<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ember.js Blog]]></title><description><![CDATA[Ember.js Blog]]></description><link>https://blog.emberjs.com/rss.xml</link><image><url>https://blog.emberjs.com/images/logos/e-icon.png</url><title>Ember.js Blog</title><link>https://blog.emberjs.com/rss.xml</link></image><generator>ember-casper-template</generator><lastBuildDate>Sat, 07 Mar 2026 20:41:05 GMT</lastBuildDate><atom:link href="https://blog.emberjs.com/rss.xml" rel="self" type="application/rss+xml"/><item><title><![CDATA[2016 Ember Community Survey]]></title><description><![CDATA[<p>2015 was an incredible year to be a web developer, and great year to be
building an Ember app.</p>
<p>Ember 2.0 landed in August, and with it came the first major shift in
application architecture since Ember left its SproutCore roots. The Ember-CLI
team made massive improvements to the speed and quality of our build tooling
several times over, all while continuing to be the foundation for a growing
addon community now topping 2000 projects. Ember-Data stabilized its public
API for the first time in the project's history, and continues to contend
for the title of most complete client-side JavaScript data layer.</p>
<p>Other projects, under the official umbrella and outside it, continue to
innovate and mature.</p>
<p>With 2015 in the rear-view mirror, we should take a moment to check our assumptions
about who is in the Ember community and how they work with the framework.
To that end, we're pleased to announce
the official 2016 Ember Community Survey!</p>
<p><a href="https://emberjs.com/ember-community-survey-2016" class="es-button">
  Survey Landing Page
</a></p>
<p>Completing the survey should take about fifteen minutes. We will be accepting
submissions until March 21st.</p>
<p>Please help us spread the word by sharing the above link on your social
network feeds, at meetups and around your office and other communities.</p>
<p>With your answers (all anonymous), we will create some visuals and write up our
insights to share at <a href="http://emberconf.com/">EmberConf 2016</a> (March 29th-30th).
If you have any immediate questions, feel free to email
Ryan (<a href="https://twitter.com/RyanLaBouve">@RyanLaBouve</a>) and
Matthew (<a href="https://twitter.com/mixonic">@mixonic</a>) via
<a href="mailto:survey@201-created.com">survey@201-created.com</a>.</p>
<p>We look forward to your participation!</p>]]></description><link>https://blog.emberjs.com/2016-ember-community-survey.html</link><guid isPermaLink="true">https://blog.emberjs.com/2016-ember-community-survey.html</guid><pubDate>Fri, 04 Mar 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[2017 Ember Community Survey]]></title><description><![CDATA[<p>The past year has been a great time to work with the web, and an exciting one to
be building applications with Ember.</p>
<ul>
<li>Ember.js completed eight backward-compatible minor version releases in the
last year, <a href="http://emberjs.com/blog/tags/releases.html">2.4 through 2.11</a>.
Included were the framework's first two Long-Term Support (LTS) releases.</li>
<li><a href="http://emberjs.com/blog/2016/07/29/announcing-the-glimmer-2-alpha.html">Glimmer 2</a>,
a major rewrite of Ember's rendering system, landed in Ember.js 2.10.</li>
<li>Framework support for <a href="https://ember-engines.netlify.app/">Ember Engines</a> landed in
in Ember.js 2.8.</li>
<li>Support for <a href="https://ember-fastboot.com/">Ember FastBoot</a> stabilized in
Ember.js 2.4.</li>
<li>The <a href="https://www.emberaddons.com/">Ember.js addon community</a> grew from 2,000
to over 3,500 publicly available addons!</li>
</ul>
<p>With 2017 already under way, we would like your help to learn
about who is in the Ember community and how they work with the framework.
To that end, we're pleased to announce the official 2017 Ember Community Survey.</p>
<p><a href="https://emberjs.com/ember-community-survey-2017" class="es-button">
  Survey Landing Page
</a></p>
<p>This is our third year learning about the community's makeup and interests,
and we're looking forward to
sharing the results at <a href="http://emberconf.com/">EmberConf 2017</a> on March 28th.
The number of survey participants grew from 900 in
2015 (<a href="http://www.201-created.com/ember-community-survey-2015">2015 survey results</a>)
to over 1,800 in 2016 (<a href="http://emberjs.com/ember-community-survey-2016">2016 survey results</a>).</p>
<p>Completing the survey should take about fifteen minutes. Submissions will be
accepted until March 21st.</p>
<p>Please help us spread the word by sharing the
<a href="/ember-community-survey-2017">survey landing page</a> on your social
network feeds, at meetups and around your office and other communities.</p>
<p>We look forward to your participation!
If you have any immediate questions, feel free to email
Tom (<a href="https://twitter.com/tzellman">@tzellman</a>) and
the survey team via
<a href="mailto:survey@201-created.com">survey@201-created.com</a>.</p>]]></description><link>https://blog.emberjs.com/2017-ember-community-survey.html</link><guid isPermaLink="true">https://blog.emberjs.com/2017-ember-community-survey.html</guid><pubDate>Tue, 28 Feb 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[2018 Ember Community Survey]]></title><description><![CDATA[<p>The last year has been a wonderful time to work with the web, and a thrilling one to
be building applications with Ember.</p>
<ul>
<li>Ember.js completed seven backward-compatible minor version releases in the
last year: 2.12 through 2.18.
Included were three Long-Term Support (LTS) releases.
Version 2.18 was declared as an LTS and is the final release of the project's 2.x series.</li>
<li>Ember 3.0 and 3.1 beta versions also came into existence, marking the beginning of the <a href="http://emberjs.com/blog/tags/releases.html">3.x
series</a>.
3.0 removes public API deprecated in Ember 2.x releases.</li>
<li><a href="https://www.ember-fastboot.com/">Ember FastBoot</a>, a server-side rendering solution for Ember apps, reached 1.0.</li>
<li>The Glimmer VM,
Ember's rendering system, also experienced a lot progress. This includes
implementations of <code>&lt;Capital /&gt;</code>-style component syntax, compiled binary
byte-code, incremental rendering, and SSR with incremental rehydration. The <a href="https://emberjs.com/blog/2017/10/10/glimmer-progress-report.html">October Glimmer Progress Report</a> is a good place to look for details.</li>
<li>The <a href="https://www.emberaddons.com/">Ember.js addon community</a> grew from 3500
to almost 4500 publicly available addons!</li>
</ul>
<p>With 2018 already under way, we would like your help to learn
about who is in the Ember community and how they work with the framework.
To that end, we're pleased to announce the official 2018 Ember Community Survey.</p>
<p><a href="https://emberjs.com/ember-community-survey-2018" class="ember-button ember-button--centered">
  Survey Landing Page <img src="/images/survey/right-arrow.png" alt="" role="presentation" class="btn-image" />
</a></p>
<p>This is our fourth year learning about the community's makeup and interests,
and we're looking forward to
sharing the results at <a href="http://emberconf.com/">EmberConf 2018</a> on March 13th.
A vast number of people, nearly 1600 participants, took part in the survey in 2017 (<a href="https://www.emberjs.com/ember-community-survey-2017/">2017 survey results</a>)</p>
<p>Completing the survey should take about 11 minutes. We've shortened the
survey compared to last year, and created opportunities for you to share
feedback as free-form text. All submissions are completely anonymous, and
demographic data about the community is not released in the same raw data files
as the free-form text and other answers.</p>
<p>Submissions will be accepted until March 7th.</p>
<p>Please help us spread the word by sharing the
<a href="/ember-community-survey-2018">survey landing page</a> on your social
network feeds, at meetups and around your office and other communities.</p>
<p>We look forward to your participation!
If you have any immediate questions, feel free to email
Akanksha Dharkar (<a href="https://twitter.com/AkankshaKana">@AkankshaKana</a>) and
the survey team via
<a href="mailto:survey@201-created.com">survey@201-created.com</a>.</p>]]></description><link>https://blog.emberjs.com/2018-ember-community-survey.html</link><guid isPermaLink="true">https://blog.emberjs.com/2018-ember-community-survey.html</guid><pubDate>Wed, 21 Feb 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The 2020 Ember Roadmap]]></title><description><![CDATA[<p>The purpose of the Ember Roadmap process is to rally the community around a number of shared goals. This post documents those goals for 2020.</p>
<p>Since the Ember community cannot predict the future, we cannot be sure that we will achieve all of the individual items enumerated here. Instead, the purpose of this document is to give the community a common purpose to aspire towards.</p>
<p>This year our two headline priorities are:</p>
<ul>
<li>Polish the practical and conceptual details of Octane (tracked properties, Glimmer components, related tooling, accessibility, performance and payload improvements).</li>
<li>Make Ember easier to try and adopt, but also lower barriers for Ember developers when collaborating with the greater JavaScript project. We will do this through improvements and simplifications to the framework, and through focused communication with the greater JavaScript community.</li>
</ul>
<!-- READMORE -->
<hr />
<p>This document was started in fall 2019. It is a distillation of multiple sources:</p>
<ol>
<li>The <a href="https://emberjs.com/ember-community-survey-2019/">2019 Community Survey</a>.</li>
<li>Community <a href="https://twitter.com/hashtag/EmberJS2019?f=live">#EmberJS2019</a> blog posts authored in response to our call for posts.</li>
<li>Discussion on <a href="https://discuss.emberjs.com/">https://discuss.emberjs.com</a>, Discord, Twitter, and other public venues (see the <a href="https://emberjs.com/community/">community page</a> for how to access these communnities).</li>
<li>Deliberations among the Ember core teams.</li>
<li>Your comments and feedback on this document via <a href="https://github.com/emberjs/rfcs/pull/519">the RFC process</a>.</li>
</ol>
<p>The goal of the roadmap is to align the Ember community around a set of shared, achievable goals that balance the needs of existing users with the need to grow and support new users.</p>
<h2 id="ourroadmap">Our Roadmap</h2>
<p>Now that Ember Octane has shipped, it’s time to turn our attention to new efforts in 2020. Our goal is to build on Octane's release and capitalize on that cutting-edge foundation.</p>
<ul>
<li><strong>Invest in Octane.</strong> Octane's mental model and basic components are complete, but a number of practical and conceptual gaps remain. We will close these gaps with work on tooling, by deprecating classic APIs to simplify Ember for new users, and by introducing additional functionality where appropriate.</li>
<li><strong>Modernize our build system.</strong> This year we will prioritize improvements to the Ember application build pipeline, and to Ember itself, which will bring modern optimizations like tree shaking and code splitting to both new applications <em>and</em> existing codebases.</li>
<li><strong>Better a11y by default</strong>. We will better support assistive technologies via updates to the router. Additionally we will provide developers more tools for understanding and improving the accessibility of their Ember applications. Our goal is a great "out of the box" experience with Ember and assistive technologies.</li>
<li><strong>Share Octane outside our community.</strong> Octane's release put Ember in front of a lot of new eyes. We will continue that trend through 2020 by talking about the latest edition of Ember in front of new audiences.</li>
</ul>
<h3 id="investinoctane">Invest in Octane</h3>
<p>Ember Octane put the framework on a strong footing by modernizing its most foundational APIs. Teams are already productive using Octane, and from their experience have provided a torrent of real-world feedback. We will continue improving the developer experience (DX) of Octane throughout 2020.</p>
<p>Many of the rough edges in Octane aren't on the features themselves, but in the supporting tooling. The usefulness of stack traces from Glimmer, the ability to use TypeScript with Ember templates, how tracked properties and Glimmer components are reflected in the Ember Inspector, and the build speed of our application pipelines are all important parts of Octane's DX. We will invest in these areas of work.</p>
<p>For developers who are new to Ember, the presence of classic non-Octane APIs can be disorienting. We will look for creative solutions that make those features trivial for existing apps to continue using while also making them less expensive (in payload, performance, and mental model) for new adopters.</p>
<p>Finally there are some areas of Octane features which can still benefit from new feature work:</p>
<ul>
<li>The <code>@tracked</code> system, for example, limits the expression of state in an application to defined properties on an object. Real-world codebases often want to maintain state as a list or a map, and we can extend on the well-designed internals of Ember's reactivity model to support these cases.</li>
<li>Modifiers provide a hook into the DOM rendering lifecycle, but Octane has no APIs for hooking into other lifecycles in the rendering and object system. We will create these APIs.</li>
<li>We will continue a push to make Ember templates better analyzable at build time by introducing a strict-mode template and static imports.</li>
<li>We will make it easier to build ergonomic, reusable components by shipping named blocks.</li>
</ul>
<p>We will introduce new features in Ember which improve Octane in these and other areas.</p>
<h3 id="modernizeourbuildsystem">Modernize our build system</h3>
<p>Last year, we started work on Embroider, an overhaul of the Ember CLI compilation pipeline. This year, we will put the finishing touches on Embroider and start migrating the Ember ecosystem to this modernized build.</p>
<p>Embroider integrates Ember CLI with popular packagers like <a href="https://webpack.js.org/">webpack</a> and <a href="https://rollupjs.org/guide/en/">rollup</a>. It allows Ember apps to trivially import from any dependency published as standard JavaScript modules, and will unblock shipping Ember itself as npm packages in the <code>@ember</code> namespace.</p>
<p>This new approach, through its foundation on common packaging libraries, will also unlock new build time optimizations. These optimizations, like tree-shaking and route-based code-splitting, will allow Embroider to produce smaller asset payloads.</p>
<p>Additionally, we will introduce a system into Ember which allows apps to drop framework code supporting deprecated features unused by an app. This will result in smaller vendor assets for applications which don't rely on deprecated features. For example, a modern Octane application may not require <code>Ember.Component</code>, and can benefit from having the code supporting that API being dropped at build time.</p>
<p>Finally, we will make sure this modernization effort provides benefits to existing applications. If a team has been steadily upgrading their app for years now, they won't need to rewrite it to get the benefits of a modern build packager.</p>
<h3 id="bettera11ybydefault">Better a11y by default</h3>
<p>Ember applications should be accessible to everyone. Unfortunately, even seemingly small mistakes can make your app difficult or impossible to use with assistive technology like screen readers. We will do more to improve the out-of-the-box accessibility of Ember applications, and provide tools to help applications stay accessible as they grow.</p>
<ul>
<li><strong>Fix router accessibility</strong> so that page navigation is correctly announced by screen readers, without needing a third-party addon.</li>
<li>Incorporate <strong>accessibility checks</strong> into the built-in test helpers.</li>
<li><strong>Engage with standards bodies</strong> to help fill the gaps in existing web accessibility APIs.</li>
</ul>
<p>To contribute to this effort see <a href="https://github.com/emberjs/rfcs/issues/595">RFC Issue 595</a> which coordinates the Ember A11y Strike Team.</p>
<h3 id="sharingoctaneoutsideourcommunity">Sharing Octane outside our community</h3>
<p>There are more people building web applications than ever, and Ember must adapt to their changing needs and expectations in order to stay relevant. Octane better aligns Ember's API with what new users expect from a modern framework. We need to take advantage of that change.</p>
<p>This year, we’ll share with the world how Ember Octane is modern, productive, and <em>fun</em>. Through blog posts, videos, social media, meetups, and conferences, we will share our knowledge and experiences with the wider JavaScript community and encourage them to give Octane a try.</p>
<p>We will continue to make Octane more attractive to new users with a new documentation approach, more effective website, and with clearer communication about the Glimmer.js project.</p>
<hr />
<h2 id="loweringbarrierstoadoptionandcollaboration">Lowering barriers to adoption, and collaboration</h2>
<p>Making Ember more attractive to new users doesn't mean compromising on what has made the framework so very successful for existing codebases and teams.</p>
<p>The most basic value of the Ember project is that we solve problems together. While we intend to grow the number of framework users and modernize the framework in many ways, we won't optimize for growth at the expense of our existing community. Instead, we will collaborate on solutions that come with a curated adoption story.</p>
<p>Because we understand and value the power of collaboration, we know we must lower barriers, technical and non-technical, which not only make new users hesitate to adopt Ember but also discourage Ember developers from participating the greater JavaScript community.</p>
<p>A great example of our progress in this is Octane's embrace of native JavaScript classes: A JavaScript developer starting out with Ember today isn't immediately forced to learn a new, Ember-specific class API before they can get to writing code. On the other hand, a developer who starts off with Ember can also contribute to most OSS JavaScript projects without needing to first un-learn the Ember class system.</p>
<p>By sharing common solutions to common problems with other communities we not only make Ember more approachable, we also benefit from the opportunity to exchange more ideas. Everyone wins.</p>
<p>With our efforts to flesh out Octane, improve the build system and align it with the rest of the JavaScript community, raise the baseline support for accessible applications, and to better communicate in 2020 we will lower barriers to adoption of Ember, but also to our own collaboration with the greater JavaScript project.</p>
<p>Want to get involved? Visit our <a href="https://emberjs.com/community/">community page</a>
and feel free to join us on Discord (chat) or Discourse (forum discussion).</p>]]></description><link>https://blog.emberjs.com/2020-ember-roadmap</link><guid isPermaLink="true">https://blog.emberjs.com/2020-ember-roadmap</guid><pubDate>Fri, 10 Jul 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Accessibility Working Group Update]]></title><description><![CDATA[<p>Back in March, an Accessibility (A11y) Strike Team was formed to address the issues outlined in <a href="https://github.com/emberjs/rfcs/issues/595">Ember RFC Issue 595 - Technical Accessibility Issues in New Ember Apps</a>. This blog post is to update the community on that group's work.</p>
<p>The Strike Team met weekly between <a href="https://github.com/ember-a11y/core-notes/blob/ember-a11y/ember-a11y/2020-03/march-25.md">March 25</a> and <a href="https://github.com/ember-a11y/core-notes/blob/ember-a11y/ember-a11y/2020-06/june-24.md">June 24</a>. We even managed to celebrate <a href="https://blog.emberjs.com/2020/05/21/global-accessibility-awareness-day.html">Global Accessibility Awareness Day</a>!</p>
<!-- READMORE -->
<p>There were five items listed in <a href="https://github.com/emberjs/rfcs/issues/595">Issue 595</a>:</p>
<ol>
<li>Application Language Support</li>
<li>Label/Input Support</li>
<li>Page Title Support</li>
<li>Support for <code>...attributes</code></li>
<li>Accessible Routing Support</li>
</ol>
<h2 id="activework">Active Work</h2>
<h3 id="applicationlanguagesupport">Application Language Support</h3>
<!-- alex ignore easy white -->
<p>The goal of application language support was to provide a mechanism for new Ember apps to pass <a href="https://www.w3.org/TR/WCAG21/#language-of-page">WCAG Success Criteria 3.1.1 - Language of Page</a>. To meet that goal, <a href="https://github.com/josephdsumner">Joseph Sumner</a>, <a href="https://github.com/jgwhite">Jamie White</a>, <a href="https://github.com/hergaiety">Ava Wroten</a> and <a href="https://github.com/melsumner">Melanie Sumner</a> authored <a href="https://emberjs.github.io/rfcs/0635-ember-new-lang.html">RFC 635</a>, which proposed a <code>--lang</code> flag for <code>ember-cli</code>. This flag would enable developers to declare the application's language while they were creating the app, allowing them to more easily meet this particular success criteria. This RFC was merged on June 12th; the feature itself, authored by <a href="https://github.com/josephdsumner">Joseph Sumner</a> with help from <a href="https://github.com/rwjblue">Rob Jackson</a>, was merged on August 24th.</p>
<p>To add another layer of support and enhance the overall developer experience, the team also decided that it would be useful to have an interactive way to create new Ember apps. After some discussion, <a href="https://github.com/melsumner">Melanie Sumner</a> authored <a href="https://emberjs.github.io/rfcs/0638-interactive-app-creation.html">RFC 638</a>. The RFC was accepted and merged on August 10th. Implementation is still pending.</p>
<p>Additional support came from <a href="https://guides.emberjs.com/release/accessibility/application-considerations/#toc_lang-attribute">update to the Ember Guides</a>, in both prose and art, thanks to team members <a href="https://github.com/hergaiety">Ava Wroten</a> and <a href="https://github.com/lenoraporter">Lenora Porter</a>. <a href="https://github.com/melsumner">Melanie Sumner</a> also <a href="https://github.com/ember-template-lint/ember-template-lint/pull/1386">added a new rule</a> to the <a href="https://github.com/ember-template-lint/ember-template-lint">Ember Template Lint addon</a> called <code>require-lang</code>. It checks to make sure that the <code>lang</code> attribute is present on the <code>&lt;html&gt;</code> attribute. This rule will be effective in v3.0 of the addon, thanks to <a href="https://github.com/lifeart">Alex Kanunnikov</a> adding the ability to lint <code>.html</code> files in <a href="https://github.com/ember-template-lint/ember-template-lint/pull/1232">PR 1232</a>.</p>
<h3 id="labelandinputsupport">Label and Input Support</h3>
<p>There were 3 things the team decided to do in this area:</p>
<ul>
<li>Update the guides to provide more explicit guidance</li>
<li>Provide an addon that would help provide <code>id</code>s within a specific context</li>
<li>Write an RFC to propose a more permanent solution</li>
</ul>
<p><a href="https://github.com/kamikillerto">Benjamin Jegard</a> created the <a href="https://github.com/KamiKillertO/ember-context-id-helper">Ember Context Id Helper addon</a>. The <code>{{context-id}}</code> generates a unique <code>id</code> for a given context. Because it uses Ember's <code>guidFor</code> function under the hood, it will always return the same <code>id</code> for the same context. A use case for <code>context-id</code> helper is to programmatically associate <code>&lt;label&gt;</code>s and <code>&lt;input&gt;</code> element using the <code>&lt;label&gt;</code> <code>for</code> attribute and the <code>&lt;input&gt;</code>s <code>id</code> attribute.</p>
<p>This addon took inspiration from the pre-RFC for the <code>guid-for</code> helper, which resulted in <a href="https://github.com/emberjs/rfcs/pull/659">RFC 659, which proposes a new built-in template helper</a>, authored by <a href="https://github.com/steveszc">Steve Szczecina</a>.</p>
<p><a href="https://github.com/rajasegar">Rajasegar Chandran</a> and <a href="https://github.com/jenweber">Jen Weber</a> updated the <a href="https://guides.emberjs.com/release/components/built-in-components/#toc_ways-to-associate-labels-and-inputs">Official Ember Guides</a> with more explicit information for how to associate <code>&lt;label&gt;</code> and <code>&lt;input&gt;</code> elements. <a href="https://github.com/melsumner">Melanie Sumner</a> also authored <a href="https://emberjs-1.gitbook.io/ember-component-patterns/form-components/input">ember-component-patterns</a> that reflect best practices for <code>&lt;input&gt;</code> fields.</p>
<p>Finally, support has been added to the <a href="https://github.com/ember-template-lint/ember-template-lint">Ember Template Lint addon</a> with rules that require <code>&lt;input&gt;</code> elements to have <a href="https://github.com/ember-template-lint/ember-template-lint/pull/1105">valid labels</a> and that there are <a href="https://github.com/ember-template-lint/ember-template-lint/pull/1439">no duplicate labels</a>. Additional work is now being done to check that there are <a href="https://github.com/ember-template-lint/ember-template-lint/pull/1187">no duplicate ids</a> as well as <a href="https://github.com/ember-template-lint/ember-template-lint/pull/1367">valid use of form groups</a>.</p>
<h3 id="pagetitlesupport">Page Title Support</h3>
<p>In our <a href="https://github.com/ember-a11y/core-notes/blob/ember-a11y/ember-a11y/2020-04/april-08.md">April 8th meeting</a>, the team discussed how we thought we should approach page title support. More discussion throughout the month led us to support the template-driven support for page titles in Ember apps.</p>
<p><a href="https://github.com/kamikillerto">Benjamin Jegard</a>, <a href="https://github.com/melsumner">Melanie Sumner</a> and <a href="https://github.com/locks">Ricardo Mendes</a> authored <a href="https://github.com/emberjs/rfcs/pull/645">RFC 645</a>, which proposes that the Ember Page Title addon be added to the blueprints for new Ember apps. After Framework Core Team discussion, it was decided that the addon needed some work before the RFC could be accepted. That work was outlined <a href="https://github.com/adopted-ember-addons/ember-page-title/issues/167">in an issue</a> and is <a href="https://github.com/adopted-ember-addons/ember-page-title/pull/168">currently underway</a>, thanks to community member <a href="https://github.com/raido">Raido Kuli</a>!</p>
<h2 id="backtothedrawingboard">Back to the Drawing Board</h2>
<p>After discussion and some analysis, it was determined that some issues required the attention of the <a href="https://emberjs.com/teams/">Framework Core Team</a> to resolve. These issues will likely require re-thinking of significant Ember features, so some workarounds should be expected until they are resolved.</p>
<h3 id="supportforattributes">Support for <code>...attributes</code></h3>
<p>As outlined in <a href="https://github.com/emberjs/ember.js/issues/19026">Ember Issue 19026</a>, <code>...attributes</code> does not have a guaranteed merge order. This is problematic for 5 ARIA attributes because they can have multiple values in the form of an ID reference list and the order of these values matters.</p>
<p>This is likely to lead to some additional discussion about how Ember handles properties and attributes, and rethinking that approach to better support attributes.</p>
<h3 id="accessiblerouting">Accessible Routing</h3>
<p>There is an ongoing discussion for how to best resolve this issue in a permanent way. Despite a significant amount of <a href="https://github.com/MelSumner/ember-a11y-roadmap/tree/master/rfc-research/router">research into the issue</a> and <a href="https://github.com/emberjs/rfcs/pull/433">an RFC</a> that attempts to solve the issue, no resolution has been agreed upon yet. However, the Framework Core Team has accepted that accessibility is a design constraint for any new router work.</p>
<p>Until then, developers are encouraged to review the <a href="https://guides.emberjs.com/release/accessibility/application-considerations/">accessibility section of the Ember guides</a>, and consider one of the routing-related addons for use. Options include <a href="https://github.com/linkedin/self-focused/tree/master/packages/ember-self-focused">ember-self-focused</a>, <a href="https://github.com/ember-a11y/a11y-announcer">a11y-announcer</a>, <a href="https://github.com/ember-a11y/ember-a11y">ember-a11y</a>, and <a href="https://github.com/ember-a11y/ember-a11y-refocus">ember-a11y-refocus</a>.</p>
<h2 id="a11yworkinggroup">A11y Working Group</h2>
<p>At the final Strike Team meeting, we decided to continue the accessibility work in Ember and became the Ember A11y Working Group. We coordinate in the #dev-ember-a11y channel on <a href="https://discord.gg/emberjs">Ember's Discord server</a> and meet as needed. Anyone who is interested is welcome to join in!</p>
<p>Work is also underway to upscale the addons in the <a href="https://github.com/ember-a11y">Ember-A11y GitHub org</a>! We are also continuing to add first-class accessibility support to ember-template-lint; coming soon is support for users to be able to <a href="https://github.com/ember-template-lint/ember-template-lint/pull/1443">specifically only run the accessibility-related linting rules</a> on a codebase.</p>
<h2 id="thankyou">Thank You</h2>
<!-- alex ignore white -->
<p>A huge thank you to all of the community members who participated in the Ember A11y Strike Team: <a href="https://github.com/abhilashlr">Abhilash Ramesh</a>, <a href="https://github.com/amyrlam">Amy Lam</a>, <a href="https://github.com/hergaiety">Ava Wroten</a>, <a href="https://github.com/kamikillerto">Benjamin Jegard</a>, <a href="https://github.com/the-bionic">Emmanuel Patrick</a>, <a href="https://github.com/HeroicEric">Eric Kelly</a>, <a href="https://github.com/hakilebara">Frédéric Soumaré</a>, <a href="https://github.com/jgwhite">Jamie White</a>, <a href="https://github.com/jenweber">Jen Weber</a>, <a href="https://github.com/jrock2004">John Costanzo</a>, <a href="https://github.com/josephdsumner">Joseph Sumner</a>, <a href="https://github.com/zinyando">Lennex Zinyando</a>, <a href="https://github.com/lenoraporter">Lenora Porter</a>, <a href="https://github.com/melsumner">Melanie Sumner</a>, <a href="https://github.com/praskovia-root">Praskovia Root</a>, <a href="https://github.com/rajasegar">Rajasegar Chandran</a>, <a href="https://github.com/rwjblue">Robert Jackson</a>, <a href="https://github.com/steveszc">Steve Szczecina</a>, and <a href="https://github.com/seemajune">Seema Shariat</a>.</p>]]></description><link>https://blog.emberjs.com/accessibility-working-group-update</link><guid isPermaLink="true">https://blog.emberjs.com/accessibility-working-group-update</guid><pubDate>Tue, 25 Aug 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Announcing Ember's First LTS Release]]></title><description><![CDATA[<p>Currently, Ember uses <a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">release channels</a>
to help users balance between a desire for new features (canary or beta
channels) with stability (the release channel). While semver guarantees mean
that upgrades are quite straightforward, some users aren't able to upgrade
every six weeks. To address <a href="https://github.com/emberjs/rfcs/blob/master/text/0056-improved-release-cycle.md#problems-with-the-1x-model">these needs</a>,
we are announcing a new <abbr title="Long-Term Support">LTS</abbr> release
channel.</p>
<p><strong>Ember 2.4 will be the first LTS release of the core framework, and will
continue every four releases thereafter.</strong> Additionally, we've updated the
<a href="http://emberjs.com/builds/">emberjs.com/builds</a> page with better guidance
about when and how to use each of the channels.</p>
<p><img src="/images/blog/2016-02/lts-tomster.png" class="no-background float-right" alt="LTS Tomster" width="200"></p>
<p>For our users, LTS releases allow you to upgrade less frequently while still
getting support from the Ember project and the wider ecosystem.</p>
<p>For addon authors, LTS releases allow you to know which versions of Ember to
focus effort on.</p>
<p>As a project, Ember will provide security and critical bugfixes for the most
recent LTS release, in addition to the most recent release (as we do today).
We will also avoid breaking heavily used private APIs without first
deprecating them in a previous LTS release.</p>
<p>You can read more about the problems we tried to solve and details about how
it works in <a href="https://github.com/emberjs/rfcs/blob/master/text/0056-improved-release-cycle.md#proposal-lts-releases">RFC #56</a>.</p>
<h3 id="theltsreleaseprocess">The LTS Release Process</h3>
<p>The existing release channels allow you to make a tradeoff. On canary, you get
features as quickly as they land, but get no guarantees about those features.
On the stable release channel, you have to wait 12 weeks for features to
stabilize and make their way through the beta process, but you are rewarded
with semver guarantees.</p>
<p>While this provides all the flexibility you need to make stability vs. features
tradeoff, there is another orthogonal dimension: how often you can schedule
time to upgrade. LTS releases give the community an alternative, sanctioned
schedule that works better for users who prefer a slower pace.</p>
<p>By synchronizing the timing that these users upgrade, the community can decide
to focus energy on specific versions, rather than a scattershot attempt to
support every possible combination. This should result in more consistent
support and easier upgrades for users on the LTS channel.</p>
<p>The Ember 2.4 branch will be moved into the LTS release channel six weeks after
Ember 2.4.0. In other words, Ember 2.4 LTS will ship at the same time as Ember
2.5.0. This means that features begin on Canary, spend six weeks on beta before
making it into the stable channel, and spend another six weeks on the stable
channel before making it into the LTS release channel.</p>
<p>This same process repeats every four releases, meaning that the next release on
the LTS channel will be Ember 2.8 LTS, which will ship at the same time as
Ember 2.9.0.</p>
<p>For example, the expected release of Ember 2.4 stable (currently in beta) is on
February 26th. To give you a sense for the cadence of our release channels, the
projected release timeline is as follows.</p>
<p><img src="/images/blog/2016-02/Releases@3x.svg" alt="LTS release timeline" /></p>
<p><strong>LTS releases will receive critical bugfixes for 6 release cycles (36 weeks).</strong>
This means we will support Ember 2.4 LTS with critical bugfixes until Ember
2.10.0 is released, around November 4, 2016.</p>
<p><strong>LTS releases will receive security patches for 10 release cycles (60 weeks).</strong>
This means we will support Ember 2.4 LTS with security patches at least until
Ember 2.14.0 is released, around April 21, 2017.</p>
<p>As you can see in the above diagram, Ember 2.8 LTS is projected to ship around
September 23, 2016. This gives you plenty of time to complete the migration to
the next LTS release once it comes out. As always, because Ember 2.8 is semver
compatible with Ember 2.4, the upgrade should be relatively smooth.</p>
<p>By the time 2.8 rolls around in roughly six months, any addons that make use
of the private <code>view</code> APIs should have had a chance to update.</p>
<h3 id="theltsguarantees">The LTS Guarantees</h3>
<p>What makes an LTS release different than a stable Ember release? LTS releases
come with guarantees about API stability and security:</p>
<ul>
<li><p>Because each LTS release will receive security fixes for 60 weeks, we will
backport them to at least the two most recent LTS releases. <a href="http://emberjs.com/security/">Read more about
Ember's security policy</a>.</p></li>
<li><p>Release notes for each LTS will contain a summary of features and
deprecations added since the previous LTS. This will likely consist of a
number of links to documentation, guides, and release notes for stable
releases.</p></li>
<li><p>Addons and applications should constrain themselves to using Ember's public
APIs. However, in practice we recognize that experimentation and use of
"intimate" APIs is a reality. To ensure addons and apps using these intimate
APIs have a migration path forward, any change to a heavily used private APIs
will receive a deprecation warning in at least one LTS release. This gives
LTS users and the addon community about six months to migrate away. For
example, the <code>view</code> APIs (private in Ember 2.x) will be marked as deprecated
in Ember 2.4 LTS, and removed before Ember 2.8 LTS.</p></li>
<li><p>We encourage addon authors to maintain support for the latest LTS release, in
addition to tracking changes in the stable releases.</p></li>
</ul>
<p>In practice, since these releases still abide by <a href="http://semver.org/">semantic versioning</a>,
upgrading from LTS release to LTS release should not be significantly more work
than upgrading along the six-week release cycle.</p>
<p>Upgrading less frequently will mean, of course, that a developer will wait
longer to take advantage of new features. Additionally, it means the changes in
best practices between releases (and in the number of deprecations) may feel
more significant.</p>
<h3 id="legacyviewandcontrolleraddons">Legacy View and Controller Addons</h3>
<p>Ember has provided the <a href="https://github.com/emberjs/ember-legacy-views">ember-legacy-views</a>
and <a href="https://github.com/emberjs/ember-legacy-controllers">ember-legacy-controllers</a>
addons since Ember 1.13. For large codebases, these addons provide a slower
off-ramp for legacy view and controller features. Big apps can move to Ember
2.0 without the complete removal of views.</p>
<p>These addons rely on several private APIs expected to undergo significant
refactoring in Ember 2.5 or 2.6. Therefore, the Ember 2.4 LTS will likely be
the last LTS to support these addons. They will become unsupported in September
or October with the release of Ember 2.8 LTS.</p>
<h3 id="seeyousoon">See You Soon</h3>
<p>LTS releases are just one of the many things we've been working on; the core
team has had a <em>long</em> couple of months and we're excited to share everything.
There will be more announcements and plans shared at <a href="http://emberconf.com/">EmberConf</a>
(March 29-30 in Portland), looking forward to seeing so many of you there!</p>
<p><img src="/images/blog/2016-02/release-tomsters.png" class="no-background" alt="The Release Tomsters Family"></p>]]></description><link>https://blog.emberjs.com/announcing-embers-first-lts</link><guid isPermaLink="true">https://blog.emberjs.com/announcing-embers-first-lts</guid><pubDate>Thu, 25 Feb 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Announcing the Official TypeScript Types Public Preview]]></title><description><![CDATA[<p>As of <code>ember-source@4.8.0-beta.2</code>, Ember is shipping a public preview of our official TypeScript support for the framework itself. This is the next step in implementing <a href="https://rfcs.emberjs.com/id/0724-road-to-typescript/">RFC 0724: Official TypeScript Support</a> and <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan/">RFC 0800: TypeScript Adoption Plan</a>. Anyone using TypeScript with Ember 4.8.0 Beta 2 or later can opt into using these preview types by removing the corresponding <code>@types</code> packages and adding the following import in your <code>types/&lt;your app&gt;/index.d.ts</code> file:</p>
<pre><code class="ts language-ts">import 'ember-source/types';
import 'ember-source/types/preview';
</code></pre>
<p>This will set your app up to start using Ember's preview types <em>now</em> and to automatically benefit as we stabilize our types incrementally over the releases ahead. You won't have to do anything except add these once and then upgrade your app on your normal upgrade cadence!</p>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/lHQB7DxgFbg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>Note that there are some significant changes to these types compared to the types as they exist on DefinitelyTyped today. <strong>All public API remains supported, but in line with RFC 0800, we intentionally provide only minimal support for Ember Classic APIs around class definitions.</strong> Accordingly, you should migrate to native classes <em>before</em> attempting to adopt these types if you have not already done so!</p>
<p>The rest of this post is broken into four sections:</p>
<ul>
<li><a href="#toc_how-the-preview-period-will-work">How the preview period will work</a></li>
<li><a href="#toc_migrating-from-definitelytyped">Migrating from DefinitelyTyped</a></li>
<li><a href="#toc_new-typescript-users">New TypeScript users</a></li>
<li><a href="#toc_whats-next-on-ember’s-road-to-typescript">What's next on Ember’s road to TypeScript?</a></li>
</ul>
<p>If you’re curious about the details of how this approach to publishing TypeScript types for Ember works, check out <a href="https://github.com/emberjs/ember.js/pull/20180">the PR which introduced support</a>!</p>
<h2 id="howthepreviewperiodwillwork">How the preview period will work</h2>
<p>There are two type-only modules you import: <code>'ember-source/types'</code> and <code>'ember-source/types/preview'</code>. These represent the stable and preview types respectively. At the start of the preview period, there is nothing at all in the stable module: <em>all</em> the types are in the preview module.</p>
<p>The key difference between the stable and preview types is: our stable types <em>must</em> be generated from Ember's own TypeScript source code, while the preview types are hand-written type definitions. The hand-written definitions match up closely to the actual code, but small gaps are inevitable. Types published directly from Ember's own source code will not have that problem!</p>
<p>Over the course of the preview period, we will be doing two things:</p>
<ol>
<li><p>We will be fixing bugs in these types as they are identified, and releasing bug fix releases the same way we would for runtime errors. (This will be the new normal for Ember: fixes to types are exactly like fixes to runtime errors, because both are bugs!)</p></li>
<li><p>We will be working on Ember's build infrastructure and the structure of its internals to make it possible to publish types directly from the source, instead of using hand-authored types. These are the types which will be exposed via the <code>import 'ember-source/types';</code> statement.</p></li>
</ol>
<p>Once we are fully cut over to publishing types from Ember's source code, we will declare them "stable" and therefore subject to Ember's normal SemVer policy. For details on how we are handling SemVer for TypeScript, check out <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan/#semantic-versioning">the relevant section of RFC 0800</a> and the <a href="https://www.semver-ts.org">Semantic Versioning for TypeScript</a> spec we authored and follow. We’ll also be updating the website with those details in the next few weeks.</p>
<p>We will make a best effort to avoid breaking changes in the types during the preview period, but the transition to the stable types will inevitably involve many bug fixes which may <em>feel</em> like breaking changes!</p>
<p>Also, given that these are <em>preview</em> types, we will continue to maintain the types on DefinitelyTyped until we stabilize these. If you try them out and hit issues you cannot resolve, that’s totally fine! There are two things we think you should do in that case:</p>
<ol>
<li>File an issue on <a href="https://github.com/emberjs/ember.js/issues">the ember.js repo</a> with a report about the issue you had.</li>
<li>Switch back to the <code>@types</code> packages!</li>
</ol>
<p>We will make sure there are no blocking bugs before stabilizing.</p>
<h2 id="migratingfromdefinitelytyped">Migrating from DefinitelyTyped</h2>
<p><em>This section only applies if you are an existing Ember TypeScript user who has been using the <code>@types</code> packages from <a href="https://github.com/DefinitelyTyped/DefinitelyTyped">DefinitelyTyped</a>. If you're trying out TypeScript for the first time now, you can skip it!</em></p>
<p>There are four steps involved in switching from the existing types published on DefinitelyTyped to these preview types.</p>
<ol>
<li><p>Remove the following packages from your <code>package.json</code>:</p>
<ul>
<li><code>@types/ember</code></li>
<li><code>@types/ember__application</code></li>
<li><code>@types/ember__array</code></li>
<li><code>@types/ember__component</code></li>
<li><code>@types/ember__controller</code></li>
<li><code>@types/ember__debug</code></li>
<li><code>@types/ember__destroyable</code></li>
<li><code>@types/ember__engine</code></li>
<li><code>@types/ember__error</code></li>
<li><code>@types/ember__helper</code></li>
<li><code>@types/ember__modifier</code></li>
<li><code>@types/ember__object</code></li>
<li><code>@types/ember__owner</code></li>
<li><code>@types/ember__polyfills</code></li>
<li><code>@types/ember__routing</code></li>
<li><code>@types/ember__runloop</code></li>
<li><code>@types/ember__service</code></li>
<li><code>@types/ember__string</code></li>
<li><code>@types/ember__template</code></li>
<li><code>@types/ember__test</code></li>
<li><code>@types/ember__utils</code></li></ul></li>
<li><p>Install a version of <code>ember-source</code> greater than <code>4.8.0-beta.2</code>. You should pick the latest beta of 4.8 <em>or</em> any stable version starting with 4.8.0 once it's out!</p></li>
<li><p>In the <code>types/&lt;your-app&gt;/index.d.ts</code> file generated for you automatically by <code>ember-cli-typescript</code>, add the new imports as the first items in the file, and remove the array prototype extensions support from the file. With the defaults generated for you, the result would look like this:</p>
<pre><code class="diff language-diff">+import 'ember-source/types';
+import 'ember-source/types/preview';
-import Ember from 'ember';
-
-declare global {
- // Prevents ESLint from "fixing" this via its auto-fix to turn it into a type
- // alias (e.g. after running any Ember CLI generator)
- // eslint-disable-next-line @typescript-eslint/no-empty-interface
- interface Array&lt;T&gt; extends Ember.ArrayPrototypeExtensions&lt;T&gt; {}
- // interface Function extends Ember.FunctionPrototypeExtensions {}
-}

export {};
</code></pre></li>
<li><p>Account for the differences between the preview types and the definitions on DefinitelyTyped. These differences all fall into one of these broad categories:</p>
<ul>
<li>Fixes to problems in the existing definitions.</li>
<li>Removal of our (poor!) support for Ember Classic class features in favor of native classes.</li>
<li>Changes to type registry handling</li>
<li>Removal of legacy (private) routing APIs</li></ul></li>
</ol>
<h3 id="fixestoproblemsintheexistingdefinitions">Fixes to problems in the existing definitions</h3>
<p>For the preview types, we started by copying over the community-maintained type definitions from DefinitelyTyped. We then updated them to use more robust type testing tools that DefinitelyTyped allows, which exposed a bunch of bugs to fix. We also did a basic comparison of the types we are publishing with the corresponding types in Ember's own code, which has been written in TypeScript for years and got a huge improvement from <a href="https://github.com/wagenet">@wagenet</a> earlier this year.</p>
<p>As a result, you may find some differences when you switch over. In every case, these represent <em>bug fixes</em>, but we recognize they may involve some work!</p>
<h4 id="introducingaresolvertype">Introducing a <code>Resolver</code> type</h4>
<p>The types on DefinitelyTyped supply a definition of <code>Resolver</code> from <code>ember-resolver</code>, which is where most Ember users get their resolver. However, <code>ember-resolver</code> and other resolvers work because they implement <em>Ember’s</em> contract for what a resolver is. A future RFC will introduce a public type import for this. (It was missed during the work on <a href="https://rfcs.emberjs.com/id/0821-public-types/">RFC 0821</a> because the type presently does <em>not</em> come from Ember!)</p>
<p>For now, the type exists at <code>@ember/-internals/resolver</code>, and is introduced to be type-compatible with the type for <code>ember-resolver</code> on DefinitelyTyped. (See <a href="https://github.com/ember-cli/ember-resolver/issues/795">this issue</a> for an issue tracking publishing types from <code>ember-resolver</code>, which is likely gated on a public type import from Ember, but until we ship stable types, can be managed via careful types work on DefinitelyTyped.)</p>
<h4 id="removingsupportforarrayprototypeextensions">Removing support for <code>Array</code> prototype extensions</h4>
<p>This work also exposed a number of errors in the existing types, especially around <code>Array</code> prototype extensions. As a result, these types <em>do not support</em> <code>Array</code> prototype extensions, and it is unlikely that future work will be able to add that support. (The support provided via the types on DefinitelyTyped only worked because the types were defined incorrectly, resulting in a variety of kinds of unsafety.)</p>
<p>Notably, Array prototype extensions are <a href="https://github.com/emberjs/rfcs/pull/848">being deprecated</a>, so moving off of them is work you will need to do <em>anyway</em>.</p>
<h3 id="emberclassicsupport">Ember Classic support</h3>
<p>As specified in <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan/">RFC 0800</a>, there are also a number of breaking changes from the types in DefinitelyTyped regarding support for Ember Classic features:</p>
<blockquote>
  <p>Per the edition support policy, we will provide minimal support for Ember Classic features:</p>
  <ul>
  <li><p><strong>Ember's classic class system</strong>: we will provide minimal definitions for the <code>.create()</code>, <code>.extend()</code>, <code>.reopen()</code>, <code>.reopenClass()</code>, methods, which make no attempt to use them to actually update the types of the items they modify.…</p></li>
  <li><p><strong>Ember’s <code>get</code> and <code>set</code> helpers:</strong> we will not provide types to make <code>get</code> and <code>set</code> type-safe beyond property lookups on objects—i.e. no support for nested path lookups.…</p></li>
  <li><p><strong>Classic computed property handling:</strong> we will not provide “safe” types for the classic form of computed properties.</p></li>
  </ul>
</blockquote>
<h4 id="embersclassicclasssystem">Ember's classic class system</h4>
<p>The definitions on DefinitelyTyped attempted to make <code>.create()</code> and <code>.extend()</code> actually create updated types, and tried to make <code>.create()</code>, <code>.extend()</code>, <code>.reopen()</code>, and <code>.reopenClass()</code> have the correct type for <code>this</code> within their bodies. These were always extremely fragile and mostly did not work. Since Ember 3.6, Ember users have been able to use native classes instead of Ember’s classic class system, and this has been the recommended way of writing Ember code since the release of the Octane edition in Ember 3.15.</p>
<p>In the preview types, these methods are present and are safe to use since they are still part of Ember’s public API. However, <code>.create()</code> and <code>.extend()</code> do not create new types. The <code>.create()</code> method <em>does</em> still check that the values you pass match those defined on the class body, but the types do not attempt to make <code>this</code> have the right type within the bodies of <code>.create()</code>, <code>.extend()</code>, <code>.reopen()</code>, or <code>.reopenClass()</code>.</p>
<p>To migrate, you should:</p>
<ul>
<li>Convert all your own classic classes to native classes.</li>
<li>Eliminate your use of mixins.</li>
</ul>
<p>(Most Ember TypeScript users have already done this, because these worked so poorly with TypeScript.)</p>
<p>The <code>.create()</code> call can always be replaced with a normal <code>class</code> definition in JavaScript. For each of the others, you can also use <a href="http://www.typescriptlang.org/docs/handbook/declaration-merging.html">declaration merging</a> to represent the <em>behavior</em> of the method in question.</p>
<h5 id="extend"><code>.extend()</code></h5>
<p>For the case where you are only defining a new class, convert to a native class instead. However, if you have code which still relies on mixins like <code>Evented</code>, you can represent it using interface merging like this:</p>
<pre><code class="ts language-ts">import EmberObject from '@ember/object';
import Evented from '@ember/object/evented';
import type Owner from '@ember/owner';

// A native class which still applies the Evented mixin
class ExtendsDemo extends EmberObject.extend(Evented) {
  moreStuff = true;

  constructor(owner: Owner) {
    super(owner);
    this.on('custom', this, 'boundMethod');
  }

  willDestroy(): void {
    this.off('custom', this, 'boundMethod');
  }

  boundMethod = () =&gt; {
    alert('do something');
  };
}

// Make that work for the *type* by merging the type of the class
// (`interface ExtendsDemo`) with the type of the mixin (`Evented`)
interface ExtendsDemo extends Evented {}

const instance = ExtendsDemo.create({
  moreStuff: false,
});

instance.trigger('custom');
</code></pre>
<p>Note: you will have to disable the <code>@typescript-eslint/no-empty-interface</code> ESLint rule for this.</p>
<p>You can do the same for your own mixins while transitioning by defining an interface which represents the type of the mixin:</p>
<pre><code class="ts language-ts">import Mixin from '@ember/object/mixin';

// Creates the runtime mixin code
const Alertable = Mixin.create({
  alert(value: string) {
    alert(`The value is ${value}`);
  }
})

// Creates the type for TypeScript to see.
interface Alertable extends Mixin {
  alert(value: string): void;
}

// Exports them as a single name in both value and type space.
export default Alertable;
</code></pre>
<h5 id="reopen"><code>.reopen()</code></h5>
<p>In general, <code>.reopen()</code> is an antipattern, because it makes it very hard to understand where a given part of a class’ state or behavior lives, and you should move away from it! You should prefer to <em>delegate</em> to a class instead of dynamically adding behavior to it, both for maintainability and for performance. However, for the transition, you can represent it using interface merging.</p>
<pre><code class="ts language-ts">import EmberObject from '@ember/object';

class Foo extends EmberObject {
  someProp = 123;
}

// This is what makes the change work at runtime...
Foo.reopen({
  extra: 'hello',
});

// ...while this is what makes it visible to the type system.
interface Foo {
  extra: string;
}

// Now when calling `Foo.create`, or when working with an instance of the
// class, both `someProp` and `extra` will be checked.
const instance = Foo.create({
  someProp: 456,
  extra: 'goodbye',
});
</code></pre>
<h5 id="reopenclass"><code>.reopenClass()</code></h5>
<p>As with <code>.reopen()</code>, the use of <code>.reopenClass()</code> is an antipattern you should move away from over time, preferring to use regular functions in module scope or normal static methods on native classes. In the meantime, you can use <em>namespace merging</em> to represent how it works:</p>
<pre><code class="ts language-ts">import EmberObject from '@ember/object';

class Foo extends EmberObject {
  static someStatic = true;
}

// This adds the method to the Foo class at runtime...
Foo.reopenClass({
  anotherStatic(): string {
    return 'hello';
  },
});

// ...and this makes it visible to TypeScript as a static method.
declare namespace Foo {
  export function anotherStatic(): string;
}

if (Foo.someStatic) {
  Foo.anotherStatic().length;
}
</code></pre>
<p>Note: you will have to disable the <code>@typescript-eslint/no-namespace</code> ESLint rule for this.</p>
<h3 id="typeregistries">Type registries</h3>
<p>These types, as a fairly direct extraction from DefinitelyTyped, currently maintain the service and controller type registries. Given the lack of support for classic computed properties, which are the main way to take advantage of those at present, <strong>it is fairly likely some or all of these will be removed before stabilizing the types.</strong> The major remaining use case is type-safe lookup using the <code>Owner.lookup</code> APIs, so if you have thoughts on that, please reach out in <a href="https://discord.com/channels/480462759797063690/786312479620726804"><code>#dev-typescript</code></a>.</p>
<h3 id="legacyroutingtypelocations">Legacy routing type locations</h3>
<p>In line with <a href="https://rfcs.emberjs.com/id/0821-public-types/">RFC 0821: Public API for Type-Only Imports</a>, this PR also removes support for importing the types for <code>Transition</code>, <code>RouteInfo</code>, and <code>RouteInfoWithMetadata</code> from the private locations that DefinitelyTyped presently supports for backwards compatibility. Users will need to migrate to using the correct import paths when switching to use these imports.</p>
<ul>
<li><code>import Transition from '@ember/routing/-private/transition'</code> → <code>import Transition from '@ember/routing/transition'</code></li>
<li><code>import RouteInfo from '@ember/routing/-private/route-info'</code> → <code>import RouteInfo from '@ember/routing/route-info'</code></li>
<li><code>import { RouteInfoWithMetadata } from '@ember/routing/-private/route-info-with-metadata'</code> → <code>import { RouteInfoWithMetadata } from '@ember/routing/route-info'</code></li>
</ul>
<h2 id="newtypescriptusers">New TypeScript users</h2>
<p><em>This section only applies if you are trying out the types for the first time!</em></p>
<p>For the moment, the best way to get started with these types is to install <code>ember-cli-typescript</code> and use its generators, then <em>remove</em> a lot of what it does. We will be fixing this in the weeks ahead!</p>
<p>Here’s the process as of today:</p>
<ol>
<li><p>Set up <code>ember-cli-typescript</code> by running <code>ember install ember-cli-typescript</code>.</p></li>
<li><p>Remove the following newly-added packages from your <code>package.json</code>:</p>
<ul>
<li><code>@types/ember</code></li>
<li><code>@types/ember__application</code></li>
<li><code>@types/ember__array</code></li>
<li><code>@types/ember__component</code></li>
<li><code>@types/ember__controller</code></li>
<li><code>@types/ember__debug</code></li>
<li><code>@types/ember__destroyable</code></li>
<li><code>@types/ember__engine</code></li>
<li><code>@types/ember__error</code></li>
<li><code>@types/ember__helper</code></li>
<li><code>@types/ember__modifier</code></li>
<li><code>@types/ember__object</code></li>
<li><code>@types/ember__owner</code></li>
<li><code>@types/ember__polyfills</code></li>
<li><code>@types/ember__routing</code></li>
<li><code>@types/ember__runloop</code></li>
<li><code>@types/ember__service</code></li>
<li><code>@types/ember__string</code></li>
<li><code>@types/ember__template</code></li>
<li><code>@types/ember__test</code></li>
<li><code>@types/ember__utils</code></li></ul></li>
<li><p>Install a version of <code>ember-source</code> greater than <code>4.8.0-beta.2</code>. You should pick the latest beta of 4.8 <em>or</em> any stable version starting with 4.8.0 once it's out!</p></li>
<li><p>In the <code>types/&lt;your-app&gt;/index.d.ts</code> file generated for you automatically by <code>ember-cli-typescript</code>, add the new imports as the first items in the file, and remove the array prototype extensions support from the file. With the defaults generated for you, the result would look like this:</p>
<pre><code class="diff language-diff">+import 'ember-source/types';
+import 'ember-source/types/preview';
-import Ember from 'ember';
-
-declare global {
- // Prevents ESLint from "fixing" this via its auto-fix to turn it into a type
- // alias (e.g. after running any Ember CLI generator)
- // eslint-disable-next-line @typescript-eslint/no-empty-interface
- interface Array&lt;T&gt; extends Ember.ArrayPrototypeExtensions&lt;T&gt; {}
- // interface Function extends Ember.FunctionPrototypeExtensions {}
-}

export {};
</code></pre></li>
</ol>
<h2 id="knownissues">Known issues</h2>
<p>The first beta release has the following known issues (which we will fix during the beta period):</p>
<ul>
<li>The <code>@types/ember-data</code> packages are not compatible with these types, because they assume the presence of many of the Ember Classic types we removed in this migration. If you are using Ember Data with TypeScript, you will need to wait for a future update.</li>
<li>The import file for stable types does not exist yet, so TypeScript will warn you that there is no type for the module. We expect to fix this before releasing <code>4.8.0-beta.3</code>!</li>
</ul>
<h2 id="whatsnextonembersroadtotypescript">What's next on Ember’s road to TypeScript?</h2>
<p>Now that we have these preview types in place, we can begin publishing types in a stable way as soon as our build tooling for Ember itself supports it. As we do so, more and more the types will be provided by the <code>import 'ember-source/types';</code> import, and fewer from the <code>import 'ember-source/types/preview';</code> import. That will largely be transparent to you as an end user. Where there are be small differences, we will note them as it happens!</p>
<p>We <em>hope</em> to progressively switch over from these preview types to the stable types in the 4.9–4.11 time frame—that is, before the 4.12 LTS candidate release comes out. As always with software, and especially open source software, there are no guarantees, though!</p>
<p>We are also working on a “quest” issue for getting the rest of <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan/">RFC 0800</a> implemented. There are a <em>lot</em> of other core packages which need to publish types for us to get all the way to our goal of having first-class TypeScript support for the ecosystem. We could use your help! If you’d like to pitch in, check out <a href="https://github.com/emberjs/ember.js/issues/20162">the tracking issue</a> and reach out <a href="https://discord.com/channels/480462759797063690/786312479620726804">in <code>#dev-typescript</code> on Discord</a>!</p>
<p>In parallel, there are two other big efforts in flight:</p>
<ol>
<li><p>The Ember TypeScript team is making steady progress on getting <a href="https://typed-ember.gitbook.io/glint">Glint</a> to its 1.0 release.</p>
<ul>
<li><p>We recently shipped basic support for TypeScript <a href="https://www.typescriptlang.org/docs/handbook/project-references.html">project references</a>, i.e. the <code>--build</code> command, and expect to finish that up by supporting <code>--build --watch</code> mode in the next month or two.</p></li>
<li><p>We supported Framework Core team member emeritus <a href="https://github.com/chadhietala">@chadhietala</a> in landing full support for <a href="https://github.com/glimmerjs/glimmer-experimental">GlimmerX</a> in Glint.</p></li>
<li><p>We identified a significant refactor we can make which will let us give <em>much</em> better type errors and eliminate a number of tricky edge cases. (If you’ve hit the “Expected 3 arguments but got 2” error for an item which only <em>has</em> two arguments, this will fix that and a bunch of others as well!)</p></li></ul></li>
<li><p>The Ember Learning team is working closely with the Ember TypeScript team and to build out support for TypeScript in our API docs and the Guides. The effort is being led by a community member, <a href="https://github.com/ttbach">@ttbach</a>—and she could also use your help, too! Most of the work here does <em>not</em> require TypeScript expertise, only the ability to work on Node tools, so it’s another great spot to jump in. Reach out to <code>@thaobach</code> in <a href="https://discord.com/channels/480462759797063690/480777444203429888"><code>#dev-ember-learning</code></a> if you would like to contribute!</p></li>
</ol>
<p>That’s it for now, but keep your eyes open for further blog posts about the TypeScript effort and other parts of Polaris!</p>]]></description><link>https://blog.emberjs.com/announcing-official-typescript-types-public-preview</link><guid isPermaLink="true">https://blog.emberjs.com/announcing-official-typescript-types-public-preview</guid><pubDate>Fri, 16 Sep 2022 16:30:00 GMT</pubDate></item><item><title><![CDATA[Announcing the Ember.js Security Policy]]></title><description><![CDATA[<p>We know that building your apps on top of a framework requires
trust, and that trust is never put to the test more than when security
vulnerabilities are discovered.</p>
<p>While we're very fortunate to work on an open source project that runs
in a sandboxed environment, the browser, we realize that even JavaScript
applications can be vulnerable to attacks from malicious third-parties.</p>
<p>Ember.js is designed to mitigate common forms of attack. For example,
all values rendered using Handlebars are automatically escaped to
prevent XSS attacks, and developers must explicitly opt in to outputting
raw HTML.</p>
<p>To ensure that Ember applications stay safe, today we're announcing the
<a href="/security">Ember.js Security Policy</a>, to help security researchers and
developers responsibly disclose potential vulnerabilities in Ember and
Ember Data.</p>
<p>We have also set up the <a href="https://groups.google.com/forum/#!forum/ember-security">Ember.js security announcements mailing
list</a>. This is
an extremely low-traffic mailing list reserved solely for announcing
security releases of the framework. If you're deploying Ember to
production, you or your security team may wish to subscribe.</p>
<p>To be clear, there are no vulnerabilities we're aware of at this time
and there is not a security release forthcoming. We take security
extremely seriously and believe that having a procedure in place ahead of
time will allow us to respond most effectively should the
worst happen.</p>
<p>If you have any questions or concerns that are not addressed by the new
security policy, please email us at
<a href="mailto:security@emberjs.com">security@emberjs.com</a>.</p>
<p>I'd like to thank the Ruby on Rails security team, from whom our
security policy was lifted almost wholesale, for serving as a role model
for open source projects everywhere.</p>
<p>Lastly, my personal thanks to <a href="https://twitter.com/tenderlove">Aaron "tenderlove"
Patterson</a> and <a href="https://twitter.com/bascule">Tony "bascule"
Arcieri</a> for reviewing our policy and
answering many of my ignorant questions.</p>
<p>Let's stay safe out there.</p>]]></description><link>https://blog.emberjs.com/announcing-the-ember-security-policy</link><guid isPermaLink="true">https://blog.emberjs.com/announcing-the-ember-security-policy</guid><pubDate>Fri, 05 Apr 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Announcing The Glimmer 2 Alpha]]></title><description><![CDATA[<p>In this year's <a href="https://www.youtube.com/watch?v=OInJBwS8VDQ&list=PL4eq2DPpyBblc8aQAd516-jGMdAhEeUiW">EmberConf keynote</a>,  Yehuda mentioned that we are working on a highly optimized rendering engine for Ember called Glimmer 2.</p>
<p>On behalf of all the contributors who have lent a hand along the way, I am very excited to announce that we have released Ember 2.9.0-alpha.1, the first official build with Glimmer 2 included.</p>
<h2 id="akeymilestone">🔑 A Key Milestone 🔑</h2>
<p>During the alpha testing period, we will publish new alpha builds on a weekly cadence, following the <a href="http://emberjs.com/builds/#/beta">beta releases schedule</a>. The alpha releases will be cut from the <code>master</code> branch, but with all <a href="https://guides.emberjs.com/v2.7.0/configuring-ember/feature-flags/">experimental features</a> other than <code>ember-glimmer</code> stripped from the builds.</p>
<p>The purpose of the alpha releases is to enable our community – especially the addon and tooling ecosystem – to start testing the new engine for compatibility and offer feedback. Needless to say, the alpha releases are not intended for production use.</p>
<p>To test your apps with the alpha builds, run <code>bower install --save ember#alpha</code> and follow the prompt to persist the resolution.</p>
<p>From Ember's perspective, integrating Glimmer 2 does not expose any new user-facing features. Even though it is a complete rewrite under the hood, <strong>we expect the final release to be a drop-in, completely backwards compatible upgrade</strong> for virtually all Ember users. Notably, we will follow our usual <a href="http://semver.org">SemVer</a> guarantee and ensure all public APIs continue to function as advertised. At this point, we do not expect to introduce any new deprecations along with the initial release.</p>
<p>That being said, despite our <a href="https://github.com/emberjs/ember.js/issues/13127">best efforts</a>, we might not have gotten every detail right in our very first attempt, hence the alpha releases. We would really appreciate it if you could start testing your applications and report any regressions. You may refer to the <a href="https://github.com/emberjs/ember.js/issues/13949">GitHub issue</a> for a list of known issues.</p>
<p>It is worth noting that the version number (2.9.0-alpha.1) does not imply the new engine will be automatically included in the 2.9 final release. Like any other changes, the Glimmer 2 integration is subject to the usual rigor and stability requirements of our <a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">release process</a>. The core team will make the final decision on when to promote the feature into beta and stable releases based on our learnings from the alpha period.</p>
<p>Based on current information, the 2.8-LTS release (when available) will likely be the final <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">LTS release</a> to include the current-generation rendering engine, which will be supported with critical bugfixes until at least May 2017 and security patches until at least October 2017.</p>
<h2 id="anoteonperformance">🚀 A Note On Performance 🚀</h2>
<p>While one of the overarching goals of Glimmer 2 is to improve performance, the immediate priority in the alpha phase is maximal compatibility. We are barely scratching the surface with the possible optimizations unlocked by the new engine, and once the dust settles there will be ample headroom for further improvements.</p>
<p>That being said, you should start seeing some improvements in rendering performance with each alpha release, as well as reduced download/parsing time thanks to the new templates serialization format.</p>
<p>We are also aware of a few minor bugs that cause performance problems in the first alpha release, which we plan to address quickly. However, it is also possible that we inadvertently regressed performance in certain scenarios. If you noticed certain common patterns have become slower, please report them as bugs.</p>
<p>As always – when running performance benchmarks, <strong>please make sure you are using the minified production build</strong> (<code>ember.min.js</code>). The debug builds contain a lot of helpful development aids that are known to impact performance negatively.</p>
<h2 id="awholelotmoretocome">🎁 A Whole Lot More To Come 🎁</h2>
<p>Besides performance, Glimmer 2 has laid a solid foundation for us to build on.</p>
<p>The project originally started when Tom, Yehuda and I spiked on implementing "angle bracket components" in the HTMLBars ("Glimmer 1") engine over a year ago. This exercise highlighted some fundamental misalignments between the current rendering stack and the direction Ember is headed.</p>
<p>While HTMLBars handled basic templating, it left the implementation of many of Ember's view layer features (notably components) up to Ember itself. Not only did it make new features more difficult to implement, it made it hard to implement them <em>efficiently</em> out of the gate.</p>
<p>As Ember has moved towards components and "data-down, actions-up", we wanted to do many optimizations that weren't a good fit for the HTMLBars architecture. The lessons we learned from the spike ultimately leading us down the journey that is now known as the Glimmer 2 architecture. The underlying technologies are very interesting, but I will save those details for another time.</p>
<p><strong>As an Ember user, you can expect the new engine to unlock some long-awaited features</strong>, such as FastBoot rehydration and a refreshed approach to components once the initial integration is complete.</p>
<h2 id="abigthankyou">❤️ A Big Thank You ❤️</h2>
<p>Since <a href="https://github.com/tildeio/glimmer/compare/rip-htmlbars…master">forking HTMLBars</a>, the Glimmer repo has received over 700 commits, not to mention the <a href="https://github.com/emberjs/ember.js/issues?page=1&q=label%3AGlimmer2+is%3Aclosed">integration effort</a> that happened on the Ember side, all of which would not be possible without the help from our community.</p>
<p>Thank you to every one who helped us get here – from the <a href="http://emberjs.com/sponsors/">companies</a> who donated employees' time to the individual contributors who made personal sacrifices to make this happen.</p>
<p>With all of that out of the way – <em>happy alpha testing</em>! 🍾🎊🎉</p>
<hr />
<h2 id="furtherreadingwatching">📚 Further Reading/Watching 📚</h2>
<ul>
<li>🔜 Stay tuned for more <em>Inside Glimmer 2</em> articles from this blog</li>
<li>🚧 <a href="https://github.com/tildeio/glimmer/blob/master/guides/01-introduction.md">Glimmer Architecture Guides</a></li>
<li><a href="https://www.youtube.com/watch?v=OInJBwS8VDQ&list=PL4eq2DPpyBblc8aQAd516-jGMdAhEeUiW&index=1">Opening Keynote</a> from EmberConf 2016</li>
<li><a href="https://www.youtube.com/watch?v=dpx9P1cz37k&list=PL4eq2DPpyBblc8aQAd516-jGMdAhEeUiW&index=23">The Future of Ember Templating</a> from EmberConf 2016</li>
<li><a href="https://www.youtube.com/watch?v=vg5A_UOGShg">Inside Glimmer 2: What Is A Compiler?</a></li>
<li><a href="https://www.youtube.com/watch?v=vL8sCi1Bv6E">Glimmer 2 Deep Dive</a></li>
</ul>]]></description><link>https://blog.emberjs.com/announcing-the-glimmer-2-alpha</link><guid isPermaLink="true">https://blog.emberjs.com/announcing-the-glimmer-2-alpha</guid><pubDate>Fri, 29 Jul 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Another Ember 2.x Status Update]]></title><description><![CDATA[<p>We're a few weeks away from the release of Ember 1.13 and Ember 2.0 beta, and while there's been a lot of focus on those releases, the trains will keep rolling on June 12. There will be a 2.1 release 6 weeks hence, and a 2.2 release 6 weeks later.</p>
<!-- alex ignore easy just -->
<p>With all of the focus on Ember 2.0, it's easy to forget that 2.0 is just a six-week release, with the added ability to remove some built-up cruft. Because of the symbolic nature of 2.0, discussions about the future have had an artificial end date of June 12, which is now three weeks away.</p>
<p>This post gives some more details about what cruft will be removed in Ember 2.0 and, since the first features in Ember 2.1 will land in three weeks, what we plan to do in the early releases of Ember 2.x.</p>
<p>It's important to note that we've talked a lot about an improved "Ember 2 programming model" over the past several months, significantly inspired by React. While much of the model will be in place in Ember 2.0, the early releases of Ember 2.x (especially 2.1 and 2.2), will finish up some important features. This blog post details the expected timeline.</p>
<p>Note that the six-week release cycle means that we ship on a train cycle, so the precise versions of specific features may change before they land in a final release.</p>
<h2 id="removals">Removals</h2>
<p>While we've spent a lot of time talking about the new features that Ember is getting over the next few months, the 2.0 release itself is more about removals and de-cruft-ification.</p>
<p>Some notable examples:</p>
<ul>
<li>Context-shifting helpers (<code>#with item</code> becomes <code>#with item as |i|</code>,
<code>#each list</code> becomes <code>#each list as |item|</code>)</li>
<li>Fake block params versions of helpers (<code>#with foo as bar</code> becomes
<code>#with foo as |bar|</code>, <code>#each item in list</code> becomes
<code>#each list as |item|</code>)</li>
<li>The <code>ArrayPolyfills</code> and <code>EnumerableUtils</code> libraries are being
pulled out into a library; most apps should prefer lodash or other
utility libs.</li>
<li>In <code>#each</code>, the options <code>itemController</code>, <code>itemViewClass</code>,
<code>itemView</code>; superseded by using a component inside the loop</li>
<li>In <code>#with</code>, the <code>controller</code> option</li>
<li>The <code>Ember.Handlebars</code> namespace and all of its properties</li>
<li><code>bind-attr</code>, superseded by using attributes</li>
<li>The legacy names <code>bindAttr</code> and <code>linkTo</code></li>
<li>The <code>{{collection}}</code> helper</li>
<li>The <code>{{template}}</code> helper; superseded by <code>{{partial}}</code></li>
<li>The <code>{{render}}</code> helper; superseded in most cases by components</li>
<li>Manually rendering a string into the buffer in a view</li>
<li><code>Ember.Deferred</code>; superseded by normal promises</li>
<li>The globals resolver, which will be moved into an external library;
superseded in normal use by the ES6 module resolver</li>
</ul>
<p>While top-level controllers will not be removed in 2.0 (see more below), we will remove all of the other uses of controllers from templates (such as <code>#with controller=</code>, <code>{{render}}</code>, <code>itemController</code> and others).</p>
<p>In all of these cases, we did significant work in the 1.x series, especially in 1.12 and 1.13, to make sure that the dominant use-cases for these features were addressed by existing or new features.</p>
<p>You can learn about all of the deprecations added in the 1.x era, along with the expected transition to the features that superseded them, in the <a href="http://emberjs.com/deprecations/v1.x/">1.x deprecations guide</a>.</p>
<h2 id="theglimmerengine">The Glimmer Engine</h2>
<p>The Glimmer engine, with its improved performance and improved support for the "data down, actions up" model, landed in Ember 1.13 beta.</p>
<h2 id="fastrerender">Fast Re-Render</h2>
<p>In Ember 1.12, calling rerender() on a component is an extremely expensive operation, and blows away all of the existing DOM (together with its internal state, such as selection, cursor, focus, scroll position and more).</p>
<p><strong>In Ember 1.13</strong>, thanks to the Glimmer engine, you can safely invoke rerender() and it will only update the parts of the template that have actually changed.</p>
<p>This allows you to replace an entire data structure with a totally new POJO, rerender the component, and get highly performant updates that preserve the DOM.</p>
<h2 id="newlifecyclehooks">New Lifecycle Hooks</h2>
<p>Because <code>rerender()</code> is now fast and reliable, any call to <code>component.set()</code> will trigger a re-render on the component. When a component re-renders, that may change the attributes of child components, which likewise are re-rendered.</p>
<p>As a result of the fact that <code>rerender()</code> is now such an important part of the programming model, <strong>Ember 1.13 beta</strong> got a bunch of new React-inspired lifecycle hooks:</p>
<ul>
<li><code>didUpdateAttrs</code>, invoked when a component's attributes have changed
but before the component is rendered.</li>
<li><code>willUpdate</code>, invoked before a component will rerender, whether
the update was triggered by new attributes or by rerender.</li>
<li><code>didUpdate</code>, invoked after a component has been rerendered.</li>
<li><code>didReceiveAttrs</code>, invoked when a component gets attributes, either
initially or due to an update.</li>
<li><code>willRender</code>, invoked before a component will render, either
initially or due to an update, and regardless of how the rerender
was triggered.</li>
<li><code>didRender</code>, invoked after a component has been rendered, either
initially or due to an update.</li>
</ul>
<p>These lifecycle hooks will fire on all components (but not views), regardless of invocation style (both curlies and angle bracket style).</p>
<h2 id="anglebracketcomponents">Angle Bracket Components</h2>
<!-- alex ignore easy -->
<p>Angle bracket components (<code>&lt;my-component&gt;</code>) are a very important part of the Ember 2.x programming model. In addition to nicer syntax, they serve as an opt-in for component changes that we could not easily make compatibly, such as default one-way bindings.</p>
<p>We originally thought that angle-bracket components would land in time for Ember 1.13, and they have already landed on Canary, and were included in the first 1.13 beta release.</p>
<p>However, there were some late-breaking concerns, and we have decided to defer this feature so we can write an RFC and go through the regular process. We have already written an implementation of the RFC, which we will land on Canary and keep up to date with the RFC discussions.</p>
<p>Because we are so close to the Ember 2.0 branch point, <strong>this feature is likely to land in Ember 2.1.</strong></p>
<h2 id="routeablecomponents">Routeable Components</h2>
<p>The routeable components RFC was first published several months ago, and has been the subject of vigorous discussion. It is one of the most anticipated features of the Ember 2.x programming model.</p>
<hr />
<p>(the following two paragraphs are a bit of insider baseball)</p>
<p>The primary reason to attempt to land this feature in Ember 2.0, despite the fact that its development is at a relatively early stage, was a desire to deprecate controllers for 2.0. In Ember, in order to deprecate a public API, we require an alternate path for all of the use-cases of the old feature. In order to remove a feature in 2.0, it would have needed to be deprecated in 1.13.</p>
<p>Together, that means that in order to remove controllers in 2.0, we needed to land routeable components, the transition from controllers, in 1.13. During the 1.13 canary cycle, it became apparent that removing controllers in 2.0 would be too aggressive, so the pressure to ship Routeable Components exactly in 2.0.0 is less.</p>
<hr />
<p>The work on Routeable Components, as well as work to make it possible to move query parameters fully to routes, is ongoing.</p>
<p>There are less than three weeks left until the 2.0-beta branch point, and given that the feature has not yet landed in Canary (and the importance and magnitude of the feature), it will probably land in 2.1 at the earliest.</p>
<p><strong>It is extremely likely to land in 2.1, or 2.2 at the latest.</strong></p>
<!-- alex ignore just -->
<p>The Routeable Component feature also includes a change that makes it possible to provide multiple asynchronous attributes to the component you are routing to, rather than just the <code>model</code> attribute. The <code>attrs</code> hook will run on every transition into the route, in contrast to the <code>model</code> hook, which doesn't run again in some cases.</p>
<h2 id="fastboot">FastBoot</h2>
<p>An early version of the FastBoot feature, suitable for SEO, is already available as an Ember addon that works with Ember 1.12. We expect the addon to work with the final release of 1.13.</p>
<p>Work on rehydrating FastBoot will begin very soon, and we hope to land it in Canary early in the 2.x release cycle.</p>
<h2 id="engines">Engines</h2>
<p>The Engines feature was first proposed as an <a href="https://github.com/tomdale/rfcs/blob/master/active/0000-engines.md">RFC</a> last year, and work on the feature itself will likely begin very soon.</p>
<p>We expect the Engines feature to land in Canary early in the 2.x release cycle.</p>]]></description><link>https://blog.emberjs.com/another-two-oh-status-update</link><guid isPermaLink="true">https://blog.emberjs.com/another-two-oh-status-update</guid><pubDate>Sun, 24 May 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Upcoming deprecation of baseURL in Ember CLI 2.7]]></title><description><![CDATA[<p>The <code>baseURL</code> configuration option and the accompanying <code>&lt;base&gt;</code> tag in Ember CLI applications are often and tragically misunderstood. There have been <a href="https://github.com/ember-cli/ember-cli/search?q=baseURL&type=issues">at least 67 issues</a> opened for Ember CLI referencing <code>baseURL</code>, making it one of the most common points of discussion. <strong><a href="https://github.com/ember-cli/ember-cli/pull/5792">As a result, in Ember CLI's canary channel, we have deprecated <code>baseURL</code> and removed the default <code>&lt;base&gt;</code> inside of <code>index.html</code>.</a></strong> The intent is that this change will be released with Ember CLI 2.7 stable in roughly 10 weeks.</p>
<p>Existing applications are able to continue using <code>baseURL</code> with a deprecation warning. If you are eager to adopt this change, you should note that the removal of the <code>&lt;base&gt;</code> tag may impact how your application is deployed, and if so, will likely require some small migration effort, detailed below.</p>
<p>This is the culmination of a lot of research and work by <a href="https://github.com/Turbo87">Tobias Bieniek</a> and we're incredibly grateful for his efforts.</p>
<h3 id="whatwasit">What was it?</h3>
<p><code>baseURL</code> allowed an Ember application and assets to be deployed to a subdirectory without requiring rewriting of asset URLs, instead allowing them to be included relatively. For example given an HTML file:</p>
<pre><code class="html language-html">&lt;head&gt;
  &lt;base href="http://emberapp.example.com/path/to/application/"&gt;
  &lt;link rel="stylesheet" href="assets/style.css"&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;img src="assets/images/image.png"&gt;
&lt;/body&gt;
</code></pre>
<p>The style would be fetched from <code>http://emberapp.example.com/path/to/application/assets/style.css</code>, and the image from <code>http://emberapp.example.com/path/to/application/assets/images/image.png</code>. If you are curious, <a href="http://webdesign.tutsplus.com/articles/quick-tip-set-relative-urls-with-the-base-tag--cms-21399">here is a good read on the base tag</a>. In short, <code>baseURL</code> is the configuration property Ember CLI used to identify what value to put in the <code>&lt;base href="..." /&gt;</code> tag included in <code>index.html</code>. This determined where assets for the application should be loaded from, including <code>app.js</code>, <code>vendor.js</code>, <code>app.css</code>, and anything else that isn't specified with a fully-qualified path.</p>
<h3 id="whyarewedeprecatingit">Why are we deprecating it?</h3>
<p>Variations on the <code>baseURL</code> solution has been Ember CLIs default asset prefixing behavior for <a href="https://github.com/ember-cli/ember-cli/commit/404091401400478ef55088888b8ec383e02a17d6#diff-b785f57fd6a80a44da40bd76e531d8ecR11">two years</a>. There are a number of reasons why we're moving away from this pattern, but a few things really made it unnecessarily complicated.</p>
<h4 id="apidesignbugs">API Design Bugs</h4>
<p>Since we added this feature two years ago apps can have both <code>baseURL</code> and <code>rootURL</code> configuration values. These two names are far too similar and do things which are far too similar. Where <code>baseURL</code> identified the asset prefix of an application, <code>rootURL</code> identifies the path at which an Ember application is served so Ember's router can know which path segments to ignore.</p>
<h4 id="implicitbehavior">Implicit Behavior</h4>
<p>Not only are there two confusing configuration options, but if only one of <code>baseURL</code> or <code>rootURL</code> was set Ember CLI made a best-effort guess at populating the other's value. This implicit behavior violated the principle of least surprise for many people. An explicit requirement for both values always being set and clearer documentation would have averted <em>some</em> of the pain but would have added additional things to the learning curve.</p>
<h4 id="integrationwithotherapplications">Integration With Other Applications</h4>
<p>Not every Ember application is full green field development. If you happened to have legacy user-generated HTML, or other data containing relative links, this didn't play nicely with the <code>&lt;base&gt;</code> tag. Rewriting this content is an option, but incurs cost and bugs that can be avoided by not including the <code>&lt;base&gt;</code> tag.</p>
<h4 id="svg">SVG</h4>
<p>Worst of all, and something that we can't code or document around, SVG <code>&lt;use&gt;</code> elements break in an unexpected way when used with a <code>&lt;base&gt;</code> tag. It turns out that the relatively common pattern of <code>&lt;use xlink:xhref="#__SVG_ID__"&gt;&lt;/use&gt;</code> referencing a fragment identifier doesn't play nicely with the <code>&lt;base&gt;</code> tag. We like to play nicely with the web ecosystem and this fault is the final straw that resulted in the decision of removing the <code>&lt;base&gt;</code> tag.</p>
<h3 id="howdoimigrate">How Do I Migrate?</h3>
<!-- alex ignore easy -->
<p>Existing applications are able to continue using <code>baseURL</code> with a deprecation warning. For users who do want to migrate, the steps depend primarily on how your application is deployed. It's our goal is to make it easy for you to achieve the same behaviors you've had in the past.</p>
<h4 id="newapplications">New Applications</h4>
<p>If you're starting a new application using an Ember CLI canary (or eventually 2.7 stable) everything should work correctly out of the box. We've been very careful to make sure that the out of the box experience is as smooth as possible. For the built-in development server all assets will be served at the <code>rootURL</code>. Relative URLs will continue to work fine inside of your CSS files and paths to assets included in your templates, <code>index.html</code>, or inserted via <code>{{content-for}}</code> should specify a root-relative path.</p>
<h4 id="upgrading">Upgrading</h4>
<p>If you are upgrading your application to the new version of Ember CLI (canary with this change, or eventually 2.7 stable), you should pay close attention to the configuration changes inside of <a href="https://github.com/ember-cli/ember-cli/pull/5792/files#diff-42e917b9304df0e99048f335019647bc">the</a> <a href="https://github.com/ember-cli/ember-cli/pull/5792/files#diff-f4d09ffc13efe496dd246031d423e166">modified</a> <a href="https://github.com/ember-cli/ember-cli/pull/5792/files#diff-9588ab8abb99afa6cac30dd0e2b86041">blueprint</a> <a href="https://github.com/ember-cli/ember-cli/pull/5792/files#diff-3b0f91e0e9f317eecebfad38da2f9b4c">files</a>. We have also inserted deprecation warnings which will hopefully guide you through each of these changes.</p>
<p>The primary migration effort is that you should expect to adjust any relative paths which appear in your templates, are inserted via <code>{{content-for}}</code>, or directly present in <code>index.html</code>. Because you will be serving <code>index.html</code> from the server for any arbitrary route in your application you must modify these to be either a fully-qualified path or a root-relative URL.</p>
<p>As an example, given this configuration where you have configured a different <code>rootURL</code> and <code>baseURL</code>:</p>
<pre><code class="javascript language-javascript">// config/environment.js
var ENV = {
  /* ... */
  rootURL: '/path/to/application/',
  baseURL: '/assets/go/here/'
  /* ... */
}
</code></pre>
<p>You would remove the <code>baseURL</code> option and modify your templates like so:</p>
<pre><code class="handlebars language-handlebars">{{!-- Old: --}}
&lt;img src="images/logo.png" /&gt;

{{!-- New: --}}
&lt;img src="/assets/go/here/images/logo.png" /&gt;
</code></pre>
<h4 id="howtouseacdn">How To Use a CDN</h4>
<p>One of the most common use cases for <code>baseURL</code> was pointing to assets on a CDN. After this change to remove <code>baseURL</code> you should use the <code>prepend</code> option for <a href="https://github.com/rickharrison/broccoli-asset-rev"><code>broccoli-asset-rev</code></a> which is included with Ember CLI apps by default. For example, in <code>ember-cli-build.js</code>:</p>
<pre><code class="javascript language-javascript">// ember-cli-build.js
var app = new EmberApp(defaults, {
  // Add options here
  fingerprint: {
    prepend: 'https://cdn.example.com/'
  }
});
</code></pre>
<p>Note that the <code>prepend</code> option only applies when doing <em>production</em> builds via something like <code>ember build --prod</code>. Given the above example, and this input:</p>
<pre><code class="javascript language-javascript">// config/environment.js
var ENV = {
  /* ... */
  rootURL: '/path/to/application/'
  /* ... */
}
</code></pre>
<pre><code class="html language-html">&lt;!-- Snipped from the &lt;head&gt; of the new `index.html` blueprint.  --&gt;
&lt;link rel="stylesheet" href="{{rootURL}}assets/vendor.css"&gt;
&lt;link rel="stylesheet" href="{{rootURL}}assets/app-name.css"&gt;
</code></pre>
<p>The output for asset paths in <code>index.html</code> would look something like:</p>
<pre><code class="html language-html">&lt;link rel="stylesheet" href="https://cdn.example.com/path/to/application/assets/vendor-e37004361bf9cda2ab3379d96c9eba4b.css"&gt;
&lt;link rel="stylesheet" href="https://cdn.example.com/path/to/application/assets/app-name-dc477601773d4043b0c461b2a0ae8aef.css"&gt;
</code></pre>
<p>Note that <code>rootURL</code> <em>is present</em> as part of the path for the CDN-hosted assets inside of <code>index.html</code>. <code>rootURL</code> is an Ember CLI concept primarily concerned with supporting the behavior of <code>ember server</code>.</p>
<h4 id="configuringtherouter">Configuring the Router</h4>
<p>We also use the setting for <code>rootURL</code> at runtime in the application's router:</p>
<pre><code class="javascript language-javascript">// app/router.js
import Ember from 'ember';
import config from './config/environment';

const Router = Ember.Router.extend({
  rootURL: config.rootURL
});
</code></pre>
<p>In most cases this does exactly what you want it to do. However, if you wish to mount the application at a different place than the Ember CLI <code>rootURL</code> specifies for its <code>ember serve</code> location, you may add an additional property in your config, <code>routerRootURL</code>, to specify the path that your application will live at runtime.</p>
<pre><code class="javascript language-javascript">// config/environment.js
var ENV = {
  /* ... */
  rootURL: '/',
  routerRootURL: '/path/to/application/'
  /* ... */
}
</code></pre>
<p>You would then reference that inside of your application's router like so:</p>
<pre><code class="javascript language-javascript">const Router = Ember.Router.extend({
  rootURL: config.routerRootURL
});
</code></pre>
<p>This provides a method to remove the  <code>'/path/to/application/'</code> prefix from assets inside of <code>index.html</code> which will be served from a CDN.</p>
<h4 id="cssfontsandotherstaticassets">CSS, Fonts, and Other Static Assets</h4>
<p>Depending upon how these were included into an application, their paths may need to be adjusted. Assets like these are often handled outside the Ember CLI build pipeline, but do check to make sure that everything is works as expected.</p>
<h4 id="addonconsumptionanddevelopment">Addon Consumption and Development</h4>
<p>It's possible that you have addons which rely on rewriting asset URLs. If there is any impact, it is most likely going to impact users of <code>ember-cli-deploy</code>. Please let us know what you discover during this canary/beta process, we'd like to see what each addon is attempting to accomplish and make sure we can support that use case.</p>
<h4 id="everythingisbrokenhelp">Everything is Broken! Help!</h4>
<p>If for some reason removing <code>baseURL</code> and the default <code>&lt;base&gt;</code> tag causes problems, you can still add a <code>&lt;base&gt;</code> tag directly to your <code>index.html</code> file:</p>
<pre><code class="html language-html">&lt;base href="/what/your/baseURL/was/" /&gt;
</code></pre>
<p>This can be useful to address relative URLs which are being inserted via templates, <code>index.html</code>, or <code>{{content-for}}</code>. For pathing to your built CSS and JS assets use the method described for CDNs.</p>
<h3 id="howcanitrythis">How Can I Try This?</h3>
<p>Using our new release channel setup, you can try this change by upgrading your Ember CLI app to the canary channel:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli/ember-cli#canary
</code></pre>
<p>If you discover any problems with this change please <a href="https://github.com/ember-cli/ember-cli/issues/new">file an issue</a>, we'll be paying especially close attention to this topic.</p>]]></description><link>https://blog.emberjs.com/baseURL</link><guid isPermaLink="true">https://blog.emberjs.com/baseURL</guid><pubDate>Thu, 28 Apr 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Cleaning Up Github Issues]]></title><description><![CDATA[<!-- alex ignore easy -->
<p>If you've been following along, the Ember issues tracker has grown to over 200 active issues. While this is better than some other large OSS projects, it's still too large for us on the core team to easily keep track of. There are also a number of issues that are over six months old and even a year or two old.</p>
<p>Declaring straight-up issue bankruptcy is appealing, but does a disservice to everyone involved. There's a lot of useful information here for the core team and many of these issues are things we are actively working on solving. So we're attempting to cut down on the number of issues in a bit more targeted way.</p>
<p>In many cases these old issues stuck around because the solution was non-trivial and only a limited set of contributors was qualified to fix them. In some instances, a fix involves considerable internal refactoring that no one has yet had time to do and was hard to justify for one fix.</p>
<p>To help keep things manageable, we'll be consolidating these types of issues into single meta issues. Over time we do intend to refactor and clean up different parts of the internals and knowing what bugs we need to fix while we're at it will be helpful. The original issues will be closed to help reduce overall noise, but we'll still make sure to consider them when doing our refactoring. Please continue to comment on the original issue so we can keep things organized.</p>
<p>In some cases, we may close issues without a meta if there is a clean workaround (we don't want you to have to use hacks) or if the issue is very minor. If you think we miscategorized an issue, please let us know. We're also still happy to receive PRs for these issues, though it's probably wise to double check with us first.</p>
<p>I hope we can make the issue tracker more useful and effective for everyone.</p>]]></description><link>https://blog.emberjs.com/cleaning-up-github-issues</link><guid isPermaLink="true">https://blog.emberjs.com/cleaning-up-github-issues</guid><pubDate>Mon, 28 Jul 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Coming Soon in Ember Octane - Part 1: Native Classes]]></title><description><![CDATA[<p>(This post was originally published on <a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-1-native-classes/">www.pzuraq.com</a>)</p>
<!-- alex ignore nuts-->
<p>If you've been paying attention in Ember lately you may have heard the term "Octane" floating around here and there recently, and wondered what all the excitement was about. It may seem like a bit of a big deal - and that's because it kind of is! It's Ember's first new <em>edition</em>, proposed in the <a href="https://github.com/emberjs/rfcs/blob/master/text/0364-roadmap-2018.md">Ember 2018 Roadmap</a>, and represents a major shift in the mental model behind Ember.js and Ember applications. In this series, I'll be diving into some of the new features that are part of Octane (specifically the ones that are part of the <em>browser</em> side of the framework) and giving a brief overview of how the feature works, and why the feature is being added. The features I'm planning on discussing are:</p>
<ul>
<li>Native Classes (+Decorators)</li>
<li>Angle Bracket Syntax &amp; Named Arguments</li>
<li>Tracked Properties</li>
<li>Modifiers</li>
<li>Glimmer Components</li>
</ul>
<p>There <em>are</em> more features that are part of Octane, such as Ember's new file system layout (also known as Module Unification), template imports, and other build improvements, but these are a bit out of my scope - I've personally been focused on the story for developers in the browser, writing app and addon code, and how that's going to change.</p>
<!-- alex ignore dives dive-->
<p>This series is aimed at existing Ember users, but if you're new to Ember or tried Ember a while ago and want to see how things are changing, I'll be providing context on the existing features as we go along. These posts won't be doing deep dives on all the edge cases of the functionality, they are moreso meant as an overview of what's coming. If you can't already tell, I'm very excited about these new features and the future of Ember with them, and can't wait to see them land! So, let's dive in!</p>
<h3 id="whatareeditions">What Are Editions?</h3>
<p>Before we move onto Native Classes, let's talk about Ember Editions really quickly. Not many other frameworks have an equivalent for Editions, and they may seem a little confusing at first. So, what are they?</p>
<p>An Edition in Ember represents the culmination of all the changes that have happened in the framework since the last Edition. In a lot of other frameworks, this is like a new major version. It means we have significantly improved things, added new concepts and ideas, updated all the documentation and marketing materials, created new guides, battle-tested everything, and are confident that it is ready for mass adoption. In some ways, it's like a new release of a product version at a company - things have changed, and we're ready to blast out to the world that there's a whole "new" Ember!</p>
<!-- alex ignore just-->
<p>You might be asking yourself, why not just use SemVer's major versions to do this? Usually when a framework releases a new major version, there are new APIs and features and there's lots of buzz and excitement about that. So, why not just release Ember v4 and be done with it?</p>
<!-- alex ignore just-->
<p>The answer is in the way Ember treats and respects SemVer. We follow SemVer to the letter - patch versions include <em>only</em> bugfixes, minor versions include <em>only</em> new features and improvements, and major versions only <em>remove</em> deprecated APIs. No new features are <em>ever</em> introduced on a major Ember version. This makes updating your app much simpler - there's no need to rewrite a component or service, or update to the new ways of doing things, just remove the deprecated features (which issue console warnings when used) and you should be able to bump the version without problems.</p>
<p>In this model, new features are introduced gradually over the course of a single major version, allowing users to adopt them incrementally. This is amazing for app maintenance - instead of having a new major version be released and having to go update everything all at once, you can do it one piece at a time, as the new things are released.</p>
<!--alex ignore remain-->
<p>However, because this is done incrementally it can also sometimes mean that the new experience isn't really all that polished. After all, the docs and guides have to continue supporting the existing features, and remain cohesive. Adding every new feature to them immediately could quickly make them overwhelming for new users. Additionally, sometimes features may be ready and complete in isolation, but really be part of a larger picture of new features that are still in the pipeline, and some folks would prefer to wait for all of the "new world" to land before adopting new features.</p>
<p>Editions are Ember's way to message to the community that the framework has synchronized, that all (or most) of the new features have shipped, and that it's time to update and adopt the new features. It's a tool that allows us to continue to use SemVer to signal <em>compatibility</em> changes exclusively, and have a different tool for signaling <em>major updates and new features</em>. This allows us to keep our core value of stability without stagnation, and be able to show off cool new things at the same time!</p>
<p>Alright, now let's move onto those new features in Octane!</p>
<h2 id="nativeclassesdecorators">Native Classes (+Decorators)</h2>
<!-- alex ignore just-->
<p>Native Javascript classes in Ember are near and dear to my heart. I first began exploring them almost 2 years ago now, when I first approached <a href="https://twitter.com/rwjblue">@rwjblue</a> about the state of <a href="https://ember-decorators.github.io/ember-decorators/">ember-decorators</a> ("ember-computed-decorators" at the time). I was tasked with building out our documentation internally, and wanted something more ergonomic than YUIDoc/JSDoc style tags and comments that required you to manually name and tag every single method, property, and parameter. I had heard from <a href="https://twitter.com/runspired">@runspired</a> some time before that native classes actually <em>mostly</em> worked with Ember already, and just needed a little bit of finagling to get all the way there.</p>
<!-- alex ignore just-->
<p>It turned out that was half-true - native classes did work pretty well with Ember's own classes, but there were some pretty major changes we needed to make to get them to be just as ergonomic and usable as Ember's classic class syntax, which was beginning to look more and more dated by the day. These changes were ultimately <em>small</em>, but they were deep in the internals of Ember, and operating on them was an almost surgical process, with little room for error or regression.</p>
<!-- alex ignore remain-->
<p>Today, native classes are fully supported in Ember, with a rock solid public API and well defined, ergonomic behavior. However, they are one of those features that are part of a larger picture, specifically they require <em>class fields and decorators</em> to be used effectively. Class fields are currently stage 3 in the TC39 process, which is generally supported by Ember for early adoption, but decorators remain at stage 2 after the January 2019 TC39 meeting. As we will discuss, decorators are crucial to using Native Classes effectively because Ember <em>has been using the decorator pattern all along</em>!</p>
<p>We have plans to continue working with TC39, along with the other major users of decorators (TypeScript, Angular, Vue, MobX, etc) to standardize and stabilize the syntax enough for us to land them in the framework, and while that may end up being some time after EmberConf, we already have the <em>behavior</em> of decorators spec'd out and implemented behind a feature flag. They will be available to play around with by EmberConf, so you'll be able to try them out with native classes to see how they work. If you're impatient, you can also always use <a href="https://ember-decorators.github.io/ember-decorators/">ember-decorators</a>, which matches the behavior of the proposed decorators exactly.</p>
<p>Enough background, let's move onto some demonstrations!</p>
<h3 id="classesinaction">Classes in Action</h3>
<p>Classes have existed since the very earliest versions of Ember, when it was still named SproutCore 2. Back in 2011, ES6 did not yet exist, and a true native class syntax wasn't even a remote possibility. Many frameworks ended up creating their own class-like wrappers around JavaScript's prototypical inheritance, Ember included. It looked very much like it looks today:</p>
<pre><code class="javascript language-javascript">// A person class defined in Ember v1
var Person = Ember.Object.extend({
  firstName: 'Steve',
  lastName: 'Rogers',

  fullName: function() {
    return this.get('firstName') + ' ' + this.get('lastName');
  }.property('firstName', 'lastName'),

  updateName: function(firstName, lastName) {
    this.set('firstName', firstName);
    this.set('lastName', lastName);
  },
});

// Make an instance of the class, overriding default values
let phoenix = Person.create({ firstName: 'Jean', lastName: 'Gray' });

// A person class defined with current class syntax
import EmberObject, { computed } from '@ember/object';

const Person = EmberObject.extend({
  firstName: 'Steve',
  lastName: 'Rogers',

  fullName: computed('firstName', 'lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  }),

  updateName(firstName, lastName) {
    this.set('firstName', firstName);
    this.set('lastName', lastName);
  },
});

// Make an instance of the class, overriding default values
let phoenix = Person.create({ firstName: 'Jean', lastName: 'Gray' });
</code></pre>
<!-- alex ignore just-->
<p>There are some noticeable differences here, but most of these are unrelated to changes in the class syntax. We now have the niceties of ES2018 such as template strings and object-method syntax, and we no longer need to use <code>get</code> to get values, but we do still need to use <code>set</code> (that's being addressed by a different feature, <em>tracked properties</em>, that I'll be discussing in a later post in this series). The only major change to the mechanics of classes is the change to the way we define computed properties - in the older style, we used the <code>.property()</code> notation which was available because we added it to <code>Function.prototype</code> (<strong>very much an antipattern!</strong>), and now we just use the <code>computed</code> function to wrap the getter directly.</p>
<p>Let's take a look at what this looks like when converted to native classes:</p>
<pre><code class="javascript language-javascript">import EmberObject, { computed } from '@ember/object';

class Person extends EmberObject {
  firstName = 'Steve';
  lastName = 'Rogers';

  @computed('firstName', 'lastName')
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }

  updateName(firstName, lastName) {
    this.set('firstName', firstName);
    this.set('lastName', lastName);
  }
}

// Make an instance of the class, overriding default values
let phoenix = Person.create({ firstName: 'Jean', lastName: 'Gray' });
</code></pre>
<p>Now that's much cleaner! We have far fewer opening and closing brackets, and we're using the native <code>get fullName()</code> syntax to define the getter meaning we don't have to remember that funky <code>computed()</code> syntax. Computed properties are decorators now, and assigned values are class fields. In fact, we can go one step further - we don't even need to extend from <code>EmberObject</code> anymore:</p>
<pre><code class="javascript language-javascript">import { computed, set } from '@ember/object';

class Person {
  firstName = 'Steve';
  lastName = 'Rogers';

  constructor(firstName, lastName) {
    this.updateName(firstName, lastName);
  }

  @computed('firstName', 'lastName')
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }

  updateName(firstName, lastName) {
    set(this, 'firstName', firstName);
    set(this, 'lastName', lastName);
  }
}

// Make an instance of the class, overriding default values
let phoenix = new Person('Jean', 'Gray');
</code></pre>
<p>We can completely drop the weight of using Ember's legacy class system and rely solely on native classes this way. This is awesome! In the future this means we'll be able to remove a large chunk of Ember's legacy code and leverage the platform instead, making our apps faster to load and easier to write.</p>
<!-- alex ignore just-->
<p>Another thing you may have noticed in the above examples is that we're using the exact same import paths for everything, including <code>computed</code>. At first this may seem like a breaking change! How can <code>computed</code> be a modern class decorator <em>and</em> be used in classic class syntax, without breaking anything? Shouldn't it be imported from a different location or something? In fact, it doesn't need to be at all. <code>computed</code> is fully compatible with <em>both</em> classic classes and native classes, along with all existing computed property macros in Ember and the Ember addon ecosystem! This is perfectly valid syntax that will Just Work™️:</p>
<pre><code class="javascript language-javascript">import EmberObject, { computed, set } from '@ember/object';

const ClassicClassPerson = EmberObject.extend({
  firstName: 'Steve',
  lastName: 'Rogers',

  fullName: computed('firstName', 'lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  }),

  updateName(firstName, lastName) {
    this.set('firstName', firstName);
    this.set('lastName', lastName);
  },
});

class NativeClassPerson {
  firstName = 'Steve';
  lastName = 'Rogers';

  constructor(firstName, lastName) {
    this.updateName(firstName, lastName);
  }

  @computed('firstName', 'lastName')
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }

  updateName(firstName, lastName) {
    set(this, 'firstName', firstName);
    set(this, 'lastName', lastName);
  }
}

// Make an instance of the class, overriding default values
let classicClassSpiderMan = ClassicClassPerson.create({
  firstName: 'Peter',
  lastName: 'Parker',
});

let nativeClassSpiderMan = new NativeClassPerson('Peter', 'Parker');
</code></pre>
<p>The reason this is possible is, behind the scenes, <code>computed</code> has <em>always</em> been a decorator.</p>
<h3 id="decoratorsbeforedecorators">Decorators Before @Decorators</h3>
<p>You may be familiar with the proposed decorator syntax for JavaScript, but if not the basic gist is that you can "decorate" class fields and methods with additional behavior:</p>
<pre><code class="javascript language-javascript">class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  // memoizes the value, which caches it the first time
  // it is calculated and then always returns the cached value
  @memo
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}
</code></pre>
<p>There are lots of potential uses for this functionality, such as a <code>@bound</code> decorator that binds a method to the instance (for use in event listeners and such) or an <code>@htmlSafe</code> decorator that sanitizes the return value of a function so it's safe to add it to the DOM.</p>
<p>Javascript is far from the first language to have this sort of functionality however. One great example of it is in Python, and one reason I especially like <a href="https://realpython.com/primer-on-python-decorators/#simple-decorators">some examples from their community</a> is they show how you can use decorators <em>without their decorator syntax</em>:</p>
<pre><code class="python language-python"># Given this decorator:
def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

# This function definition with the decorator syntax:
@my_decorator
def say_whee():
    print("Whee!")

# Is the same as doing this without it:
def say_whee():
    print("Whee!")

say_whee = my_decorator(say_whee)
</code></pre>
<!-- alex ignore special just basically-->
<p>The "decorator pattern" more generically is about taking an input of some type - a function, a class method, a field - and transforming it into something of the same (or similar) type, adding some extra functionality along the way. You don't need a special syntax to use the decorator pattern, it just makes it a bit more convenient! If you think about it this way, Ember's <code>computed()</code> function is <em>basically</em> a decorator - it adds caching based on dependent keys to a getter function.</p>
<p>Leveraging this similarity, we were able to update that decorator functionality to match JavaScript's newly proposed API, which is how we're able to have it be compatible between both the classic and current syntax. The added side effect is that the <em>entire</em> Ember ecosystem gets this upgrade all at once, with absolutely no extra work required!</p>
<h3 id="decoratorsinemberoctane">Decorators in Ember Octane</h3>
<p>The changes proposed in the <a href="https://github.com/emberjs/rfcs/blob/master/text/0408-decorators.md">Decorators RFC</a> boil down to:</p>
<ul>
<li><code>@ember/object#computed</code> is now a decorator</li>
<li>All of the macros available in <code>@ember/object/computed</code>, such as <code>alias</code>, <code>gte</code>, <code>bool</code>, etc. are decorators</li>
<li><code>@ember/service#inject</code> and <code>@ember/controller#inject</code> are decorators</li>
<li>A new decorator, <code>@action</code>, has been added for function binding.</li>
</ul>
<p>These cover all of the basic functionality provided by the current classic class syntax, with the exception of classic component customization (there's a mouthful!) and observers/event listeners. Because Ember Octane is introducing a new component class, <code>@glimmer/component</code>, that doesn't require the element/DOM APIs of classic components, it was decided that decorators for that functionality were not needed in the core of the framework. Likewise, observers and event listeners are not a recommended pattern anymore, so adding decorators for them didn't make much sense. Instead, users can rely on existing libraries like <code>ember-decorators</code> which cover these use cases if they need them.</p>
<h3 id="puttingitalltogether">Putting It All Together</h3>
<!-- alex ignore bigger-->
<p>Alright, with that in mind, let's take on a bigger, more complete example! This is a component from <a href="https://emberobserver.com/">emberobserver.com</a>, one of the larger components I could find in the application (<a href="https://github.com/emberobserver/client/blob/343e7f39b035897e4db0b4be45ca3a1cd238eacc/app/components/addon-source-usages.js">source here</a>):</p>
<pre><code class="javascript language-javascript">import { inject as service } from '@ember/service';
import Component from '@ember/component';
import { computed } from '@ember/object';
import { isEmpty } from '@ember/utils';
import { task } from 'ember-concurrency';

export default Component.extend({
  visibleUsageCount: 25,

  showUsages: false,

  usages: null,

  regex: false,

  fileFilter: null,

  codeSearch: service(),

  visibleUsages: computed('visibleUsageCount', 'usages', function() {
    return this.usages.slice(0, this.visibleUsageCount);
  }),

  moreUsages: computed('visibleUsageCount', 'usages', function() {
    return this.visibleUsageCount &lt; this.usages.length;
  }),

  fetchUsages: task(function*() {
    let usages = yield this.codeSearch.usages.perform(
      this.addon.id,
      this.query,
      this.regex
    );
    this.set('usages', filterByFilePath(usages, this.fileFilter));
  }).drop(),

  actions: {
    toggleUsages() {
      this.toggleProperty('showUsages');
      if (this.showUsages &amp;&amp; this.usages === null) {
        this.fetchUsages.perform();
      }
    },

    viewMore() {
      this.set('visibleUsageCount', this.visibleUsageCount + 25);
    },
  },
});

function filterByFilePath(usages, filterTerm) {
  if (isEmpty(filterTerm)) {
    return usages;
  }
  let filterRegex;
  try {
    filterRegex = new RegExp(filterTerm);
  } catch (e) {
    return [];
  }
  return usages.filter(usage =&gt; {
    return usage.filename.match(filterRegex);
  });
}
</code></pre>
<p>And here is the same component, fully converted to native classes using Ember's built-in decorators and the and <a href="https://github.com/machty/ember-concurrency-decorators">ember-concurrency-decorators</a> library:</p>
<pre><code class="javascript language-javascript">import { inject as service } from '@ember/service';
import Component from '@ember/component';
import { action, computed } from '@ember/object';
import { isEmpty } from '@ember/utils';
import { dropTask } from 'ember-concurrency-decorators';

export default class AddonSourceUsagesComponent extends Component {
  visibleUsageCount = 25;
  showUsages = false;
  usages = null;
  regex = false;
  fileFilter = null;

  @service codeSearch;

  @computed('visibleUsageCount', 'usages')
  get visibleUsages() {
    return this.usages.slice(0, this.visibleUsageCount);
  }

  @computed('visibleUsageCount', 'usages')
  get moreUsages() {
    return this.visibleUsageCount &lt; this.usages.length;
  }

  @dropTask
  *fetchUsages() {
    let usages = yield this.codeSearch.usages.perform(
      this.addon.id,
      this.query,
      this.regex
    );
    this.set('usages', filterByFilePath(usages, this.fileFilter));
  }

  @action
  toggleUsages() {
    this.toggleProperty('showUsages');
    if (this.showUsages &amp;&amp; this.usages === null) {
      this.fetchUsages.perform();
    }
  }

  @action
  viewMore() {
    this.set('visibleUsageCount', this.visibleUsageCount + 25);
  }
}

function filterByFilePath(usages, filterTerm) {
  if (isEmpty(filterTerm)) {
    return usages;
  }
  let filterRegex;
  try {
    filterRegex = new RegExp(filterTerm);
  } catch (e) {
    return [];
  }
  return usages.filter(usage =&gt; {
    return usage.filename.match(filterRegex);
  });
}
</code></pre>
<p>This is subjectively much cleaner and easier to read, but should still look pretty familiar to long-time Ember users.</p>
<h3 id="nativeclassbenefits">Native Class Benefits</h3>
<p>Maybe you're not convinced by the new syntax - after all, it's not <em>that</em> much different than what we have today. There are many other benefits that'll be coming thanks to native classes, and I'd like to touch on them briefly here:</p>
<h4 id="speedandperformanceenhancements">Speed and performance enhancements</h4>
<p>Relying on native features means that we can drop a significant chunk of Ember's internal framework code, meaning Ember will be that much lighter overall. In addition, since classes are easier to statically analyze, there may be more benefits unlocked by the VMs themselves in the future, increasing the speedup as time goes on.</p>
<h4 id="shareddocumentationandtooling">Shared documentation and tooling</h4>
<p>The rest of the JavaScript ecosystem is beginning to adopt classes as well, meaning we'll have a much larger community of shared libraries, documentation, and tooling to rely on. Today, new Ember users have to be taught the details of Ember's class system, but in the future JavaScript classes will be one of the first chapters in every JS manual, how-to-guide, and bootcamp. This means less time ramping developers up to speed.</p>
<p>In addition, tooling like IDEs (WebStorm, VSCode), typecheckers (Flow, TypeScript), and documentation generators (ESDoc, TypeDoc) will all benefit from the statically analyzable nature of classes. There's already lots of work happening to automate more and more tasks, meaning that writing codebases with classes will be that much easier.</p>
<h4 id="trueprivatestate">True private state</h4>
<p>Native class fields also add <em>private</em> fields, which allow us to have truly private instance state for the first time (without using a <code>WeakMap</code>, which is highly unergonomic):</p>
<pre><code class="javascript language-javascript">class Person {
  #firstName;
  #lastName;

  constructor(firstName, lastName) {
    this.#firstName = firstName;
    this.#lastName = lastName;
  }

  get fullName() {
    return `${this.#firstName} ${this.#lastName}`;
  }
}

let person = new Person('Jessica', 'Jones');

console.log(person.fullName); // 'Jessica Jones'
console.log(person.#firstName) // ERROR
</code></pre>
<h4 id="fewerbugsandquirks">Fewer bugs and quirks</h4>
<p>There are quite a few quirky behaviors of classic classes:</p>
<!-- alex ignore easy-->
<ul>
<li>Merged and concatenated properties (like <code>classNames</code> on components)</li>
<li>Shared state between instances (e.g. if you do <code>EmberObject.extend({ foo: [] })</code>)</li>
<li>Reopening class definitions to define static properties (<code>reopenClass</code>)</li>
<li>The ability to reopen and redefine class methods and behaviors in general (still possible with native classes, but not nearly as easy)</li>
<li>Mixin behavior in general, especially inheritance and <code>super</code></li>
</ul>
<p>All of these issues have been addressed in native classes. Some functionality was not needed, and other functionality was added to ensure that strange, counterintuitive behavior does not occur.</p>
<h2 id="conclusion">Conclusion</h2>
<p>That's all I have for today, I hope you're looking forward to being able to use native class syntax in Ember as much as I am! Tune in next week for a break down of the changes to Ember's templating syntax, including <code>&lt;AngleBracketInvocation&gt;</code> and <code>@namedArgs</code>!</p>]]></description><link>https://blog.emberjs.com/coming-soon-in-ember-octane-part-1</link><guid isPermaLink="true">https://blog.emberjs.com/coming-soon-in-ember-octane-part-1</guid><pubDate>Mon, 11 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Coming Soon in Ember Octane - Part 2: Angle Brackets & Named Arguments]]></title><description><![CDATA[<p>(This post was originally published on <a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-2-angle-brackets-and-named-arguments/">www.pzuraq.com</a>)</p>
<p>Hello again, and welcome back! This is the second part of the multipart <em>Coming Soon in Ember Octane</em> series, where we're previewing some of the various features that are landing in Ember's upcoming Octane edition, including:</p>
<ul>
<li><a href="https://emberjs.com/blog/2019/02/11/coming-soon-in-ember-octane-part-1.html">Native Classes (+Decorators)</a></li>
<li>Angle Brackets &amp; Named Arguments <em>← this post</em></li>
<li>Tracked Properties</li>
<li>Modifiers</li>
<li>Glimmer Components</li>
</ul>
<p>These aren't <em>all</em> of the new features that will be part of Octane, but they're the ones that I'm most familiar with personally, so I can give y'all the low down!</p>
<!-- alex ignore dives -->
<p>This series is aimed at existing Ember users, but if you're new to Ember or tried Ember a while ago and want to see how things are changing, I'll be providing context on the existing features as we go along. These posts won't be doing deep dives on all the edge cases of the functionality, they are moreso meant as an overview of what's coming. If you're curious about what an <em>edition</em> is exactly, you can check out a quick break down in <a href="https://emberjs.com/blog/2019/02/11/coming-soon-in-ember-octane-part-1.html">the first post in the series</a>.</p>
<h2 id="embertemplateshtml">Ember Templates: HTML++</h2>
<!-- alex ignore easy simple -->
<p>One of the things that sets Ember apart from other component based frameworks is its strong focus on templates that <em>extend</em> HTML with a declarative, LISP-like syntax. Unlike JSX, which allows direct usage of Javascript wherever you want, or other framework's templating languages like Vue or Angular that lean heavily on HTML, Ember's syntax balances a mix of expressiveness and declarativeness that keeps template code relatively simple and easy to read, but doesn't prevent you from accomplishing your goals with artificial constraints.</p>
<p>Ember templates draw their roots from the Handlebars templating language which used <code>{{doubleCurly}}</code> syntax to insert values into templates. For the first version of Ember, this templating language remained pretty basic. You could reference values in templates, render components, and use specialized helpers like <code>{{outlet}}</code> for routing, <code>{{if}}</code> for branching, and <code>{{each}}</code> for looping:</p>
<pre><code class="handlebars language-handlebars">Hello, {{fullName}}!

{{#if hasTodos}}
  &lt;ul&gt;
    {{#each todos as |todo index|}}
      &lt;li&gt;
        {{todo-item-component todo=todo index=index}}
      &lt;/li&gt;
    {{/each}}
  &lt;/ul&gt;
{{else}}
  No todos!
{{/if}}
</code></pre>
<p>Things got more interesting as that language evolved, particularly when the ability to add <em>nested</em> helpers was added, since this mean that helpers could be composed. Logic that previously <em>had</em> to exist on classes in the form of computed properties could now exist in the template:</p>
<pre><code class="handlebars language-handlebars">Hello, {{join (capitalize firstName) (capitalize lastName)}}!

{{#if (gt todos.length 0)}}
  &lt;ul&gt;
    {{#each todos as |todo index|}}
      &lt;li&gt;
        {{add index 1}}. {{todo-item-component todo=todo}}
      &lt;/li&gt;
    {{/each}}
  &lt;/ul&gt;
{{else}}
  No todos!
{{/if}}
</code></pre>
<p>Another major piece of functionality which was added was the ability for helpers and components to <em>yield</em>, which is similar to calling a callback with some values in Javascript:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- todo-list.hbs --&gt;
&lt;ul&gt;
  {{#each todos as |todo index|}}
    &lt;li&gt;
      {{yield (todo-item-component todo=todo) index}}
    &lt;/li&gt;
  {{/each}}
&lt;/ul&gt;
</code></pre>
<pre><code class="handlebars language-handlebars">&lt;!-- main.hbs --&gt;
Hello, {{join (capitalize firstName) (capitalize lastName)}}!

{{#if (gt todos.length 0)}}
  {{#todo-list todos=todos as |item index|}}
    {{add index 1}}. {{item}}
  {{/todo-list}}
{{else}}
  No todos!
{{/if}}
</code></pre>
<p>Between these major improvements and many other minor improvements, Ember templates slowly became a first class language in their own right over the years. They continue to be, however, a language with a specific purpose - to write declarative HTML templates. While it would be possible to write extended business logic in templates directly, there comes a point where it's much more pain than it's worth. For instance, you can add local variables with the <code>{{let}}</code> helper, but since it requires you to yield to add the variable it quickly becomes more of a headache than it's worth, except in targeted circumstances:</p>
<pre><code class="handlebars language-handlebars">{{#let 'Carol' as |firstName|}}
  {{#let 'Danvers' as |lastName|}}
    {{#let (join firstName lastName) as |fullName|}}
      ...
    {{/let}}
  {{/let}}
{{/let}}
</code></pre>
<p>You can see how quickly this would become a difficult to work with and reason about if you used it for all of the business logic a large app! In this way, Ember templates guide users to separate concerns when they reach a certain level of complexity, but give them enough freedom to avoid large amounts of boiler plate for small, mundane snippets of logic.</p>
<p>Still there were some nagging issues with this syntax:</p>
<ul>
<li>There's so many curlies! It can be hard to distinguish what's what between helpers and components and plain values being put into template, which makes reading template code difficult at times.</li>
<li>It's so ambiguous! <code>{{fullname}}</code> probably means a variable, but it could be a component or a helper. And even if it's a variable, is it a local variable provided by a <code>yield</code>? Is it a variable on the component instance? Is it an <em>argument</em> (a.k.a. property) provided to the component? Where are all these things coming from anyways?</li>
</ul>
<!-- alex ignore just-->
<p>Some of the ambiguity problem is going to be solved by template imports, which will allow you to directly import helpers and components for use just like you would in JavaScript code, but there are lots of other small issues in there. There are three major changes that are part of Ember Octane that address these issues:</p>
<ol>
<li>Angle bracket syntax for components</li>
<li>Named argument syntax</li>
<li>Required <code>this</code> in templates</li>
</ol>
<h2 id="anglebracketsyntax">Angle Bracket Syntax</h2>
<p>Angle bracket syntax for components draws heavily from other templating languages. You can invoke a component by using the <code>CapitalCase</code> version of the component's name, and using angle brackets instead of curlies, like HTML. Arguments passed to the component must be prefixed with the <code>@</code> symbol, distinguishing them from HTML <em>attributes</em> which can be applied directly like you would with standard HTML elements:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- main.hbs --&gt;
Hello, {{join (capitalize firstName) (capitalize lastName)}}!

{{#if (gt todos.length 0)}}
  &lt;TodoList role="list" @todos={{todos}} as |Item index|&gt;
    {{add index 1}}. &lt;Item/&gt;
  &lt;/TodoList&gt;
{{else}}
  No todos!
{{/if}}
</code></pre>
<p>As you can see, this immediately gives the <code>TodoList</code> component some visual distinction from the rest of the template. We can tell that it's a separate type of <em>thing</em> based on a quick glance, instead of having to think about the context we're in, and what helpers and variables exist in the template.</p>
<p>The ability to pass <em>arbitrary</em> HTML attributes directly to components is also a huge time saver. This was a point of brittleness in components previously, since every new attribute required adding a new argument to the component, and binding that argument to the attribute. Another minor pain point was also addressed by this feature: single word component names are now completely allowed. <code>{{todo}}</code> was not a valid component name before, but <code>&lt;Todo&gt;</code> is now!</p>
<p>It's important to note that <em>positional parameters</em> can't be used with angle bracket syntax. That's ok, because curly bracket syntax still exists, and most things that use positional parameters really feel more like helpers than components (e.g. <code>if</code>, <code>each</code>, etc). There are some exceptions, such as <code>link-to</code>, but these will likely be converted to a more angle bracket friendly form in time.</p>
<h2 id="namedargumentsyntax">Named Argument Syntax</h2>
<p>As mentioned in the previous section, arguments that are passed to components are prefixed with the <code>@</code> symbol in Angle bracket syntax. Ember Octane leverages this in the component's templates by allowing users to directly refer to an argument using the same prefix:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- todo-list.hbs --&gt;
&lt;ul&gt;
  {{#each @todos as |todo index|}}
    &lt;li&gt;
      {{yield (todo-item-component todo=todo) index}}
    &lt;/li&gt;
  {{/each}}
&lt;/ul&gt;
</code></pre>
<p>We can immediately tell now by looking at this template that <code>@todos</code> is an argument that was passed to the component externally. This is in fact always true - there is <em>no way</em> to modify the value referenced by <code>@todos</code> from the component class, it is the original, unmodified value. If there is some business logic that needs to happen in the class, for instance to filter the items, you can do this in a getter and refer to that instead:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- todo-list.hbs --&gt;
&lt;ul&gt;
  {{#each this.uncompletedTodos as |todo index|}}
    &lt;li&gt;
      {{yield (todo-item-component todo=todo) index}}
    &lt;/li&gt;
  {{/each}}
&lt;/ul&gt;
</code></pre>
<pre><code class="javascript language-javascript">// todo-list.js
export default class TodoList extends Component {
  @computed('todos.length')
  get uncompletedTodos() {
    return this.todos.filter(todo =&gt; !todo.completed);
  }
}
</code></pre>
<p>This is a subtle change, but helps to reduce some of the ambiguity of our templates. Combined with the next change, requiring <code>this</code>, it makes a huge difference.</p>
<h2 id="requiredthisintemplates">Required <code>this</code> in Templates</h2>
<p>The final major change in Octane-style templates is to require <code>this</code> when referring to the component instance and its state. This includes computed properties and normal properties:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- main.hbs --&gt;
Hello, {{join (capitalize this.firstName) (capitalize this.lastName)}}!

{{#if (gt this.todos.length 0)}}
  &lt;TodoList role="list" @todos={{this.todos}} as |Item index|&gt;
    {{add index 1}}. &lt;Item/&gt;
  &lt;/TodoList&gt;
{{else}}
  No todos!
{{/if}}
</code></pre>
<!-- alex ignore clearly easily -->
<p>This change is subtle, but instantly provides much more context in templates. We can now clearly tell what are <em>values</em> provided by the component class, and what are helpers (<code>join</code>, <code>capitalize</code>, <code>gt</code>, <code>add</code>) or local variables provided in yields (<code>Item</code>, <code>index</code>). Combined with named argument syntax, it allows for almost all values in the template to have a clear point-of-origin, so users can follow them back to where they came from easily.</p>
<h3 id="puttingitalltogether">Putting It All Together</h3>
<!-- alex ignore just-->
<p>Like last time, I'd like to show you a more complete example based on a real-life template, instead of having you just take my word for it based on a few small examples. This is a component from <a href="https://emberobserver.com/">emberobserver.com</a>, one with a fairly verbose template (<a href="https://github.com/emberobserver/client/blob/0c6058456803817673255fd91b0991d5a93916be/app/templates/components/large-search.hbs">source here</a>):</p>
<pre><code class="handlebars language-handlebars">&lt;div class="large-search with-default-styling"&gt;
  &lt;div class="search"&gt;
    &lt;div class="search-wrapper"&gt;
      &lt;input type="search"
             placeholder="Search for addons, maintainers and categories"
             autocomplete="off"
             id="search-input"
             spellcheck="false"
             value={{query}}
             oninput={{action (perform search) value="target.value"}}&gt;
      {{#if query}}
        &lt;button
          {{action clearSearch}}
          class="close-button test-clear-search"&gt;
          {{svg-icon "close"}}
        &lt;/button&gt;
      {{/if}}
    &lt;/div&gt;
    &lt;div class="readme-toggle"&gt;
      {{input type="checkbox"
              class="test-search-readmes"
              id="search-readmes"
              checked=searchReadmes
              change=(action (perform toggleReadmeSearch))}}
      &lt;label for="search-readmes"&gt;Search readmes&lt;/label&gt;
    &lt;/div&gt;
    &lt;h6 class="no-results {{if hasSearchedAndNoResults 'showing'}}"&gt;
      No results found for "{{query}}"
    &lt;/h6&gt;
  &lt;/div&gt;

  {{#if results.length}}
    &lt;h4 class="result-info test-result-info"&gt;
      Results for "{{query}}"
    &lt;/h4&gt;
    {{#search-result-set
      results=results.displayingReadmes
      totalCount=results.totalReadmeCount
      fetchMore=fetchMoreReadmes
      title="Readmes"
      resultClass="readme-results"}}
      &lt;ul class="readme-list"&gt;
        {{#each results.displayingReadmes as |addon|}}
          &lt;li&gt;
            {{addon-details addon=addon}}
            {{#each (get _results.readmeMatchMap addon.id) as |match|}}
              &lt;div class="test-readme-match text-match"&gt;
                ...{{dom-purify match use-profiles=(hash html=true) hook='target-blank'}}...
              &lt;/div&gt;
            {{/each}}
          &lt;/li&gt;
        {{/each}}
      &lt;/ul&gt;
    {{/search-result-set}}
    {{#search-result-set
      results=results.displayingCategories
      totalCount=results.totalCategoriesCount
      fetchMore=fetchMoreCategories
      title="Categories"
      resultClass="category-results"}}
      &lt;ul&gt;
        {{#each results.displayingCategories as |category|}}
          &lt;li&gt;
            {{#link-to "categories.show" category.slug}}
              &lt;span class="bullet"&gt;&amp;#9632;&lt;/span&gt;
              &lt;div&gt;{{category.name}} ({{category.totalAddonCount}})&lt;/div&gt;
            {{/link-to}}
          &lt;/li&gt;
        {{/each}}
      &lt;/ul&gt;
    {{/search-result-set}}
    {{#search-result-set
      results=results.displayingAddons
      totalCount=results.totalAddonsCount
      fetchMore=fetchMoreAddons
      title="Addons"
      resultClass="addon-results"}}
      {{addon-list addons=results.displayingAddons}}
    {{/search-result-set}}
    {{#search-result-set
      results=results.displayingMaintainers
      totalCount=results.totalMaintainersCount
      fetchMore=fetchMoreMaintainers
      title="Maintainers"
      resultClass="maintainer-results"}}
      &lt;ul&gt;
        {{#each results.displayingMaintainers as |maintainer|}}
          &lt;li&gt;
            {{#link-to "maintainers.show" maintainer.name}}
              &lt;span class="bullet"&gt;&amp;#9632;&lt;/span&gt;
              &lt;div&gt;{{maintainer.name}}&lt;/div&gt;
            {{/link-to}}
          &lt;/li&gt;
        {{/each}}
      &lt;/ul&gt;
    {{/search-result-set}}
  {{else if search.isRunning}}
    {{dot-spinner}}
  {{/if}}
&lt;/div&gt;
</code></pre>
<p>And here is the same template rewritten with the various new features added in Octane:</p>
<pre><code class="handlebars language-handlebars">&lt;div class="large-search with-default-styling"&gt;
  &lt;div class="search"&gt;
    &lt;div class="search-wrapper"&gt;
      &lt;input
        type="search"
        placeholder="Search for addons, maintainers and categories"
        autocomplete="off"
        id="search-input"
        spellcheck="false"
        value={{this.query}}
        oninput={{action (perform this.search) value="target.value"}}
      /&gt;
      {{#if this.query}}
        &lt;button
          {{action this.clearSearch}}
          class="close-button test-clear-search"
        &gt;
          {{svg-icon "close"}}
        &lt;/button&gt;
      {{/if}}
    &lt;/div&gt;
    &lt;div class="readme-toggle"&gt;
      &lt;Input
        @type="checkbox"
        @checked={{this.searchReadmes}}
        @change={{action (perform this.toggleReadmeSearch)}}

        id="search-readmes"
        class="test-search-readmes"
      /&gt;
      &lt;label for="search-readmes"&gt;Search readmes&lt;/label&gt;
    &lt;/div&gt;
    &lt;h6 class="no-results {{if this.hasSearchedAndNoResults 'showing'}}"&gt;
      No results found for "{{this.query}}"
    &lt;/h6&gt;
  &lt;/div&gt;

  {{#if this.results.length}}
    &lt;h4 class="result-info test-result-info"&gt;
      Results for "{{this.query}}"
    &lt;/h4&gt;

    &lt;SearchResultSet
      @results={{this.results.displayingReadmes}}
      @totalCount={{this.results.totalReadmeCount}}
      @fetchMore={{this.fetchMoreReadmes}}
      @title="Readmes"
      @resultClass="readme-results"
    &gt;
      &lt;ul class="readme-list"&gt;
        {{#each this.results.displayingReadmes as |addon|}}
          &lt;li&gt;
            &lt;AddonDetails @addon={{addon}} /&gt;

            {{#each (get this._results.readmeMatchMap addon.id) as |match|}}
              &lt;div class="test-readme-match text-match"&gt;
                ...{{dom-purify match use-profiles=(hash html=true) hook='target-blank'}}...
              &lt;/div&gt;
            {{/each}}
          &lt;/li&gt;
        {{/each}}
      &lt;/ul&gt;
    &lt;/SearchResultSet&gt;

    &lt;SearchResultSet
      @title="Categories"
      @results={{this.results.displayingCategories}}
      @totalCount={{this.results.totalCategoriesCount}}
      @fetchMore={{this.fetchMoreCategories}}
      @resultClass="category-results"
    &gt;
      &lt;ul&gt;
        {{#each this.results.displayingCategories as |category|}}
          &lt;li&gt;
            {{#link-to "categories.show" category.slug}}
              &lt;span class="bullet"&gt;&amp;#9632;&lt;/span&gt;
              &lt;div&gt;{{category.name}} ({{category.totalAddonCount}})&lt;/div&gt;
            {{/link-to}}
          &lt;/li&gt;
        {{/each}}
      &lt;/ul&gt;
    &lt;/SearchResultSet&gt;

    &lt;SearchResultSet
      @title="Addons"
      @results={{this.results.displayingAddons}}
      @totalCount={{this.results.totalAddonsCount}}
      @fetchMore={{this.fetchMoreAddons}}
      @resultClass="addon-results"
    &gt;
      &lt;AddonList @addons={{this.results.displayingAddons}} /&gt;
    &lt;/SearchResultSet&gt;

    &lt;SearchResultSet
      @title="Maintainers"
      @results={{this.results.displayingMaintainers}}
      @totalCount={{this.results.totalMaintainersCount}}
      @fetchMore={{this.fetchMoreMaintainers}}
      @resultClass="maintainer-results"
    &gt;
      &lt;ul&gt;
        {{#each this.results.displayingMaintainers as |maintainer|}}
          &lt;li&gt;
            {{#link-to "maintainers.show" maintainer.name}}
              &lt;span class="bullet"&gt;&amp;#9632;&lt;/span&gt;
              &lt;div&gt;{{maintainer.name}}&lt;/div&gt;
            {{/link-to}}
          &lt;/li&gt;
        {{/each}}
      &lt;/ul&gt;
    &lt;/SearchResultSet&gt;
  {{else if this.search.isRunning}}
    &lt;DotSpinner/&gt;
  {{/if}}
&lt;/div&gt;
</code></pre>
<p>In my opinion, this is much easier to skim through and get a general sense of quickly, with clear visual markers for the major different elements (components, helpers, plain HTML, and inserted values). Importantly, the core essence of Handlebars' declarative templating has not been lost - this still reads like HTML, and where there is dynamism it is a declarative sort of dynamism. We <em>aren't</em> reading Javascript, we're reading LISP-y templates!</p>
<h2 id="availablenow">Available Now</h2>
<p>The title of this post is actually inaccurate - all of these features have already landed in Ember, and have been usable for some time! You can try them out now, and they're fully backwards compatible with older features and components.</p>
<!-- alex ignore just-->
<p>The nature of Editions is that some of the new features land sooner rather than later, and we just haven't really had a chance to polish up the guides and the DX for learning all of them. Octane gives us a focal point that allows us to sum everything up, and update all of our learning materials and guides, but if you're interested in early adoption things have been landing in <code>master</code> for some time now!</p>
<h2 id="conclusion">Conclusion</h2>
<p>That's all I have for today! I'm sure you're eager to try out <code>&lt;AngleBrackets&gt;</code> in your app/addon now that you've seen it, so I'll wrap this up quick 😄 Next week I'll be posting about Tracked Properties, which are a major update to the way Ember tracks state changes, so be sure to come back then!</p>]]></description><link>https://blog.emberjs.com/coming-soon-in-ember-octane-part-2</link><guid isPermaLink="true">https://blog.emberjs.com/coming-soon-in-ember-octane-part-2</guid><pubDate>Tue, 19 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Coming Soon in Ember Octane - Part 3: Tracked Properties]]></title><description><![CDATA[<p>(This post was originally published on <a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-3-tracked-properties/">www.pzuraq.com</a>)</p>
<p>Hello again, and welcome back! This is the third entry in the multipart <em>Coming Soon in Ember Octane</em> series, where we're previewing some of the various features that are landing in Ember's upcoming Octane edition, including:</p>
<ul>
<li><a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-1-native-classes/">Native Classes (+Decorators)</a></li>
<li><a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-2-angle-brackets-and-named-arguments/">Angle Brackets & Named Arguments</a></li>
<li>Tracked Properties <em>← this post</em></li>
<li>Modifiers</li>
<li>Glimmer Components</li>
</ul>
<!-- alex ignore dives -->
<p>These aren't <em>all</em> of the new features that will be part of Octane, just the ones that I'm most familiar with personally. This series is aimed at existing Ember users, but if you're new to Ember or tried Ember a while ago and want to see how things are changing, I'll be providing context on the existing features as we go along. These posts won't be doing deep dives on all the edge cases of the functionality, they are moreso meant as an overview of what's coming. If you're curious about what an <em>edition</em> is exactly, you can check out a quick break down in <a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-1-native-classes/#whatareeditions">the first post in the series</a>.</p>
<p>On to tracked properties!</p>
<h2 id="trackedpropertiesautomaticshouldcomponentupdate">Tracked Properties: Automatic <code>shouldComponentUpdate</code></h2>
<p>For most Ember users, typing out lists of dependencies should be second nature. Ember has never had the equivalent of React's <code>shouldComponentUpdate</code> or <code>React.memo</code>, instead relying on <code>set</code> (roughly equivalent to <code>setState</code>), and explicit property dependencies for computed properties:</p>
<pre><code class="javascript language-javascript">// components/clock.js
export default Component.extend({
  init() {
    setInterval(() =&gt; {
      this.set('date', new Date());
    }, 1000);
  },

  formattedTime: computed('date', function() {
    return moment(this.get('date')).format('h:mm:ss a');
  }),

  message: computed('formattedTime', function() {
    return `It is currently ${this.get('formattedTime')}!`;
  }),
});
</code></pre>
<!-- alex ignore dirty -->
<p>This system means that users don't usually have to <em>think</em> about whether or not a component should update. If any values have updated, they will inform their dependencies, and Ember will know whether or not to rerender the template if something that has been marked as dirty was rendered before. This is similar to to React's new <code>useMemo</code> hook, but is used by <em>default</em> for every value in an Ember app.</p>
<p>Better yet, it also means Ember can <em>minimize</em> the amount that is rerendered - each individual value in the template can know whether or not it has been updated, meaning entire sections of the template (and components within those sections) can be skipped:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- This wrapper component gets ignored completely during rerenders --&gt;
&lt;ClockWrapper theme="dark"&gt;
  &lt;!-- This text node is the _only_ thing that gets touched --&gt;
  {{this.message}}
&lt;/ClockWrapper&gt;
</code></pre>
<p>This is also what enables Ember's <a href="https://guides.emberjs.com/release/applications/services/"><em>dependency injection</em> system</a>. Instead of having to wrap every component in a Context/Provider that is updating the component's props, we can directly inject the instance of a service and passively watch it for changes, reducing a layer of indirection.</p>
<p>However, this all comes at a cost. We have to use <code>set</code> <em>everywhere</em> to ensure that the system picks up changes (up until recently we also had to use <code>get</code> to get them, but thankfully that constraint was <a href="https://github.com/emberjs/rfcs/blob/master/text/0281-es5-getters.md">mostly removed recently</a>), and we have to type out these lists of dependencies for any derived values in the system. This can take quite a lot of time and effort, and requires diligence to maintain.</p>
<!-- alex ignore easy simple -->
<p>So, Ember's current system isn't quite "automatic" either. It's <em>conventional</em> - by following the rules, you get the benefits of <code>shouldComponentUpdate</code> without having to work out the details yourself. It's pretty easy to follow those rules, because they <em>are</em> simple and straightforward, but it still can be tedious and feels like boilerplate, and if there's an unofficial Ember motto it may be "get rid of the boilerplate!"</p>
<h3 id="flipitaround">Flip It Around!</h3>
<p>Tracked properties are Ember's next iteration on this system. They address all of the above pain points, and then some. The way they work is by explicitly annotating all <em>trackable</em> properties on a class, instead of annotating the dependencies for every single getter, effectively reversing where the annotation occurs. Trackable properties are any properties which:</p>
<ol>
<li>Change over time and</li>
<li>May cause the DOM to update in response to those changes</li>
</ol>
<p>For example, here's the <code>ClockComponent</code> class from earlier refactored with tracked properties:</p>
<pre><code class="javascript language-javascript">// components/clock.js
export default class ClockComponent extends Component {
  @tracked date;

  constructor() {
    setInterval(() =&gt; (this.date = new Date()), 1000);
  },

  get formattedTime() {
    return moment(this.date).format('h:mm:ss a');
  }

  get message() {
    return `It is currently ${this.formattedTime}!`;
  }
}
</code></pre>
<p>Notice that getters no longer need to be annotated at all, and we only have a single decorated property. This works because when Ember is rendering a value, like <code>{{this.message}}</code>, it watches for accesses to <em>any</em> tracked properties. Later on, if one of those properties changes, it knows it needs to rerender that value and any components or helpers that consume it. No more dependency lists required! Now <em>that</em> is automatic.</p>
<!--alex ignore just-->
<p>But the benefits go <em>beyond</em> just removing all of that boilerplate.</p>
<h4 id="explicitfielddeclarations">Explicit Field Declarations</h4>
<p>We now have an <em>explicit</em> list of all trackable values on a class. This means that we can very quickly look at a class and see where the "important" values are, in a single declarative list:</p>
<pre><code class="javascript language-javascript">// components/person.js
export default class PersonComponent extends Component {
  @tracked firstName;
  @tracked lastName;

  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }

  @action
  updateName(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
}
</code></pre>
<p>Before, it was not uncommon to have these values be <em>implicit</em>. Somewhere in the code flow, something would use <code>set</code>, and the value would suddenly exist:</p>
<pre><code class="javascript language-javascript">// components/person.js
export default Component.extend({
  // This computed property _implies_ that `firstName` and `lastName`
  // exist, but we don't know that without reading it.
  fullName: computed('firstName', 'lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  }),

  actions: {
    // Likewise, this action sets `firstName` and `lastName`
    // which implies that they are used and watched, but we wouldn't
    // have known that unless we actually read the function body.
    updateName(firstName, lastName) {
      this.set('firstName', firstName);
      this.set('lastName', lastName);
    },
  },
});
</code></pre>
<!-- alex ignore just-->
<p>It was often convention to assign default values to these fields so that they could be seen, but that convention was not enforced in any meaningful way and really just became another small amount of boilerplate.</p>
<h4 id="enforcedpublicapi">Enforced Public API</h4>
<p>We also have <em>control</em> over what values are trackable. With <code>set</code>, it's possible to "reach" into objects and observe any values you want. This makes the previous problem that much worse!</p>
<pre><code class="javascript language-javascript">// utils/person.js

// This might be confusing at first - it looks like an empty class.
// What are its values? What is it used for? Maybe it has a `name`?
// `address`? Who knows!
export default EmberObject.extend({});
</code></pre>
<pre><code class="javascript language-javascript">// components/person.js
export default Component.extend({
  init() {
    this._super(...arguments);
    this.set('person', Person.create());
  },

  fullName: computed('person.firstName', 'person.lastName', function() {
    return `${this.person.firstName} ${this.person.lastName}`;
  }),

  actions: {
    // Here we can see that set the `firstName` and `lastName`
    // properties, so now we have _some_ sense of what the "shape"
    // of a Person is.
    updateName(firstName, lastName) {
      this.set('person.firstName', firstName);
      this.set('person.lastName', lastName);
    },
  },
});
</code></pre>
<!-- alex ignore simply -->
<p>Because of this effect, <em>any</em> external class can essentially expand a class's public API at any point in time simply because it's convenient. In large codebases, this can lead to the true definition of a class being spread out across many different files, actions, helper functions, and computed properties. In other words, it leads to spaghetti.</p>
<p>By comparison, for this to work at <em>all</em> with tracked properties, <code>firstName</code> and <code>lastName</code> <em>must</em> be annotated:</p>
<pre><code class="javascript language-javascript">// utils/person.js

// `firstName` and `lastName` are the only watchable values on
// `Person`. We can't prevent people from adding other properties,
// but they will have no effect on rerenders.
export default class Person {
  @tracked firstName;
  @tracked lastName;
}
</code></pre>
<pre><code class="javascript language-javascript">// components/person.js
export default class PersonComponent extends Component {
  person = new Person();

  get fullName() {
    return `${this.person.firstName} ${this.person.lastName}`;
  }

  // This works as expected, because the properties are tracked.
  @action
  updateName(firstName, lastName) {
    this.person.firstName = firstName;
    this.person.lastName = lastName;
  }

  // This adds the property, but does not trigger a rerender. If
  // we want it to trigger a rerender, we need to go and add
  // `middleName` as a tracked property to `Person`.
  @action
  updateMiddleName(middleName) {
    this.person.middleName = middleName;
  }
}
</code></pre>
<p>This means that we have an <em>enforced</em> "public API" in effect. Users of the class cannot add values that were not intended to exist and then watch them, and this disincentives using the class for anything other than its intended purpose.</p>
<h3 id="backwardscompatible">Backwards Compatible</h3>
<!-- alex ignore just-->
<p>You may be looking at these examples and thinking, "This is great in <em>theory</em>, but I have a lot of computed properties in my app! How am I going to update them all?" Unfortunately, we can't just codemod you forward because of the implicit layer of definitions we talked about earlier. It's hard to know <em>where</em> to add tracked properties, on which classes and objects they should be defined.</p>
<p>Luckily, tracked properties are <em>fully</em> backwards compatible with computed properties and the <code>get</code>/<code>set</code> system, and they also work in classic class syntax. You can access a tracked property from a computed, and it will be picked up without having to add the dependency:</p>
<pre><code class="javascript language-javascript">// components/person.js
export default Component.extend({
  firstName: tracked(),
  lastName: null,

  // This computed property _implies_ that `firstName` and `lastName`
  // exist, but we don't know that without reading it.
  fullName: computed('lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  }),

  actions: {
    // Likewise, this action sets `firstName` and `lastName`
    // which implies that they are used and watched, but we wouldn't
    // have known that unless we actually read the function body.
    updateName(firstName, lastName) {
      this.firstName = firstName;
      this.set('lastName', lastName);
    },
  },
});
</code></pre>
<p>This means you can convert your applications one field at a time, in parts. It may take a while, but <code>computed()</code> isn't going anywhere anytime soon, giving you plenty of time and space to adopt tracked properties at your own pace.</p>
<h3 id="puttingitalltogether">Putting It All Together</h3>
<!-- alex ignore just-->
<p>Alright, let's once again take the new feature and put it to use! This time I'm going to take an example from the excellent <a href="https://github.com/poteto/ember-cli-flash">ember-cli-flash</a> addon which is used for showing flash messages. This example is a bit more involved than previous ones, since I really wanted to demonstrate just how much tracked properties can help to clean up not only component code, but utility code as well.</p>
<blockquote>
  <p>Note: I've also edited down some of the classes to show only the parts relevant to tracked properties, and this is <em>not</em> a full conversion as there may be more tracked values used in other contexts which I did not add.</p>
</blockquote>
<pre><code class="javascript language-javascript">// ember-cli-flash/addon/flash/object.js
import Evented from '@ember/object/evented';
import EmberObject, { set, get } from '@ember/object';

export default EmberObject.extend(Evented, {
  exitTimer: null,
  exiting: false,
  isExitable: true,
  initializedTime: null,

  // ... class methods
});
</code></pre>
<pre><code class="javascript language-javascript">// ember-cli-flash/addon/components/flash-message.js
import { htmlSafe, classify } from '@ember/string';
import Component from '@ember/component';
import { isPresent } from '@ember/utils';
import { next, cancel } from '@ember/runloop';
import { computed, set, get, getWithDefault } from '@ember/object';
import { and, bool, readOnly, not } from '@ember/object/computed';
import layout from '../templates/components/flash-message';

export default Component.extend({
  layout,
  active: false,
  messageStyle: 'bootstrap',
  classNames: ['flash-message'],
  classNameBindings: ['alertType', 'active', 'exiting'],
  attributeBindings: ['aria-label', 'aria-describedby', 'role'],

  showProgress: readOnly('flash.showProgress'),
  notExiting: not('exiting'),
  showProgressBar: and('showProgress', 'notExiting'),
  exiting: readOnly('flash.exiting'),
  hasBlock: bool('template').readOnly(),

  alertType: computed('flash.type', {
    get() {
      const flashType = getWithDefault(this, 'flash.type', '');
      const messageStyle = getWithDefault(this, 'messageStyle', '');
      let prefix = 'alert alert-';

      if (messageStyle === 'foundation') {
        prefix = 'alert-box ';
      }

      return `${prefix}${flashType}`;
    },
  }),

  flashType: computed('flash.type', {
    get() {
      const flashType = getWithDefault(this, 'flash.type', '');

      return classify(flashType);
    },
  }),

  didInsertElement() {
    this._super(...arguments);
    const pendingSet = next(this, () =&gt; {
      set(this, 'active', true);
    });
    set(this, 'pendingSet', pendingSet);
  },

  progressDuration: computed('flash.showProgress', {
    get() {
      if (!get(this, 'flash.showProgress')) {
        return false;
      }

      const duration = getWithDefault(this, 'flash.timeout', 0);

      return htmlSafe(`transition-duration: ${duration}ms`);
    },
  }),

  click() {
    const destroyOnClick = getWithDefault(this, 'flash.destroyOnClick', true);

    if (destroyOnClick) {
      this._destroyFlashMessage();
    }
  },

  mouseEnter() {
    const flash = get(this, 'flash');
    if (isPresent(flash)) {
      flash.preventExit();
    }
  },

  mouseLeave() {
    const flash = get(this, 'flash');
    if (isPresent(flash) &amp;&amp; !get(flash, 'exiting')) {
      flash.allowExit();
    }
  },

  willDestroy() {
    this._super(...arguments);
    this._destroyFlashMessage();
    cancel(get(this, 'pendingSet'));
  },

  // private
  _destroyFlashMessage() {
    const flash = getWithDefault(this, 'flash', false);

    if (flash) {
      flash.destroyMessage();
    }
  },

  actions: {
    close() {
      this._destroyFlashMessage();
    },
  },
});
</code></pre>
<p>You can see from this example the implicit state problem I mentioned earlier. We can see from the <code>FlashMessage</code> component that it definitely <em>expects</em> the flash object to have quite a few values on it, but we aren't seeing them here. Let's update it to tracked properties and see how that changes things:</p>
<pre><code class="javascript language-javascript">// ember-cli-flash/addon/flash/object.js
import Evented from '@ember/object/evented';
import EmberObject, { set, get } from '@ember/object';

export default class FlashObject extends EmberObject.extend(Evented) {
  @tracked type = '';
  @tracked timeout = 0;
  @tracked showProgress = false;
  @tracked destroyOnClick = true;
  @tracked exiting = false;

  exitTimer = null;
  isExitable = true;
  initializedTime = null;

  // ... class methads
}
</code></pre>
<pre><code class="javascript language-javascript">// ember-cli-flash/addon/components/flash-message.js
import { htmlSafe, classify } from '@ember/string';
import Component from '@ember/component';
import { next, cancel } from '@ember/runloop';
import { and, bool, readOnly, not } from '@ember/object/computed';
import { layout, classNames, className } from '@ember-decorators/component';
import template from '../templates/components/flash-message';

@layout(template)
@classNames('flash-message')
export default class FlashMessage extends Component {
  // Arguments
  messageStyle = 'bootstrap';

  // Internal state
  @className
  @tracked
  active = false;

  @className
  @readOnly('flash.exiting')
  exiting;

  @not('exiting') notExiting;
  @and('flash.showProgress', 'notExiting') showProgressBar;
  @bool('template') hasBlock;

  #pendingSet;

  @className
  get alertType() {
    let prefix = this.messageStyle === 'foundation' ?
      'alert-box' :
      'alert alert-';

    return `${prefix}${this.flash.type}`;
  }

  get flashType() {
    return classify(this.flash.type);
  }

  get progressDuration() {
    if (!this.flash.showProgress) {
      return false;
    }

    return htmlSafe(`transition-duration: ${this.flash.timeout}ms`);
  }

  didInsertElement() {
    super.didInsertArguments(...arguments);
    this.#pendingSet = next(this, () =&gt; this.active = true);
  },

  click() {
    if (this.flash.destroyOnClick) {
      this.#destroyFlashMessage();
    }
  }

  mouseEnter() {
    if (this.flash) {
      this.flash.preventExit();
    }
  }

  mouseLeave() {
    if (this.flash &amp;&amp; !this.flashexiting) {
      this.flash.allowExit();
    }
  }

  willDestroy() {
    super.willDestroy(...arguments);
    this.#destroyFlashMessage();
    cancel(this.#pendingSet);
  }

  #destroyFlashMessage() {
    if (this.flash) {
      flash.destroyMessage();
    }
  }

  @action
  close() {
    this.#destroyFlashMessage();
  }
}
</code></pre>
<!-- alex ignore dive -->
<p>This reads much more clearly than before! We can now read the <code>FlashObject</code> class definition and know what properties external consumers, such as the <code>FlashMessage</code> component, will be watching and using. When we dive into the <code>FlashMessage</code> component, it's much less verbose and easier to read. Properties and getters are much more straightforward, and we can easily distinguish between properties that are used for rendering (<code>action</code>, which is tracked) and properties that are not (<code>#pendingSet</code> which is a private property used for tracking a runloop task). Additionally, we can still use computed property macros for convenience, and private fields and methods are a nice bonus here in native class syntax.</p>
<h2 id="conclusion">Conclusion</h2>
<p>That's all I have for today! Tracked properties are currently behind a feature flag on canary, and still being polished up. They should be available soon as we get the Octane preview up and running, I'll be sure to tweet about it when they are! In the meantime, thanks for reading, and stay tuned for next week's post on Element Modifiers!</p>]]></description><link>https://blog.emberjs.com/coming-soon-in-ember-octane-part-3</link><guid isPermaLink="true">https://blog.emberjs.com/coming-soon-in-ember-octane-part-3</guid><pubDate>Tue, 26 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Coming Soon in Ember Octane - Part 4: Modifiers]]></title><description><![CDATA[<p>(This post was originally published on <a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-4-modifiers/">www.pzuraq.com</a>)</p>
<p>Hello again, and welcome back! This is the fourth entry in the multipart <em>Coming Soon in Ember Octane</em> series, where we're previewing some of the various features that are landing in Ember's upcoming Octane edition, including:</p>
<ul>
<li><a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-1-native-classes/">Native Classes (+Decorators)</a></li>
<li><a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-2-angle-brackets-and-named-arguments/">Angle Brackets & Named Arguments</a></li>
<li><a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-3-tracked-properties/">Tracked Properties</a></li>
<li>Modifiers <em>← this post</em></li>
<li>Glimmer Components</li>
</ul>
<!-- markdownlint-disable MD029 -->
<!-- alex ignore dives just -->
<p>These aren't <em>all</em> of the new features that will be part of Octane, just the ones that I'm most familiar with personally. This series is aimed at existing Ember users, but if you're new to Ember or tried Ember a while ago and want to see how things are changing, I'll be providing context on the existing features as we go along. These posts won't be doing deep dives on all the edge cases of the functionality, they are moreso meant as an overview of what's coming. If you're curious about what an <em>edition</em> is exactly, you can check out a quick break down in <a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-1-native-classes/#whatareeditions">the first post in the series</a>.</p>
<p>Alright, now let's talk about modifiers, Ember's new tool for working with the DOM!</p>
<h2 id="whataremodifiers">What Are "Modifiers"</h2>
<p>Modifiers are similar to Handlebars helpers, they are functions or classes that can be used in templates directly using <code>{{double-curlies}}</code>. The major difference with modifiers is that they are applied directly to <em>elements</em>:</p>
<pre><code class="handlebars language-handlebars">&lt;button {{on "click" this.handleClick}}&gt;
  Hello, World!
&lt;/button&gt;
</code></pre>
<p>Modifiers are used for manipulating or reading from the DOM somehow. For instance, the example above uses the <a href="https://github.com/buschtoens/ember-on-modifier#readme"><code>on</code> modifier</a> to add a click handler to the <code>button</code> element it is modifying. In general modifiers act on the element they are modifying, but they could also act on the the subtree of that element.</p>
<!-- alex ignore easily -->
<p>Modifiers are not an entirely new concept in Ember. In fact, they've existed in some form or another since some of the earliest days of Ember, in the form of the <code>{{action}}</code> modifier, and the <code>{{bind-attr}}</code> modifier from the v1 era of the framework. However, it's never been possible before for users to make their <em>own</em> modifiers. Now they're being given first class support to allow users more fidelity in how they interact with the DOM, and to allow DOM code to be more easily shared across components and other templates.</p>
<h3 id="thenewdidinsertelement">The New <code>didInsertElement</code></h3>
<p>You may be thinking, don't lifecycle hooks solve the same problem? Can't I put logic like adding event listeners and measuring elements in <code>didInsertElement</code> or <code>didRender</code> on my component class and call it a day? Why do we need a new concept for this kind of logic?</p>
<p>There are a few reasons modifiers end up being a better solution for DOM manipulation in general:</p>
<!-- alex ignore easily -->
<ol>
<li><strong>They allow targeting specific elements more easily.</strong> Lifecycle hooks only allow you to work with the component's <em>root</em> element, if it has one. If you want to target any other element in the component, it can be a lot of work. For instance, to do the same thing as our original example with the <code>on</code> modifier, we would have to use <code>querySelector</code> in our <code>didInsertElement</code> hook to find the <code>button</code> element:</li>
</ol>
<pre><code class="javascript language-javascript">didInsertElement() {
  this.element
    .querySelector('button')
    .addEventListener('click', this.handleClick);
}
</code></pre>
<p>This type of code can get even trickier in larger components, where you may have multiple elements that need event listeners, or have elements that only exist conditionally:</p>
<pre><code class="handlebars language-handlebars">&lt;button&gt;Hello, World!&lt;/button&gt;

{{#if this.showTutorial}}
  &lt;span class="tooltip"&gt;Click the button!&lt;/span&gt;
{{/if}}
</code></pre>
<pre><code class="javascript language-javascript">didInsertElement() {
  this.element
    .querySelector('button')
    .addEventListener('click', this.handleClick);

  let tooltip = this.element.querySelector('.tooltip');

  if (tooltip) {
    tooltip.addEventListener('mouseover', this.toggleTooltip);
  }
}
</code></pre>
<p>We <em>could</em> create new components instead, and this may make sense at times - for instance, the tooltip logic is something we'd likely want to reuse across the app. But in many cases, like our "Hello, world!" button, this would be a pretty heavy-handed solution, with a lot of boilerplate being generated for a very small amount of functionality. Compare this to modifiers, which can be applied directly to the elements that they operate on:</p>
<pre><code class="handlebars language-handlebars">&lt;button {{on "click" this.handleClick}}&gt;
  Hello, World!
&lt;/button&gt;

{{#if this.showTutorial}}
  &lt;span class="tooltip" {{on "mouseover" this.toggleTooltip}}&gt;
    Click the button!
  &lt;/span&gt;
{{/if}}
</code></pre>
<!-- alex ignore easily -->
<p>This cleans things up considerably. We don't have to duplicate logic in the component and the template, only one <code>if</code> statement is needed, and we can easily see what event listeners are applied to which elements. No need to make more components!</p>
<ol start="2">
<li><strong>They allow related code to live in the same place.</strong> The above example is even more complicated in actuality, because it's missing its <em>teardown</em> logic. If we aren't careful, we could end up leaking event listeners, or in an inconsistent state when the <code>if</code> statement toggles. Here's what the <em>full</em> logic for our component should look like:</li>
</ol>
<pre><code class="javascript language-javascript">class HelloWorld extends Component {
  addTooltipListener() {
    // save the element so we can remove the listener later
    this._tooltip = this.element.querySelector('.tooltip');

    if (this._tooltip) {
      this._tooltip.addEventListener(
        'mouseover',
        this.toggleTooltip
      );
    }
  }

  removeTooltipListener() {
    if (this._tooltip) {
      this._tooltip.removeEventListener(
        'mouseover',
        this.toggleTooltip
      );
    }
  }

  didInsertElement() {
    this.element
      .querySelector('button')
      .addEventListener('click', this.handleClick);

    this.addTooltipListener();
  }

  didUpdate() {
    this.removeTooltipListener();
    this.addTooltipListener();
  }

  willDestroyElement() {
    this.element
      .querySelector('button')
      .removeEventListener('click', this.handleClick);

    this.removeTooltipListener();
  }

  // ...
}
</code></pre>
<!-- alex ignore just -->
<p>As you can see, this is just a <em>bit</em> convoluted. We have a lot of conditional code all over the place, <em>and</em> we have mixing of concerns between the logic for the tooltip and the logic for the button. By contrast, modifiers have their own setup and teardown logic, completely self-contained. They also run on the insertion and destruction of the <em>element</em> they are modifying, not the component, so we don't need to check for the element's existence to see if we should be doing anything. The modifier will run when <code>showTutorial</code> switches to true, and it'll be torn down when <code>showTutorial</code> switches to false.</p>
<!-- alex ignore easy -->
<ol start="3">
<li><strong>They make sharing code between components much easier.</strong> Often times the same types of DOM manipulations need to be used in many components throughout an app, and <em>usually</em> it isn't easy or natural to share them via class inheritance. On the other hand, utility functions generally feel very bloated and boilerplate heavy to use for these purposes, since they <em>must</em> use state from the component and be integrated into its hooks. Addons like <a href="https://github.com/ember-lifeline/ember-lifeline"><code>ember-lifeline</code></a> do a good job at reducing the boilerplate, but it's still not ideal.</li>
</ol>
<p>This is one of the remaining use cases for Ember's mixin functionality, and arguably modifiers solve it even more cleanly since the modifications are applied <em>where they happen</em>.</p>
<!-- alex ignore simple -->
<ol start="4">
<li><p><strong>They work with template-only components.</strong> Currently you must always create a component class to do even simple DOM manipulation. With modifiers that's no longer necessary. In the future, this will mean more performance wins for simpler components, since they won't need a class instance.</p></li>
<li><p><strong>They work with tag-less components and Glimmer components.</strong> Currently, tag-less components (components with <code>tagName: ''</code>) have lifecycle hooks, but they don't have the <code>this.element</code> property since they don't have a wrapping element. This means that manipulating the DOM in them is pretty hard, you generally have to add a unique <code>id</code> to an element and select by that. Glimmer components also don't have <code>this.element</code> since they don't have a wrapping element either (more on that next time), and on top of that, they also don't have <em>any</em> lifecycle hooks beyond the <code>constructor</code> and <code>willDestroy</code>.</p></li>
</ol>
<p>Modifiers disconnect the component class definition from DOM manipulation, which means that they work even without these APIs. In fact, they will work with any component API. This allows more thorough separation concerns, and makes transitioning forward from classic components to Glimmer components even easier.</p>
<p>These benefits are the reasoning behind introducing a new concept. We also aren't the only framework to have noticed the benefits of this pattern, most recently React's new Hooks API is accomplishing a lot of the same goals in a similar manner, especially the <code>useLayoutEffect</code> hook which is specifically for running <a href="https://en.wikipedia.org/wiki/Side_effect_(computer_science)">side-effecting</a> layout code. Ember modifiers fill a similar gap.</p>
<h3 id="sowhatdotheylooklike">So What Do They Look Like?</h3>
<p>The usage side of modifiers has been defined since Ember v1. A modifier is the same syntax as a helper, but applied directly to an element instead of to an attribute:</p>
<pre><code class="handlebars language-handlebars">&lt;div
  {{my-modifier 'hello' 'world!'}}
  role={{my-helper 'some' 'value'}}
&gt;&lt;/div&gt;
</code></pre>
<p>Notably, there is an <code>{{action}}</code> helper and an <code>{{action}}</code> modifier, which is why it appears like the action helper can be used in both places:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- this is the action modifier --&gt;
&lt;div {{action this.handleClick}}&gt;&lt;/div&gt;

&lt;!-- this is the action helper --&gt;
&lt;div onclick={{action this.handleClick}}&gt;&lt;/div&gt;
</code></pre>
<p>Modifiers run whenever the element is <em>inserted</em> or <em>destroyed</em>, and whenever any of arguments to them change.</p>
<!-- alex ignore just -->
<p>User defined modifiers haven't been finalized just yet. Instead, Ember has created a low level API, the <em>Modifier Manager</em>. This allows us to experiment with different APIs for modifiers in the addon ecosystem before committing to a specific API. There are two major design proposals (and many variations on them) for modifiers that have been floated around at the moment.</p>
<p><strong>NOTE: These are NOT actual Ember APIs. They can currently be implemented in addons (and definitely should be!), but they may change in the future before Ember picks recommended/standard APIs!</strong></p>
<ol>
<li><strong>Class Based Modifiers</strong></li>
</ol>
<p>These modifiers would be more fully featured, with an instance and state, and the ability to control each lifecycle event:</p>
<pre><code class="javascript language-javascript">export default class DarkMode extends Modifier {
  @service userSettings;

  didInsert(element, [darkModeClass]) {
    if (this.userSettings.darkModeEnabled) {
      this._previousDarkModeClass = darkModeClass;
      element.classList.add(darkModeClass);
    }
  }

  willDestroy(element) {
    element.classList.remove(this._previousDarkModeClass);
  }

  didUpdate() {
    this.willDestroy(...arguments);
    this.didInsert(...arguments);
  }
}
</code></pre>
<pre><code class="handlebars language-handlebars">&lt;!-- usage --&gt;
&lt;div {{dark-mode 'ui-dark'}}&gt;&lt;/div&gt;
</code></pre>
<p>This API gives users the ability to have fine grained control over how they update the element each time the arguments change. In some cases, this level of control will be very useful for fine tuning performance, but in many cases (including this one) it may be more complicated than is necessary.</p>
<ol start="2">
<li><strong>Functional Modifiers</strong></li>
</ol>
<p>These modifiers would use a functional API, similar to <code>useLayoutEffect</code> in React, where they would consist of a single function that returns a cleanup function (if needed):</p>
<pre><code class="javascript language-javascript">function darkMode(userSettings, element, [darkModeClass]) {
  if (userSettings.darkModeEnabled) {
    element.classList.add(darkModeClass);

    return () =&gt; {
      element.classList.remove(darkModeClass);
    };
  }
}

export default modifier(
  { services: ['userSettings'] },
  darkMode
);
</code></pre>
<pre><code class="handlebars language-handlebars">&lt;!-- usage --&gt;
&lt;div {{dark-mode 'ui-dark'}}&gt;&lt;/div&gt;
</code></pre>
<p>The cleanup function would run <em>every</em> time the modifier updates, so in some cases this won't be performant enough. In many cases though, like this one, the increased ergonomics of it will be worth the extra cost. This version would also clean up very nicely in the future if decorators are made available to functions and function parameters:</p>
<pre><code class="javascript language-javascript">@modifier
function darkMode(
  @service userSettings,
  element,
  [darkModeClass]
) {
  if (userSettings.darkModeEnabled) {
    element.classList.add(darkModeClass);

    return () =&gt; {
      element.classList.remove(darkModeClass);
    }
  }
}
</code></pre>
<p>In the end, it's likely that a couple different modifier APIs will be recommended for most use-cases. Custom modifier APIs that are created will also continue to be supported indefinitely, part of the power and flexibility of the manager pattern that Ember is now using for userland APIs.</p>
<h3 id="sowhatcaniusenow">So, What Can I Use Now?</h3>
<p>There are several addons that have created modifiers that you can use in your apps today, including:</p>
<ul>
<li><a href="https://github.com/emberjs/ember-render-modifiers"><code>@ember/render-modifiers</code></a>, an official Ember addon that includes:</li>
</ul>
<ol>
<li><code>{{did-insert}}</code></li>
<li><code>{{did-update}}</code></li>
<li><code>{{will-destroy}}</code></li>
</ol>
<!-- alex ignore simple -->
<p>These modifiers are meant to be simple primitives that allow you to run code on each of the major lifecycle events that modifiers (and modifier managers) can have. They're also meant to help users refactor from classic components forward to Glimmer components, since Glimmer components don't have their own lifecycle hooks, though there are still some differences - notably, <code>{{did-update}}</code> does <em>not</em> update every time the component rerenders, only when its arguments change.</p>
<ul>
<li><a href="https://github.com/buschtoens/ember-on-modifier"><code>ember-on-modifier</code></a>, created by Jan Buschtöns, allows you to add event listeners of any kind directly to elements. This means you can cleanup any <code>ember-lifeline</code> code you have lying around and switch on over!</li>
<li><a href="https://github.com/lifeart/ember-ref-modifier"><code>ember-ref-modifier</code></a>, created by Alex Kanunnikov, mimics React's "ref" system for storing references to elements. This allows you to use them on your component directly if you need to, for more complicated component use cases.</li>
</ul>
<p>If you're willing to work at a lower level and experiment with new APIs, you can also check out the <a href="https://github.com/rwjblue/ember-modifier-manager-polyfill">modifier-manager-polyfill</a>, but be warned that it is meant for <em>low level</em> infrastructure, and shouldn't generally be used to write modifiers directly. The Modifier Manager API is still very new, and it'll take some time to solidify the userland APIs, but they'll be available soon!</p>
<h3 id="puttingitalltogether">Putting It All Together</h3>
<p>As always, we'll end with an example of a component before and after, to see how this new feature impacts real applications. This time we'll use an example from <code>ember-paper</code>, the Material UI addon for Ember, specifically <a href="https://github.com/miguelcobain/ember-paper/blob/14e3f0ffcaff3c4cfb9b93ff44f989da2a9a64dd/addon/components/paper-toast-inner.js">the paper-toast-inner component</a>, which uses the <a href="http://hammerjs.github.io">Hammer.js</a> library for recognizing touch events.</p>
<p>We'll also be using <em>theoretical</em> user APIs this time around, because the details of writing a component manager are definitely <em>not</em> ergonomic.</p>
<p><strong>NOTE: These examples contain <em>PROPOSED</em> APIs that have not been finalized, and could change in the future.</strong></p>
<p>Starting out, this is what our component looks like:</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';

import { run } from '@ember/runloop';
import { computed } from '@ember/object';
import { htmlSafe } from '@ember/string';
import layout from '../templates/components/paper-toast-inner';
import TransitionMixin from 'ember-css-transitions/mixins/transition-mixin';
import { invokeAction } from 'ember-invoke-action';

/**
 * @class PaperToastInner
 * @extends Ember.Component
 */
export default Component.extend(TransitionMixin, {
  layout,
  tagName: 'md-toast',

  // ...

  _setupHammer() {
    // Enable dragging the slider
    let containerManager = new Hammer.Manager(this.element, {
      dragLockToAxis: true,
      dragBlockHorizontal: true,
    });
    let swipe = new Hammer.Swipe({
      direction: Hammer.DIRECTION_ALL,
      threshold: 10,
    });
    let pan = new Hammer.Pan({
      direction: Hammer.DIRECTION_ALL,
      threshold: 10,
    });
    containerManager.add(swipe);
    containerManager.add(pan);
    containerManager
      .on('panstart', run.bind(this, this.dragStart))
      .on('panmove', run.bind(this, this.drag))
      .on('panend', run.bind(this, this.dragEnd))
      .on('swiperight swipeleft', run.bind(this, this.dragEnd));
    this._hammer = containerManager;
  },

  didInsertElement() {
    this._super(...arguments);
    if (this.get('swipeToClose')) {
      this._setupHammer();
    }
  },

  didUpdateAttrs() {
    this._super(...arguments);

    if (this.get('swipeToClose') &amp;&amp; !this._hammer) {
      // if it is enabled and we didn't init hammer yet
      this._setupHammer();
    } else if (!this.get('swipeToClose') &amp;&amp; this._hammer) {
      // if it is disabled and we did init hammer already
      this._teardownHammer();
    }
  },

  willDestroyElement() {
    this._super(...arguments);
    if (this._hammer) {
      this._teardownHammer();
    }
  },

  _teardownHammer() {
    this._hammer.destroy();
    delete this._hammer;
  },

  dragStart(event) {
    // ...
  },

  drag(event) {
    // ...
  },

  dragEnd() {
    // ...
  },
});
</code></pre>
<p>You'll notice that I've omitted some of the implementation details of the component so we can focus on the parts we're going to replace with modifiers. The same functionality can be refactored with two different functional modifiers - <code>if</code> and <code>hammer</code>:</p>
<pre><code class="javascript language-javascript">// /addon/modifiers/if.js
function _if(
  element,
  [conditional, modifier, ...rest],
  named) {
  if (Boolean(conditional)) {
    return modifier(element, rest, named);
  }
}

export default modifier(_if);
</code></pre>
<pre><code class="javascript language-javascript">// /addon/modifiers/hammer.js
const HAMMER_TYPE = {
  swipe: Hammer.Swipe,
  pan: Hammer.Pan,
  // remaining types...
};

const HAMMER_DIRECTION = {
  all: Hammer.DIRECTION_ALL,
  // remaining directions...
};

function hammer(element, positional, {
  recognizers = [],
  options = {},
  ...events
}) {
  let hammer = new Hammer.Manager(element, options);

  for (let { type, direction, ...rest } of recognizers) {
    let Recognizer = HAMMER_TYPE[type];
    direction = HAMMER_DIRECTION[direction];

    hammer.add(new Recognizer({ direction, ...rest }));
  }

  for (let event in events) {
    hammer.on(event, events[event]);
  }

  return () =&gt; {
    hammer.destroy();
  };
}

export default modifier(hammer);
</code></pre>
<p>The <code>if</code> modifier conditionally applies another modifier based on the the value passed to it, and the <code>hammer</code> modifier is a general purpose wrapper around the Hammer library. We can now use these modifiers without writing <em>any</em> component code:</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';
import template from '../templates/components/paper-toast-inner';
import TransitionMixin from 'ember-css-transitions/mixins/transition-mixin';

import { layout, tagName } from '@ember-decorators/component';

/**
 * @class PaperToastInner
 * @extends Ember.Component
 */
@tagName('')
@layout(template)
export default class PaperToastInner extends Component.extend(TransitionMixin) {
  // ...

  dragStart(event) {
    // ...
  }

  drag(event) {
    // ...
  }

  dragEnd() {
    // ...
  }
}
</code></pre>
<pre><code class="handlebars language-handlebars">&lt;md-toast
  {{if @swipeToClose hammer

    panstart=this.dragStart
    panmove=this.drag
    panend=this.dragEnd
    swiperight=this.dragEnd
    swipeleft=this.dragEnd

    recognizers=(arr
      (hash type="swipe" direction="all" threshold=10)
      (hash type="pan" direction="all" threshold=10)
    )

    options=(hash
      dragLockToAxis=true
      dragBlockHorizontal=true
    )
  }}
&gt;
  ...
&lt;/md-toast&gt;
</code></pre>
<!-- alex ignore easy -->
<p>As you can see, this is a fair amount less code overall. It's also code that is <em>very</em> easy to reuse now, since all of the implementation concerns for Hammer have been extracted. We could also pre-apply some of the modifiers options directly, for instance if the horizontal-swipe settings are used commonly in the app:</p>
<pre><code class="javascript language-javascript">// /addon/modifiers/horizontal-swipe.js
import hammer from './hammer';

export default modifier((element, positional, named) =&gt; {
  return hammer(element, positional, {
    ...named,

    recognizers: [
      { type: 'swipe', direction: 'all', threshold: 10 }
      { type: 'pan', direction: 'all', threshold: 10 }
    ],

    options: {
      dragLockToAxis: true,
      dragBlockHorizontal: true,
    },
  });
});
</code></pre>
<pre><code class="handlebars language-handlebars">&lt;md-toast
  {{if @swipeToClose horizontalSwipe

    panstart=this.dragStart
    panmove=this.drag
    panend=this.dragEnd
    swiperight=this.dragEnd
    swipeleft=this.dragEnd
  }}
&gt;
  ...
&lt;/md-toast&gt;
</code></pre>
<h2 id="conclusion">Conclusion</h2>
<!-- alex ignore mental -->
<p>Modifiers are one of the most exciting features landing in Octane to me. They definitely are a shift in the mental model for DOM and lifecycle hooks, but in my experience so far the component's I've refactored with them are much easier to reason about, and much more composable. Nailing down the userland APIs is going to be an exciting and interesting part of the design, and I'm hoping we get some interesting new ideas from the community (and if anyone wants to implement either of the managers I've described, please do! The class based one has even been mostly spec'd out in <a href="https://github.com/emberjs/rfcs/pull/353">Chad Hietala's RFC</a>. Ping me in Discord if you want help!) Overall, I'm looking forward to seeing how they turn out 😄</p>
<p>That's all I have for this week! Next Friday will be the last post in this series - Glimmer components, the next generation of components in Ember.</p>]]></description><link>https://blog.emberjs.com/coming-soon-in-ember-octane-part-4</link><guid isPermaLink="true">https://blog.emberjs.com/coming-soon-in-ember-octane-part-4</guid><pubDate>Wed, 06 Mar 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Coming Soon in Ember Octane - Part 5: Glimmer Components]]></title><description><![CDATA[<p>(This post was originally published on <a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-5-glimmer-components/">www.pzuraq.com</a>)</p>
<p>Hello again, and welcome back! This is the fifth and final entry in the multipart <em>Coming Soon in Ember Octane</em> series, where we're previewing some of the various features that are landing in Ember's upcoming Octane edition, including:</p>
<ul>
<li><a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-1-native-classes/">Native Classes (+Decorators)</a></li>
<li><a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-2-angle-brackets-and-named-arguments/">Angle Brackets & Named Arguments</a></li>
<li><a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-3-tracked-properties/">Tracked Properties</a></li>
<li><a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-4-modifiers/">Modifiers</a></li>
<li>Glimmer Components <em>← this post</em></li>
</ul>
<!-- markdownlint-disable MD029 -->
<!-- alex ignore just -->
<p>These aren't <em>all</em> of the new features that will be part of Octane, just the ones that I'm most familiar with personally. This series is aimed at existing Ember users, but if you're new to Ember or tried Ember a while ago and want to see how things are changing, I'll be providing context on the existing features as we go along. These posts won't be doing deep dives on all the edge cases of the functionality, they are moreso meant as an overview of what's coming. If you're curious about what an <em>edition</em> is exactly, you can check out a quick break down in <a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-1-native-classes/#whatareeditions">the first post in the series</a>.</p>
<p>Now, let's move onto Glimmer Components!</p>
<h2 id="abettercomponentapi">A Better Component API</h2>
<!-- alex ignore primitive -->
<p>Near the end of the Ember@v1 cycle, the community started noticing some pain points around Ember's component API. While components were a big hit overall, and quickly overtook views to become the default rendering primitive in Ember, there were a few paper cuts here and there that made them feel more difficult to use than they should have. In particular:</p>
<ol>
<li><strong>Syntax</strong>: The fact that components required the same <code>{{double-curly}}</code> syntax as helpers and bindings in templates could sometimes make them hard to parse out. There was a lot of visual clutter, and it could be hard to figure out what was being invoked where:</li>
</ol>
<pre><code class="handlebars language-handlebars">{{#modal-dialog}}
  {{#power-select
    options=names
    onchange=(action "foo")
    as |name|}}
    {{capitalize name}}
  {{/power-select}}
{{/modal-dialog}}
</code></pre>
<ol start="2">
<li><strong>Wrapper Element</strong>: Components had an implicit wrapper element that always wrapped the template, and required creating a class to customize:</li>
</ol>
<pre><code class="javascript language-javascript">import Component from '@ember/component';

export default Component.extend({
  tagName: 'button',
  classNames: ['btn'],
});
</code></pre>
<!-- alex ignore just -->
<p>This meant that the template was not the only source-of-truth for the final output of the component - users had to read the component class to know if it had customized the template in some way. It also meant users would oftentimes have to create a class just to customize this element, in what would otherwise be a Template-Only component.</p>
<ol start="3">
<li><strong>Arguments</strong>: Arguments to a component were assigned directly as properties on the component's instance. This would often lead to conflicts between arguments and properties or methods on a component, and make it difficult to tell the two apart:</li>
</ol>
<pre><code class="javascript language-javascript">import Component from '@ember/component';

export default Component.extend({
  init() {
    this._super(...arguments);

    // You may wonder where this magic `filter`
    // value came from. Is it a method on the
    // superclass? Actually, it's an argument
    // that was passed to the component, a callback.
    this.filter('').then((results) =&gt; {
      return this.set('results', results);
    });
  },
});
</code></pre>
<ol start="4">
<li><strong>Two-Way Bindings</strong>: Ember started off at a time when two-way data binding was the standard in frontend frameworks, but as time went on it became clear, both from a performance standpoint, and from a code organization standpoint, that one-way data flow made the most sense. Ember components can still currently modify values bound in the parent class's template, but this behavior tends to be buggy and error prone.</li>
</ol>
<p>These, along with many  other small paper cuts along the way, led the core team to a rethink of the component API. Along the way, parts of that rethink were broken out into individual pieces that we've already covered in this series, such as <code>&lt;AngleBracket&gt;</code> syntax, and the infrastructure was put in place to rationalize Ember's component API internally so that an entirely new API could be added, side-by-side to the original. Components are foundational to an Ember app, usually containing by and large the most code in the app, so being able to upgrade one component at a time rather than through a massive rewrite was incredibly important.</p>
<p>Glimmer Components are the final result of all that hard work. They're lighter, simpler, more ergonomic, and address all of these issues and more.</p>
<h2 id="lessismore">Less is More</h2>
<p>More than anything, Glimmer Components are a dramatic simplification of Ember's component API, which is now being referred to as Classic Components in the community. Classic Components have built up a lot of cruft over the years, including:</p>
<ul>
<li><strong>13</strong> Standard lifecycle hooks, such as
<code>didInsertElement</code>/<code>willDestroyElement</code> and <code>didUpdate</code>.</li>
<li><strong>29</strong> Event handlers, such as <code>click</code>, <code>mouseEnter</code>, and <code>dragStart</code>.</li>
<li><strong>9</strong> element/element customization properties, such as <code>element</code> and
<code>tagName</code>.</li>
<li><strong>21</strong> standard framework functions, such as <code>get</code>/<code>set</code>,
<code>addObserver</code>/<code>removeObserver</code> and <code>toggleProperty</code>.</li>
</ul>
<!-- alex ignore just -->
<p>By comparison, Glimmer Components have just <strong>2</strong> lifecycle hooks and <strong>3</strong> properties. They don't have any element or DOM based properties, hooks, or event handler functions, whose responsibilities have been passed on to element modifiers. This <em>dramatically</em> simplifies what you need to learn in order to start using the bread-and-butter class of Ember, allowing you to focus on productivity out of the box.</p>
<p>The other major differences include:</p>
<ul>
<li><strong>Outer HTML Semantics</strong></li>
<li><strong>Namespaced Arguments</strong></li>
<li><strong>Unidirectional Dataflow</strong></li>
<li><strong>Stateless Template-Only Components</strong></li>
</ul>
<p>And last, but certainly not least, the namesake of Glimmer Components - compatibility with <em>Glimmer.js</em>, the minimal component framework that complements Ember.</p>
<h3 id="lifecyclehooksmodifiers">Lifecycle Hooks &amp; Modifiers</h3>
<!-- alex ignore just -->
<p>As mentioned above, Glimmer Components have just two lifecycle hooks - the <code>constructor</code> function for setting up the component, and the <code>willDestroy</code> function for tearing it down. It also has just 3 properties: <code>isDestroying</code>, <code>isDestroyed</code>, and <code>args</code> (which we'll go over later on).</p>
<pre><code class="typescript language-typescript">interface GlimmerComponent&lt;T = object&gt; {
  args: T;

  isDestroying: boolean;
  isDestroyed: boolean;

  constructor(owner: Opaque, args: T): void;
  willDestroy(): void;
}
</code></pre>
<!-- alex ignore primitive -->
<p>You may be wondering how you can replace hooks like <code>didInsertElement</code> and <code>didUpdateAttrs</code>, or properties like <code>this.element</code>. After all, there were <em>13</em> hooks, and that has to cover a lot of functionality right? In actuality, our case studies showed that many of these hooks had significant overlap with each other, and that most of their functionality could either be replaced by <em>getters</em> and derived state, or by <a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-4-modifiers/">Modifiers</a>. I discussed Modifiers in depth in my last post, but the gist is that they're the new primitive for DOM manipulation, and with Glimmer Components they'll be the <em>only</em> method for accessing the DOM.</p>
<p>Reducing the number of lifecycle hooks makes designing a component that much simpler. There's no longer debating about which hooks to use, the benefits and tradeoffs and timing differences between <code>didRender</code> and <code>didReceiveAttrs</code>, when to use <code>willDestroyElement</code> and <code>didDestroyElement</code>. Instead, as much business logic should be pushed into getters and tracked properties as possible, with modifiers being used for any advanced side-effecting DOM logic.</p>
<h3 id="outerhtml">Outer HTML</h3>
<!-- alex ignore just -->
<p>In Glimmer Components, what you see in the template is what you get in the output. There is no wrapping element around the template - the template represents the "outer edge" of the component, instead of being just the "inside". This means that you don't have to use APIs like <code>tagName</code>, <code>classNames</code>, or <code>attributeBindings</code> to customize your template, ever. This component:</p>
<pre><code class="javascript language-javascript">// app/templates/hello-button.js
import Component from '@ember/component';

export default Component.extend({
  tagName: 'button',
  classNames: ['btn'],
  attributeBindings: ['role'],
  role: 'button',
});
</code></pre>
<pre><code class="handlebars language-handlebars">&lt;!-- app/templates/components/hello-button.hbs --&gt;
Hello, world!
</code></pre>
<p>Can be rewritten as:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- app/templates/components/hello-button.hbs --&gt;
&lt;button class="btn" role="button"&gt;
  Hello, world!
&lt;/button&gt;
</code></pre>
<p>This makes templates much easier to reason about, since the full definition is no longer split between two different files. You no longer have to remember that there is an outer element of some kind, and that it <em>may-or-may-not-be-but-usually-is</em> a <code>div</code>.</p>
<p>This does bring up the question of attribute reflection though. As we learned about in the post on <a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-2-angle-brackets-and-named-arguments/">Angle Bracket syntax</a>, attributes that are added to a component when used with angle brackets will be reflected onto the main element:</p>
<pre><code class="handlebars language-handlebars">&lt;MyButton class="custom-btn" aria-labelledby="my-label"/&gt;
</code></pre>
<!-- alex ignore special -->
<p>With Classic Components, the main component <em>is</em> the wrapper element. In Glimmer Components, there is no clear main element - there could be multiple top level elements, or there could be <em>no</em> elements, just text. This is what the special <code>...attributes</code> syntax is used for:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- app/templates/components/hello-button.hbs --&gt;
&lt;button ...attributes class="btn" role="button"&gt;
  Hello, world!
&lt;/button&gt;
</code></pre>
<!-- alex ignore clearly easily -->
<p>This syntax allows you to choose which element(s) the attributes get applied to. It can be applied multiple times, or not at all, in which case using attributes on the component will throw an error. This allows us to see clearly where element attributes are getting applied, and also to control it more easily. You could, for instance, use it on a <em>nested</em> element instead of a top level one.</p>
<p>Another cool feature of this syntax is that the <em>order</em> it is applied in can be used to determine how it overrides attributes. Attributes that come <em>before</em> <code>...attributes</code> will be overridden, but attributes that come <em>after</em> will not. For example, given these two possibilities:</p>
<pre><code class="handlebars language-handlebars">&lt;div data-foo="inner" ...attributes&gt;&lt;/div&gt;
&lt;div ...attributes data-foo="inner"&gt;&lt;/div&gt;
</code></pre>
<p>With this invocation:</p>
<pre><code class="handlebars language-handlebars">&lt;Foo data-foo="outer" /&gt;
</code></pre>
<p>We would get this result:</p>
<pre><code class="handlebars language-handlebars">&lt;div data-foo="outer"&gt;&lt;/div&gt;
&lt;div data-foo="inner"&gt;&lt;/div&gt;
</code></pre>
<p>This system is much more flexible overall, and means we can write easier to understand components with cleaner, more readable and self-explanatory templates!</p>
<h3 id="namespacedarguments">Namespaced Arguments</h3>
<p>Arguments in Glimmer Components are placed on the <code>args</code> property, instead of directly on component properties. This makes it much more clear what values are <em>arguments</em> that are passed to the component, and which are properties that the component uses itself internally. Revisiting our example from the introduction, this:</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';

export default Component.extend({
  init() {
    this._super(...arguments);

    this.filter('').then((results) =&gt; {
      return this.set('results', results);
    });
  },
});
</code></pre>
<p>Becomes this:</p>
<pre><code class="javascript language-javascript">import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';

export default class FilterComponent extends Component {
  @tracked results;

  constructor() {
    super(...arguments);

    this.args.filter('').then((results) =&gt; {
      this.results = results;
    });
  }
}
</code></pre>
<!-- alex ignore clearly -->
<p>And we can now clearly see that <code>filter</code> is an argument, and not some API function that came out of nowhere.</p>
<p>The <code>args</code> object is also immutable (though the arguments <em>themselves</em> are not). This enforces <strong>unidirectional dataflow</strong>, from parent components to child components, and prevents two-way data binding in general. It also means that when you see an argument, you <em>know</em> that it is a value passed down by the parent, and not something managed internally by the component. This distinction also helps with reasoning about component code.</p>
<h3 id="statelesstemplateonlycomponents">Stateless Template-Only Components</h3>
<p>Template-Only components are useful for extracting bits and pieces of functionality from other components quickly, without bringing along business logic. They keep things simpler by only having one file, and by keeping it focussed on presentation. However, with Classic Components they had two major issues:</p>
<!-- alex ignore just -->
<ol>
<li>There was no way to control the wrapping element, and oftentimes a class would have to be made just for that. Glimmer Components solve this with Outer HTML semantics, like we discussed above.</li>
<li>Even though Template-Only components didn't have any logic, with Classic Components they <em>did</em> have state. They needed an instance to hold their argument values, and it was <em>possible</em>, albeit somewhat difficult, to assign values to that instance and make them stateful using built-in helpers.</li>
</ol>
<p>With Template-Only Glimmer Components, components are <em>completely</em> stateless. They have no backing instance at all, making them much faster, and they have no way to set or access any state except for their arguments, making them much easier to reason about in general.</p>
<h3 id="glimmerjscompatibility">Glimmer.js Compatibility</h3>
<p>Glimmer.js has been the proving ground for a lot of the ideas that have made it into Ember over the past few years. It is a thin wrapper on top of the Glimmer VM, the rendering engine that both Glimmer.js and Ember share. While Ember is an all in solution for ambitious applications, Glimmer.js seeks to be a minimal, component-only framework that allows users to build up functionality as they need it. Eventually, the idea is that we'll be able to install our way to Ember, one package at a time.</p>
<p>Glimmer Components being cross-compatible means that Ember users can share code with a more minimal framework, that can better serve targeted use cases. In time, it'll mean that the ecosystem can work with both, and we'll be able to unify the two as we split apart the monolith one piece at a time.</p>
<h2 id="puttingitalltogether">Putting It All Together</h2>
<p>Like always, I'd like to end on a high note. Here's an example from the popular <a href="https://github.com/knownasilya/ember-toggle">ember-toggle</a> addon, which provides a nice toggle component, the <code>x-toggle-label</code> component:</p>
<pre><code class="javascript language-javascript">import { readOnly } from '@ember/object/computed';
import Component from '@ember/component';
import { computed } from '@ember/object';
import layout from './template';

export default Component.extend({
  layout,
  tagName: 'label',
  attributeBindings: ['for'],
  classNames: ['toggle-text', 'toggle-prefix'],
  classNameBindings: ['labelType'],
  for: readOnly('switchId'),
  isVisible: readOnly('show'),

  labelType: computed('type', function() {
    let type = this.get('type');

    return `${type}-label`;
  }),

  type: computed('value', {
    get() {
      return this.get('value') ? 'on' : 'off';
    }
  }),

  click(e) {
    e.stopPropagation();
    e.preventDefault();
    this.sendToggle(this.get('value'));
  }
});
</code></pre>
<pre><code class="handlebars language-handlebars">{{#if hasBlock}}
  {{yield label}}
{{else}}
  {{label}}
{{/if}}
</code></pre>
<p>As you can see, the component code is really heavy, and most of that is customization of the element. Converting it over to a Glimmer component, along with all the other improvements from Octane, we have:</p>
<pre><code class="javascript language-javascript">import Component from '@glimmer/component';
import { action } from '@ember/object';

export default class XToggleLabel extends Component {
  get type() {
    return this.args.value ? 'on' : 'off';
  }

  @action
  handleClick(e) {
    e.stopPropagation();
    e.preventDefault();
    this.args.sendToggle(this.args.value);
  }
}
</code></pre>
<pre><code class="handlebars language-handlebars">&lt;label
  for="{{@switchId}}"
  onclick={{this.handleClick}}

  class="
    toggle-text
    toggle-prefix
    {{this.type}}-label
    {{if @show 'is-visible' 'is-hidden'}}
  "
&gt;
  {{#if hasBlock}}
    {{yield label}}
  {{else}}
    {{label}}
  {{/if}}
&lt;/label&gt;
</code></pre>
<p>The class definition here is much smaller overall because we're able to strip out all of the logic for setting up the <em>template</em>, and we're able to put that where it really belongs: the template! This is much easier to read overall,  since we don't have to jump back and forth between the template and the class definition to understand what the final HTML will look like. It's all in one place.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Glimmer Components are a long-overdue refinement of Ember's component system, and I'm really excited to see how they clean up our code. The design process for this API took a very long time, but in the end I think we came up with the best possible component API for Ember, and I think it'll serve us well for years to come. I'm also very excited to see how Glimmer.js evolves now that users will be able to write components for both!</p>
<p>This wraps up this blog series! I hope you've enjoyed these posts, and look forward to the preview launching in the coming weeks! Ember in 2019 is going to be a very different framework 😄</p>]]></description><link>https://blog.emberjs.com/coming-soon-in-ember-octane-part-5</link><guid isPermaLink="true">https://blog.emberjs.com/coming-soon-in-ember-octane-part-5</guid><pubDate>Thu, 14 Mar 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Preview Weekend: 2019 Ember Community Survey]]></title><description><![CDATA[<p>We are thrilled to announce that we will be adding to the spring excitement
surrounding <a href="https://github.com/emberjs/rfcs/blob/26c4d83fb66568e1087a05818fb39a307ebf8da8/text/0000-roadmap-2018.md">Ember Octane</a>
and <a href="https://emberconf.com/">EmberConf 2019</a> with the release of the fifth
annual Ember Community Survey, and as always, we want your input before we go
live!</p>
<p>This year we're making an effort to move much of the survey
process to the <a href="https://github.com/ember-learn/annual-community-survey">ember-learn/annual-community-survey GitHub repo</a>.
Please review the <a href="https://github.com/ember-learn/annual-community-survey/blob/master/2019/survey-questions.md">the list of 2019 survey questions</a>
this before February 17th and submit feedback as
<a href="https://github.com/ember-learn/annual-community-survey/issues">an issues on that repo</a>.</p>
<p><a href="https://www.201-created.com/">201 Created</a> began this annual survey of
the Ember community in 2015. Over the past four years, data from the survey has helped
us measure progress on issues as wide ranging as diversity and browser support.
In 2017, free text responses were permitted for the first time, giving community
participants a way to provide feedback to the project and project leadership a
new way to hear their voices. As 201 Created steps away, it is
time to promote the annual survey to an official project of the Ember Learning
Team. Thank you 201 Created team (and interns who worked on this) for our first
four years!</p>
<p>In 2019 the Ember community is more vibrant than ever, with over 3000 members
having joined the official Discord server (join via the <a href="https://www.emberjs.com/community/">Ember Community page</a>)
that launched last September. We're eager to hear how people are using Ember
and what they plan for the future.</p>
<p>Here are the key dates for this year's survey:</p>
<ul>
<li>02/16 - 02/17 : Survey question feedback</li>
<li>02/18 - 03/08 : Survey open to the public for responses</li>
<li>03/19 : Results distributed in time for the EmberConf 2019 keynote!</li>
</ul>
<p>Please join us in <code>#dev-ember-learning</code> <a href="https://emberjs.com/community/">on Discord</a>
if you have any questions or other feedback for this year's survey.</p>
<p>You can read <a href="https://www.emberjs.com/ember-community-survey-2018/">last year's survey results
here</a>.</p>
<p>A big thank you to <a href="http://codeallday.com/">Code All Day</a> for sponsoring
<a href="https://github.com/JosephDTemple">Joseph Temple</a> to work on this year's
survey. You can learn more about Code All Day's Ember.js development and
consulting services at their website <a href="http://codeallday.com/">codeallday.com</a>.</p>]]></description><link>https://blog.emberjs.com/community-survey-preview</link><guid isPermaLink="true">https://blog.emberjs.com/community-survey-preview</guid><pubDate>Sat, 16 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Compiling templates with Ember 1.10]]></title><description><![CDATA[<p>As many of you know, Ember 1.10 will be the first version of Ember that uses <a href="https://github.com/tildeio/htmlbars">HTMLBars</a> as its templating engine. With this change you may need to change the way you compile your templates.</p>
<p>The HTMLBars API is evolving and not 1.0.0 yet, so to ensure that templates are compiled compatibly with your Ember version we have updated the Ember build system to generate a <code>ember-template-compiler.js</code> file alongside every build of Ember. This template compiler can be used server-side for precompilation or in the browser to compile templates on the fly. If you do not need to compile templates at runtime (in the browser) the <code>ember.debug.js</code> or <code>ember.prod.js</code> file alone is sufficient. There is no need to include a runtime dependency. This is a departure from previous versions, where you would always include either <code>handlebars.js</code> or <code>handlebars.runtime.js</code>.</p>
<p>Most of the time you will use a third party library like <a href="https://github.com/ember-cli/ember-cli">ember-cli</a>, <a href="https://github.com/rondale-sc/ember-cli-htmlbars">ember-cli-htmlbars</a>, or <a href="https://github.com/dgeb/grunt-ember-templates">grunt-ember-templates</a> to precompile templates, but this post will discuss how libraries like this should work internally.</p>
<h3 id="serversidecompilation">Server Side Compilation</h3>
<p>If possible, it is definitely a best practice to compile your templates server side. This is much faster due to less total size (you don't need the compiler on the client) and less work that the app needs to do.</p>
<h4 id="ember10through19">Ember 1.0 through 1.9</h4>
<p>In prior versions, you would typically use the <code>ember-template-compiler</code> NPM package that corresponded to your Ember version to precompile your templates. That might look something like the following:</p>
<pre><code class="javascript language-javascript">var fs = require('fs');
var compiler = require('ember-template-compiler');
var input = fs.readFileSync('path/to/template.hbs', { encoding: 'utf8' });
var template = compiler.precompile(input, false);
var output = 'export default Ember.Handlebars.template(' + template + ');';

fs.writeFileSync('path/to/output.js', output, { encoding: 'utf8' });
</code></pre>
<p>You would also need to include <code>handlebars.runtime.js</code> in your final build</p>
<h4 id="ember110">Ember 1.10+</h4>
<p>With Ember 1.10, you will use the <code>ember-template-compiler.js</code> file that is paired with your Ember version. If you use our <a href="https://github.com/components/ember">Bower repo</a> or <a href="https://rubygems.org/gems/ember-source">RubyGem</a>, or download Ember from our <a href="http://emberjs.com/builds/">builds site</a>, there is a <code>ember-template-compiler.js</code> in the same path as <code>ember.debug.js</code> and <code>ember.prod.js</code>.</p>
<p>You can use this template compiler directly  and without additional requirements. For example:</p>
<pre><code class="javascript language-javascript">var fs = require('fs');
var compiler = require('./bower_components/ember/ember-template-compiler');
var input = fs.readFileSync('path/to/template.hbs', { encoding: 'utf8' });
var template = compiler.precompile(input, false);
var output = 'export default Ember.HTMLBars.template(' + template + ');';

fs.writeFileSync('path/to/output.js', output, { encoding: 'utf8' });
</code></pre>
<p>As you will notice, the new API for server-side compilation is nearly identical to that of prior versions. The main change is the usage of the local <code>bower_components/ember/ember-template-compiler.js</code> file as opposed to the NPM module.</p>
<h3 id="clientsidecompilation">Client Side Compilation</h3>
<p>Generally speaking, you should avoid compiling templates on the client, but there are times that you cannot avoid this. Live demo apps like <a href="http://emberjs.jsbin.com">JSBin</a> are one example.</p>
<h3 id="ember10through19-1">Ember 1.0 through 1.9</h3>
<p>In prior versions of Ember you would need to ensure that the full version of <a href="handlebarsjs.com">Handlebars.js</a> was present to allow compiling of templates. Perhaps something like the following in your <code>index.html</code>:</p>
<pre><code class="html language-html">&lt;script src="assets/handlebars.js"&gt;&lt;/script&gt;
&lt;script src="assets/ember.prod.js"&gt;&lt;/script&gt;
</code></pre>
<h3 id="ember110-1">Ember 1.10+</h3>
<p>With Ember 1.10, you will include the <code>ember-template-compiler.js</code> for your specific Ember version.  Something like the following:</p>
<pre><code class="html language-html">&lt;script src="assets/ember-template-compiler.js"&gt;&lt;/script&gt;
&lt;script src="assets/ember.prod.js"&gt;&lt;/script&gt;
</code></pre>
<p>If you include the <code>ember.debug.js</code> file instead of a production file the compiler is still required.</p>
<h3 id="templatecompilationbuildtools">Template Compilation Build Tools</h3>
<p>There are any number of build tool libraries that are intended to make the server side compilation of templates easier. Here are a few (please let us know of others):</p>
<ul>
<li><a href="https://github.com/rondale-sc/ember-cli-htmlbars">ember-cli-htmlbars</a> - Can be used either as a standalone Broccoli plugin, or as an ember-cli addon.</li>
<li><a href="https://github.com/dgeb/grunt-ember-templates">grunt-ember-templates</a> - Works as a Grunt plugin. To precompile HTMLBars templates, you must supply specific parameters to your task definition as mentioned in <a href="https://github.com/dgeb/grunt-ember-templates/pull/77">this PR</a>.</li>
<li><a href="https://github.com/dbashford/mimosa-ember-htmlbars">mimosa-ember-htmbars</a> - A plugin for the <a href="http://mimosa.io/">mimosa</a> build tool.</li>
<li><a href="https://github.com/emberjs/ember-rails">ember-rails</a> - The Rails Asset Pipeline plugin supports HTMLBars templates.</li>
</ul>]]></description><link>https://blog.emberjs.com/compiling-templates-in-1-10-0</link><guid isPermaLink="true">https://blog.emberjs.com/compiling-templates-in-1-10-0</guid><pubDate>Thu, 05 Feb 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Face to Face, January 2016]]></title><description><![CDATA[<p>Ember is a truly community-driven framework, with contributors and core
team members who live all over the world and work for many different
companies. The vast majority of our collaboration happens online via
tools like GitHub.</p>
<p>That said, every quarter the Ember core team likes to meet face-to-face
for a high-bandwidth, high-intensity discussion about the future of the
framework. We focus on high priority issues, ways we can improve our
process, and setting the long-term vision for Ember.</p>
<p>A week ago, the core team descended on beautiful Spicewood, Texas
(about an hour outside of Austin) for two days of <s>hand to hand
combat</s> technical discussion.</p>
<p>Below, in no particular order, are summaries of the topics we discussed.
Nothing here should be considered final, and all decisions are subject
to change as we receive community feedback.</p>
<h3 id="subteams">Subteams</h3>
<p>Ember includes everything you need to create a modern web application,
from build tools to a lightning fast rendering engine to comprehensive
documentation. Because of its scope, it can be difficult for any one
core team member to keep everything in their head (except maybe Yehuda).</p>
<p>As we've taken on new initiatives, we've often bootstrapped ad hoc
subteams to help carry out the day-to-day work. For example, Ember
Data, Ember CLI and the documentation subteams all have their own set
of committers who meet regularly to discuss their area of focus.</p>
<p>At the face-to-face, we discussed formalizing the subteams and granting
them more autonomy. Primarily, this increased autonomy will be achieved
through refinements to the RFC process, largely inspired by the <a href="https://github.com/aturon/rfcs/blob/rust-governance/text/0000-rust-governance.md">Rust
governance model</a>.</p>
<p>To quote the Rust governance RFC:</p>
<blockquote>
  <p>The basic idea is to supplement the core team with several "subteams".
  Each subteam is focused on a specific area, e.g., language design or
  libraries. Most of the RFC review process will take place within the
  relevant subteam, scaling up our ability to make decisions while
  involving a larger group of people in that process.
  To ensure global coordination and a strong, coherent vision for the
  project as a whole, each subteam is led by a member of the core team.</p>
</blockquote>
<p>Subteams are responsible for shepherding RFCs along, helping submitters
identify open or unresolved issues. Once a subteam deems an RFC
complete, it enters a week-long final comment period.  This serves as a
warning to community members that the time to get their feedback in is
coming to a close. After the week is up, the subteam will make a
decision about whether the RFC should be accepted or not.</p>
<p>For more information, see the <a href="https://github.com/aturon/rfcs/blob/rust-governance/text/0000-rust-governance.md">Rust governance
RFC</a>, where the process and the motivation behind
it is outlined in detail. We will have more information about the
subteams soon.</p>
<h3 id="rfcimprovements">RFC Improvements</h3>
<p>In addition to the changes noted above about subteams managing the RFC
process, we are also making several tweaks to the existing RFC format:</p>
<ol>
<li>All RFCs <strong>must</strong> include Drawbacks and Alternatives sections. (<code>N/A</code>
will no longer be accepted.)</li>
<li>We are introducing a new section to discuss naming and terminology.</li>
<li>We are introducing a new section that asks how the RFC changes the
programming model, if at all. This is critical for ensuring the
guides stay up-to-date with best practices.</li>
</ol>
<p>More details on the RFC improvements will be posted soon.</p>
<h3 id="documentation">Documentation</h3>
<p>We had a wide-ranging discussion about documentation. Generally,
documentation has been significantly improved but we always want to do
more to make sure developers have a great experience.</p>
<p>We discussed several relatively easy-to-do improvements that would be high
value:</p>
<ol>
<li>Encourage more core team members to join in on the documentation
subteam calls, particularly those shepherding new features that
impact the programming model.</li>
<li>Suppress private classes from the API docs, which can feel
overwhelming to new users.</li>
<li>Offer better cross-linking between API docs and guides.</li>
<li>Ensure that Google only indexes the latest version, so intrepid
searchers do not end up on stale documents.</li>
</ol>
<p>We also have some exciting improvements to the getting started
experience being worked on.</p>
<h3 id="engines">Engines</h3>
<p>As Ember adoption increases, one common question we get is: how can
multiple teams work on an Ember app without stepping on each others'
toes?</p>
<p>The answer to that question is engines. A little over a year ago, Yehuda and I
submitted <a href="https://github.com/emberjs/rfcs/pull/10">RFC #10: Engines</a>, describing a way to break
apart a large Ember app into several, smaller apps that can be merged
together into a cohesive whole.</p>
<p>Engines have taken a while to get right, because they touch almost every
part of Ember. Dan Gebhardt and Robert Jackson have been working
tirelessly on this, and recently released the experimental
<a href="https://github.com/dgeb/ember-engines">ember-engines</a> addon that you can begin using today.</p>
<p>The addon currently relies on monkey-patching several private Ember
classes. Now that the addon is out, we plan to upstream these changes
back into Ember itself. Our hope is to get the these building blocks
into Ember (and stable) as fast as possible, so the addon will work with
non-Canary releases. After that, we will continue to iterate on the design
and user-facing API in the addon.</p>
<p>For more about engines, see <a href="https://speakerdeck.com/dgeb/introducing-ember-engines">the slides from Dan's talk at Boston Ember introducing the
ember-engines addon</a>.</p>
<h3 id="betterappcomponentization">Better App Componentization</h3>
<p>Developers love Ember components because they help break up your UI into
small pieces that you can reason about.</p>
<p>On the other end of the spectrum, engines allow you to break up
monolithic apps into a smaller set of apps that you can develop
individually, then compose together into one large app.</p>
<p>But what about medium-size apps? These apps may not have enough people
working on them that they'd want to break it apart using engines, but
they <em>are</em> starting to accumulate many UI components. Reasoning about
which components are used where is getting difficult.</p>
<p>The answer to this problem is something that we've called the pods
architecture. It allows you to organize your app by feature, rather than
by type, so you can quickly see all of the pieces that bring a feature
to life.</p>
<p>We have several significant improvements to pods coming soon, including
the ability to scope UI components to a single pod. Stay tuned for more
details.</p>
<h3 id="universaleventdispatch">Universal Event Dispatch</h3>
<p>This is still a pie-in-the-sky idea, but we discussed whether it would
be possible to create a universal event dispatch engine.</p>
<p>To understand what an event dispatch engine is, you should
first understand the idea of <a href="https://learn.jquery.com/events/event-delegation/">event delegation</a>.</p>
<p>The basic idea is this: as your app runs, many components will be added
and removed from the DOM. Those components have event handlers:
functions that get run when the user clicks on the component, for example.</p>
<p>Rather than setting up a listener for each component, then tearing it
down when the component is removed, Ember installs a single listener for
each possible event on the root document.</p>
<p>Then, when the user interacts with a component, we rely on the fact that
the DOM event will eventually bubble up to the document, and thus and
the event handler Ember has installed. Once there, we reverse-engineer
which component the bubbled event originated from. Once we've found the
component, we invoke its event handler.</p>
<p>This works well but there's one problem for people that embed multiple
Ember apps on the same page: each Ember app installs its own set of
event listeners. We can optimize startup performance for these cases by
having a set of event listeners that each Ember app instance can share.</p>
<p>But it's not Ember that would benefit only. Other libraries like React
use event delegation as well. We discussed whether it would be possible
to create a dispatch engine that was low-level enough that all of the
React, Ember, etc. apps running on a single page could share it, and only pay the
cost of installing event listeners once.</p>
<p>We don't have anything concrete here yet but want to put together a plan
and start socializing it with other library implementors. Even if we
don't get their buy-in, at least we can improve the boot performance of
multiple Ember apps on a single page.</p>
<h3 id="smoothingthe1xto20upgrade">Smoothing the 1.x to 2.0 Upgrade</h3>
<p>The strength of Ember is in its community and in its ecosystem. We
increase the vibrancy of both by doing everything in our power to smooth
the upgrade process and ensure the vast majority of apps can make the
transition to new versions of the framework.</p>
<p>The 1.13 to 2.0 transition was our first time managing a community
migration across major version boundaries. We had a long discussion
about what went right and what went wrong, and what we can learn as we
begin to think about what an Ember 3.0 might look like.</p>
<p>More importantly, we discussed what factors are still keeping some apps
on 1.12 and 1.13, and what we can do to address them.</p>
<p>Some teams may stick with a 1.x version that works
for them; we won't be able to get everyone to upgrade to 2.x, at least
right away. Rather, our goal is that anyone on 1.12 or 1.13 who <em>wants</em>
to be on 2.x should have a way to get there.</p>
<p>One of the biggest issues we've heard reported is that, while the new
Glimmer engine in 1.13 is much faster in some scenarios, there are
several performance regressions in other scenarios.</p>
<p>Naturally, teams are hesistant to upgrade if their app is impacted by a
performance regression. But if they cannot upgrade to 1.13, which
contains the deprecation warnings needed to make a smooth transition to 2.x, how
can they ever get there?</p>
<p>The answer is to use 1.12 for deploying to production, but
switch to 1.13 temporarily while developing to get the list of
deprecations to fix.</p>
<p>Unfortunately, 1.13 introduced several new public APIs to replace
private APIs for things like registering Handlebars helpers. Despite
being private, those APIs were nonetheless in use by apps and addons.
This can make it difficult to switch between versions: 1.12 has private
APIs for something 1.13 has public APIs for, but no version has both.</p>
<p>To remedy this situation, we're taking a two-pronged approach:</p>
<ol>
<li>For commonly used private APIs that were removed in 1.13, we will
backport their public API versions to a 1.12 patch release.</li>
<li>We will continue to investigate performance regressions in 1.13.</li>
</ol>
<p>Note that many of the initial performance regressions have already been
fixed in the 1.13.x series. <strong>We encourage teams that tested under early
1.13 releases to run their performance analysis again with the latest
patch release.</strong></p>
<p>Ideally, most teams should be able to move to 1.13 on the way to 2.0. If
that's not possible, we'll at least make it possible for an app to
switch seamlessly between 1.12 and 1.13. Core team member Erik Bryn has
also committed to writing an upgrade guide based on his real-world
experiences upgrading several large apps, and we look forward to seeing
that.</p>
<h3 id="longtermsupportrelease">Long-Term Support Release</h3>
<p>Developers on the bleeding edge love the rhythm of Ember's six week
release cycle. That cadence leads to a steady pace of new features,
while also taking the pressure off contributors; they don't feel the
need to rush features because there's always a new release on the
horizon.</p>
<p>That said, we've heard from developers at more conservative
organizations that the pace of new releases can feel overwhelming. Those
developers are happy with the features they have, but are apprehensive
about <em>not</em> upgrading because they don't want to be left behind.</p>
<p>To help those developers, <a href="http://emberjs.com/blog/2015/08/13/ember-2-0-released.html">we announced in the Ember 2.0 release blog
post</a> that we would be introducing Long-Term Support
(LTS) releases. We are gearing up for our first LTS release and hammered
out some more details at the face-to-face meeting.  You should expect to
see the first LTS release in the next few months.</p>
<p>For more details on the LTS release process, see <a href="https://github.com/emberjs/rfcs/pull/56">RFC #56: Release Cycle
Improvements</a>.</p>
<h3 id="ember30deprecations">Ember 3.0 Deprecations</h3>
<p>One of the mistakes we made during the 2.0 transition was rushing
last-minute deprecations into 1.13. We felt a sense of urgency, since
not getting a deprecation in meant it couldn't be removed for at least
another year, or whenever Ember 3.0 was released.</p>
<p>Unfortunately, this created a feeling of significant churn, and the list
of deprecations to fix became overwhelming. For many apps, the promise
that they could fix all of the deprecations in a single sprint rang hollow.</p>
<p>To make up for the 1.13 deprecation onslaught, we've held off
introducing major new deprecations into any of the 2.x releases so far.</p>
<p>Enough time has now passed that we feel comfortable starting to think
about introducing new deprecations. That said, we've learned several
important lessons from Deprecationocalypse and we will do our best to
avoid a repeat of the situation.</p>
<p>At the face-to-face, we agreed on the following policies to reduce pain
for developers:</p>
<ol>
<li>Now that we have a plan for major version releases and have lived
through one such transition, we will start implementing deprecations
earlier in the cycle rather than rushing them in at the last minute.</li>
<li>We will try to only introduce a handful of deprecations per release,
so that no one release feels overwhelming and the upgrade cost can be
paid over the entire major version cycle.</li>
<li>Deprecations will not be merged into <code>master</code> until a deprecation guide
has been written.</li>
<li>Deprecation guides will be more holistic and include more than one
example. Ideally, deprecation guides would contain code snippets from
open source Ember apps and addons that show how to make the change in
a real-world context.</li>
<li>We will collaborate with the docs team early on to ensure that
deprecated features are not being used in the guides.</li>
</ol>
<h3 id="fastboot">FastBoot</h3>
<p>FastBoot development continues at a rapid pace and we hope to have a
stable release soon.</p>
<p>As anyone who's attempted to do server-side rendering of client-side
JavaScript knows, being able to render a component's HTML on the server
is a critical but very small part of the overall story. While we've had
server rendering of Handlebars templates working for the better part of
a year, integrating server-side rendering into the application
architecture and ecosystem takes a lot of work.</p>
<!-- alex ignore simple -->
<p>Our hope with FastBoot is that it's so easy to use, the majority of
Ember users enable it. We don't want server-side rendering to be
something you can kind of do with weeks and weeks of work; we want it to
be as simple as installing an addon via npm. It's going to take the
support of the entire community to do that.</p>
<p>Expect more updates from us about FastBoot soon, particularly about how
you can start making sure your addons are FastBoot-compatible.</p>
<h3 id="performance">Performance</h3>
<p>One topic that touched almost all of the other conversations was
performance. We continue to make improved boot, rendering, and build
performance our top priority.</p>
<p>In addition to creating a performance subteam, we are beginning the
infrastructure work to allow Svelte Builds&mdash;builds of Ember that
have all code related to deprecated features removed. This allows
developers who have eliminated the deprecation warnings in their code to
benefit from a significantly reduced file size.</p>
<p>We also have several on-going initiatives to improve the Glimmer rendering
engine that we hope will start paying dividends soon.</p>
<h3 id="emberasastablecore">Ember as a Stable Core</h3>
<p>If there was one thing that became apparent to me at this meeting, it is
that Ember has become a stable core on top of which developers can build
amazing web applications&mdash;without fearing they will be left behind.</p>
<p>The key to <em>Stability without Stagnation</em> is the ability to experiment
outside of the core framework.  Because of the addon ecosystem, unified
community and our strong shared conventions, new features can start off
as addons that are free to boldly experiment. Once the experiments have
been proven, they can be incorporated back into the mainstream developer
experience.</p>
<p>The thinking behind the <a href="https://extensiblewebmanifesto.org">Extensible Web Manifesto</a> has
influenced us greatly. The key idea of the EWM is that browser vendors
should focus on exposing the smallest set of raw capabilities&mdash;the
DOM, geolocation, background workers, the camera, bytes and
buffers&mdash;then let the open source community iterate on libraries
and frameworks that make those raw capabilities easier to use for a
broader audience.</p>
<p>While low-level API gives you maximum flexibility, it doesn't always
make it pleasant to build large apps. However, these unpleasant building
blocks have unlocked frameworks and libraries like jQuery, Ember,
Angular and React.</p>
<p>By focusing first on raw capabilities before ease-of-use, you keep the
scope constrained. You can ship features faster, and by exposing only
the building blocks, you can let experimentation and competition in the
ecosystem find an API that developers love&mdash;without breaking
backwards compatibility.</p>
<p>The same thing is starting to happen in Ember. Two illustrative examples
are FastBoot and Engines. With FastBoot, we made only the minimum set of
changes needed to the core framework.  Primarily, that was cleaning up
application boot and introducing <code>ApplicationInstance</code>, and adding a
low-level API for programmatically routing and rendering an app (the
<code>visit()</code> API).</p>
<p>Despite the fact that FastBoot 1.0 has not yet shipped, because of their
small scope, the low-level framework features needed to make it work are
already in release versions of Ember. This means that FastBoot will work
with any release of the framework that has the <code>visit()</code> API, starting
with Ember 2.3.</p>
<p>And because the majority of FastBoot's developer-facing API lives in an
addon, we can rapidly iterate separate from Ember's typical six week
release cycle.</p>
<!-- alex ignore easy -->
<p>And, as described in the above Engines section, the <code>ember-engines</code>
addon is taking a similar approach. We'll figure out the minimum set of
changes needed to the core framework to make them work, then rapidly
incorporate them into a stable release. The bulk of the code will live
in a separate addon, making it easy to add or remove.  And if someone
doesn't like how engines work, they too will have access to the
low-level building blocks that are needed to create a competitor.</p>
<p>None of this would be possible without a community and framework that
rallies behind finding shared solutions as much as possible. Early
adopters of Ember experienced significant churn as we were figuring out
what the stable core was. Now we are reaping the benefits of that
experimentation in a big way, as we can now build even higher on top of
the solid foundation we've built together.</p>
<p>A common refrain in the JavaScript ecosystem is that opinionated
software boxes you in, and that you're better off spending weeks picking
the set of libraries that fit the particular needs of your application.
But it has been our experience that building a strong community around a
shared set of solutions leads to applications that are more maintainable
over the long run, and don't leave you itching to throw away everything
and rewrite it in a year or two.</p>
<p>As the set of things needed to build a modern web app
grows&mdash;Service Workers, Web Workers, offline sync, push
notifications, OS integration, server-side rendering, fast re-rendering, WebSockets,
reliable deployment, CSS postprocessing, and animation, to name only a
few&mdash;we think Ember will be better positioned than ever to help
developers build amazing things. Soon, it will flat out not be
feasible to do everything yourself.</p>
<p>Thank you for being a part of the Ember community. It's going to be a
very exciting 2016.</p>]]></description><link>https://blog.emberjs.com/core-team-face-to-face-january-2016</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-face-to-face-january-2016</guid><pubDate>Sat, 23 Jan 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2013/12/06]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>We want to ensure that our process and thinking is totally transparent
to the Ember.js community so we're going to start publishing meeting
notes here.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @stefanpenner, @tomdale, @trek, @wagenet, @wycats</p>
<h3 id="topics">Topics</h3>
<h4 id="transparency">Transparency</h4>
<p>We've heard a few comments that people would like greater Core Team transparency.
Since the weekly meetings are the only significant group communication that isn't
public, we'll be posting notes from these meetings.</p>
<p>Resolutions:</p>
<ul>
<li>@trek publish core team meeting notes</li>
<li>@trek post weekly reminders that the core team meeting occurs and invite people
to contact individual core team members if they have issued they’d like raised.</li>
</ul>
<h4 id="htmlbars">HTMLBars</h4>
<p>@wycats says it’s ready to hand off to someone else.</p>
<p>Resolutions:</p>
<ul>
<li>@krisselden will come a bit early to the face to face to get mind-dumped. @machty
is already familiar with writing Handlebars runtime compatible template languages
from his work on <a href="http://emblemjs.com/">Emblem.js</a> so can also help get this
over the last few hurdles.</li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2013-12-06</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2013-12-06</guid><pubDate>Sat, 07 Dec 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2013/12/20]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@krisselden, @machty, @stefanpenner, @tomdale, @trek, @wagenet, @wycats</p>
<h3 id="topics">Topics</h3>
<h4 id="buildtools">Build Tools</h4>
<p>@wycats has been communicating with @jo_liss about using
<a href="https://github.com/joliss/broccoli/">broccoli</a> as the basis for a build tools package.</p>
<h4 id="emberdata">Ember Data</h4>
<!-- alex ignore easy -->
<p>Ember data is now less of an ORM and more of a pluggable framework for assembling your own data communication layer for Ember.js applications (with some nice defaults for people's whose APIs follow common patterns). However, the interface – especially on the "normal form" of return values – isn't well documented so people aren't able to easily jump in, try it, and offer feedback.</p>
<p>Resolutions:</p>
<ul>
<li>@trek will start working on docs.</li>
<li>@tomdale, @wycats will publish an ember data update blog post.</li>
</ul>
<h4 id="queryparams">Query Params</h4>
<p>Some debate about the correct location for defining and handling query parameters
(controller vs route).</p>
<p>Resolutions:</p>
<ul>
<li>a smaller group will handle that discussion</li>
</ul>
<h4 id="pods">Pods</h4>
<p>During the face-to-face we floated the idea of organizing an application's files in a
<a href="/blog/2013/12/17/whats-coming-in-ember-in-2014.html#toc_pod-directory-structure">"pod" structure</a>.
Feedback has been positive, but we want to get more real world stories about the pros and cons of
this structure.</p>
<p>Resolutions:</p>
<ul>
<li>@trek will reach out to people said they've built in this style.</li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2013-12-20</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2013-12-20</guid><pubDate>Sun, 22 Dec 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/01/03]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @stefanpenner, @trek, @wagenet, @wycats</p>
<h3 id="gonogofor14">Go/No-Go for 1.4</h3>
<p>It's that time in the <a href="/builds/#/beta">beta release cycle</a> where the core team
gives a "go" or "no-go" vote to feature-flagged beta functionality.</p>
<h4 id="queryparamsnewnogo">query-params-new: no-go</h4>
<ul>
<li>needs more people trying this</li>
<li>doc/guides need to be updated.</li>
</ul>
<h4 id="withcontrollergo">with-controller: go</h4>
<ul>
<li><p>make sure to add parentController immediately after merge (@kselden)</p></li>
<li><p>address <a href="https://github.com/emberjs/ember.js/issues/4050">https://github.com/emberjs/ember.js/issues/4050</a> (@stefanpenner)</p></li>
<li><p>ensure lookupFactory and creates with content</p>
<pre><code class="handlebars language-handlebars">{{#with foo controller=someController}}
</code></pre></li>
</ul>
<h4 id="embermetalwithproxygo">ember-metal-with-proxy: go</h4>
<ul>
<li>rename to Ember.run.bind and merge (@stefanpenner)</li>
</ul>
<h4 id="embermetalrunmethodnogo">ember-metal-run-method: no-go</h4>
<ul>
<li>@krisselden and @wycats are worried that this will be used inappropriately</li>
<li>people should use <code>.run</code> at the root of a frame, not randomly throughout it</li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-01-03</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-01-03</guid><pubDate>Mon, 06 Jan 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/01/17]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @stefanpenner, @tomdale, @trek, @wagenet, @wycats, @wifelette</p>
<h3 id="pendinggonogo">Pending Go/No-Go</h3>
<p>We received feedback that too many flagged features in canary were
not getting enough discussion from the core team early in the release cycle.</p>
<p>This was delaying useful features making it into scheduled beta releases.</p>
<p>To tighten up the feedback loop, the core team will regularly
review features on our canary builds and work with authors sooner to address concerns.</p>
<p>The current list of features on <code>master</code> but not enabled in the 1.4 family of beta builds
can be found on this Github issue:
<a href="https://github.com/emberjs/ember.js/issues/4052">https://github.com/emberjs/ember.js/issues/4052</a></p>
<p>The following features look good in their current incarnation and will likely receive a "go"
vote:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/3711">ember-testing-routing-helpers</a></li>
<li><a href="https://github.com/emberjs/ember.js/pull/3879">computed-read-only</a></li>
<li><a href="https://github.com/emberjs/ember.js/pull/4049">ember-metal-is-blank</a></li>
<li><a href="https://github.com/emberjs/ember.js/pull/4122">ember-eager-url-update</a></li>
</ul>
<h4 id="stringhumanizehttpsgithubcomemberjsemberjspull3224andstringparameterizehttpsgithubcomemberjsemberjspull3953"><a href="https://github.com/emberjs/ember.js/pull/3224">string-humanize</a> and <a href="https://github.com/emberjs/ember.js/pull/3953">string-parameterize</a></h4>
<p>There is a concern that this increases the surface area of API and the size of the framework
without providing enough benefit that is unique to Ember.js. If the package manager ecosystem
for browser JavaScript were more mature, these would clear cases for community contribution.
String inflection is notoriously hard to get correct, especially with internationalization,
and the common case is already handled by existing libraries.
@trek <a href="https://github.com/trek/fleck">even maintains one</a></p>
<p>Resolutions:</p>
<ul>
<li>Revert.</li>
</ul>
<h4 id="emberhandlebarscapslookuphttpsgithubcomemberjsemberjspull3218"><a href="https://github.com/emberjs/ember.js/pull/3218">ember-handlebars-caps-lookup</a></h4>
<p>A bare capitalized word in Handlebars should look up on current scope.
<code>{{CONSTANT}}</code> and <code>{{#each CONSTANT}}</code> did global lookup mostly by side effect,
this was not intended API, but we need to think through backwards compatibility
issues for people who used this as part of their app design.</p>
<p>Some proposed ideas:</p>
<ul>
<li>try local lookup first</li>
<li>try global lookup and issue a deprecation warning ("will be removed in 2.0")</li>
</ul>
<p>Resolutions:</p>
<ul>
<li>Revert.</li>
<li>@wycats will talk to the author about a revert and our preferred way forward for this
behavior</li>
</ul>
<h4 id="embertestingtriggereventhelperhttpsgithubcomemberjsemberjspull3792"><a href="https://github.com/emberjs/ember.js/pull/3792">ember-testing-triggerEvent-helper</a></h4>
<p>Looks good but needs some revision:</p>
<ul>
<li>Needs mechanism for customizing event with additional data (i.e. which key is being pressed)</li>
<li>Possibly have <code>keyEvent</code> event helper use <code>triggerEvent</code> internally</li>
</ul>
<p>Resolutions:</p>
<ul>
<li>@ebryn will provide feedback on the PR</li>
</ul>
<h4 id="composablecomputedpropertieshttpsgithubcomemberjsemberjspull3696"><a href="https://github.com/emberjs/ember.js/pull/3696">composable-computed-properties</a></h4>
<p>Possibly still needs some work (there some unhandled todos)? Will be a "go" when
these are addressed.</p>
<p>Resolutions:</p>
<ul>
<li>@trek will ask about the status of remaining todos</li>
</ul>
<h4 id="queryparamsnewhttpsgithubcomemberjsemberjspull4008"><a href="https://github.com/emberjs/ember.js/pull/4008">query-params-new</a></h4>
<p>@wycats and @machty chatted about some last minute issues. This PR should be good soon.
The removal of query prefixing should provide a nicer query string  (the <code>[]</code> prefixing only
happens if two controllers in same hierarchy have the same parameter name).</p>
<p>Resolutions:</p>
<ul>
<li>@machty will keep chugging along</li>
</ul>
<h4 id="emberroutingloadingerrorsubstateshttpsgithubcomemberjsemberjspull3655"><a href="https://github.com/emberjs/ember.js/pull/3655">ember-routing-loading-error-substates</a></h4>
<p>Currently <code>state/loading</code> and <code>state_loading</code> both reify into StateLoading under the current
resolver. Custom resolvers (like those in EmberAppKit) don't have this issue, but the global
resolver does. We can't make this work until modularization is done.</p>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-01-17</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-01-17</guid><pubDate>Sun, 19 Jan 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/01/27]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<p>This week's core team meeting was rescheduled from Friday, January 24 to Monday, January 27
due to the Google outage that affected Google Hangouts.</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @stefanpenner, @tomdale, @trek, @wagenet, @wycats</p>
<h3 id="topics">Topics</h3>
<h4 id="issuesdiscussion">Issues Discussion:</h4>
<p>The core team discussed the following Github Issues</p>
<ul>
<li><p><code>ember-routing-auto-location</code> <a href="https://github.com/emberjs/ember.js/pull/3725">#3725</a>.</p>
<p>resolution:</p>
<ul>
<li>assign @stefanpenner</li>
<li>should be good for the next beta.</li>
<li>needs someone to audit + try for real</li>
<li>is it ok if we have /#/foo and /foo  in the wild? How does this affect SEO</li>
<li>document that backend support is needed and that your app will not have
canonical URLs (i.e. every URL will have two versions in the wild: <code>/#/foo</code> and <code>/foo</code>)</li></ul></li>
<li><p>Bound Action Lookup <a href="https://github.com/emberjs/ember.js/pull/3936">#3936</a></p>
<p>We added default fall back to allow a static string action name if a property isn't found,
but it is possible that this will break things if you have a property AND an action named
the same thing. This could be enabled similar to the <code>ember-routing-drop-deprecated-action-style</code>
feature which will need to have a <code>null</code> value in <code>features.json</code> (which will allow folks to
opt-in via <code>EmberENV</code>) until 2.0 if we are concerned with the SemVer implications.</p>
<p>resolution: Ensure docs are updated so unquoted style is not used before shipping.</p></li>
<li><p><code>ember-views-bindable-attributes</code> <a href="https://github.com/emberjs/ember.js/pull/4170">#4170</a></p>
<p>We like the idea generally but there are doubts having a a separate API, we should explore pushing it into a single API. Differences between this and <code>attributeBindings</code> are too subtle, we should not fragment</p>
<p>This has been converted to a Mixin that is only used for <code>Ember.TextField</code> and <code>Ember.TextArea</code> currently. It allows for us to use all HTML5 attributes, but only actually setup observers/bindings for the ones that are present at the first render. This has a significant developer happiness impact, and we hope that we can get comfortable with it enough to enable in 1.5 beta series.</p>
<p>resolution: @ebryn will talk to Robert</p></li>
<li><p>Replace <code>module</code> with <em>something</em> else. <a href="https://github.com/emberjs/ember.js/pull/3838">#3838</a></p>
<p>This is due to an issue under Node (since <code>module</code> is a reserved word). It ultimately doesn't matter what we decide on, but if we want the test suite to run under Node (for <code>ember-runtime</code> and <code>ember-metal</code> specifically, but also possibly <code>ember-data</code>) we need to use something that isn't a keyword.</p>
<p>resolution: QUnit.module, but check for prior art. (@stefanpenner)</p></li>
<li><p>Update Backburner (and Docs). <a href="https://github.com/emberjs/ember.js/pull/4120">#4120</a></p>
<p>Contains potentially breaking change to <code>throttle</code> to default to running immediately (from <a href="https://github.com/ebryn/backburner.js/pull/55">ebryn/backburner.js#55</a> ).</p>
<p>resolution: it was a bug, breaking it is fine.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/issues/3256">https://github.com/emberjs/ember.js/issues/3256</a></p>
<p>resolution: bindingPaths to globals should be canned, so we won't support additional features built on
on this behavior.</p></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-01-27</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-01-27</guid><pubDate>Sat, 08 Feb 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/01/31]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @stefanpenner, @tomdale, @wifelette, @wycats</p>
<h3 id="gonogofeaturelisting">Go/No-Go Feature Listing</h3>
<ul>
<li><p><code>ember-routing-named-substates</code> <a href="https://github.com/emberjs/ember.js/pull/3655">#3655</a></p>
<p>@krisselden: likes the feature a lot (we should do it)
@wycats: naming with globals is totally unsolvable.
@machty: If FooLoading is ambiguous, we should warn that global mode is not supported for this feature
@tomdale: we need a separate task force for thinking about module mode only features.</p>
<p>resolution: Tom and Stef will review</p></li>
<li><p><code>ember-handlebars-caps-lookup</code> <a href="https://github.com/emberjs/ember.js/pull/3218">#3218</a></p>
<p>resolution: check local first, warn and fallback to global seems like a good strategy</p></li>
<li><p><code>ember-testing-simple-setup</code> <a href="https://github.com/emberjs/ember.js/pull/3785">#3785</a></p>
<p>resolution: Tom and Stef will review</p></li>
<li><p><code>version api docs</code></p>
<p>Often asked for. We should work with community, see if robert can own, and help delegate.</p></li>
<li><p><code>query-params-new</code> <a href="https://github.com/emberjs/ember.js/pull/4008">#4008</a></p>
<p>misleading bug reports, but eager loader of controllers was the original pain point that kept
this a "No go"</p></li>
<li><p><code>composable-computed-properties</code> <a href="https://github.com/emberjs/ember.js/pull/3696">#3696</a></p>
<p>@wycats: aliased to short words in the examples, should be documented to match this?
@ebryn:: new CP work may have issues, @wycats and @ebryn and David should talk.</p>
<p>resolution: @ebryn will talk to David about blocking</p></li>
<li><p><code>ember-routing-auto-location</code> <a href="https://github.com/emberjs/ember.js/pull/3725">#3725</a></p>
<p>resolution: Alex will make sure docs are good, then this becomes a "Go"</p></li>
<li><p><code>ember-routing-bound-action-name</code> <a href="https://github.com/emberjs/ember.js/pull/3936">#3936</a></p>
<p>resolution: "Go" but we need an intermediate release issuing deprecation warnings, a future release will have break. This future release may contain some helpful warning, and the release notes will contain this info.</p></li>
</ul>
<h3 id="prsissuestoreview">PR's/Issues To Review</h3>
<ul>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4251">FEATURE ember-routing-consistent-resources</a></p>
<p>Adds <code>.index</code>, <code>.loading</code>, and <code>.error</code> sub-routes for resources created even if no callback was provided.</p>
<p>For example:</p>
<pre><code class="javascript language-javascript">App.Router.map(function() {
  this.resource("home");
});
</code></pre>
<p>Prior to this feature <code>home.index</code> route would not be created for the above resource.
It is possible that the current situation was intentional.</p>
<p>resolution: "No go"</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4246">FEATURE ember-routing-inherits-parent-model</a></p>
<pre><code class="javascript language-javascript">App.Router.map(function() {
  this.resource('thing', { path: '/thing/:thing_id' }, function() {
    this.route('edit');
  });
});
</code></pre>
<p>If you wanted the Edit route's model to be the Thing loaded in the Thing route, you have to define a model hook on the Edit route to call this.modelFor('thing'), which is pretty repetitive and cumbersome.</p>
<p>For this.route() routes that don't specify a model hook, the model for that route should default to the parent resource's model.</p>
<p>This should be totally backwards compatible unless someone is doing something extremely strange.</p>
<p>resolution: make this work only for routes, not resources for now. The interim solution.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/3689">FEATURE ember-document-title</a></p>
<p>Examples from @machty:</p>
<ul>
<li><a href="http://jsbin.com/ucanam/3299">Single static title</a></li>
<li><a href="http://jsbin.com/ucanam/3302">Basic example of titleToken + title</a></li>
<li><a href="http://jsbin.com/ucanam/3300">Basic example of titleToken + title (reversed)</a></li>
<li><a href="http://jsbin.com/ucanam/3303">titleToken bound to controller/model properties</a></li>
<li><a href="http://jsbin.com/ucanam/3304">Overriding doc.title format in deeper routes</a></li></ul>
<p>resolution: pause, until @wycats and @tomdale can review tokens behavior. Its getting close and we want this.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/3935">Convert Checkbox and Select to Components.</a></p>
<p>resolution: "No go", this is a breaking change.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/3838">Use <code>QUnit.module</code> instead of <code>module</code>.</a></p>
<p>Let's confirm what to use as a prefix. Is <code>QUnit.module</code> OK, or should we create our own
(perhaps <code>EmberDev.module</code> or something)?</p>
<p>resolution: "Go"</p></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-01-31</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-01-31</guid><pubDate>Sat, 08 Feb 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/02/07]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @stefanpenner, @tomdale, @trek, @wagenet, @wycats</p>
<h3 id="topics">Topics</h3>
<h4 id="featurespendinggodecision">Features pending 'Go' decision.</h4>
<p>The core team reviewed the following pull requests for inclusion in the 1.5.x beta series:</p>
<ul>
<li><p><code>ember-routing-named-substates</code> <a href="https://github.com/emberjs/ember.js/pull/3655">#3655</a></p>
<p>Tom and Stef still need to discuss how to handle module mode + new semantics next week.</p>
<p>Resolution: Tom and Stef will discuss this week. No, for real this time.</p></li>
<li><p><code>ember-handlebars-caps-lookup</code> <a href="https://github.com/emberjs/ember.js/pull/3218">#3218</a></p>
<p>Needs follow up from <a href="https://github.com/xtian">@xtian</a>.</p>
<p>Resolution: Ping @xtian</p></li>
<li><p><code>ember-testing-simple-setup</code> <a href="https://github.com/emberjs/ember.js/pull/3785">#3785</a></p>
<p>Tom and Stef still need to review.</p>
<p>Resolution: Tom and Stef will review.</p></li>
<li><p><code>query-params-new</code> <a href="https://github.com/emberjs/ember.js/pull/4008">#4008</a></p>
<p>There are still some decisions around <a href="https://code.stypi.com/stefanpenner/lazy-loading">lazy loading code</a>
and query params.</p>
<p>resolution: Alex and Stef will discuss lazy stuff.</p></li>
<li><p><code>composable-computed-properties</code> <a href="https://github.com/emberjs/ember.js/pull/3696">#3696</a></p>
<p>resolution:  stefan will work with David monday or tuesday to get this in. A "Go" then.</p></li>
<li><p><code>ember-routing-inherits-parent-model</code> <a href="https://github.com/emberjs/ember.js/pull/4246">#4246</a></p>
<p>resolution: "Go", already in beta</p></li>
<li><p><code>ember-handlebars-log-primitives</code> <a href="https://github.com/emberjs/ember.js/pull/4252">#4252</a></p>
<p>resolution: "Go"</p></li>
<li><p><code>ember-document-title</code> <a href="https://github.com/emberjs/ember.js/pull/3689">#3689</a></p>
<p>Examples from @machty of current behavior:</p>
<ul>
<li><a href="http://jsbin.com/ucanam/3299">Single static title</a></li>
<li><a href="http://jsbin.com/ucanam/3302">Basic example of titleToken + title</a></li>
<li><a href="http://jsbin.com/ucanam/3300">Basic example of titleToken + title (reversed)</a></li>
<li><a href="http://jsbin.com/ucanam/3303">titleToken bound to controller/model properties</a></li>
<li><a href="http://jsbin.com/ucanam/3304">Overriding doc.title format in deeper routes</a></li></ul>
<p>resolution: Still "No go", tokenization needs some polish related to nested resources</p></li>
</ul>
<h4 id="featurescurrentlyslatedfor150betaseries">Features currently slated for 1.5.0 beta series</h4>
<p>The core team reviewed the following pull requests for already enabled in canary builds for inclusion in the 1.5.x beta series. All still have a "Go" vote.</p>
<ul>
<li><code>ember-testing-routing-helpers</code> <a href="https://github.com/emberjs/ember.js/pull/3711">#3711</a></li>
<li><code>ember-testing-triggerEvent-helper</code> <a href="https://github.com/emberjs/ember.js/pull/3792">#3792</a></li>
<li><code>computed-read-only</code> <a href="https://github.com/emberjs/ember.js/pull/3879">#3879</a></li>
<li><code>ember-metal-is-blank</code> <a href="https://github.com/emberjs/ember.js/pull/4049">#4049</a></li>
<li><code>ember-eager-url-update</code> <a href="https://github.com/emberjs/ember.js/pull/4122">#4122</a></li>
<li><code>ember-routing-auto-location</code> <a href="https://github.com/emberjs/ember.js/pull/3725">#3725</a></li>
<li><code>ember-routing-bound-action-name</code> <a href="https://github.com/emberjs/ember.js/pull/3936">#3936</a></li>
</ul>
<h4 id="featureprocess">Feature Process</h4>
<p>We reviewed the a proposed change to the process for adding features. This isn't a major departure, but an iteration
on what we are currently doing:</p>
<p>Process:</p>
<ul>
<li>Feature is submitted via PR.<ul>
<li>Confirm <code>features.json</code> and <code>FEATURES.md</code> have entries.</li>
<li>That PR is reviewed, and generally confirmed to be a solid idea</li>
<li>PR is merged so makes it into a canary build</li></ul></li>
<li>Feature is added to <a href="https://github.com/emberjs/ember.js/issues/4052">Features Pending 'Go' Decision</a> Issue</li>
<li>New Issue is created with a check-list of items to be completed prior to receiving a 'Go' vote.<ul>
<li>This should include at least the following entries:<ul>
<li>Security Audit</li>
<li>Core Team Sign-off<!-- alex ignore easy --></li></ul></li>
<li>Should be given a special tag (to make it easy to find later)</li>
<li>Should be assigned to the original feature contributor</li>
<li>This can serve as the proper place to ask for changes/fixes to the feature</li>
<li>Once the feature has gotten a 'Go' decision<ul>
<li>The issue is closed.</li>
<li>It is added to <code>features.json</code> with a value of <code>true</code>.</li></ul></li></ul></li>
</ul>
<p>resolution: "Go" and CONTRIBUTOR.md should be update accordingly.</p>
<h4 id="securityprocess">Security Process</h4>
<p>Currently we do security releases all the way back to 1.0.x. At some point that will be untenable (not yet though).
There was some discussions about Long Term Support release structures: every odd/even becomes LTS, or even 5th release, or we only support previous three revisions (which would be all releases in the last 4.5 months with our current release model).</p>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-02-07</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-02-07</guid><pubDate>Sat, 08 Feb 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/02/14]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @stefanpenner, @tomdale, @trek, @wagenet, @wycats</p>
<h3 id="topics">Topics</h3>
<h4 id="es6ifyingcore">ES6ifying core</h4>
<p>Last month we completed the migration of <a href="https://github.com/emberjs">ember-data</a> to the ES6 module syntax. This lets us use <a href="https://github.com/emberjs/data/blob/master/packages/ember-data/lib/serializers/rest_serializer.js#L5-L8">clearer dependency declarations</a>, stay clear of module syntax battles (you can export to whichever module format best conforms to your deeply held beliefs on JavaScript modules), and continues our pattern of bringing future JavaScript features to you today.</p>
<p>Work has started on the <a href="https://github.com/emberjs/ember.js/commit/8c0a52cb10efbaede8e14cca24fa5c05bcf121ff">porting Ember.js to ES6 module syntax as well!</a>.</p>
<p>Thanks to @thomasABoyt and @Square for work on the <a href="https://github.com/square/es6-module-transpiler">ES6 Module Transpiler</a>, @fivetanley for converting ember-data, and @rwjblue for starting the process in Ember.js core.</p>
<p>Resolution: @rwjblue hands off the grunt work to @trek and @fivetanley so he's not overextended. @rwjblue says "you're good to start with ember-metal"</p>
<h4 id="ghostjsadmin">Ghost.js Admin</h4>
<p>The fine folks at <a href="https://ghost.org/">Ghost</a> have hit a complexity ceiling with their current admin interface (a mixed client/server rendering solution with Backbone tossed in). They're <a href="https://github.com/TryGhost/Ghost/issues/2144">discussing various solutions for a rewrite</a> and Ember.js is among the options.</p>
<p>The core team discussed devoting some time to helping the Ghost team evaluate Ember.js as a possible solution.
If you'd like to help or weigh in – especially if you're a current Ghost user or developer – please go comment: <a href="https://github.com/TryGhost/Ghost/issues/2144">https://github.com/TryGhost/Ghost/issues/2144</a></p>
<p>Resolution: @trek will devote some time to helping the Ghost team. Possibly on a small spike.</p>
<h4 id="gettingridofoldstackoverflowquestionsanswers">Getting rid of old Stack Overflow questions/answers</h4>
<p>We frequently get comments about older Stack Overflow questions and answers. Answers
related to pre-release versions of Ember have a high likelihood of no longer being valid.
Stack Overflow has a policy of not deleting questions related to older versions of software,
but we think pre-release software is exceptional for a few reasons:</p>
<ul>
<li>pre-release software is often undocumented and unfinished, leading people to use
Stack Overflow as a place to find answers at higher rates than for relased software</li>
<li>people should not continue using pre-release software for long after an official
release, so there is little value in having those answers around for future reference</li>
<li>good questions might have wildly different answers before and after a 1.0 release
but there's no way for a new user to know</li>
<li>some questions themselves will no longer make sense as features are added or removed</li>
</ul>
<p>An example of a question that should be deleted is this <a href="http://stackoverflow.com/questions/8672287/ember-js-how-to-use-em-button">question related to Ember.Button</a>. Ember.Button has long been deprecated and removed. The pattern for actions has changed significantly since that question was asked in December 2011. However, someone wondering how to handle buttons in Ember who searches for "ember and buttons stackoverflow" will get this question as a top result.</p>
<p>We're working to do some form of cleanup for questions like these. The first step is to compile a list of ones the community feels should be removed. With that list we'll apply some form of cleanup.</p>
<p>Resolution: @trek will get this list created somehow.</p>
<h4 id="featurespendinggodecision">Features pending 'Go' decision.</h4>
<p>The core team reviewed the following pull requests for future inclusion in the 1.6.x beta series:</p>
<ul>
<li><p><code>ember-routing-named-substates</code> <a href="https://github.com/emberjs/ember.js/pull/3655">#3655</a></p>
<p>@stefanpenner and @tomdale still need to discuss this.</p>
<p>Resolution: @stefanpenner and @tomdale will speak.</p></li>
<li><p><code>ember-testing-simple-setup</code> <a href="https://github.com/emberjs/ember.js/pull/3785">#3785</a></p>
<p>@stefanpenner and @tomdale still need to discuss this.</p>
<p>Resolution: @stefanpenner and @tomdale will speak.</p></li>
<li><p><code>query-params-new</code> <a href="https://github.com/emberjs/ember.js/pull/4008">#4008</a></p>
<p>@wycats and @machty continued discussion on lazy loading. Goal is to get it in during this beta cycle</p>
<p>Resolution: @machty &amp; @stefanpenner have a man-date to discuss lazy loading.</p></li>
<li><p><code>composable-computed-properties</code> <a href="https://github.com/emberjs/ember.js/pull/3696">#3696</a></p>
<p>Still blocked on <a href="https://github.com/emberjs/ember.js/pull/4185">computed.literal</a></p>
<p>Resolution: The original behavior wasn't intended. Changing now might be breaking change
in some people's apps. We'll put it through a multi-cycle deprecation/removal path.</p></li>
<li><p><code>ember-metal-computed-empty-array</code> <a href="https://github.com/emberjs/ember.js/pull/4219">#4219</a></p>
<p>Resolution: "Go". Upgrade to a Bugfix is it doesn't require a flag.</p></li>
<li><p><code>ember-runtime-test-friendly-promises</code> <a href="https://github.com/emberjs/ember.js/pull/4176">#4176</a></p>
<p>Resolution: Peter will try in <a href="https://www.skylight.io/">Skylight</a>'s tests and
offer feedback</p></li>
<li><p><code>ember-routing-inherits-parent-model</code> <a href="https://github.com/emberjs/ember.js/pull/4246">#4246</a></p>
<p>Resolution: Already conceptually a "Go". @machty will make nestable routes in the next week or so so this can be merged.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4235">BUGFIX beta Still update HTML5 history if the previous state was null</a></p>
<p>iframes may set null values onto the HTML5 history state. The router will sometimes pick up the null value as current
instead of the window's nominal state (which was set by Ember). The old logic required that a prior state be present,
this logic allows a null state to be replaced or pushed over.</p>
<p>Resolution: A clear "Go".</p></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-02-14</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-02-14</guid><pubDate>Sat, 15 Feb 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/02/21]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @tomdale, @trek, @wagenet, @wycats</p>
<h3 id="topics">Topics</h3>
<h4 id="oldstackoverflowquestions">Old Stack Overflow questions</h4>
<p>Last week we started the process of cleaning up old questions on Stack Overflow by
collecting a list of questions and evaluating whether the question still made
sense and, if so, whether selected answer was still the best available answer.</p>
<p>Initially we were using Stack Overflow's existing tagging functionality to collect this
list but the Stack Overflow admins <a href="http://meta.stackoverflow.com/a/221612/238614">suggested that we find some other way</a>.
They didn't have any suggestions for using Stack Overflow to speed this process,
so we created a list of all Ember.js questions to date with some minimal semantics
around correctness.</p>
<p>If you're looking to help, please <a href="https://docs.google.com/spreadsheet/ccc?key=0Aie5my_LJZzOdFB3SnAtZHFZcENic3hrMmxHdWkzeXc&usp=drive_web#gid=0">check out this document</a>
and give us feedback on some older Stack Overflow questions and answers!</p>
<h4 id="es6ifyingcore">ES6ifying core</h4>
<p>This work continues <a href="https://github.com/emberjs/ember.js/pull/4374">here</a>.</p>
<h4 id="featurespendinggodecision">Features pending 'Go' decision.</h4>
<p>The core team reviewed the following pull requests for future inclusion in
the 1.6.x beta series:</p>
<ul>
<li><p><code>ember-testing-simple-setup</code> <a href="https://github.com/emberjs/ember.js/pull/3785">#3785</a></p>
<p>While its heart is in the right place, we think this is a bandaid on top of a
testing infrastructure that needs a bottoms-up rethink.</p>
<p>While we don't think the implementation needs to change dramatically, per se,
someone needs to sit down and write a proposal for how the testing infrastructure
should work.</p>
<p>Resolution: Revert.</p></li>
<li><p><code>query-params-new</code> <a href="https://github.com/emberjs/ember.js/pull/4008">#4008</a></p>
<p>@stefanpenner and @machty met in person on Tuesday to discuss an API that supported
lazy loading of routes and will continue the conversation as these changes are made.</p>
<p>Resolution: Not ready yet. We don’t  want to serialize default values into the
URL. False params should be represented as “=false”, rather than merely being absent
from URL (which was ambiguous). So, this example JSBin from the docs is wrong:
<a href="http://emberjs.jsbin.com/ucanam/2708">http://emberjs.jsbin.com/ucanam/2708</a>.</p></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-02-21</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-02-21</guid><pubDate>Sun, 23 Feb 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/02/28]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @rwjblue, @stefanpenner, @tomdale, @trek, @wycats</p>
<h3 id="topics">Topics</h3>
<h4 id="helloghost">Hello, Ghost</h4>
<p>A few weeks ago <a href="https://twitter.com/jacob4u2/status/434059022220541952">@jacob4u2 reached out over twitter</a>
to let us know the popular Node.js-based blogging platform <a href="https://ghost.org/">Ghost</a> was looking to
reinvent their admin interface and were discussing various browser JavaScript libraries. The
<a href="https://github.com/TryGhost/Ghost/issues/2144">ensuing discussion</a> is a great read.</p>
<p>This week the Ghost team announced <a href="http://dev.ghost.org/hello-ember/">they'd be rebuilding in Ember.js</a>.
We're super geeked to see Ghost join <a href="https://www.balancedpayments.com/">Balanced</a>,
<a href="https://travis-ci.org/">TravisCI</a>, <a href="http://www.discourse.org/">Discourse</a>, and the rest of the
great community of open source projects adopting Ember.js.</p>
<p>Thanks to everyone who chimed in on the discussion and the Ember.js community members who
helped with advice, feedback, and tender loving care on Github, Twitter, and IRC.</p>
<p>Resolution:</p>
<ul>
<li>@ebryn is going to do a video walkthrough of how he'd organize Ghost's admin interface</li>
<li>@rwjblue and @trek have been in #Ghost IRC and will keep that up</li>
<li>We'll ask the Ghost to team to draw our attention to PRs/Issues related to the migration</li>
</ul>
<h4 id="es6ifyingcore">ES6ifying core</h4>
<p>The migration of ember-metal, ember-runtime, and ember-debug to ES6-style modules is
<a href="https://github.com/emberjs/ember.js/pull/4374">completed but not yet merged</a>.  In making
large changes we're always especially cautious about accidentally breaking existing
features, reducing performance, or increasing file size. Modularizing doesn't appear to have
an effect on build speed or runtime performance, but did lead to a 5k min/gzip size increase
that we're not happy with.</p>
<p>We're currently tracking down the various causes of size bloat and doing some cleanup
to bring build size back to its previous size.</p>
<p>Resolution:</p>
<ul>
<li>@rwjblue is going to do some cleanup and work with the transpiler
maintainers to add some output improvements.</li>
</ul>
<h4 id="featurespendinggodecision">Features pending 'Go' decision.</h4>
<p>The core team reviewed the following pull requests for future inclusion in
the 1.6.x beta series:</p>
<ul>
<li><p><code>ember-routing-named-substates</code> <a href="https://github.com/emberjs/ember.js/pull/3655">#3655</a>
Still blocked on module vs global object lookup form, which causes naming collisions.</p>
<p>Resolution: will remain on canary until we've moved to modules and have a modular
loader.</p></li>
<li><p><code>ember-handlebars-caps-lookup</code> <a href="https://github.com/emberjs/ember.js/pull/3218">#3218</a>
The original author has become unresponsive.</p>
<p>Resolution: approach @mixonic to take over.</p></li>
<li><p><code>ember-routing-add-model-option</code> <a href="https://github.com/emberjs/ember.js/pull/4293">#4293</a></p>
<p>Resolution: It’s a go.</p></li>
</ul>
<h4 id="prsissuestoreview">PR's/Issues To Review</h4>
<ul>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4436">Do not setup listeners for destroyed Arrays</a></p>
<p>Sometimes due to timing in test suites, an array that has become
destroyed (most likely due to a call to DS.Store#unloadAll in Ember Data)
is assigned to an array proxy. This leads to an intermittent problem
where an assertion is raised due to a destroyed array-like object
no longer being considered an array by Ember.</p>
<p>The root cause is that Ember.isArray relies on Ember.Array.detect to
determine "Array-ness", and when Ember.Array.detect is used on a
destroyed object false is returned because the meta information has
been removed.</p>
<p>Resolution: this error is the symptom, needs further investigation.
@stefanpenner will investigate, and consult @krisselden and @ebryn</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4401">Resolve target issue on actions and with-controller</a></p>
<p>Fixes issues where actions inside a {{with controller='foo'}}
block bypass the <code>FooController</code>'s action handling.</p>
<p>Resolution: @ebryn, @krisselden, @wycats should review. Future changes that touch
scope manipulation must be reviewed by @ebryn, @krisselden,  @wycats.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4404">The <code>each</code> helper checks that the metamorph tags have the same parent.</a></p>
<p>In some cases, the browser may add or fix tags, which change the
parentage of metamorph tags. This problem happens frequently when the
developer doesn't not include the TBODY tag inside a table for example.
This prevents the framework to update or clean the underlying DOM
elements.</p>
<p>This helps to detect the issue described in #4273.</p>
<p>Resolution: @trek will offer some feedback on wording. This should be a total non-issue
once we can emit HTMLBars.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4097">Expose asObject to Ember.Handlebars.precompile</a></p>
<p>Resolution: This belongs in handlebars, so reopen on Handlebars repo</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4352">FEATURE ember-handlebars-radio-buttons Implement radio buttons</a></p>
<p>Resolution: hold off and talk about this at the next face to face.</p></li>
</ul>
<!-- alex disable simple -->
<ul>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4124">Deprecate edge-case get and normalizeTuple behavior before fixes</a></p>
<p>PR <a href="https://github.com/emberjs/ember.js/pull/3852">#3852</a> changes some edge case behavior for get and normalizeTuple. Ahead of those changes, this commit introduces deprecation notices.</p>
<p>Resolution:</p>
<ul>
<li>Deprecate get for local paths on global contexts, only if they
return data.</li>
<li>Deprecate normalizeTuple calls that return a non-global context
and a simple global path.</li></ul></li>
</ul>
<!-- alex enable simple -->]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-02-28</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-02-28</guid><pubDate>Tue, 04 Mar 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/03/07]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @rwjblue, @stefanpenner, @tomdale, @trek, @wycats</p>
<h3 id="topics">Topics</h3>
<h4 id="featurespendinggodecisiontrackingissuehttpsgithubcomemberjsemberjsissues4052">Features pending 'Go' decision. <a href="https://github.com/emberjs/ember.js/issues/4052">Tracking Issue</a></h4>
<ul>
<li><code>ember-routing-add-model-option</code> <a href="https://github.com/emberjs/ember.js/pull/4293">#4293</a>
Resolution: Go</li>
</ul>
<h3 id="prsissuestoreview">PR's/Issues To Review</h3>
<ul>
<li><p>Query Params New - Sticky Params?</p>
<p>Should query paramters remain on route change? When do we want it? All the time?
How do we disable it? Proposals thus far:</p>
<pre><code class="markup language-markup">/r?sort=asc ← keep
/r/ios?sort=hot ← keep? “model specific state”
/r/gonewild ← keep? “model specific state”
/r/foo?name=’something related to foo’
</code></pre>
<p>or</p>
<pre><code class="markup language-markup">/blog/somepost?comments=true
then navigate to
/blog/someOtherPost?comments=true ← keep?
/blog/someOtherPostthen ← don’t keep?
// then navigate to
/blog/somepost?comments=true ← kept from before? kept from last route? gone from last route?
</code></pre>
<p>Possible opt-out via helper?</p>
<pre><code class="handlebars language-handlebars">{{link-to ‘Home’ ‘home’ (query-params sort=null)}}
</code></pre>
<p>some options:</p>
<ul>
<li><p>Preserve stickiness as the default, but add a (query-params-reset) subexpression helper
(in addition to query-params) that can take 0 or more args and will reset any query params
not explicitly specified in the helper invocation. The puts the stickiness in the control
of the caller (the link-to helper).</p></li>
<li><p>Add a sticky option to the route query params config hash, which defaults to true. If set to
false, any links into that route will reset (unless QP values are explicitly provided in the
link-to helper), but any links to that route from within that route hierarchy will be sticky,
which effectively makes it so that if you leave a route and come back into it via a link-to,
the QPs specified as sticky:false will be reset. Keep in mind though that leaving a route and
pressing the back button will be "sticky" since the previous values on the controller will be
restored based on the previous URL.</p>
<p>Example JSBin: <a href="http://emberjs.jsbin.com/ucanam/4102">http://emberjs.jsbin.com/ucanam/4102</a></p>
<p>Resolution: Sticky by default, with appropriate escape valves to opt out per route change</p></li></ul></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4374">ES6 ember-metal, ember-runtime, ember-debug</a></p>
<p>Work is currently being done (by @thomasaboyt amongst others) on the es6-module-transpiler
to remove the need for intermediate variables. This will both reduce filesize (less total
output), and enable cycles support (since it is evaluated lazily).</p>
<p>We believe there is more file size savings to be had in the way the view layer, and would like
to be able to progress in the ES6 effort. Currently rebasing upon any change to ember-metal,
ember-runtime, and ember-debug (rare) is difficult. I believe that we cannot maintain the long
running pull-request branch for much longer and would like time to process/deal-with any issues
that crop up from the swap (missing global exports for example) before branching the next beta
series (2 weeks).</p>
<p>RESOLUTION: Merge (pending specific issues that have already been noted), but before shipping another globals build we should deal with the file size issue. We have ~7 weeks until the 1.6 release.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4404">The <code>each</code> helper checks that the metamorph tags have the same parent.</a></p>
<p>This was generally approved in the 2014-02-28 meeting once some verbiage tweaks were made. @trek's suggested
changes have been made, this is ready to go.</p>
<p>Resolution: merge.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4291">FEATURE Ember.computed.instance</a></p>
<blockquote>
  <p>A computed property that creates a new instance of source. <code>source</code> can be any
  Class constructor, object, array, or a path to a local property.  Optionally you can
  specify the initial value(s), if only <code>initialValue</code> is given and if it is a string, it
  is treated as a local path.</p>
</blockquote>
<p>Resolution: make it an add on that’s not core. CPM.</p></li>
</ul>
<!-- alex disable simple -->
<ul>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4124">Deprecate edge-case get and normalizeTuple behavior before fixes</a></p>
<p>PR <a href="https://github.com/emberjs/ember.js/pull/3852">#3852</a> changes some edge case behavior for get and normalizeTuple. Ahead of those changes, this commit introduces deprecation notices.</p>
<ul>
<li>Deprecate get for local paths on global contexts, only if they
return data.</li>
<li>Deprecate normalizeTuple calls that return a non-global contenxt
and a simple global path.</li></ul></li>
</ul>
<!-- alex enable simple -->
<ul>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4459">Deprecate global access from templates</a></p>
<p>PR by @mixonic:</p>
<blockquote>
  <p>Replaces #4358. These deprecations are narrow in scope, and only impact {{Global}} and
  {{#each Global}}. They do not deprecate any other global access in templates. Deprecating
  all global access from templates would a) need to be done helper-by-helper or b) would impact
  the get and binding code at a lower level.</p>
  <p>@xtian I'm rewritten your first commit but preserved it here.</p>
  <p>@ebryn yo.</p>
</blockquote></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4328">Container throws if injection registered for already instantiated type</a></p>
<blockquote>
  <p>Prior to this commit, the container would happily allow you to register an injection for a
  type that had already been instantiated. This led to confusing-to-debug situations where an
  injection is registered but a container-created instance doesn't have the injection applied.</p>
</blockquote>
<p>Comment from @stefanpenner</p>
<blockquote>
  <p>As you know I'm all for this change, but it may cause people some inconvenience. I personally
  consider it a bugfix, but i would like @tomdale or @wycats's +1/-1.</p>
</blockquote>
<p>Resolution: @stefanpenner &amp; @wycats will chat.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4097">Expose asObject to Ember.Handlebars.precompile</a></p>
<p>Comment from @rwjblue:</p>
<blockquote>
  <p>This was mentioned in the core team meeting on 2014-02-28. It was mentioned that this should be
  changed upstream (in Handlebars itself), but as I reviewed (to let you know where that change
  would be needed) I realized that this PR is only exposing the functionality that already
  exists within Handlebars, but is not exposed to <code>Ember.Handlebars.precompile</code>.
  As such, I think that we should likely re-evaluate the prior decision.</p>
</blockquote>
<p>Resolution. Ship it. This passes from Handlebars to Ember.Handlebars</p></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-03-07</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-03-07</guid><pubDate>Sat, 22 Mar 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/03/14]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @rwjblue, @stefanpenner, @tomdale, @trek, @wycats</p>
<h3 id="topics">Topics</h3>
<h3 id="gonogofeaturelisting">Go/No-Go Feature Listing</h3>
<ul>
<li><code>query-params-new</code> <a href="https://github.com/emberjs/ember.js/pull/4008">#4008</a>
 Still a no-go, while @machty and @wycats hash out the specifics</li>
</ul>
<h3 id="prsissuestoreview">PR's/Issues To Review</h3>
<ul>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4496">canSetInnerHTML: IE cannot set innerHTML on several tags</a></p>
<p>IE doesn't support .innerHTML = on COL, COLGROUP, FRAMESET, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, or TR.</p>
<p>Resolution: definitely a bug, but this will be fixed with HTMLbars so we'd rather wait for that to
land instead of fixing now</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4360">Overwrite observers and listeners in Ember.CoreObject.create().</a></p>
<p>Modifies mixin inclusion code in <code>makeCtor</code> to remove any observers/listeners setup on the property or key prior
to adding the property.</p>
<p>My concern is the modification in this particular code path.</p>
<p>Resolution: this used to be how create worked, but we moved away with this for performance reasons. <code>.extend</code>
is intended for design-time use, not runtime: use <code>.extend().create()</code> or <code>.createWithMixins()</code></p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4520">Use injected test helpers instead of local functions.</a></p>
<p>Since we are injecting the application with our helpers (into the App.testHelpers hash), we should be using
that helper and not calling the function in local scope.</p>
<p>As the tests show, this allows a user to override the internal helpers with a tailored version for their scenarios.</p>
<p>Resolution: make it possible but still private API. Assert on attempting to override built-in helpers.</p></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-03-14</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-03-14</guid><pubDate>Sat, 22 Mar 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/03/21]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p>@ebryn, @krisselden, @machty, @rwjblue, @stefanpenner, @trek, @wycats, @wifelette</p>
<h3 id="topics">Topics</h3>
<h4 id="prsissuestoreview">PRs/Issues To Review</h4>
<p>We reviewed the following PRs and Issues:</p>
<ul>
<li><p><code>query-params-new</code> <a href="https://github.com/emberjs/ember.js/pull/4008">#4008</a></p>
<p>Nothing new here. We're working very hard to get this correct the first time
and have something to demo at EmberConf.</p></li>
<li><p>Move instanceMetas into object's meta <a href="https://github.com/emberjs/ember.js/pull/4559">#4559</a></p>
<p>InstanceMetas for objects' ReduceComputedPropertys are stored on the RCP instance (ie. on the descriptor) as <code>this._instanceMetas[key]</code> where key = guidOfTheObject + ':' + propertyName (see <a href="http://git.io/t9bKxA">http://git.io/t9bKxA</a>). The RCP can't know when the object is garbage collected, hence the _instanceMetas array grows unbounded.</p>
<p>Resolution: if David Hamilton +1’s, we merge as a bugfix.</p></li>
<li><p>Allow multiple arguments to be passed to EmberStringUtils.fmt() <a href="https://github.com/emberjs/ember.js/pull/4518">#4518</a></p>
<p>This allows you to use Ember.String.fmt with the same multi-arg signature as String#fmt:</p>
<pre><code class="javascript language-javascript">Ember.String.fmt('%@ %@', 'John', 'Doe')
// vs
Ember.String.fmt(['%@ %@', 'John', 'Doe'])
</code></pre>
<p>Resolution: Seems reasonable. Merge</p></li>
<li><p>Deprecate App.Store in favor of App.ApplicationStore <a href="https://github.com/emberjs/data/pull/1808">#1808</a></p>
<p>This makes the application level store lookup much closer to the reset of our conventions (ala <code>App.ApplicationAdapter</code> and <code>App.ApplicationSerializer</code>).</p>
<p>This change also allows specifying a custom store when using non-global resolver (i.e. EAK/ember-cli). Previously, we were only looking for a property <code>Store</code> hung off of the application instance. Now you can have a module named (in the case of stock EAK setup):
 <code>app/stores/application</code> or <code>app/application/store.js</code> (pods structure).</p>
<p>A deprecation warning was added, and the prior technique still works so this is not a breaking change (although I believe that we should remove before the prior lookup prior to 1.0).</p>
<p>Resolution: Seems reasonable. Merge</p></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-03-21</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-03-21</guid><pubDate>Sat, 22 Mar 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/04/04]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<p><a href="https://twitter.com/ebryn">@ebryn</a>, <a href="https://twitter.com/krisselden">@krisselden</a>, <a href="https://twitter.com/machty">@machty</a>,
<a href="https://twitter.com/rwjblue">@rwjblue</a>, <a href="https://twitter.com/wagenet">@wagenet</a>, <a href="https://twitter.com/tomdale">@tomdale</a></p>
<h3 id="topics">Topics</h3>
<h3 id="prsissuestoreview">PR's/Issues To Review</h3>
<ul>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4645">BUGFIX beta Allow setting of <code>undefined</code> value to a <code>content</code> property</a></p>
<p>Fixes setting of <code>undefined</code> value to a content property.</p>
<p>Still, checking <code>obj[keyName] === value</code> in these <a href="https://github.com/selvagsz/ember.js/blob/master/packages_es6/ember-metal/lib/property_set.js#L52-54">lines</a> is bypassed in two cases</p>
<ul>
<li>If the setter value is <code>undefined</code></li>
<li>If the setter property lies inside the proxied content</li></ul>
<p>Using <code>get(obj, keyName)</code> might resolve. But was quite nervous to do that as it may involve some additional function calls</p>
<p>+1 by @stefanpenner, but he requests @krisselden to review.</p>
<p>Resolution:</p>
<p>Seems good, but @krisselden will review in further detail. Will attempt to have this update in 1.6.0-beta.2.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4636">BUGFIX beta Ensure context is unchanged when using keywords with itemController.</a></p>
<p>Prior to this change the following code would bind <code>this</code> in the template block to the itemController's content (even
though the keyword form of <code>{{each}}</code> is used).</p>
<p>This change sets the child view's <code>_context</code> property to the current context when using the keyword form of <code>{{each}}</code>,
and a couple of confirming tests to demonstrate using <code>itemController</code> specified in either the <code>ArrayController</code> or the
template directly.</p>
<p><a href="http://emberjs.jsbin.com/zokali/1/edit">Failing JSBin</a> | <a href="http://emberjs.jsbin.com/kecen/1/edit">Passing JSBin</a></p>
<p>Fixes #4634.</p>
<p><strong>Resolution</strong></p>
<p>The intent of the <code>each foo in bar</code> syntax is specifically to preserve the current context. However, using <code>each foo in bar</code> syntax along
with an <code>itemController</code> has always changed the inner templates context. This change seems good, but all context related changes
require a bit of additional review. @krisselden to review further and +1/-1.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4598">BUGFIX beta {{view}} helper no longer uses Ember.View global, instead uses container view:default</a></p>
<p>During the ES6-ify process @rwjblue left a comment mentioning that the {{view}} helper needs to not look up
Ember.View globally. This PR fixes this by looking up view:default from the container (which Ember.View is
registered at, by default).</p>
<p><strong>Resolution</strong></p>
<p>Looking up <code>view:default</code> in the container is definitely more appropriate than hard-coding to <code>Ember.View</code>.</p>
<p>Merged.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4655">BUGFIX beta Add better debugging for DefaultResolver.</a></p>
<p>Adds nice log entries if your application was created with <code>LOG_RESOLVER</code> set.</p>
<p>Example log entries:</p></li>
</ul>
<pre><code class="bash language-bash">  [ ] route:application ..........................................  App.ApplicationRoute
  [✓] route:index ................................................  App.IndexRoute
  [ ] controller:application .....................................  App.ApplicationController
</code></pre>
<p>Fixes #4654.</p>
<p>Example <a href="http://emberjs.jsbin.com/maxum/1">JSBin</a> (look at console)</p>
<p><strong>Resolution</strong></p>
<p>This adds good insight into exactly what the resolver is doing and what you need to implement to add
  custom behavior. In the future, a better API needs to be created to enable these logging options (hanging
  a bunch of properties off of the application instance is sub-optimal).</p>
<p>Merged (will be in 1.6.0-beta.2).</p>
<ul>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4352">FEATURE ember-handlebars-radio-buttons Implement radio buttons</a></p>
<p>This updates <a href="https://github.com/emberjs/ember.js/pull/1235">#1235</a> to extend component, adds handlebar helpers,
updates tests and documentation. I think a lot of people would be pleased to see radio buttons in the core and I
see a lot of developers at my company have a hard time with radio buttons when they first get started with Ember,
so I think this would be a great addition to the core.</p>
<p><strong>Resolution</strong></p>
<p>We would prefer for this to live as an addon for a while to allow the community to test (and influence) the API.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/issues/4613">Transitioning to a globbing route does not work</a></p>
<p>I think it's a corner case, so I don't know if this should work, or if you would fix that.
Anyway, in my application, I'm defining a notFound route, hit when the user plays with the url and gives something wrong.
I also want redirect to this route when the user try to access an unexisting record (ie the backend answer a 404). So I tried to define an error handler in the ApplicationRoute, and transitionTo('notFound'). Unfortunately it does not work. Though if I remove the globbing path, then it works for the redirection, but not when entering unknown url.</p>
<p>I made a jsbin reproducing it: <a href="http://emberjs.jsbin.com/ucanam/4401/edit">here</a></p>
<p><strong>Resolution</strong></p>
<p>It is possible to transition to a globbing route, but like any target route with a dynamic segment, you need to
provide a object / param, which in this case can be a string of the path you want to use for that globbed segment:</p>
<p><code>this.transitionTo('yargle', "MY/COOL/URL");</code></p>
<p><a href="http://emberjs.jsbin.com/ucanam/4522/edit">JSBin</a></p></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-04-04</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-04-04</guid><pubDate>Sat, 05 Apr 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/04/25]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats) -->
<p><a href="https://twitter.com/ebryn">@ebryn</a>,
<a href="https://twitter.com/krisselden">@krisselden</a>,
<a href="https://twitter.com/machty">@machty</a>,
<a href="https://twitter.com/rwjblue">@rwjblue</a>,
<a href="https://twitter.com/trek">@trek</a>,
<a href="https://twitter.com/stefanpenner">@stefanpenner</a>,
<a href="https://twitter.com/wagenet">@wagenet</a>,
<a href="https://twitter.com/wycats">@wycats</a></p>
<h3 id="topics">Topics</h3>
<h3 id="buildtoolsreduxprogresss">Build Tools Redux Progresss</h3>
<p>When Ember.js took its first tentative steps into the world there existed no
ecosystem of build tools for ambitious applications in the browser. Instead,
we needed to <a href="https://github.com/livingsocial/rake-pipeline">build these tools</a>
from scratch.</p>
<p>The build tools story is significantly improved from those days! We're fortunate enough to
have several competing systems, all JavaScript based, that help streamline this workflow.</p>
<p>Work is <a href="https://github.com/rwjblue/ember.js/tree/broccolify">in progress</a> to unify our builds
and better declare and manage our external dependencies.</p>
<h3 id="prsissuestoreview">PR's/Issues To Review</h3>
<ul>
<li><p><code>ember-routing-linkto-target-attribute</code> <a href="https://github.com/emberjs/ember.js/pull/4718">#4718</a></p>
<p>Resolution: Good to merge into Canary, but not a "Go" yet.</p></li>
<li><p><code>ember-routing-will-change-hooks</code> <a href="https://github.com/emberjs/ember.js/pull/4760">#4760</a></p>
<p>Resolution: Good to merge into Canary, but not a "Go" yet.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4770">Fix view keyword in component block</a></p>
<p>Fixes <a href="https://github.com/emberjs/ember.js/pull/3520">#3520</a> by setting the concreteView
of the virtual view created to yield inside a component block.</p>
<p>Resolution: Don't merge. Not the real fix.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/issues/4764">Cannot use the property name <code>states</code> in views</a>
_states</p>
<p>Resolution: Fix by making <code>states</code> into <code>_states</code>. States is considered private API,
so this should not be a breaking change.</p></li>
<li><p>Async Testing Helpers</p>
<p>1.4 contained bug fixes in the async test helpers that broke plugins relying on the broken
behavior (e.g. <a href="https://github.com/trek/ember-testing-httpRespond">the third party httpRespond helper</a>)</p>
<p>Currently, async is not granular enough, so it's not possible to have test helpers that
assert while async is working (which httpRespond would need).</p>
<p>Testing Async helpers need some love. In the past when parts of the ecosystem have needed
help we've suggested teams of motivated and capable individuals to investigate and improve
our process. Past successful examples of this include the Ember Inspector and the build tools
team. We probably need someone to take point on really making the test experience in Ember
as great as the rest of the framework.</p>
<p>Resolution: Assemble a Testing Task Force.</p></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-04-25</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-04-25</guid><pubDate>Tue, 29 Apr 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/06/06]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats) -->
<p><a href="https://twitter.com/ebryn">@ebryn</a>,
<a href="https://twitter.com/krisselden">@krisselden</a>,
<a href="https://twitter.com/machty">@machty</a>,
<a href="https://twitter.com/trek">@trek</a>,
<a href="https://twitter.com/stefanpenner">@stefanpenner</a>,
<a href="https://twitter.com/wagenet">@wagenet</a>,
<a href="https://twitter.com/tomdale">@tomdale</a></p>
<h3 id="wherehavealltheminutesgonelongtimepassing">Where have all the minutes gone, long time passing?</h3>
<p>Many people have reached out on twitter wondering where the meeting
minutes for May have gone. We'd like to apologize: many of us were
traveling, attending conferences, and/or handling cross-state moves during May.
Meetings have still been taking place, topics discussed, and advanced thought
leadership generated, but attendance and note taking have been sporadic.</p>
<h3 id="ember1617betadelayed">Ember 1.6/1.7.beta Delayed</h3>
<p>We've been delaying the release of Ember 1.6 and the start of the 1.7.beta
branch for a few weeks to address outstanding issues that have been reported
and to ensure certain features make it into the 1.7.beta cycle.</p>
<p>There are two main concerns:</p>
<h4 id="moduleperformanceregression">Module Performance Regression</h4>
<p>Despite what the anti-framework crowd might think, Ember.js was written from the
start to be composed of many smaller, single purpose modules. Some of these are
pulled in from external repositories and some are contained inside
the Ember.js repository itself.</p>
<p>Modularity was part of the Ember.js story even when there wasn't a great way to distribute
or consume modules for the browser. Today, the landscape is much improved with an official
module specification for ES6 and tooling to transpile from this format to the several
competing community formats until the browsers gain native support.</p>
<p>A month ago, we completed our migration to the ES6 module format and
<a href="https://github.com/square/es6-module-transpiler">Square's ES6 module transpiler</a>, transpiling to
<a href="https://github.com/amdjs/amdjs-api/blob/master/AMD.md">AMD style</a> modules.</p>
<p>Unfortunately, even with an extremely <a href="https://github.com/stefanpenner/loader.js">minimal loader</a>,
the number of module load calls adds up: An AMD build of Ember.js accesses the loader ~ 1300 times.</p>
<p>On desktop the performance change is negligible, but on lower power mobile devices can cause
a ~300ms addition to load time over previous builds of Ember.js.</p>
<p>Thankfully, the ES6 module transpiler is being augmented to address this concern and we should be
able to output a build that does not require a loader for Ember.js internals. Everyone
should be sure to thank <a href="https://twitter.com/eventualbuddha">Brian Donovan</a> and <a href="https://twitter.com/squareeng">Square</a> for their amazing work on bringing ES6 modules to us today.</p>
<h4 id="queryparameters">Query Parameters</h4>
<p>When we released 1.0 we pledged to follow <a href="http://semver.org/">Semantic Versioning</a> and not break public-facing API until 2.0. Because of this, we're hesitant to release extensions to Ember.js's
public API until we feel confident supporting it for the foreseeable future. We've taken several stabs
at adding query parameters to our router. People have been very happy with the <a href="/guides/routing/query-params/">latest incarnation</a> available on canary builds, but there have been a few
edge cases we wanted to address. The last of these (providing a hook for overriding parameter resets
on route exit) is about to land and we should hopefully include query parameters in the first 1.7.beta release.</p>
<p>If you're thinking "pft, how hard is it to tack a <code>?</code> to the end of a URL?", there's a great <a href="https://www.youtube.com/watch?v=Syv_OTzHOr0">EmberConf presentation</a> about the road to discovering what exactly query parameters are trying to express in a long running, stateful application.</p>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-06-06</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-06-06</guid><pubDate>Sat, 07 Jun 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/06/13]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats) -->
<p><a href="https://twitter.com/krisselden">@krisselden</a>,
<a href="https://twitter.com/machty">@machty</a>,
<a href="https://twitter.com/rwjblue">@rwjblue</a>,
<a href="https://twitter.com/trek">@trek</a>,
<a href="https://twitter.com/stefanpenner">@stefanpenner</a></p>
<h3 id="queryparameters">Query parameters</h3>
<p>This has been <a href="https://github.com/emberjs/ember.js/commit/4130e556132eabad11aa619092c8ea840ba4957b">enabled by default</a>
in beta and nightly builds. Check out <a href="/guides/routing/query-params/">Query Parameters Guide</a>
for usage details.</p>
<h3 id="keepingthetrainmoving">Keeping the train moving</h3>
<p>In the last meeting we discussed why the release of 1.6 and 1.7.beta was delayed.
In this meeting we resolved to not delay releases, because we hope to include
a specific feature.</p>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-06-13</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-06-13</guid><pubDate>Sat, 28 Jun 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/06/20]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats) -->
<p><a href="https://twitter.com/krisselden">@krisselden</a>,
<a href="https://twitter.com/machty">@machty</a>,
<a href="https://twitter.com/rwjblue">@rwjblue</a>,
<a href="https://twitter.com/trek">@trek</a>,
<a href="https://twitter.com/stefanpenner">@stefanpenner</a>,
<a href="https://twitter.com/wagenet">@wagenet</a>,
<a href="https://twitter.com/tomdale">@tomdale</a>,
<a href="https://twitter.com/wycats">@wycats</a></p>
<h3 id="featurespendinggodecisions">Features pending 'Go' decisions</h3>
<ul>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4251">ember-routing-consistent-resources</a></p>
<p>This PR adds .index, .loading, and .error sub-routes for resources created even
if no callback was provided so <code>this.resource('foo')</code> and
<code>this.resource('foo', function(){})</code> behave identically.</p>
<p>Resolution:  'Go'.</p></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-06-20</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-06-20</guid><pubDate>Sat, 28 Jun 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/06/27]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats) -->
<p><a href="https://twitter.com/ebryn">@ebryn</a>,
<a href="https://twitter.com/krisselden">@krisselden</a>,
<a href="https://twitter.com/machty">@machty</a>,
<a href="https://twitter.com/rwjblue">@rwjblue</a>,
<a href="https://twitter.com/trek">@trek</a>,
<a href="https://twitter.com/stefanpenner">@stefanpenner</a>,
<a href="https://twitter.com/wagenet">@wagenet</a>,
<a href="https://twitter.com/tomdale">@tomdale</a>,
<a href="https://twitter.com/wycats">@wycats</a></p>
<h3 id="16and17beta">1.6 and 1.7.beta</h3>
<p>We're cutting these today and publishing.</p>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-06-27</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-06-27</guid><pubDate>Sat, 28 Jun 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/07/11]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats) -->
<p><a href="https://twitter.com/ebryn">@ebryn</a>,
<a href="https://twitter.com/krisselden">@krisselden</a>,
<a href="https://twitter.com/rwjblue">@rwjblue</a>,
<a href="https://twitter.com/trek">@trek</a>,
<a href="https://twitter.com/stefanpenner">@stefanpenner</a>,
<a href="https://twitter.com/wagenet">@wagenet</a>,
<a href="https://twitter.com/tomdale">@tomdale</a>,
<a href="https://twitter.com/wycats">@wycats</a></p>
<h3 id="pathtocore">Path to Core</h3>
<p>Members of the community who have a sustained and significant contribution to
Ember.js are invited to join the core team and help us guide the framework's
future direction. Members we'd like to add are put on the "path to core" and
given greater autonomy for a trial period before being officially invited.</p>
<p>Contributors on path to core are given commit access to the Ember.js
repositories and attend our weekly core team meetings and periodic
face to face meetings.</p>
<p>Today we're happy to announce that two Ember.js contributors are on the path
to core: Matthew Beale (who most of you will know as
<a href="https://twitter.com/mixonic">@mixonic</a>) and Martin Mu&ntilde;oz
(<a href="https://twitter.com/_mmun">@_mmun</a>). Matthew and Martin have both been
pushing hard on <a href="https://github.com/tildeio/htmlbars">htmlbars</a>, the
underlying library that will power Ember.js's rewritten view layer.</p>
<h3 id="featurespendinggonogo">Features Pending Go/No-Go</h3>
<ul>
<li><p><a href="https://github.com/emberjs/ember.js/pull/5136">ember-metal-is-present</a></p>
<p>Resolution: this is excellent addon material. Revert.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/5116">event-dispatcher-can-disable-event-manager</a></p>
<p>Resolution: event dispatcher is being deprecated, but we'll have hooks for
              libraries like (Hammer.js)[http://hammerjs.github.io/] to
              integrate with. Revert.</p></li>
<li><p>[ember-routing-linkto-target-attribute]</p>
<p>Resolution: This is a Go.</p></li>
</ul>
<h3 id="issuesfordiscussion">Issues for Discussion</h3>
<ul>
<li><p><a href="https://github.com/emberjs/ember.js/pull/5115">Fix {{#with view.foo as bar}} #5115</a></p>
<p>This is a bug. Merged.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/5089">Fix usage of document.body.contains</a></p>
<p>This is not required in metal-views, so the problem should go away. The suggested
polyfill with feature flag for 1.7 OK until that time.</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4936">Force remove <code>required</code> attribute for IE8</a></p>
<p>Scumbag IE. This is merged</p></li>
<li><p><a href="https://github.com/emberjs/ember.js/pull/4920">Actions should be looked up via <code>Ember.get</code></a></p>
<p><code>:-1:</code> as is, need to re-work and add a 're-bubble' phase that checks <code>actionMissing</code>
good idea, but seems like it may require a lot of work.</p></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-07-11</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-07-11</guid><pubDate>Sat, 26 Jul 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/07/25]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@mixonic](https://twitter.com/mixonic)
  [@_mmun](https://twitter.com/_mmun),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats) -->
<p><a href="https://twitter.com/krisselden">@krisselden</a>,
<a href="https://twitter.com/machty">@machty</a>,
<a href="https://twitter.com/mixonic">@mixonic</a>
<a href="https://twitter.com/_mmun">@_mmun</a>,
<a href="https://twitter.com/rwjblue">@rwjblue</a>,
<a href="https://twitter.com/trek">@trek</a>,
<a href="https://twitter.com/stefanpenner">@stefanpenner</a>,
<a href="https://twitter.com/wagenet">@wagenet</a>,
<a href="https://twitter.com/wycats">@wycats</a></p>
<h3 id="facetofacejuly2014">Face to Face July 2014</h3>
<p>Last week the core team (and those on path to core) met in New York City for
our periodic face to face meeting. Tom and Yehuda will be posting notes from
that meeting in the coming weeks. Thank you to our friends at <a href="http://pivotallabs.com/">Pivotal
Labs</a> for hosting us in their awesome new office.</p>
<h3 id="builtwithember">Built With Ember</h3>
<p>A few months ago we <a href="https://docs.google.com/document/d/1ZWYq3gwkPTzUiyqr4x_asSj8wIgfvg8XyLmU3Yx_FPE/edit">began tracking</a> some of the ambitious apps made
with Ember.js. The folks at <a href="http://www.getblimp.com/">Blimp</a> have turned that
document into a curated list of awesome Ember.js applications. <a href="http://builtwithember.io/">Check it
out</a>.</p>
<h3 id="embercliwebsite">ember-cli website</h3>
<p><code>ember-cli</code>, our ES6 module-based build tool has a new site. <a href="http://www.ember-cli.com/">Give it a
browse</a></p>
<h3 id="modularizingemberjssrepository">Modularizing Ember.js's Repository</h3>
<p>We've started moving more external dependencies out of the Ember.js repository
and have begun work to turn some infrequently used parts of the framework into
their own libraries. These will still be built into the <code>1.x</code> series of
releases, but will not come bundled by default when we have the next major
versions release.</p>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-07-25</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-07-25</guid><pubDate>Sat, 26 Jul 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/08/01]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@mixonic](https://twitter.com/mixonic)
  [@_mmun](https://twitter.com/_mmun),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats) -->
<p><a href="https://twitter.com/krisselden">@krisselden</a>,
<a href="https://twitter.com/mixonic">@mixonic</a>
<a href="https://twitter.com/_mmun">@_mmun</a>,
<a href="https://twitter.com/trek">@trek</a>,
<a href="https://twitter.com/stefanpenner">@stefanpenner</a>,
<a href="https://twitter.com/wagenet">@wagenet</a>,
<a href="https://twitter.com/tomdale">@tomdale</a>,
<a href="https://twitter.com/wycats">@wycats</a></p>
<h3 id="revampthegettingstartedguide">Revamp the Getting Started Guide</h3>
<p>We're starting work to revamp
our <a href="http://emberjs.com/guides/getting-started/">Getting Started Guide</a>.
TodoMVC is too small of an app to demonstrate enough topics. We were
holding off in hopes that there would be further progress on the <a href="https://github.com/tastejs/TasteApp">successor
to TodoMVC</a> but this project has stalled.</p>
<p>We're investigating building a Github Issues viewer. Our goals are to better
highlight areas where Ember really shines compared to other frameworks: Deeply
nested view and data hierarchies, url-driven applications, intuitive
query paramater behaviors.</p>
<h3 id="deprecatingglobalviewlookupfromtemplates">Deprecating global view lookup from templates</h3>
<p>As we move towards a world where ES6 syntax and modules
become viable we continue to deprecate some "old style"
globals lookup. The following uses will all trigger
deprecation warnings:</p>
<pre><code class="javascript language-javascript">{{view "App.SomeThing"}}
{{view Oh.ThisToo}}
{{#collection itemViewClass="Some.Wow"}}
{{#collection itemViewClass=Not.Yet}}
{{#each itemView="Ugh.Why"}}
{{#each itemView=Something.Something}}
{{view Ember.Select value=whut}}
</code></pre>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-08-01</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-08-01</guid><pubDate>Sat, 13 Sep 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/08/14]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@mixonic](https://twitter.com/mixonic)
  [@_mmun](https://twitter.com/_mmun),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats) -->
<p><a href="https://twitter.com/ebryn">@ebryn</a>,
<a href="https://twitter.com/krisselden">@krisselden</a>,
<a href="https://twitter.com/machty">@machty</a>,
<a href="https://twitter.com/mixonic">@mixonic</a>
<a href="https://twitter.com/_mmun">@_mmun</a>,
<a href="https://twitter.com/rwjblue">@rwjblue</a>,
<a href="https://twitter.com/trek">@trek</a>,
<a href="https://twitter.com/stefanpenner">@stefanpenner</a>,
<a href="https://twitter.com/wagenet">@wagenet</a>,
<a href="https://twitter.com/tomdale">@tomdale</a>,
<a href="https://twitter.com/wycats">@wycats</a></p>
<h3 id="exploreusinglodash">Explore using Lodash</h3>
<p>We reviewed a <a href="https://github.com/emberjs/ember.js/pull/5019">PR that replaces Ember builtin array extensions internals with Lodash</a>.</p>
<p>Assuming no performance regressions, we're in favor.</p>
<h3 id="guidesandapiversionedandsubdomained">Guides and API versioned and subdomained</h3>
<p>Currently the Guides and API are not versioned, which increasingly leads to
pain around new feature documentation. The plan is to beging publishing guides
and API to a subdomains and version them:</p>
<ul>
<li><a href="http://guides.emberjs.com/">http://guides.emberjs.com/</a> (defaults to latest)</li>
<li><a href="http://guides.emberjs.com/1.8">http://guides.emberjs.com/1.8</a></li>
<li><a href="http://api.ember.js.com/">http://api.ember.js.com/</a> (defaults to latest)</li>
<li><a href="http://api.ember.js.com/1.8">http://api.ember.js.com/1.8</a></li>
</ul>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-08-14</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-08-14</guid><pubDate>Sat, 13 Sep 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Core Team Meeting Minutes - 2014/09/12]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the <a href="/team">Ember.js Core Team</a> meets privately every
Friday at 2pm EST/11am PST through Google Hangout for a weekly
discussion of all things Ember.</p>
<p>If you have a topic you'd like to see covered, contact your favorite
core team member and let them know!</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@mixonic](https://twitter.com/mixonic)
  [@_mmun](https://twitter.com/_mmun),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats) -->
<p><a href="https://twitter.com/ebryn">@ebryn</a>,
<a href="https://twitter.com/krisselden">@krisselden</a>,
<a href="https://twitter.com/machty">@machty</a>,
<a href="https://twitter.com/mixonic">@mixonic</a>
<a href="https://twitter.com/_mmun">@_mmun</a>,
<a href="https://twitter.com/rwjblue">@rwjblue</a>,
<a href="https://twitter.com/trek">@trek</a>,
<a href="https://twitter.com/stefanpenner">@stefanpenner</a>,
<a href="https://twitter.com/wagenet">@wagenet</a>,
<a href="https://twitter.com/tomdale">@tomdale</a>,</p>
<h3 id="htmlbars">HTMLBars</h3>
<p>Most of this weeks discussion focused on our largest ongoing project: HTMLBars.
We're hoping HTMLBars is on track to make it into the 1.9 or 1.10 beta series.</p>
<p>The biggest outstanding issues are general cleanup, fixing behavior around
parts of the
<a href="https://github.com/emberjs/ember.js/pull/5571">DOM where a browser will "helpfully" insert "missing" tags</a>
(like auto-insertion of <code>tbody</code> into a <code>table</code>),
and <a href="https://github.com/tildeio/htmlbars/pull/91">Internet Explorer bugs and performance</a></p>]]></description><link>https://blog.emberjs.com/core-team-meeting-minutes-2014-09-12</link><guid isPermaLink="true">https://blog.emberjs.com/core-team-meeting-minutes-2014-09-12</guid><pubDate>Sat, 13 Sep 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Intl]]></title><description><![CDATA[<p><strong>In our end of year series-"Countdown to The New Year: 31 Days of Ember Addons" we showcase a new addon each day until the new year, and we hope you have fun hearing about our favorite addons!</strong></p>
<h2 id="day16">Day 16</h2>
<p>For day 16 of our <strong>Countdown to The New Year</strong> we want to highlight and addon that truly brings the entire Ember community <strong>from all locales together</strong>: <a href="https://emberobserver.com/addons/ember-intl">ember-intl</a>!</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-intl</code> addon is probably one of the most popular addons used in Ember apps today. As the go-to solution for bringing internationalisation to our application, it allows us to manage translations, date, time, number and currency formats in more than 150 languages!</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>The rich <code>ember-intl</code> service API and many useful template helpers help us to add new locales to our apps continually as our product's user base grows globally.</p>
<p>For those of us who have lots of languages to support in their application, <code>ember-intl</code> even allows us to load translations asynchronously - making sure that the size of the bundle that determines initial page load time stays small and neat!</p>
<p>Using <code>ember-intl</code> we can build Ember apps that are accessible beyond language barriers - making it more fun to share our app with friends all around the world!</p>
<p><a href="https://emberobserver.com/addons/ember-intl">Check out ember-intl on Ember Observer</a>! If you are a fan of multi-locale apps and you're using internationalisation addons yourself, let us know in the comments which ones are your favorite and the most fun to use!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-2019-ember-intl</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-2019-ember-intl</guid><pubDate>Mon, 16 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year- Ember A11Y Testing]]></title><description><![CDATA[<p><strong>This is the tenth in our DecEmber series-"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day10">Day 10</h2>
<p>Let's talk about <a href="https://emberobserver.com/addons/ember-a11y-testing">ember-a11y-testing</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-a11y-testing</code> addon is a wrapper around <a href="https://github.com/dequelabs">Deque Labs'</a>
<a href="https://github.com/dequelabs/axe-core">axe-core</a> accessibility(a11y) testing engine that helps you identify accessibility issues in your Ember app &amp; provides useful information on how to solve them.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>Like many of you out there, I too developed webapps without realizing the impact that accessible apps can have on users. In fact, I
started learning about a11y problems through this addon when I added it to a few apps that I was working on when this addon got
released back in 2015.</p>
<p>While there's more to building accessible apps than automated tools (like this addon) can help with, it does help ensure that
common a11y violations are captured before they can make their way to users.</p>
<p>The best part about this addon is that it lets you conditionally turn off parts or the entire violation report so that you don't have
to feel overwhelmed when you add this to an existing app. In the teams I've worked with, we usually add an environment variable to control
that setting so that we can work on addressing those violations whenever we can &amp; run a variation of the nightly test run on CI with the flag enabled to check if the violation count hasn't increased since the previous run.</p>
<p>This addon is Octane-ready. Give it a try today &amp; begin your a11y journey with it.</p>
<p>Do you use this addon? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-a11y-testing</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-a11y-testing</guid><pubDate>Tue, 10 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Angle Brackets Codemod]]></title><description><![CDATA[<p><strong>This is the ninth in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day9">Day 9</h2>
<p>Until recently, converting Ember templates to use Angle Bracket invocation was a tiresome and manual task. With the latest version of <a href="https://www.emberobserver.com/addons/ember-angle-brackets-codemod">ember-angle-brackets-codemod</a>, you get a smarter, more complete codemod to change your templates in a flash!</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>Before Angle Bracket invocation, nearly every template construct in Ember was invoked using Handlebars <code>{{doubleCurly}}</code> syntax. This made differentiating between components, helpers, and plain values incredibly difficult.  Angle Brackets alleviate most of this ambiguity.  But what if you wanted to change every double curly component invocation to Angle Brackets?  That task could take forever (especially if you cant reliably tell the difference between everything in your templates)!  The Angle Bracket Codemod eases the transition in a few steps:</p>
<ol>
<li>It visits a URL of your app that is supplied as a command line argument</li>
<li>A small bit of code is injected into the context of the app.</li>
<li>The code identifies the app's components and their properties, as well as all the helpers. This includes those in addons!</li>
<li>Given all this information, the codemod quickly changes all the apps templates preserving most of the space and indentation.</li>
</ol>
<p>Here is an example of typical conversion:</p>
<h4 id="before">Before</h4>
<pre><code class="handlebars language-handlebars">{{site-header user=this.user class=(if this.user.isAdmin "admin")}}

{{#super-select selected=this.user.country as |s|}}
  {{#each this.availableCountries as |country|}}
    {{#s.option value=country}}{{country.name}}{{/s.option}}
  {{/each}}
{{/super-select}}

{{ui/button text="Click me"}}
</code></pre>
<h4 id="after">After</h4>
<pre><code class="handlebars language-handlebars">&lt;SiteHeader @user={{this.user}} class={{if this.user.isAdmin "admin"}} /&gt;
&lt;SuperSelect @selected={{this.user.country}} as |s|&gt;
  {{#each this.availableCountries as |country|}}
    &lt;s.option @value={{country}}&gt;
      {{country.name}}
    &lt;/s.option&gt;
  {{/each}}
&lt;/SuperSelect&gt;

&lt;Ui::Button @text="Click me" /&gt;
</code></pre>
<p>Additionally, the codemod has a number of options that can be configured. The codemod can be adjusted to skip certain helpers, avoid changing built-in components <code>{{link-to}}</code>, <code>{{input}}</code> and <code>{{textarea}}</code>, or skipping files for conversion altogether.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>Codemods are the best, especially if they are smart! They save a significant amount of time and they are typically better than manual intervention. Until a few months ago, running this codemod and the changes it made were entirely based on a set of heuristics. The codemod was good but it often made mistakes, requiring an exhaustive amount of human input.  Today the codemod can intelligently convert templates to Angle Bracket invocation with exceptional precision, often with few to no errors.  This allows teams to opt-in to the future in an instant instead of wasting precious cycles.</p>
<p>Do you use this codemod? Or one like it? We'd love to hear about Ember codemods that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-angle-brackets-codemod</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-angle-brackets-codemod</guid><pubDate>Mon, 09 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Animated]]></title><description><![CDATA[<p><strong>This is the seventh in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day7">Day 7</h2>
<p>According to Wikipedia's <a href="https://en.wikipedia.org/wiki/History_of_animation">History of Animation</a>-</p>
<!--alex ignore of-course-->
<blockquote>
  <p>The Roman poet and philosopher Lucretius (c. 99 BCE – c. 55 BCE) wrote in his poem <em>De rerum natura</em> a few lines that come close to the basic principles of animation: "…when the first image perishes and a second is then produced in another position, the former seems to have altered its pose. Of course this must be supposed to take place very swiftly: so great is their velocity, so great the store of particles in any single moment of sensation, to enable the supply to come up."</p>
</blockquote>
<p>Today, we write such poems in code, using <a href="https://emberobserver.com/addons/ember-animated">ember-animated</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p><code>ember install ember-animated</code> is an invitation for creativity. This addon provides animation primitives and some built-in transitions that help bring interfaces to life! You can animate across route changes, content can flow smoothly when new data arrives, and web interactions can compete with the kinds of interfaces that are usually only seen in native applications.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>I feel like animation helps an app make the leap from beautiful and useful to <em>delightful</em>.</p>
<p>My favorite thing about it is that I do not need to wrap my animation targets in any other elements. This has major benefits for styling and writing semantic, valid HTML.
The out-of-the-box motions are helpful, and I also appreciate that I can write my own animations to fit unusual use cases.</p>
<p>This addon is Octane ready, although its documentation needs some Octane code examples added in. Check out the <a href="https://github.com/ember-animation/ember-animated/issues">Issues</a> to help out!</p>
<p>Do you use this addon? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-animated</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-animated</guid><pubDate>Sat, 07 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Auto Import]]></title><description><![CDATA[<p><strong>This is the sixth in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day6">Day 6</h2>
<p>Once upon a time, if Ember developers wanted to use a regular npm package, they needed to jump through some hoops, but <a href="https://emberobserver.com/addons/ember-auto-import">ember-auto-import</a> makes it a breeze!</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-auto-import</code> addon provides a zero-config way to use npm packages in your Ember app, and even lazy-load them.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>One of my wishes for the web is that we can make it easier for new people to learn, participate, and build.
Whenever I see this trend happening in Ember, it makes me happy.</p>
<p>I love this addon because it eliminates the need for a beginner (and experienced developer) to understand the differences between AMD and CJS modules, and how they get into the app tree.
They don't need to read about how to configure their build.
They don't need to know how Ember's build pipeline differs from other build tools.
They import what they need, and it works.
That's awesome.</p>
<p>I think back to earlier in my career, when I was reliant on other people to make addons that wrapped popular libraries, or I used <code>ember-browserify</code>, which had some drawbacks.
Thanks to <code>ember-auto-import</code>, it is a joy to use new libraries directly and even contribute features or bugfixes upstream.
I also imagine that it has saved a ton of time across the Ember community, since developers do not need to write and maintain as many wrapper addons.</p>
<p>This addon is Octane-ready!</p>
<p>Do you use this addon? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-auto-import</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-auto-import</guid><pubDate>Fri, 06 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Bootstrap and Ember Paper]]></title><description><![CDATA[<p><strong>This is the 23rd in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day23">Day 23</h2>
<p>For the 23rd edition of <strong>Countdown to The New Year</strong> we're going to take a
look at <em>two</em> great design library addons, <a href="https://emberobserver.com/addons/ember-bootstrap"><code>ember-bootstrap</code></a> and <a href="https://emberobserver.com/addons/ember-paper"><code>ember-paper</code></a></p>
<!-- READMORE -->
<h3 id="emberbootstrapwhatitdoes">Ember Bootstrap - What It Does</h3>
<p>The <code>ember-bootstrap</code> addon is for using the <a href="http://getbootstrap.com/">Bootstrap</a> design library in Ember applications. This addon provides a native Ember component library for some of the more commonly used Bootstrap components.</p>
<p>The <code>ember-bootstrap</code> addon can help you can integrate Bootstrap into your application quickly, and in an idiomatic Ember manner.</p>
<p>There are many related Ember addons that integrate with Ember Bootstrap to provide additional features on top of Ember Bootstrap, such as form validation and changesets.</p>
<h3 id="emberbootstrapwhyilikeit">Ember Bootstrap  - Why I Like It</h3>
<p>If you're looking to add Bootstrap to an Ember application, <code>ember-bootstrap</code> makes doing so incredibly straight-foward.</p>
<p>The <code>ember-bootstrap</code> addon's clean API's and native Ember components also provide an ergonomic way to use Bootstrap in your Ember application, and all without using Bootstrap's JavaScript.</p>
<p>Writing forms or modals with these components is a very enjoyable experience and has streamlined the code in several of my projects.</p>
<!-- alex ignore trap -->
<p>Also, recent versions of <code>ember-bootstrap</code> have added additional support for improving accessibility by using ember-focus-trap to implement focus trap for modals and keyboard navigation of dropdowns. <code>ember-bootstrap</code> has even added ember a11y tests to the addon's test suite!</p>
<p>It gets better, too- <code>ember-bootstrap</code> is Octane ready and has refactored it's own components internally to use native classes and angle bracket syntax.</p>
<p>The <code>ember-bootstrap</code> addon has excellent documentation, which you can read up on <a href="https://www.ember-bootstrap.com/">here</a> to learn more about how to use the addon.</p>
<h3 id="emberpaperwhatitdoes">Ember Paper - What It Does</h3>
<p>If you're looking for a solution to add Google's <a href="https://www.google.com/design/spec/material-design/introduction.html">Material</a> design library to an Ember application you can use <code>ember-paper</code> to do so! <code>ember-paper</code> aims to encapsulate everything possible in Material in Ember components.</p>
<p>The <code>ember-paper</code> addon provides an extensive library of components, from buttons and sliders to selects and modal dialogs.</p>
<p>All of <code>ember-paper</code>'s components are written in a modular and elegant Ember way.</p>
<p>The <code>ember-paper</code> addon is also extensible and its component coverage is widened by a set of addons that can be used in combination with <code>ember-paper</code> to extend the library's reach (a notable example includes a modal manager).</p>
<h3 id="emberpaperwhyilikeit">Ember Paper  - Why I Like It</h3>
<p>Sometimes you really need an Ember focused solution for Material design and <code>ember-paper</code> provides a super easy-to-use and well built set of Ember components to get you up and running right away.</p>
<p>I've used <code>ember-paper</code> in at least one project my experience was a very smooth one. Components are written with adopted Ember design patterns in mind and they are built to fit into your work flow.</p>
<p>The component API's provide thoughtful touches and I've been able to build out an entire UI without knowing much about Material design because of them.</p>
<p>You can write most components in block-form so it's effortless to wrap what you need with the solutions that <code>ember-paper</code> provides.</p>
<p>Octane support is something that is slated for the future, but is not yet complete as of today.</p>
<p>In keeping with many widely used Ember addons, <code>ember-paper</code> provides a great documentation site that covers the usage and API's for all of its components. You can read up on the details <a href="https://miguelcobain.github.io/ember-paper/">here</a>.</p>
<p>Do you use these addons? Or any like them? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-bootstrap-and-ember-paper</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-bootstrap-and-ember-paper</guid><pubDate>Mon, 23 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Changeset]]></title><description><![CDATA[<p><strong>This is the 28th in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day28">Day 28</h2>
<p>For the 28th edition of <strong>Countdown to The New Year</strong> we're going to take a
look at <a href="https://emberobserver.com/addons/ember-changeset"><code>ember-changeset</code></a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>Managing data associated with forms can sometimes be unwieldy. As a result, we have borrowed concepts from the Elixir <a href="https://hexdocs.pm/ecto/Ecto.Changeset.html#content">community</a> to give you the ability to prevent mutating the underlying object until the last possible moment when you have decided to apply the changes and the data is valid. This functional approach to validations has proved to be quite useful.</p>
<p>This addon works in conjunction with <a href="https://github.com/poteto/ember-changeset-validations/"><code>ember-changeset-validations</code></a> to provide you with out of the box validations to validate the format of a certain input, ensure passwords pass a minimum security threshold or even let you build your own custom validator!</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>Recently I <a href="https://github.com/poteto/ember-changeset/pull/379">rewrote</a> <code>ember-changeset</code> to fix long outstanding bugs, support Octane patterns and utilize <code>@tracked</code>. As a result, not only can you validate and apply changes to top level keys (<code>person</code>), nested keys such as <code>person.firstName</code> may also be used.  In addition, at the same time <code>@pzuraq</code>'s blog post <a href="https://www.pzuraq.com/do-you-need-ember-object/">Do You Need EmberObject?</a> came out, we removed <code>EmberObject</code>, giving you a simpler base class to work with. The base functionality has been extracted to <a href="https://github.com/validated-changeset/validated-changeset"><code>validated-changeset</code></a> for use outside of Ember applications as well! Currently this addon is still in <code>v3</code> beta. We plan to exit the beta period and do a proper <code>3.0.0</code> release in the near future for apps supporting <code>ember-source</code> &gt;= 3.13. .</p>
<p>Ember has further memorialized itself with the OOP community. As a result, a functional approach to mutating state is a good tool to have in your toolbelt!</p>
<p>Do you use <code>ember-changeset</code> or something similar? We'd love to hear about Ember addons you love for DecEmber in the comments below!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-changeset</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-changeset</guid><pubDate>Sat, 28 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember CLI Mirage]]></title><description><![CDATA[<p><strong>This is the second in our December series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day2">Day 2</h2>
<p>Today we are going to look at one of our community's most popular addons- <a href="https://emberobserver.com/addons/ember-cli-mirage">ember-cli-mirage</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-cli-mirage</code> addon is a client-side server to help you build, test, and demo your Ember app. It helps developers be more productive by providing ways to generate fake data, allowing front-end engineers to spend more time focusing on the UI.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>As I was informally polling the community about their favorite Ember addons, ember-cli-mirage came up A LOT. For good reason, too. It's well-supported by the addon maintainers, there's a dedicated <a href="https://www.ember-cli-mirage.com/">documentation site</a>, and there's support on the <a href="https://discord.gg/emberjs">Ember Community Discord server</a> in the #ec-mirage channel.</p>
<blockquote>
  <p>"It’s a part of the ecosystem I dearly miss when I work with other frameworks."</p>
</blockquote>
<p>As an extra bonus, EmberMap has generously made their <a href="https://embermap.com/topics/mirage-tips-and-tricks">"Mirage Tips and Tricks" video series</a> free to everyone (usually for subscribers only!) for December. Be sure to check it out!</p>
<p>Do you use this addon? <a href="https://emberobserver.com/categories/mocking,-fixtures,-and-factories">Or one like it?</a> We'd love to hear about the Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-cli-mirage</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-cli-mirage</guid><pubDate>Mon, 02 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember CLI Sass]]></title><description><![CDATA[<p><strong>This is the eighth in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day8">Day 8</h2>
<p><a href="https://emberobserver.com/addons/ember-cli-sass">ember-cli-sass</a> is an addon that I always install when I work on side projects. It's that amazing / critical / \&lt;<em>add your hype word of choice here</em>>!</p>
<p>In all seriousness, let me tell you why I love Sass and why I encourage you to try out ember-cli-sass today.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<!--alex ignore just-->
<p><a href="https://github.com/simonexmachina/ember-cli-sass">ember-cli-sass</a> uses Sass to <strong>preprocess stylesheets</strong> in your Ember app (or addon). That's just a fancy way of saying you will have an easier time expressing how you want to style your app.</p>
<p>The addon also supports common, advanced use cases for Ember projects:</p>
<ul>
<li>Source maps by default in development</li>
<li>Support for <code>outputPaths</code> configuration</li>
<li>Ability to specify <code>includePaths</code></li>
<li>Ability to edit Sass in Chrome Dev Tools</li>
</ul>
<h3 id="whyilikeit">Why I Like It</h3>
<p>There are two areas to examine here: (1) why I love Sass, and (2) why I love ember-cli-sass.</p>
<h4 id="whyilovesass">Why I Love Sass</h4>
<p><a href="https://sass-lang.com/">Sass (Syntactically Awesome Style Sheets)</a>, which builds on top of CSS, provides features that help increase my productivity as designer and developer.</p>
<p>My most favorite feature is <strong>nesting</strong>, which lets me practice <a href="http://getbem.com/introduction/">BEM (Block, Element, Modifier)</a>. BEM helps me think carefully about how I write components and architect my app. It helps me envision how different components will interact with each other and how I might avoid leaking style.</p>
<p>PS. <strong>Variables</strong> are awesome too!</p>
<h4 id="whyiloveemberclisass">Why I Love Ember CLI Sass</h4>
<p>ember-cli-sass is a great example of <strong>zero-config</strong>. In a new Ember app, all you need to do is run <code>ember install ember-cli-sass</code>, then change the file name <code>app/styles/app.css</code> to <code>app/styles/app.scss</code>. You also get <strong>live reload</strong> with no additional work!</p>
<!--alex ignore easy-->
<p>Because there will be developers who are learning Sass for their first time, I believe zero-config is a must-have. When I was in a coding bootcamp, I wanted to try out Sass or Less for a group project. We ended up with plain CSS because we had limited time and had more important things to do than figuring out how to install and configure either. Without access to nesting or variables (i.e. a convention), we didn't have an easy time dividing work and collaborating with one another.</p>
<h3 id="conclusion">Conclusion</h3>
<p>I think Sass is a great tool to help you think about how you want to architect your app. <a href="https://github.com/simonexmachina/ember-cli-sass">ember-cli-sass</a> helps you try out Sass today!</p>
<p>I also encourage you to try out other tools for styling and discover what's best for your project. This could mean looking at a different framework such as <a href="https://github.com/chrism/emberjs-tailwind-purgecss#emberjs-tailwind-10-and-purgecss-working-example">Tailwind</a>, localizing styles using <a href="https://github.com/salsify/ember-css-modules">ember-css-modules</a> or <a href="https://github.com/ebryn/ember-component-css">ember-component-css</a>, and finding a linter for stylesheets. I think we have made a good progress in bridging design and development, and am looking forward to what the future holds next.</p>
<p>Do you use ember-cli-sass? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-cli-sass</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-cli-sass</guid><pubDate>Sun, 08 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember CLI TypeScript]]></title><description><![CDATA[<p><strong>This is the 24th part of our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". Highlighting a new addon each day until the new year starts, we hope you enjoy learning together with us!</strong></p>
<h2 id="day24">Day 24</h2>
<p>Today we are going to take a look at writing apps in TypeScript - using <a href="https://emberobserver.com/addons/ember-cli-typescript">ember-cli-typescript</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-cli-typescript</code> addon sets up everything you need to start using TypeScript in your Ember apps and addons. This includes not only configuring Babel to handle TypeScript, but build-time type-checking, in-browser type error reporting, and a whole set of custom blueprints for generating TypeScript versions of everything from routes and controllers to services to components. <code>ember-cli-typescript</code> also helps addon authors write their addons in TypeScript by handling automatic precompilation and type definition generation when publishing.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>Static typing is a lifesaver, especially in ambitious apps with complex structures and many moving parts. It helps speed up development with rich autocompletion and by catching type errors right in your editor and during the build. It provides a saftey net when refactoring or upgrading that I, frankly, wouldn't want to develop without. And addons written in TypeScript are a joy to use because they ship with type definitions that help guarantee you are using them correctly.</p>
<p>I like <code>ember-cli-typescript</code> because it handles all of the Ember + TypeScript integration for you and provides a very good set of defaults. It has <a href="https://ember-cli-typescript.com">great documentation</a>, not only on how to use <code>ember-cli-typescript</code>, but on how to use TypeScript effectively with Ember. And to top it off, an amazing communuty of strong typers has formed around <code>ember-cli-typescript</code> and many of these individuals can be found on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> in #e-typescript ready to answer your Ember + TypeScript questions!</p>
<p>Do you use <code>ember-cli-typescript</code>? Or something else to use TypeScript (or another language) with Ember? We'd love to hear about Ember addons you love for DecEmber in the comments below!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-cli-typescript</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-cli-typescript</guid><pubDate>Tue, 24 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember CLI Update]]></title><description><![CDATA[<p><strong>This is the 26th in our December series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day26">Day 26</h2>
<p>Let's highlight how you can update Ember your projects with <a href="https://emberobserver.com/addons/ember-cli-update">ember-cli-update</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>Besides package updates like ember-source and ember-cli, there are more files that are updated when a new version of Ember releases.
Tweaks to testem.js or .eslintrc.js may be missed if you're not tracking those files changes (via something like <a href="https://github.com/ember-cli/ember-new-output">ember-new-output</a>).
ember-cli-update was created to update those kinds of files along with package.json changes for you.
It can also run codemods against your newly installed versions.</p>
<p>A new feature is on its way where it can maintain any blueprint, not only the official Ember blueprint.
The idea is that you can make one blueprint for your organization, and keep your projects up-to-date like ember-cli-update does today.
You could also keep default blueprints that ship with addons (ember-cli-mirage, ember-cli-deploy, etc) up-to-date in the same way.
<a href="https://github.com/emberjs/rfcs/pull/477">RFC here</a>.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>I maintain countless Ember apps and addons. Without this tool, I would have burnt out long ago!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-cli-update</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-cli-update</guid><pubDate>Thu, 26 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Code Snippet]]></title><description><![CDATA[<p><strong>This is the twenty-ninth in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day29">Day 29</h2>
<p>Before I took this assignment, I didn't know anything about <a href="https://emberobserver.com/addons/ember-code-snippet">ember-code-snippet</a>. Now, I'm glad that I did. This addon surfaced in 2015, has received regular updates, and powers many of my favorite addons. (Can you guess how?)</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p><a href="https://github.com/ef4/ember-code-snippet">ember-code-snippet</a> lets you render code snippets in your app (or addon). Quite handy if you want to create a technical blog or <strong>document your components</strong>.</p>
<p>It provides a helper called <code>get-code-snippet</code> so that (1) you can save code snippets in a dedicated folder and (2) create your own component to customize their look.</p>
<p>To illustrate the use, we'll consider a code snippet from <a href="https://ember-learn.github.io/ember-octane-vs-classic-cheat-sheet/">the Ember.js Octane vs Classic Cheat Sheet</a>:</p>
<pre><code class="javascript language-javascript">// my-app-name/snippets/make-your-own-elementId.js

import Component from '@glimmer/component';
import { guidFor } from '@ember/object/internals';

export default class InputTextComponent extends Component {
  inputId = 'textInput-' + guidFor(this);
}
</code></pre>
<h3 id="whyilikeit">Why I Like It</h3>
<!--alex ignore just-->
<p>ember-code-snippet is designed with <strong>composability</strong> in mind. It outputs just the right amount of useful data so that you can consume them to build more powerful things.</p>
<p>Starting version 3.0, you can <a href="https://github.com/ef4/ember-code-snippet#syntax-highlighting">decide what library to use for syntax highlighting</a>. For example, you might like to try out <a href="https://github.com/shipshapecode/ember-prism">Prism.js</a>:</p>
<pre><code class="handlebars language-handlebars">{{!-- my-app-name/app/components/code-snippet/template.hbs --}}

{{#let (get-code-snippet @fileName) as |snippet|}}
  &lt;CodeBlock
    @code={{snippet.source}}
    @language={{snippet.language}}
  /&gt;
{{/let}}
</code></pre>
<figure class="mb-4">
  <img alt="Code snippet highlighted with Prism JS" src="/images/blog/2019-12-29/code-snippet-prism.png">
  <figcaption>Code snippet highlighted with Prism.js</figcaption>
</figure>
<p>Maybe you want <a href="https://highlightjs.org/">Highlight.js</a> instead:</p>
<pre><code class="handlebars language-handlebars">{{!-- my-app-name/app/components/code-snippet/template.hbs --}}

{{#let (get-code-snippet @fileName) as |snippet|}}
  &lt;pre {{did-insert this.highlightCode}}&gt;&lt;code class="language-{{snippet.language}}"&gt;{{snippet.source}}&lt;/code&gt;&lt;/pre&gt;
{{/let}}
</code></pre>
<figure class="mb-4">
  <img alt="Code snippet highlighted with Highlight JS" src="/images/blog/2019-12-29/code-snippet-highlight.png">
  <figcaption>Code snippet highlighted with Highlight.js</figcaption>
</figure>
<p>No matter the styling approach, the invocation remains the same:</p>
<pre><code class="handlebars language-handlebars">{{!-- my-app-name/templates/application.hbs --}}

&lt;CodeSnippet
  @fileName="make-your-own-elementId.js"
/&gt;
</code></pre>
<p>I think the fact that <a href="https://emberobserver.com/lists/top-addons">many top addons</a> use ember-code-snippet for documentation is a testament to its well-designed API. You may not have realized this (I didn't until today) because each doc has a unique style:</p>
<ul>
<li><a href="https://www.ember-bootstrap.com/#/components/alert">Ember Bootstrap</a></li>
<li><a href="https://ember-learn.github.io/ember-cli-addon-docs/docs/components/docs-snippet">Ember CLI Addon Docs</a></li>
<li><a href="http://ember-concurrency.com/docs/tutorial/discussion">Ember Concurrency</a></li>
<li><a href="http://offirgolan.github.io/ember-cp-validations/">Ember CP Validations</a></li>
<li><a href="https://ember-power-select.com/docs/how-to-use-it">Ember Power Select</a></li>
<li><a href="https://ember-animation.github.io/liquid-fire/helpers/liquid-outlet">Liquid Fire</a></li>
<li>and many more…</li>
</ul>
<p>Do you use ember-code-snippet? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-code-snippet</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-code-snippet</guid><pubDate>Sun, 29 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Composable Helpers]]></title><description><![CDATA[<p><strong>This is the 18th in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day18">Day 18</h2>
<p>Today we are going to look at the 11th most popular addon on Ember Observer: <a href="https://emberobserver.com/addons/ember-composable-helpers"><code>ember-composable-helpers</code></a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-composable-helper</code> addon provides composable helpers for Ember apps, which allows for more declarative templating.</p>
<p>Now, the first time I read that sentence, I thought, "huh what?" so I want to break it down a little more.</p>
<p>This addon provides helpers. Useful helpers (like <a href="https://github.com/DockYard/ember-composable-helpers#filter-by"><code>filter-by</code></a>, <a href="https://github.com/DockYard/ember-composable-helpers#repeat"><code>repeat</code></a>, and <a href="https://github.com/DockYard/ember-composable-helpers#group-by"><code>group-by</code></a>, to name a few. These helpers can be used together (imagine using <code>group-by</code> in conjunction with <code>filter-by</code>…go ahead, imagine it, I'll wait…).</p>
<p>The declarative bit means that we're telling our template <em>what</em> we want to do, succinctly; <code>ember-composable-helpers</code> tells our app <em>how</em> to do it, saving us time and increasing our productivity.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>I think this addon is the bee's knees. It allows me to write code in the way I wish I could always write code! I love being able to say "here's what I want done, please." I'd rather not have to think too much about the "how", especially not every.single.time. I write code. The team that worked on this addon is known for producing useful addons, too, and I trust their work. Once again, strong community conventions come through for the benefit of all!</p>
<p>Even better, the fantastic team at EmberMap has <a href="https://embermap.com/video/ember-composable-helpers">a video about this addon</a> if you want to learn more!</p>
<p>Do you use this addon? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-composable-helpers</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-composable-helpers</guid><pubDate>Wed, 18 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Concurrency]]></title><description><![CDATA[<p><strong>This is the fifth in our DecEmber series–Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day5">Day 5</h2>
<p>Let's talk about <a href="https://emberobserver.com/addons/ember-concurrency">ember-concurrency</a>.
The experience is part joy, part tragedy.</p>
<!-- READMORE -->
<p>The joy comes from having elegant, straightforward solutions for things like debouncing.
The tragedy is that I have to write this code myself when I am working in a non-Ember setting, but I suppose absence makes the heart grow fonder.</p>
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-concurrency</code> addon helps you "write concise, robust, and beautiful asynchronous code." For example, think about what should happen if a user rapidly clicks a "submit" button. With this addon, there's a nice way to prevent 30 form submissions.
Or, what if an API request takes a long time, and you want to be able to cancel it? Promises won't help you, but <code>ember-concurrency</code> tasks will.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>Without <code>ember-concurrency</code>, it would take a lot of effort to manage starting, interrupting, cancelling, restarting, debouncing, queueing, and checking the status of async operations.
Yet in a complex, data-rich application, these things often emerge as necessities.
It's a relief to have a concise and readable way of handling these behaviors.</p>
<p>Another thing I like about <code>ember-concurrency</code> is that when I read the documentation, it helps me to evaluate whether the code I have written can withstand deviations from the happy path - impatient users, slow API requests, and interrupted animations.</p>
<p>The joy it brings me is that it keeps my code tidy and resilient. I can spend more of my time working on interfaces and interactions, without littering my code with things like an array of promises and booleans to track their resolved states.</p>
<p>This addon is Octane-ready. For developers who are using Ember Octane or Native Classes, <a href="https://github.com/machty/ember-concurrency-decorators">ember-concurrency-decorators</a> provides decorator syntax for tasks, which isn't strictly necessary, but it looks nicer.</p>
<p>Do you use this addon? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-concurrency</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-concurrency</guid><pubDate>Thu, 05 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember CSS Modules]]></title><description><![CDATA[<p><strong>This is the 22nd part of our December series–"Countdown to The New Year: 31 Days of Ember Addons". Highlighting a new addon each day until the new year starts, we hope you enjoy learning together with us!</strong></p>
<h2 id="day22">Day 22</h2>
<p>Today we are going to take a look at creating apps with style - <a href="https://emberobserver.com/addons/ember-css-modules">using ember-css-modules</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>With the addon <strong>ember-css-modules</strong>, styling à la <a href="https://github.com/css-modules/css-modules">CSS Modules</a> is only one <code>ember install</code> away.
CSS Modules allow us to write styles which are <strong>scoped</strong> to particular parts of our application <strong>by default</strong> and allow style sharing by explicit opt-in mechanisms. The ember-css-modules addon helps us to co-locate css files next to our components, routes and controllers following Ember's file name conventions.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>Making the apps we are building  look awesome can be really fun! But maintaining a growing CSS code base can also be really hard. CSS Modules are a great way to modularise our styles in a way that they apply locally to only the exact component or route we wrote them for by default. This helps us to add new stylish features to our code base with the confidence that the look&amp;feel of other parts of our app is left unchanged. This confidence is helpful for us when editing, adding and deleting CSS even in large web applications.</p>
<p>Using ember-css-modules we can start leveraging CSS modules in our Ember app right away and even benefit from Ember's conventional approach for file arrangement: the co-located CSS files are quick to find right next to our routes and components and blend in nicely into the developer experience that Ember enthusiasts are familiar with.</p>
<p>Do you use ember-css-modules? Or another <strong>stylish</strong> addon? We'd love to hear about Ember addons you love for DecEmber in the comments below!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-css-modules</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-css-modules</guid><pubDate>Sun, 22 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Exam]]></title><description><![CDATA[<p><strong>This is already the second to last edition of our December series-"Countdown to The New Year: 31 Days of Ember Addons". In this series we are highlighting a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day30">Day 30</h2>
<p>On the 30th day of our <strong>Countdown to The New Year</strong> we want to feature an exciting Ember addon to make your <strong>test suite</strong> fun to work with: <strong>ember-exam</strong>!</p>
<p>Learn more about <a href="https://emberobserver.com/addons/ember-exam">ember-exam on Ember Observer</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>ember-exam is an addon that allows to have more control over running your ember-qunit (Ember's default testing framework) and ember-mocha test suite. It extends from the default Ember CLI <code>test</code> command, allowing you run it as you would <code>ember test</code>.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>ember-exam allows us to run tests in parallel which can greatly reduce the overall run time of our test suite. Using the <code>--random</code> option of this addon, we are able to run tests in random order; this helps us to uncover interdependencies between test cases which would be hard to spot otherwise. And the <code>exam:iterate</code> option allows us to iterate over parts of our test suite repeatedly when tracking down brittle tests.</p>
<p>ember-exam is our side-kick for developing a fast, robust and reliable test suite - which makes our testing workflow in Ember more predictable, more relaxed and therefore also more fun! <a href="https://emberobserver.com/addons/ember-exam">Check it out for yourself!</a></p>
<p>And if you already use this addon, we'd love to hear about it or similar addons that bring you joy in the comments section below!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-exam</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-exam</guid><pubDate>Mon, 30 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember In Viewport]]></title><description><![CDATA[<p><strong>This is the 27th in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day27">Day 27</h2>
<p>For the 27th edition of <strong>Countdown to The New Year</strong> we're going to take a
look at <a href="https://emberobserver.com/addons/ember-in-viewport"><code>ember-in-viewport</code></a>.</p>
<h3 id="whatitdoes">What It Does</h3>
<p>Does your app use scroll event listeners or <code>getBoundingClientRect</code> to determine if an element on your page is in the user's viewport?  If so, you have come across the perfect addon for you to observe DOM elements!</p>
<p>Common use cases for <code>ember-in-viewport</code> include lazy loading images, infinite scrolling (see <a href="https://github.com/ember-infinity/ember-infinity"><code>ember-infinity</code></a>) and/or tracking advertisement impressions.  This is a flexible and performant library to give your users the performance they need when visiting your site.</p>
<p>Recent additions have added our own <code>{{in-viewport}}</code> modifier, allowing you to "observe" elements in template only components! See the <a href="https://github.com/DockYard/ember-in-viewport#modifiers">Modifiers</a> section for more examples.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p><code>ember-in-viewport</code> supports browsers back to IE11 by using either <a href="https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API"><code>IntersectionObserver</code></a> or <a href="https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame"><code>requestAnimationFrame</code></a> (fallback case) to monitor the elements on your page.  Compared to traditional methods of manually observing DOM elements, this addon encapsulates functionality in a much more performant manner.  For example, <code>IntersectionObserver</code> happens off the main thread, giving you Observability without the cost.  Moreover, by reusing instances of these JavaScript APIs across similar elements on your page, you are free to use this addon for as many elements on your page as you want!</p>
<p>If you are looking for a good example to use this addon with, we have included a somewhat robust, responsive, lazy loaded <a href="https://github.com/DockYard/ember-in-viewport/blob/master/tests/dummy/app/components/dummy-artwork.js">artwork</a> component for your enjoyment!</p>
<p>Do you use <code>ember-in-viewport</code> or something similar? We'd love to hear about Ember addons you love for DecEmber in the comments below!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-in-viewport</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-in-viewport</guid><pubDate>Fri, 27 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Leaflet]]></title><description><![CDATA[<p><strong>The first of its kind "Countdown to The New Year: 31 Days of Ember Addons" series highlights popular addons in the Ember community. We hope you enjoy learning about fun tools for Ember developers together with us each day!</strong></p>
<h2 id="day17">Day 17</h2>
<p>In the 17th increment of <strong>Countdown to The New Year</strong> let's take a look at an exciting Ember addon to add <strong>maps</strong> to our apps: <strong>ember-leaflet</strong>!</p>
<p>Learn more about <a href="https://emberobserver.com/addons/ember-leaflet"><code>ember-leaflet</code> on Ember Observer</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>With <code>ember-leaflet</code> we can create useful maps for our web applications. This addon helps us to integrate the functionality of <a href="https://leafletjs.com/">Leaflet.js</a> - an open-source JavaScript library for mobile-friendly, interactive maps - into our Ember app.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>Leaflet.js is already a great library built with simplicity, performance and usability in mind. The addon <code>ember-leaflet</code> makes the developer experience even better for us: we can build complex, multi-layered street maps directly in our templates using the useful layer components provided by the addon API. This makes creating interactive map experiences much more straightforward and much more fun!</p>
<p>Build your own map using <code>ember-leaflet</code> by <a href="https://emberobserver.com/addons/ember-leaflet">checking out the project description on Ember Observer</a>!</p>
<p>And if you are already a digital cartographer yourself, we'd love to hear about your experiences using <code>ember-leaflet</code> or other map addons in the comments section below!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-leaflet</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-leaflet</guid><pubDate>Tue, 17 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Mapbox GL]]></title><description><![CDATA[<p><strong>This is the 21st in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day21">Day 21</h2>
<p>Today we are going to take a look at making maps in Ember with <a href="https://emberobserver.com/addons/ember-mapbox-gl">ember-mapbox-gl</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>Have you ever wondered how to <em>make maps in Ember</em>? No? Okay, but you should!</p>
<p>This post is about adding an interactive map to your Ember project. By the end of this post, you'll have a map of the location of your company's business (provided that it has some physical location in Cartesian space).</p>
<p>(Note: I'm not talking about <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map">these kinds of maps</a>, although they're not totally unrelated).</p>
<p>Every time I need to solve a problem in Ember, I do a quick search through the Ember addon ecosystem.
Yes, it's satisfying to solve the problem yourself, but it's smarter—and quicker—to use someone else's code. Shoulders of giants, people. Now, web mapping is a pretty complicated suite of technologies, so the temptation to reinvent <em>that</em> wheel isn't as strong as,
say, <a href="https://emberobserver.com/?query=file%20upload">building your own file uploader</a>.</p>
<p>A cursory glance at the available mapping addons show up a few options:</p>
<ul>
<li><a href="https://github.com/kturney/ember-mapbox-gl">ember-mapbox-gl</a> (Full disclosure: I'm a contributor, although <a href="https://github.com/kturney">kturney</a> does most of the work!)</li>
<li><a href="https://github.com/miguelcobain/ember-leaflet">ember-leaflet</a></li>
<li><a href="https://github.com/sandydoo/ember-google-maps">ember-google-maps</a></li>
</ul>
<p>Am I missing any? Let me know. But I'm pretty confident these are the top mapping addons.</p>
<p>How do they work? They all have a one thing in common: declarative templating. Most of the mapping objects you see on screen
are managed using template components and helper invocations:</p>
<pre><code class="handlebars language-handlebars">&lt;MapboxGl as |map|&gt;
  &lt;map.source
    @options=(hash type='geojson' data=(hash type='Point' coordinates=(array  -96.7969879, 32.7766642 ))) as |source|
  &gt;
    &lt;source.layer layer=(hash
      type='circle'
      paint=(hash
        circle-color='#007cbf'
        circle-radius=10)
      )
    &gt;
  &lt;/map.source&gt;
&lt;/MapboxGl&gt;
</code></pre>
<p>This makes for a pretty nice experience, especially in terms of long-run maintainence because the visual aspects of
your application correspond to a specific part of the template file.</p>
<p>(What would alternative be? I've seen some wild spaghetti monsters and they are not pleasant to deal with because they
do not encapsulate <em>lifecycle management</em>).</p>
<p>I'm a little biased because I really only use ember-mapbox-gl. It's powered by WebGL. That means that the graphical output is powered by the
<em>things closer to the metal of the machine itself</em>. Plus, <a href="https://github.com/mapbox/mapbox-gl-js">mapbox-gl</a>, the underlying library,
is highly customizable. It might even be a little <em>too</em> customizable, and that's where <a href="https://github.com/miguelcobain/ember-leaflet">ember-leaflet</a> really shines:
although it's SVG-based (read: not as fast), it provides more out-of-the-box abstractions at a higher level.</p>
<p>That said, for the sake of brevity, let's stick with ember-mapbox-gl. Once you become a mapping expert, you can make that call later.</p>
<h3 id="shutupandplaythehits">Shut up and play the hits</h3>
<p>Stop what you're doing right now, open the nearest Ember project, and type this into your terminal:</p>
<p><code>ember install ember-mapbox-gl</code></p>
<p>Great. It's installed. But here's the rub: you have to find a provider for the <em>basemap</em> itself, the underlying data showing  streets, buildings, and points of interest. Because that data changes quite a lot, there's a lot of work that goes into maintaining it.</p>
<p>There are a few free and paid options out there, but for simplicity, let's use <a href="mapbox.com">mapbox.com</a>. Make an account there, and head over <a href="https://account.mapbox.com/access-tokens/create">here</a> to generate a public access token.</p>
<p>Open up your <code>config/environment.js</code> and add this:</p>
<pre><code class="javascript language-javascript">'mapbox-gl': {
  accessToken: 'ACCESS TOKEN HERE',
  map: {
    style: 'mapbox://styles/mapbox/basic-v9',
    zoom: 13,
    center: [ -96.7969879, 32.7766642 ]
  }
},
</code></pre>
<p>You should swap out 'ACCESS TOKEN HERE' with the access token you generated on mapbox.com.</p>
<p>What are these other things? The map object here <em>sets up the default state of the map when it loads</em>. This means that when you create a map, it needs to know what to show, where to position the camera. This is overridable at template invocation time.</p>
<p>What is this <code>style</code> property? It's the reason we had to grab an API key from Mapbox: this points to the remote resource for loading all the basemap details you need to see for your users to orient themselves on the map. It tells your Mapbox map where to fetch all the roads and bridges and points of interest that fill a delightful, useful map.</p>
<p>Now, add this to one of your templates:</p>
<pre><code class="handlebars language-handlebars">&lt;MapboxGl as |map|&gt;
  &lt;map.source
    @options=(hash type='geojson' data=(hash type='Point' coordinates=(array  -96.7969879, 32.7766642 ))) as |source|
  &gt;
    &lt;source.layer layer=(hash
      type='circle'
      paint=(hash
        circle-color='#007cbf'
        circle-radius=10)
      )
    &gt;
  &lt;/map.source&gt;
&lt;/MapboxGl&gt;
</code></pre>
<p>What is going on? Line by line:</p>
<pre><code class="handlebars language-handlebars">&lt;MapboxGl as |map|&gt;
</code></pre>
<p>This instantiates a new map by creating new element in the DOM and binding the map instance to it.</p>
<pre><code class="handlebars language-handlebars">&lt;map.source
  @options=(hash type='geojson' data=(hash type='Point' coordinates=(array  -96.7969879, 32.7766642 ))) as |source|
&gt;
</code></pre>
<p>This creates a mapbox-gl <a href="https://docs.mapbox.com/mapbox-gl-js/api/#sources">source</a>, and passes options to it. What are those options? First, the <em>type</em> describes the kind of source that mapbox should use. What is a <a href="https://geojson.org/">GeoJSON</a>? It's a standard for representing geographic information in JSON. That explains the shape of the <code>data</code> property: a GeoJSON object specifies its own <code>type</code>. For our purposes, we're using a point:</p>
<blockquote>
  <p>For type "Point", the "coordinates" member is a single position.</p>
</blockquote>
<p>That's a little far into the weeds, but it's worth mentioning because there actually is an underlying reason for these API choices.</p>
<p><strong>Generally, you'll find that most of the components in <em>ember</em>-mapbox-gl correspond to the various <em>mapbox</em>-gl APIs. That means you can use the MapboxGL documentation site proper when using this addon</strong></p>
<pre><code class="handlebars language-handlebars">    &lt;source.layer layer=(hash
      type='circle'
      paint=(hash
        circle-color='#007cbf'
        circle-radius=10)
      )
    &gt;
</code></pre>
<p>Again, we're dealing with another area of the mapbox-gl API: <a href="https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers">the layer</a>. Like GeoJSON, the shape of this object follows a <em>styling</em> specification. There are many ways to style a map layer.</p>
<p>One-by-one: <code>source.layer</code> invokes the <code>addLayer</code> method of mapbox-gl itself and passes some options. Those options—specifically, the <code>layer</code> property—adhere to the <a href="https://docs.mapbox.com/mapbox-gl-js/style-spec/">styling specification</a>. Allowed options are <em>type</em>-specific, so there's no saying "this fill type should have a <code>circle-radius</code> of 1000". That doesn't make sense.</p>
<h3 id="alltogethernow">All together now</h3>
<p>Here's a run-through of what we did:</p>
<ol>
<li>Install the addon</li>
<li>Setup a Mapbox.com account and generate an API token</li>
<li>Add your configuration to your <code>config/environment.js</code></li>
<li>Invoke your <code>&lt;MapboxGL&gt;</code> map and yield a <a href="https://guides.emberjs.com/release/components/block-content/#toc_block-parameters">block parameter</a></li>
<li>Add a <code>&lt;map.source&gt;</code> inside the map block scope.</li>
<li>Inside that block scope, add a <code>&lt;source.layer&gt;</code></li>
</ol>
<p>Why all this work? Because the addon is dealing with all the "gotchas" that come with lifecycle management. That means you can use these components as you would any other component:</p>
<pre><code class="handlebars language-handlebars">{{#if this.someCondition}}
  &lt;map.layer /&gt; {{!-- show something !}}
{{/if}}
</code></pre>
<p>When the <code>someCondition</code> is truthy, it shows the layer. When it's falsey, it triggers the teardown methods inside mapbox-gl so things don't fall out of sync.</p>
<p>Much of <code>ember-mapbox-gl</code> is a <em>bindings</em> layer. It provides a declarative templating API for invoking parts of the mapbox-gl API proper. So, it's hands-off. But the price of customizability is having less of an opinion. As I mentioned earlier, that's where <a href="https://miguelcobain.github.io/ember-leaflet/">Ember Leaflet</a> really shines, and I encourage you to look at that as well.</p>
<h3 id="noteonmapdataproviders">Note on map data providers</h3>
<!-- alex ignore host-hostess -->
<p>I'm a little disappointed by the dearth of free and open <em>vector</em> map data providers. That said, if you find that you would like to host your own map tile provider, check out <a href="https://openmaptiles.org/">OpenMapTiles</a>. It's a free and open source server that hosts those tile URLs we were using at the beginning. My team uses it and have had no issues.</p>
<p>Thanks for reading! If you have any questions, please message me via the <a href="https://discord.gg/emberjs">Ember Discord</a> chat (Matt Gardner#6278).
I'm more than happy to help!</p>
<p>Do you use this addons? Or any like them? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-mapbox-gl</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-mapbox-gl</guid><pubDate>Sat, 21 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Modifier]]></title><description><![CDATA[<h2 id="day3">Day 3</h2>
<p><strong>This is the third in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<p>Today we are going to look at a rising star in our addon ecosystem- <a href="https://emberobserver.com/addons/ember-modifier">ember-modifier</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<!-- alex ignore simple -->
<p>The <code>ember-modifier</code> addon provides an API for authoring element modifiers in Ember. It mirrors Ember's <a href="https://api.emberjs.com/ember/3.14/classes/Ember.Templates.helpers">helper API</a>, and has forms for writing both simple functional modifiers and more complicated class modifiers.</p>
<p>A modifier can add customized, automatic behavior to a DOM element, such as tracking scroll position or adding new event listeners. After you write a modifier, you can use it in a template like this:</p>
<pre><code class="handlebars language-handlebars">&lt;div {{my-modifier}}&gt;
  Some more content
&lt;/div&gt;
</code></pre>
<p>Developers who have tried out the Octane preview might already be familiar with <a href="https://github.com/emberjs/ember-render-modifiers">ember-render-modifiers</a>, which provide some modifiers like <code>{{did-insert}}</code> out of the box. With ember-modifiers, you can go beyond the box to build whatever your app needs!</p>
<p>For an in-depth look at modifiers in Ember, check out <a href="https://github.com/pzuraq">pzuraq's</a> blog post about <a href="https://blog.emberjs.com/2019/03/06/coming-soon-in-ember-octane-part-4.html">modifiers in Ember Octane</a>.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>I think this addon is a really great example of the Ember community coming together and gathering around a single solution that everyone can benefit from.</p>
<p>This addon was originally a few different addons- ember-oo-modifiers, ember-functional-modifiers, and ember-class-based-modifier. The authors came together and worked to create a single approach - once again, giving the community the gift of strong conventions that are so well-loved and known in Ember.</p>
<p>I especially loved <a href="https://github.com/spencer516">Spencer Price's</a> talk about modifiers at EmberCamp Chicago this year- <a href="https://www.youtube.com/watch?v=Z6sHHYTz2cc">Modifiers: the Good and the Camp</a>. Check it out if you haven't seen it yet. It's an informative and entertaining talk!</p>
<p>Do you use this addon? Or one like it? We'd love to hear about the Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-modifier</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-modifier</guid><pubDate>Tue, 03 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Page Title]]></title><description><![CDATA[<p><strong>This is the eleventh in our DecEmber series-"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day11">Day 11</h2>
<p>This addon <a href="https://emberobserver.com/addons/ember-page-title">ember-page-title</a> provides a helper for changing the browser tab title of the page within your application.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-page-title</code> addon is helpful for many reasons, but an important reason is that it is a <a href="https://www.w3.org/WAI/WCAG21/Understanding/page-titled">WCAG success criteria (2.4.2)</a> to provide a page title.
A quick tip about page titles! The title of each Web page should:</p>
<ul>
<li>Identify the subject of the Web page</li>
<li>Make sense when read out of context, for example by a screen reader or in a site map or list of search results</li>
<li>Be short</li>
</ul>
<h3 id="whyilikeit">Why I Like It</h3>
<p>Thanks to <code>ember-page-title</code>, you can provide users with an HTML browser title tag so they know where they are within your single-page application (SPA).</p>
<p>How to use it:</p>
<ol>
<li>Run <code>ember install ember-page-title</code></li>
<li>Add <code>{{head-layout}}</code> to your <code>application.hbs</code> file</li>
<li>Include the title helper to each page's template. For example, if you had an "About" route, add <code>{{title "About Us"}}</code> to that template. This helper <em>also</em> gives you the ability to add custom separators, for example <code>{{title "About" separator="&gt;"}}</code>.
More information can be found at the <a href="https://adopted-ember-addons.github.io/ember-page-title/">Ember Page Title Docs Site</a>.</li>
</ol>
<p>This addon is Octane-ready!</p>
<p>Do you use this addon? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-page-title</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-page-title</guid><pubDate>Wed, 11 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Power Select]]></title><description><![CDATA[<p><strong>This is the fourteenth in our DecEmber series - "Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day14">Day 14</h2>
<p>Today's selection for '31 Days of Ember Addons' is <a href="https://emberobserver.com/addons/ember-power-select">ember-power-select</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>Ember Power Select provides a powerful select component, built from the ground up for Ember so that it works the way you expect an addon to work in Ember. Exceptionally <a href="https://ember-power-select.com/docs">well-documented</a>, Ember Power Select allows you to create everything from a straightforward list of text items to an asynchronous search driven select which incorporates graphical elements in the list.</p>
<p>The addon's website includes a <a href="https://ember-power-select.com/cookbook">cookbook</a> for more unusual requirements as well as a <a href="https://ember-power-select.com/addons">list of community provided addons</a> which address functionality outside of the scope of Ember Power Select.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<!--alex ignore just-->
<p>I have grown to love using Ember Power Select while developing a CRUD-rich web app which benefits from many instances of select elements driven by asynchronous searches. I have made use of the <a href="https://ember-power-select.com/cookbook">cookbook</a> to debounce those searches and so reduce the load on the server while maintaining a slick feel to the interface. The look of the resulting selects is fine just as they are, but the <a href="https://ember-power-select.com/docs/api-reference">well-documented API</a> has allowed me to tweak each use of the addon and to provide a better experience to the users.</p>
<p>Although <a href="https://github.com/cibernox/ember-power-select/issues/1251">some work</a> has been done to support Octane it appears that as of today this isn't yet complete. If you are interested in helping out with this addon, check the repository to see what issues remain!</p>
<p>Do you use this addon? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-power-select</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-power-select</guid><pubDate>Sat, 14 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Shepherd]]></title><description><![CDATA[<p><strong>This is the 20th in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day20">Day 20</h2>
<p>For the 20th edition of <strong>Countdown to The New Year</strong> we're going to take a
look at <a href="https://emberobserver.com/addons/ember-shepherd"><code>ember-shepherd</code></a>
which allows you to add tours to your Ember app.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-shepherd</code> addon provides an Ember wrapper for the site tour library
<a href="https://shepherdjs.dev/">Shepherd</a>, which allows you to seamlessly
configure your site tours with an Ember service.</p>
<p>It allows you to show new users around your app, introduce new features to existing users, or suggest a flow your users might follow to optimally use your app.</p>
<p>It is configurable to show modal overlays or not, and can be hooked up to your existing application flow to conditionally show steps or be controlled manually.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>Tours are an often overlooked feature of apps, and can be crucial to providing a good user experience. Without them, a user may feel lost in your app or do things in a way you did not intend.</p>
<p>The <code>ember-shepherd</code> addon makes adding these useful tours to your Ember app much easier than hand rolling them yourself. With the provided Ember service, you can add steps and interact with your tour in a familiar Ember way.</p>
<p>I really like providing these tours to users to make sure they can quickly get up to speed with my apps, rather than spending a lot of time getting lost in the app and having a less than optimal experience.</p>
<p>You can setup your own tours using <code>ember-shepherd</code> by following the docs <a href="https://shipshapecode.github.io/ember-shepherd/">here</a>.</p>
<p>Do you use this addon? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-shepherd</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-shepherd</guid><pubDate>Fri, 20 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Simple Auth]]></title><description><![CDATA[<p><strong>This is the 13th edition in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day13">Day 13</h2>
<p>Today we're going to look at <a href="https://emberobserver.com/addons/ember-simple-auth">ember-simple-auth</a>!</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-simple-auth</code> addon is a lightweight library that helps you implement authentication and authorization in your Ember applications. It takes care of maintaining a client side session and synchronizing it accross tabs and windows, so you don't have to worry about your user signing out in one tab and remaining signed in in others.</p>
<p>It comes with a set of authentication providers (OAuth, Device, Torri) and can be customized in case you need to support a different authentication mechanism. It also provides a session service and a series of mixins that will aid you in adding authorization information to your requests, defining which routes should be accessible only to signed in users, and controlling the user session.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>Adding authentication and authorization to an Ember application is one of those things that most developers will have to go through, at one time or another. Having a consistent way of doing so, where we don't have to implement the basics every time, is one of the advantages of having an ecosystem of addons. <code>ember-simple-auth</code> is a cool library that covers the most common authentication needs, while at the same time being customizable for specific cases. It's well maintained and has a nice documentation to walk you throughthe integration with your app.</p>
<p>Do you already use <code>ember-simple-auth</code>? Or is there any other addon you love? Let us know!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-simple-auth</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-simple-auth</guid><pubDate>Fri, 13 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Sortable]]></title><description><![CDATA[<p><strong>This is the first in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day1">Day 1</h2>
<p>To kick things off, we're going to look at <a href="https://emberobserver.com/addons/ember-sortable">ember-sortable</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-sortable</code> addon provides sortable UI primitives for Ember apps- this is super useful in the sense that teams don't have to reinvent this very common pattern every time they need it for their own applications!</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>While the ember-sortable addon has been around for some time now, providing a consistent way to add drag and drop functionality to an Ember app, it is the most recent additions that have made this addon especially worth paying attention to. <a href="https://github.com/ygongdev">Yicheng Gong</a>, a software engineer at LinkedIn, noticed that the addon was missing accessibility support. He took on the work via the <a href="https://github.com/adopted-ember-addons/">Adopted Ember Addons org</a>, and updated the addon to add the missing features!</p>
<p>The addon now provides a keyboard-only way to sort a group of items-</p>
<ul>
<li>Activate the item using <code>ENTER</code> or <code>SPACE</code></li>
<li>move the item with the <code>ARROW</code> keys</li>
<li>confirm the new sort order with <code>ENTER</code> or <code>SPACE</code></li>
<li>or cancel the action with the <code>ESC</code> key, and the sort order will be reverted.</li>
</ul>
<p>I really like the way this existing addon was improved to make it more accessible, and am both encouraged and excited to see accessibility have an increased focus in the Ember community.</p>
<p>Do you use this addon? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-sortable</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-sortable</guid><pubDate>Sun, 01 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Template Invocation Location]]></title><description><![CDATA[<p><strong>This is the 25th in our December series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day25">Day 25</h2>
<p>I'm not sure there is anyone who knows the ins and outs of Ember <strong>and</strong> its ecosystem quite as well as Robert Jackson, aka <a href="https://emberobserver.com/maintainers/rwjblue">rwjblue</a>. Today, we look at a useful addon he wrote to help make debugging a little simpler - <a href="https://emberobserver.com/addons/ember-template-invocation-location">ember-template-invocation-location</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The <code>ember-template-invocation-location</code> addon will allow you to debug things such as the location in a template that a given helper, component, or modifier was invoked from; the invocation site of the thing that invoked that template, and so on up to the root most template (generally a route template). Since this is primarily done in development and test builds, it will not work in production by default.</p>
<p>The general goal of this addon is to enable significantly easier debugging. As a result of this, it is expected that the majority of usages of this will not want to modify the source component/helper/modifier but instead be able to gather this info while debugging in the devtools. When you look at the <a href="https://github.com/rwjblue/ember-template-invocation-location#api">API reference for the addon</a>, you will see that an <code>ember-template-invocation-location</code> module is provided for import, as well as a <code>window._templateInvocationInfo</code> global namespace that you can use in the middle of a debugging session.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>We don't always get to work in a tidy codebase, and sometimes it can be difficult to tell exactly where a helper or component came from. I like this addon because it is yet another way our community members (especially <a href="https://github.com/rwjblue">rwjblue</a>) provide solutions to make the developer experience really great.</p>
<p>Do you have another debugging addon that you enjoy using? We'd love to hear about it!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-template-invocation-location</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-template-invocation-location</guid><pubDate>Wed, 25 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Template Lint]]></title><description><![CDATA[<p><strong>This is the 19th in our DecEmber series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day19">Day 19</h2>
<p>Today we are going to look at an addon that is part of every new Ember app. The <a href="https://github.com/ember-template-lint/ember-template-lint">ember-template-lint</a> addon has many new features added recently, and is worth a close look!</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>As you may guess from the addon title, <code>ember-template-lint</code> is a linter for your template files!
It checks for mistakes and advises best practices for the markdown in your component and route templates.
Because we work in JavaScript, there are different ways something <em>could</em> be done, but often there is an ideal solution that avoids problems down the line.
This is where <code>ember-template-lint</code> shines. It will throw warnings and/or errors when you try to break one of these rules.
It's extendable and customizable too, so you can get the right combination of rules for <em>your</em> project.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>The <code>ember-template-lint</code> addon isn't actually an Ember addon, in terms of its file structure (which is why it's not on <a href="https://emberobserver.com/">Ember Observer</a>) but it <em>is</em> an essential ingredient that helps provide accuracy, consistency and best practices in your application.</p>
<p>Recently, I have been contributing to it myself, adding in extra ways that will help Ember developers avoid accessibility pitfalls.
Through that work, I have come to deeply appreciate this addon. The <a href="https://github.com/ember-template-lint/ember-template-lint/graphs/contributors">linter's contributors</a> have really done an incredible job at helping all of us write better template code.</p>
<p>Recent <a href="https://github.com/ember-template-lint/ember-template-lint/releases">releases</a> have brought additional linting rules that help avoid <a href="https://www.w3.org/WAI/WCAG21/Techniques/#failures">common WCAG failures</a>- 16 of which are now preventable through use of <code>ember-template-lint</code>.
More accessibility-specific work is planned in the coming months, so checking out the <a href="https://github.com/ember-template-lint/ember-template-lint/issues">issues</a> in the repository is a great way to figure out how you can contribute!</p>
<p>Do you use this linter? Or one like it? We'd love to hear about Ember addons that bring you joy!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-template-lint</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-template-lint</guid><pubDate>Thu, 19 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Test Selectors]]></title><description><![CDATA[<p><strong>Our December series - "Countdown to The New Year: 31 Days of Ember Addons" aims to highlight a new addon each day until the new year, and we hope you enjoy hearing about addons that bring us joy as well!</strong></p>
<h2 id="day15">Day 15</h2>
<p>On the 15th day of our <strong>Countdown to The New Year</strong> we want to take a look at a helpful Ember addon which lets us write <strong>redesign-proof tests</strong>: <a href="https://emberobserver.com/addons/ember-test-selectors">ember-test-selectors</a>!</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>ember-test-selectors is an addon that allows us to use additional, test-specific markup in the form of <code>data-test</code> attributes in the dev and test environments of our app. This additional, test-specific markup allows us to select elements in our integration and application tests reliably - even if the HTML markup or CSS selectors change during a redesign of our app.</p>
<p>The addon takes care of removing <code>data-test</code> attributes from our production builds automatically, freeing us from the worry that our bundle size might increase as we build and test away.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>If we only rely on CSS selectors or HTML markup to find elements in test cases, changing markup in our templates due to new design specifications can make our tests fail accidentally. Test selectors applied by ember-test-selectors outlive a redesign and make our test suite return fewer false positives.</p>
<p>When we don't have to worry about testing our app after a redesign, we also have more fun tweaking our app's design for a new look!</p>
<p><a href="https://emberobserver.com/addons/ember-test-selectors">Check it out for yourself</a>! Do you use this or other fun testing addons? Let us and the Ember community know in the comments below!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-test-selectors</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-test-selectors</guid><pubDate>Sun, 15 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember Tether]]></title><description><![CDATA[<p><strong>May the 4th edition in our December series be with you! In "Countdown to The New Year: 31 Days of Ember Addons" we highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day4">Day 4</h2>
<p>Today we are going to take a look at <a href="https://emberobserver.com/addons/ember-tether">ember-tether</a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>The addon <strong>ember-tether</strong> provides us with a UI component that - once rendered - will render its <strong>block</strong> to any other target DOM node on the page as configured via the component's attributes. This "tethering" of the component's block to a target somewhere else on the page also retains the component's context - making Ember action handling and data binding possible.</p>
<h3 id="whyilikeit">Why I Like It</h3>
<p>Even though we have a lot of control over how and where Ember apps render UI using routes and components, it's sometimes difficult to implement less conventional UI patterns such as interactive modal dialogs or tooltips for street maps without writing lots of boilerplate. I enjoy using ember-tether for giving me the freedom to render app content wherever I like, almost whenever I want to.</p>
<p>Do you already use Ember Tether or another addon that allows you to render your UI in a magic way? If so, let us know in the comments below!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year-ember-tether</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year-ember-tether</guid><pubDate>Wed, 04 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Built-in Addons]]></title><description><![CDATA[<p><strong>This is the last of our December series-"Countdown to The New Year: 31 Days of Ember Addons". Thank you for joining us!</strong></p>
<p>What a month it’s been!  Over the last thirty days, we have showcased different kinds of addons in the Ember ecosystem. In this final post, we’ll show how an Ember app’s default addons come together to form a great developer experience, and we will reflect on the article series as a whole.</p>
<p>This article series highlights the real spirit of the Ember community, the ways in which we come together to find a way to say yes to good ideas.  It started out as a wish: “Wouldn’t it be nice if we had our own advent calendar blog?” Then, it quickly turned into a refined possibility: “Let’s do a countdown to the new year so we can cover more addons.” From there, it grew into actionable steps: “What does an MVP blog post look like? How about a pre-determined format to make it easier to allow other community members to contribute?” This is one example of how many of our favorite open source projects come to life!</p>
<!-- READMORE -->
<!--alex ignore of-course-->
<p>Of course, we were only able to highlight a small portion of the addons that so many of us use in our day-to-day lives, and we didn’t even touch on the ones that are included in Ember apps by default…so let's do that now!</p>
<p>If you start to consider the kinds of apps powered by Ember—everything from dairy farm apps to cruise ship line's websites, to the future in open source blockchain—the need for stability becomes urgently and crisply apparent. This is where Ember’s backwards-compatibility guarantee really shines—the new stuff won’t break your old stuff, and you’ll be given both plenty of time and guidance to upgrade.</p>
<p>One of the ways we are able to offer this kind of flexibility and stability is through the work that Rob Jackson, Kris Selden, Godfrey Chan, Ed Faulkner and many others have done to make Ember more flexible by splitting it up into separate addons. This helps the overall maintainability and makes it a lot more convenient when work needs to be done on just one of the addons.</p>
<p>When you type <code>ember new my-app</code> do you know all of the things that you’re getting by default?</p>
<p>You might already be aware of the major things:</p>
<!--alex ignore gramps-granny-->
<ul>
<li>the component library (<code>@glimmer/component</code> )</li>
<li>the data library (<code>ember-data</code> )</li>
<li>the granddaddy of all CLI tools (<code>ember-cli</code>)</li>
</ul>
<p>Those things alone are amazing, and the reason why Ember can provide such a cohesive, robust approach to building apps for developers of <strong>all</strong> skill levels. But there’s more! Let’s look at a few of the addons that are built into Ember by default, and the usefulness that they provide.</p>
<h2 id="makeitrobust">Make it robust</h2>
<ol>
<li><code>@ember/optional-features</code> - who doesn’t love a good feature flag? This is one of the ways Ember allows you to try new features. The added bonus here is that we can test out the compatibility with existing features before making the optional feature permanent. Read more about optional features in Ember: <a href="https://guides.emberjs.com/release/configuring-ember/optional-features/">https://guides.emberjs.com/release/configuring-ember/optional-features/</a>.</li>
<li><code>ember-auto-import</code> - we covered this one on <a href="https://blog.emberjs.com/2019/12/06/countdown-to-the-new-year-ember-auto-import.html">day 6</a>, but it’s worth mentioning again. As of Ember v3.15, it is now part of apps by default! Gone are the days when an Ember version of a popular library or package needed to be created (and maintained).  It eliminates the need for developers to understand the differences between AMD and CJS modules and how they get into the app tree. They don't need to read about how to configure their build, or how Ember's build pipeline differs from other build tools. They import what they need, and it just works.</li>
<li><code>ember-qunit</code> - Ember’s testing story is unarguably one of its biggest strengths, and built into every app is the ability to write tests that are concise and readable. Read more in the testing section of the guides: <a href="https://guides.emberjs.com/release/testing/">https://guides.emberjs.com/release/testing/</a>.</li>
</ol>
<h2 id="makeitjustwork">Make it just work</h2>
<ol>
<li><code>ember-cli-dependency-checker</code> automatically checks for missing dependencies before the command even runs! Ember CLI is pure productivity gold; it gives you strong defaults but also ways to customize further, if you want to. Read more here: <a href="https://guides.emberjs.com/release/configuring-ember/configuring-ember-cli/">https://guides.emberjs.com/release/configuring-ember/configuring-ember-cli/</a>.</li>
<li><code>ember-maybe-import-regenerator</code> will import the Regenerator Runtime into your Ember app- but only if you need it. <a href="https://github.com/machty/ember-maybe-import-regenerator">Among other things</a>, it’s useful for apps that want to use ES6 generator functions but don’t want to import the (larger) Babel polyfill package.</li>
<li><code>ember-resolver</code> is probably the real “Ember magic,” if there is such a thing. What template goes with what route? <a href="https://github.com/ember-cli/ember-resolver">Ember Resolver</a> has your back. Technically speaking, it’s how your code gets converted into the actual classes/functions/templates that Ember needs to resolve it’s dependencies. And you don’t have to think about it, or set it up, it’s just there, working for you. Like magic. Or science.</li>
<li><code>broccoli-asset-rev</code> adds fingerprint checksums and CDN URLs to your assets (things like images, web fonts, etc). Just one more thing you don’t have to think about, but you can customize if desired. In a similar vein, <code>ember-cli-sri</code> ensures sub-resource integrity, a security concept used to check JavaScript and stylesheets are loaded with the correct content when using a CDN.</li>
</ol>
<h2 id="makeitfriendly">Make it friendly</h2>
<ol>
<li><code>ember-welcome-page</code> is a friendly way to let you know that you’ve successfully spun up your Ember application. When you’re ready to remove it and replace it with your own app content, removing the addon from <code>package.json</code> and the related template code from <code>app/templates/application.hbs</code> will put you back to a blank slate.</li>
<li><code>ember-cli-inject-live-reload</code> is possibly my favorite developer-friendly feature of Ember. I make changes, and my local developer instance live reloads, with no setup required from me. I’ll say that again - no setup required from me. Absolute bliss.</li>
<li>lint, lint, and lint some more - the most developer-friendly thing that Ember provides is a robust set of linters. There are a lot of ways apps can get things wrong, but Ember does what it can for preventable issues. <code>ember-template-lint</code>, <code>eslint-plugin-ember</code>, and <code>ember-cli-eslint</code> are just a few of the ways we try to give you a well-lit path to success.</li>
</ol>
<p>When I stop to think about all of the things I used to have to do every time I set up a new application, I grow more grateful for the ways Ember makes it easier to focus on what my app should do, and not all the tedium that can so quickly waste developer productivity through human error on tiny details.</p>
<p>On top of all of this, the <a href="https://blog.emberjs.com/2019/12/20/octane-is-here.html">recent release of the Octane edition of Ember</a> means that now is the perfect time to give Ember a try, no matter what your skill level. <a href="https://emberobserver.com/">EmberObserver</a> is still the go-to place for pre-evaluating Ember addons, and the <a href="https://discord.gg/emberjs">community chat server</a> is a perfect spot for getting help and advice if you need it- or have some to share!</p>
<p>No matter what your relationship with Ember.js is, there’s a place for you. Haven’t tried Ember yet? Check out the <a href="https://guides.emberjs.com/release/tutorial/">revamped tutorial</a> and give it a go! Regular Ember user? Check out the <a href="https://guides.emberjs.com/release/">updated guides</a>, and let us know what you think! Already using Octane (v3.15+)? I bet there are some addons that could use some updates! There’s no time like the present- jump right in and give it a try.</p>
<p>Ember wouldn't be what it is without the community of folks that make it all work. Thank you for being a part of this community and this effort to move the web forward in a way that allows us all to climb the proverbial mountain together. Here's to a happy and healthy 2020!</p>]]></description><link>https://blog.emberjs.com/countdown-to-the-new-year</link><guid isPermaLink="true">https://blog.emberjs.com/countdown-to-the-new-year</guid><pubDate>Tue, 31 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Countdown to The New Year - Ember SVG Jar]]></title><description><![CDATA[<p><strong>This is the twelfth in our December series–"Countdown to The New Year: 31 Days of Ember Addons". We plan to highlight a new addon each day until the new year, and we hope you'll join us for the fun!</strong></p>
<h2 id="day12">Day 12</h2>
<p>Today we're highlighting <a href="https://www.emberobserver.com/addons/ember-svg-jar"><code>ember-svg-jar</code></a>.</p>
<!-- READMORE -->
<h3 id="whatitdoes">What It Does</h3>
<p>There's a reason <code>ember-svg-jar</code> has a 10 out of 10 on Ember Observer! The <code>ember-svg-jar</code> addon enables you to effortlessly use SVG images in Ember apps.</p>
<h3 id="whywelikeit">Why We Like It</h3>
<p>A common theme in the Ember community is zero configuration. In that vein, with <code>ember-svg-jar</code>, you get a visual workflow out of the box to search and preview icons in one place. Check out the <a href="https://svgjar-demo.web.app/">live demo</a> and empower your team with this feature!</p>
<p>The <code>ember-svg-jar</code> addon helps you reduce the size of your assets. Using <a href="https://github.com/svg/svgo">svgo</a>, SVGs are automatically optimized, which can cut your file size by half or more. So useful!</p>
<!-- alex ignore easy-->
<p>The addon is flexible and extensible. ember-svg-jar provides an easy-to-use helper <code>{{svg-jar "asset-name"}}</code>, support for both <code>inline</code> and <code>symbol</code> embedding methods, and the ability to copy SVG as CSS background.</p>
<p>The addon <a href="https://svgjar.web.app/">webpage</a> and <a href="https://github.com/ivanvotti/ember-svg-jar">README</a> are a dream to peruse, both well documented and beautiful! And the logo is certainly bringing us joy.</p>
<p>Do you use ember-svg-jar? Or one like it? We'd love to hear about Ember addons you love for DecEmber!</p>]]></description><link>https://blog.emberjs.com/countown-to-the-new-year-ember-svg-jar</link><guid isPermaLink="true">https://blog.emberjs.com/countown-to-the-new-year-ember-svg-jar</guid><pubDate>Thu, 12 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[First Annual DecEmber Event!]]></title><description><![CDATA[<p>This year, the Ember Learning Core Team is hosting our first annual DecEmber, a hackathon event specifically targeted at Learning Team efforts! For an extra bit of awesome, it’s running at the same time as <a href="https://24pullrequests.com/">24 Pull Requests</a>, so contributions to DecEmber will count for both!</p>
<p>Maybe December is a busy month for you, because of the holidays and family obligations—and that’s totally okay—we hope you have a great time! But for some, December is a time of the year with a lot of downtime. Maybe that’s you! Are you wondering what to do with all your vacation time in December? We’ve got ya covered!</p>
<h2 id="participationrules">Participation Rules</h2>
<p>To qualify for any of our random assortment of thank you goodies (that we’ve delightfully dubbed <em>Embercouragement</em>), you must complete at least five participation activities for repositories in the <a href="https://github.com/ember-learn">ember-learn org</a> between December 1-28, 2018.</p>
<h2 id="participationactivities">Participation Activities</h2>
<ul>
<li>Submitting PRs for issues<ul>
<li>In the <a href="https://github.com/ember-learn">Ember Learn org</a></li>
<li>That have the <code>DecEmber</code> label</li></ul></li>
<li>Writing Issues for repositories in the ember-learn org. We will mark them with the <code>DecEmber</code> label if they qualify.</li>
<li>Creating Illustrations: Maybe you have an artistic side, and illustrating code concepts is fun for you! If that’s the case, there are always illustrations that would enhance the guides, and those are very welcome for this event!</li>
<li>If you have another idea that you think would help support the Learning Core Team, let us know!</li>
</ul>
<h2 id="qualitystandards">Quality Standards</h2>
<!-- alex ignore just -->
<p>We don’t think we need to say these things, but just in case…</p>
<ul>
<li>The PR counts once it is merged; the issue counts once we have added the label.</li>
<li>The PR must not be disruptive (i.e., taking someone else’s branch/commits and creating a PR).</li>
<li>If you participate by writing an issue, the issue should be of respectable quality and not something that appears to be an intent to +1 your participation count.</li>
</ul>
<h2 id="support">Support</h2>
<p>During the month of December, members of the Learning Core Team will be spending extra time in the December <a href="https://discordapp.com/channels/480462759797063690/517914929261576212">text</a> and <a href="https://discordapp.com/channels/480462759797063690/517914929261576212">voice chat</a> channels on our <a href="https://discordapp.com/invite/zT3asNS">Discord server</a>! It's a great place to ask questions or chat about the event.</p>]]></description><link>https://blog.emberjs.com/december-event</link><guid isPermaLink="true">https://blog.emberjs.com/december-event</guid><pubDate>Thu, 29 Nov 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 Prerelease 2]]></title><description><![CDATA[<p>Ember 1.0 Prerelease 2 is out now. This is mainly a bug fix release
after 1.0.pre. However, there are a few things you should be aware of
and we'll go over those a bit below. We're still pushing hard toward the a 1.0 beta release but wanted to make some of our bug fixes available in a more formal way. If you want to go ahead and
download now, you can grab it over on the <a href="https://github.com/emberjs/ember.js/downloads">Github Download Page</a>.  </p>
<!-- READMORE -->
<h2 id="whatschangednow">What's Changed Now</h2>
<p>Other than bug fixes, there are a few things we've changed that
could affect your 1.0.pre apps.</p>
<ul>
<li><code>{{outlet}}</code> now creates a Metamorph rather than a <code>&lt;div&gt;</code>. This makes
it less obtrusive, but you may have to change your HTML or CSS if you
were relying on the <code>&lt;div&gt;</code>.</li>
<li>We have removed <code>CP_DEFAULT_CACHEABLE</code> and <code>VIEW_PRESERVES_CONTEXT</code>
flags. Both behaviors are now always on.</li>
<li>Inline Handlebars templates must always be named now. The default name
is 'application'. This means that <code>&lt;script type="text/x-handlebars"&gt;</code>
behaves exactly the same as
<code>&lt;script type="text/x-handlebars" data-template-name="application"&gt;</code>.</li>
<li>Using the <code>{{collection}}</code> helper without a class has been deprecated,
use the <code>{{each}}</code> helper instead. The <code>{{each}}</code> helper also now
supports <code>itemViewClass</code> which was the main benefit to using
<code>{{collection}}</code>.</li>
<li><code>Ember.ViewState</code> has been removed.</li>
</ul>
<p>For more information on what's been changing in Ember, take a look at
Bradley Priest's <a href="http://bradleypriest.com/tags.html#ember-wrapup-ref">What's New in EmberJS</a>.</p>
<h2 id="whatwillchangelater">What Will Change Later</h2>
<p>There are still some things that we want to take care of before we do a
beta release. Here are a few of them:</p>
<ul>
<li>New Router API: This is mostly finalized but has not yet been
implemented.</li>
<li>New Computed Property API: We're working on a new API for Computed
Property getters and setters. Don't worry, we expect to support
the existing one for the foreseeable future.</li>
<li>Asynchronous Observers: Currently observers are fired immediately
whereas bindings are synchronized with the RunLoop. In most cases
observers can and should be delayed for optimal performance. We plan
to change the existing behavior and add a new API for the cases where
immediate execution really is needed.</li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-0-pre2.html</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-pre2.html</guid><pubDate>Thu, 25 Oct 2012 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 Prerelease]]></title><description><![CDATA[<p>We're pleased to announce the Ember 1.0 Prerelease. It's been a couple
of months since our 0.9.8.1 release and a lot has changed. By making
this prerelease available we're giving you the opportunity to try out
the feature set for 1.0. Read on to learn what's new along with a few
caveats.</p>
<!-- READMORE -->
<h2 id="whatsnew">What's New</h2>
<h3 id="router">Router</h3>
<p>Ember.js is all about giving you the tools to build ambitious apps on
the web. Here's the thing about ambitious apps: they usually have state.
Lots of state. And the bigger your app gets, the harder keeping all
of it in your head becomes.</p>
<p>Part of being an app on the web is taking advantages of the browser's
strengths. In particular, the fact that we have URLs to describe what
we see on our screen is an advantage over native applications. Your
users want to be able to share that URL on Twitter or Facebook and have
 their friends see what they're seeing.</p>
<p>Ember 1.0 Prerelease includes what we think is the most advanced tool
for modeling your application's state: <code>Ember.Router</code>. The router allows
you to describe the state of your application as discrete objects, which
means it's impossible for your application to ever get into a "bad
state." And because the URL is a serialization of your
application's state, you tell us how to build the URL and we'll
keep it up-to-date as your users move throughout the application.</p>
<!-- alex ignore easy -->
<p>We're still making tweaks to the router API to make it as easy as
possible for new users to pick up, but we think that modeling your apps
as discrete states is the way all apps will be built in the future. It's
still new but we believe in a few years it will be as relied on as
automated testing for building the most robust applications possible.</p>
<h3 id="viewcontextchanges">View Context Changes</h3>
<p>In apps built on earlier version of Ember, the <code>{{#view}}</code> helper
created a new context for the view. This meant that you had to
explicitly set the context on them. In 1.0, we've made this a bit
simpler. The <code>{{#view}}</code> helper no longer changes the context, instead
maintaining the parent context by default. Alternatively, we will use
the <code>controller</code> property if provided. You may also choose to directly
override the <code>context</code> property. The order is as follows:</p>
<ol>
<li>Specified controller</li>
<li>Supplied context (usually by Handlebars)</li>
<li><code>parentView</code>'s context (for a child of a ContainerView)</li>
</ol>
<p>In the event that you do need to directly refer to a property on the
view, you can use the <code>view</code> keyword, i.e. <code>{{view.myProp}}</code>.</p>
<h3 id="miscellaneous">Miscellaneous</h3>
<ul>
<li><code>getPath</code> and <code>setPath</code> have been merged into <code>get</code> and <code>set</code>
respectively.</li>
<li><code>Ember.ObjectProxy</code> - this object proxies to its <code>content</code> property.
Along with this comes <code>Ember.ObjectController</code>.</li>
<li>The <code>#with</code> helper now supports assigning an object to a custom
property name using the format <code>{{#with path.to.object as custom}}</code></li>
<li>The <code>#each</code> helper also allows for a custom property using the format
<code>{{#each custom in path.to.array}}</code>.</li>
<li><code>Ember.SortableMixin</code> - this mixin can be added to array-like objects
for sorting functionality.</li>
<li><code>Ember.Evented#one</code> has been added for one time events.</li>
<li><code>Ember.View#classNameBindings</code> and <code>bindAttr class</code> now support the
double colon syntax: <code>myProperty:enabledClass:disabledClass</code>.</li>
<li><code>Ember.Object#canInvoke</code>, <code>tryInvoke</code> - simplifies checking to see if
a method can be invoked on the object.</li>
<li>jQuery 1.6 is no longer supported. You must use 1.7 or greater.</li>
<li>Handlebars is no longer bundled with Ember. This allows you to better control your version as well as allowing for the runtime only version to be used.</li>
<li>ViewStates are now deprecated.</li>
<li>Binding transforms have been removed in favor of computed properties.</li>
<li>Async state transitions have been removed in favor of transitional
states.</li>
<li><code>Ember.StateManager#transitionTo</code> should be used instead of
<code>goToState</code>.</li>
<li><code>Ember.Evented#fire</code> has been renamed to <code>trigger</code>.</li>
<li><code>Ember.Tabs</code> have been deprecated.</li>
<li>Some existing deprecations have been removed entirely.</li>
</ul>
<p>For a full list, see the <a href="https://github.com/emberjs/ember.js/blob/master/CHANGELOG">Changelog</a>.</p>
<h2 id="knownissues">Known Issues</h2>
<p>Since this is a prerelease, there are still some important known issues:</p>
<ul>
<li><strong>Router</strong> - The Router API is not finalized. Conceptually, things
are pretty stable, but API details are likely to change.</li>
<li><strong>Ember.Object.create</strong> - We are currently considering changing <code>create</code>
to make it behave more like <code>setProperties</code>. If this does
happen, we will try to maintain backwards compatibility as far as
possible.</li>
<li><strong>Ember Data</strong> - We hope to merge Ember Data into the core Ember project
before the final 1.0 release.</li>
<li><strong>Memory leaks</strong> - There are some known memory leaks. We will fix these
before the final 1.0 release. <a href="https://github.com/emberjs/ember.js/issues/1165">Issue #1165</a></li>
<li><strong>Browser support</strong> - We have only done limited testing on older
browsers so far. We will do more comprehensive testing before the
final release.</li>
<li><strong>Dependent Bindings</strong> - Bindings that depend on other bindings may
fail on initial connect unless properly ordered. <a href="https://github.com/emberjs/ember.js/issues/1164">Issue #1164</a></li>
<li><strong>ContainerView and SortableMixin</strong> - Using <code>ContainerView</code>, or its
subclass <code>CollectionView</code> (which is used by the <code>#each</code> and
<code>#collection</code> helpers), with <code>SortableMixin</code> may cause unexpected
rendering errors. <a href="https://github.com/emberjs/ember.js/issues/800">Issue #800</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-0-prerelease.html</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-prerelease.html</guid><pubDate>Fri, 03 Aug 2012 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 RC]]></title><description><![CDATA[<p>Today at Ember Camp, we announced the release of Ember.js 1.0 RC1.</p>
<p>This release is all about fixing bugs from the <code>pre4</code> release, and
gets us that much closer to a final 1.0 release. Between this release
and the 1.0 final, we will mostly be focusing on stability and documentation.</p>
<p>If you discover any blocking bugs or undocumented areas, please file tickets at
the emberjs/ember.js repo on GitHub and consider helping out.</p>
<h3 id="routereplacement">Route Replacement</h3>
<p>You can now transition to a new route without creating an entry in the history:</p>
<pre><code class="javascript language-javascript">// instead of this, which creates a history entry
router.transitionTo('index');

// do this
router.replaceWith('index');
</code></pre>
<p>In the <code>redirect</code> hook, you can use <code>replaceWith</code> and Ember won't create
a history entry.</p>
<p>In a controller, you can use <code>replaceRoute</code> (instead of <code>transitionToRoute</code>)
to do the same thing.</p>
<h3 id="itemcontroller">Item Controller</h3>
<p>If you want every item in a <code>{{#each}}</code> to be wrapped in an <code>ObjectController</code>,
you can do so:</p>
<pre><code class="handlebars language-handlebars">{{#each posts itemController="post"}}
  {{!-- `this` in here is each post wrapped in an App.PostController --}}
{{/each}}
</code></pre>
<h3 id="registerandinject">Register and Inject</h3>
<p>Internally, Ember uses a "container" to instantiate your controllers and other
objects.</p>
<p>As of Ember 1.0 RC1, you can use <code>App.register</code> to override the default lookup
for controllers and other objects. For example:</p>
<pre><code class="javascript language-javascript">App.register('controller:post', Ember.ObjectController.extend());
</code></pre>
<p>In general, you should use the default naming conventions, which Ember will use
to find objects, but you can use this API for advanced usages.</p>
<p>Similarly, you can use <code>App.inject</code> to tell Ember to automatically inject
objects into other Ember objects.</p>
<pre><code class="javascript language-javascript">App.register('network:main', App.NetworkAdapter);
App.inject('controller', 'network', 'network:main');
</code></pre>
<p>This will create a single instance of <code>App.NetworkAdapter</code> and give it to every
controller created over the course of building your application. Internally,
Ember Data uses this API to give every controller the application's store:</p>
<h3 id="routeractivateanddeactivate">Router Activate and Deactivate</h3>
<p>Currently, many people are using the undocumented and private <code>enter</code> and
<code>exit</code> hooks to run code whenever Ember activates a route handler or
deactivates it.</p>
<p>As of Ember 1.0 RC1, there are public hooks: <code>activate</code> and <code>deactivate</code>. Note
that the <code>activate</code> hook will run only when a route handler is activated for
the first time. If a route handler's context changes, the <code>setupController</code>
hook will run again, but not the <code>activate</code> hook.</p>
<h3 id="appreset">App.reset()</h3>
<p>If you are trying to run integration tests with Ember, you might have noticed
that there is no good way to reset all of an application's state.</p>
<p>No more!</p>
<p>As of Ember 1.0 RC1, you can call <code>App.reset()</code> to destroy all objects created
for the application, and bring the application back to <code>/</code>.</p>
<h3 id="biglistofchanges">Big List of Changes</h3>
<p>Since <code>.pre4</code>, we've added these features:</p>
<ul>
<li>Added the ability to replace the current route without adding a history
entry, using <code>router.replaceWith</code></li>
<li>Added support for String literals in <code>{{action}}</code> and <code>{{linkTo}}</code> to
differentiate between static String parameters and properties on the current
context</li>
<li>Allow redirection from routes that are not the final resting route</li>
<li>Fix a bug where using named outlets would confuse where child templates should
be rendered into</li>
<li>Add <code>itemController</code>, which allows a <code>{{#each}}</code> to wrap each iterated element
in a controller that can be used to store transient state</li>
<li>Fix a bug involving {{else}} templates only working a single time</li>
<li>Add <code>intersection</code> to <code>EnumerableUtils</code></li>
<li>Added <code>App.register</code> and <code>App.inject</code> to control the default application's
dependency injection container</li>
<li>Fixes regressions in jQuery 1.9 to address changes made to .attr and .prop</li>
<li>Add support for <code>{{unbound helper}}</code> where <code>helper</code> is a custom helper
registered via <code>Ember.Handlebars.registerBoundHelper</code></li>
<li>Added <code>Ember.debug</code> to print debug-level warnings and use it to print the
current version of Ember and its dependencies on boot</li>
<li>Fix a bug where changing the model property passed to <code>{{render}}</code> does not
update the rendered template</li>
<li>Added public <code>activate</code> and <code>deactivate</code> hooks in the router. If you were
using the private <code>enter</code> and <code>exit</code> methods, please switch!</li>
<li>Added <code>Application#reset</code> to help with integration tests</li>
<li>Several fixes for the Ember Inspector</li>
<li>Many bug and performance fixes</li>
</ul>
<p>You can see the full changelog at <a href="https://github.com/emberjs/ember.js/blob/master/CHANGELOG">the official CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-1-0-rc.html</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-rc.html</guid><pubDate>Fri, 15 Feb 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 RC2]]></title><description><![CDATA[<p>Today, we're releasing the second Release Candidate of Ember 1.0.
As we said when we released RC1, the next few releases will be
about bugfixes and improvements, and should not have any breaking
changes.</p>
<h3 id="namespacelookupforcontrollers">Namespace Lookup for Controllers</h3>
<p>It is now possible to look up controllers that are included in a
namespace other than the main application namespace.</p>
<p>For example, when using the render helper:</p>
<pre><code class="handlebars language-handlebars">{{render 'posts'}}
</code></pre>
<p>This will render the <code>posts</code> template with the controller <code>App.PostsController</code>, where <code>App</code> is the main application namespace.</p>
<p>If you want to use an alternative namespace, you can use a
<code>/</code>-separated path.</p>
<pre><code class="handlebars language-handlebars">{{render 'blog/posts'}}
</code></pre>
<p>This will render the <code>blog/posts</code> template with the controller
<code>Blog.PostsController</code>.</p>
<h3 id="usingrenderwithmultiplemodels">Using Render With Multiple Models</h3>
<p>In RC1, you could use <code>{{render 'posts'}}</code> to render the <code>posts</code>
template using the app's instance of <code>App.PostsController</code>. Using
<code>render</code> in this way will always render the template using the same
singleton controller.</p>
<p>In RC2, we are adding the ability to render a template with a
particular model: <code>{{render 'post' post}}</code>. When you supply a model,
Ember.js will create a new instance of the <code>App.PostController</code> each
time it is used.</p>
<p>This allows you to use <code>{{render}}</code> in a loop:</p>
<pre><code class="handlebars language-handlebars">{{#each post in posts}}
  {{render 'post' post}}
{{/each}}
</code></pre>
<h3 id="unwrappinganobjectcontrollersmodel">Unwrapping an <code>ObjectController</code>'s Model</h3>
<p>When passing an <code>ObjectController</code> as a parameter to the <code>action</code>
or <code>linkTo</code> helpers, Ember now unwraps the underlying model and
passes it through.</p>
<p>Most importantly, this allows you to add an <code>itemController</code> to
<code>{{#each}}</code> without affecting action handlers in your controller
or router.</p>
<p>If you have a template like this:</p>
<pre><code class="handlebars language-handlebars">{{!-- posts.hbs --}}
&lt;ul&gt;
{{#each controller itemController='postItem'}}
  &lt;li&gt;&lt;button {{action 'selectPost' this}}&gt;{{name}}&lt;/button&gt;&lt;/li&gt;
{{/each}}
&lt;/ul&gt;
</code></pre>
<p>Your <code>App.PostsController</code> would look like this:</p>
<pre><code class="javascript language-javascript">App.PostsController = Ember.ArrayController.extend({
  needs: 'currentPost',

  selectPost: function(post) {
    // `post` here is an `App.Post`, not an
    // `App.PostItemController`
    this.set('controllers.currentPost.model', post);
  }
});
</code></pre>
<p>This should make using <code>itemController</code> less gotcha-prone.</p>
<h3 id="supportforjquery20">Support for jQuery 2.0</h3>
<p>Ember 1.0 RC2 supports <a href="http://blog.jquery.com/2013/03/01/jquery-2-0-beta-2-released/">jQuery 2.0</a>.</p>
<p>This allows you to use a smaller, optimized build for newer browsers
that is fully compatible with Ember.</p>
<p>If you're targeting both older IE and modern browsers, you can use
the following snippet to get the best of both worlds:</p>
<pre><code class="html language-html">&lt;!--[if lt IE 9]&gt;
    &lt;script src="jquery-1.9.1.js"&gt;&lt;/script&gt;
&lt;![endif]--&gt;
&lt;!--[if gte IE 9]&gt;&lt;!--&gt;
    &lt;script src="jquery-2.0.0.js"&gt;&lt;/script&gt;
&lt;!--&lt;![endif]--&gt;
</code></pre>
<p>Because jQuery 1.9 and 2.0 are API-compatible, this strategy will
allow you to target the widest range of browsers, but ship a
smaller build for modern browsers.</p>
<p>The future is here!</p>
<h3 id="changelog">Changelog</h3>
<p>The full <a href="https://github.com/emberjs/ember.js/blob/7e012d9e7f4c5e5b7ce6e60307aac7cd653df5b9/CHANGELOG#L1">CHANGELOG</a> is available on Github, as always.</p>]]></description><link>https://blog.emberjs.com/ember-1-0-rc2</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-rc2</guid><pubDate>Sat, 30 Mar 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 RC3]]></title><description><![CDATA[<p>Today we are announcing the third Release Candidate of Ember 1.0.
As we said when we released RC1, all releases until 1.0 is final
will be about bugfixes and improvements, and should not have any
breaking changes.</p>
<h3 id="performance">Performance</h3>
<p>Since RC2, a series of performance improvements have landed.</p>
<ul>
<li><p>When adjacent child views are scheduled for insertion they are
are now batched together, and inserted together rather then one at
a time.</p></li>
<li><p>Object deletion is now async, this prevents un-needed churn when destroying
large interconnected object graphs.</p></li>
<li><p>The number of objects allocated during view rendering has been cut down.</p></li>
</ul>
<p>The ongoing performance effort is being championed
by Erik Bryn and Kris Selden.</p>
<h3 id="testing">Testing</h3>
<p>There have been many fixes and improvements to App#reset, which should now
correctly clear application state when invoked. Typically this is only used
for integration tests.</p>
<pre><code class="javascript language-javascript">// before each integration test
App.reset();
</code></pre>
<p>Please Note: <code>App.reset()</code> now brings its own run loop, and no longer
needs to be wrapped in one.</p>
<p>Initial work on a new <a href="https://github.com/emberjs/ember.js/tree/master/packages/ember-testing">ember-testing package</a>
has begun. The goal of this project is to make testing Ember applications easier,
especially when it comes to testing asynchrony. As this effort matures, expect full
documentation, examples and guides.</p>
<p>Props to Erik Bryn for researching integration testing approaches by many community
members, including Jo Liss and Katie Gengler, and spearheading initial work on what
will be our official library.</p>
<h3 id="emberbuilds">Ember Builds</h3>
<p>Each successful <a href="https://travis-ci.org/emberjs/ember.js">CI</a> run now publishes its build results to
<a href="/builds">http://emberjs.com/builds</a>. This should make
it much simpler to reference and use the <a href="http://builds.emberjs.com/canary/ember.js">the latest ember build</a>.</p>
<p>Thanks to Stanley Stuart, Luke Melia, Erik Bryn and others for getting this set up.</p>
<h3 id="newinputandtextareahelpers">New Input and TextArea helpers</h3>
<p><code>TextField</code>, <code>TextArea</code> and <code>Checkbox</code> views now have corresponding handlebars helpers.</p>
<pre><code class="handlebars language-handlebars">  {{view Ember.TextField valueBinding="name"}}
  {{view Ember.Checkbox  checkedBinding="isActive"}}
  {{view Ember.TextArea  valueBinding="name"}}
</code></pre>
<p>can now be expressed as:</p>
<pre><code class="handlebars language-handlebars">  {{input value=name}}
  {{input type=checkbox checked=isActive}}
  {{textarea value=name}}
</code></pre>
<p>We recommend using the "dynamic tag" forms rather than the <code>{{view}}</code> forms because
they are equivalent to the static tags that we all know and love.</p>
<p>Note that when using dynamic tags, you do not need to use a <code>Binding</code> suffix and
must leave out the quotation marks around the values. Ember will interpret quoted
strings as static strings in this context.</p>
<h3 id="documentation">Documentation</h3>
<p>The API docs have been refined and filled in by more community members
than we can mention here. Thank you everyone for helping out!</p>
<h3 id="changelog">Changelog</h3>
<p>The full <a href="https://github.com/emberjs/ember.js/blob/v1.0.0-rc.3/CHANGELOG">CHANGELOG</a> is available on Github, as always.</p>]]></description><link>https://blog.emberjs.com/ember-1-0-rc3</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-rc3</guid><pubDate>Sun, 21 Apr 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 RC4]]></title><description><![CDATA[<h4 id="announcement">Announcement</h4>
<p>We have <a href="https://github.com/emberjs/ember.js/issues/2750">noticed</a> a performance regression, a debug flag was left on by mistake. So if you really want the goodness of RC4 without this regression use <a href="http://builds.emberjs.com/ember-bd1629e1f38888be881dbfdf29b779a0cdb4e85f.js">this build</a>, we'll have an official release out soon.</p>
<hr />
<p>Today, we are pleased to announce Ember.js 1.0 RC4:</p>
<p>This RC4 release of Ember puts us very close to the final 1.0 release.</p>
<h3 id="emberjs10rc4">Ember.js 1.0 RC4</h3>
<p>As we approach 1.0 final, our focus continues to be on bugfixes, performance, and
reliability.</p>
<h4 id="breakingchangecontrollermodelsetup">BREAKING CHANGE: Controller/Model Setup</h4>
<p>One of the roles of <code>Route</code> objects in an Ember application is to tell
controllers which model they should represent.</p>
<p>By default, the object that you return from a route's <code>model</code> hook is
set as the <code>model</code> property on the corresponding controller. So, for
example, if you have this route:</p>
<pre><code class="javascript language-javascript">App.PhotosRoute = Ember.Route.extend({
  model: function() {
    return App.Photo.find();
  }
});
</code></pre>
<p>The array returned from <code>model</code> would be set as the <code>model</code> property of
the <code>App.PhotosController</code>. This tells the controller that it should
present that model to its template.</p>
<p>What if you need to set up additional controllers, beyond the primary
controller associated with that route? In that case, you can implement
the <code>setupController</code> hook:</p>
<pre><code class="javascript language-javascript">App.PhotosRoute = Ember.Route.extend({
  model: function() {
    return App.Photo.find();
  },

  setupController: function(controller, model) {
    this.controllerFor('application').set('showingPhotos', true);
  }
});
</code></pre>
<p>This is all well and good, but what if you wanted to <strong>prevent</strong> a model
from being set on the <code>PhotosController</code> at all?</p>
<p>In RC3, <em>preventing this default behavior was impossible</em>. In RC4,
<strong>implementing the <code>setupController</code> hook prevents the default behavior
from happening. This is a potentially breaking change.</strong></p>
<p>If your route implements the <code>setupController</code> hook <em>and</em> you want to
preserve default behavior, <strong>make sure you call <code>_super()</code> from within
the hook</strong>:</p>
<pre><code class="javascript language-javascript">App.PhotosRoute = Ember.Route.extend({
  model: function() {
    return App.Photo.find();
  },

  setupController: function(controller, model) {
    // Call _super for default behavior
    this._super(controller, model);
    this.controllerFor('application').set('showingPhotos', true);
  }
});
</code></pre>
<p>Thanks to Kris Selden and Luke Melia for pulling together PRs from
Paul Chavard, Rob Harper and input from others into a cohesive change.
We don't take breaking changes lightly at this stage of the release
process, but this one is worthwhile.</p>
<h4 id="rsvp20">RSVP 2.0</h4>
<p>Ember now embeds version 2.0 of
<a href="https://github.com/tildeio/rsvp.js">RSVP.js</a>, a microlibrary for
<a href="http://promises-aplus.github.io/promises-spec/">Promises/A+ compatible
promises</a>.</p>
<p>All of the Ember.js APIs that return promises use this library to
ensure compatible behavior.</p>
<p>A big, big thanks to Stefan Penner for all of his work on improving the
promises story across both Ember and Ember Data.</p>
<h4 id="runloopextractedtobackburnerjs">Run Loop Extracted to Backburner.js</h4>
<p>Erik Bryn has extracted the run loop into the
<a href="https://github.com/ebryn/backburner.js">Backburner.js</a> microlibrary,
which Ember now uses.</p>
<p>This will allow other frameworks and libraries that use
Backburner to benefit from using a deferred event queue, and hopefully
we can share our work to make the web platform faster for everyone.</p>
<h4 id="handlebarsrc4compatibility">Handlebars RC4 Compatibility</h4>
<p>Ember.js RC4 requires the latest release of Handlebars, which is also at RC4.</p>
<h4 id="improvedrouteredirection">Improved Route Redirection</h4>
<p>Routes provide a <code>redirect</code> hook that allow them to conditionally redirect to
a different route. For example, you may redirect the user to a login
route if you detect that they do not have an authentication token saved.</p>
<p>Many improvements to the <code>redirect</code> hook have been made to make it more
reliable. Additionally, you can now implement this hook in the
<code>ApplicationRoute</code>, which previously would not work.</p>
<p>Props to Tom Dale for this work.</p>
<h4 id="embertestingimprovements">ember-testing Improvements</h4>
<p>The <code>ember-testing</code> package, included in Ember.js, is the
officially-supported library for writing unit and integration tests for
Ember apps. Introduced in RC3, this has continued to be improved, with
many bug fixes and performance improvements landing in RC4.</p>
<p>A huge thanks to Teddy Zeeny for driving many of these improvements.</p>
<h4 id="disabledwhenlinktooption"><code>disabledWhen</code> {{linkTo}} Option</h4>
<p>The <code>{{#linkTo}}</code> Handlebars helper now has a <code>disabledWhen</code> option that
can be bound to conditionally disable a link:</p>
<pre><code class="handlebars language-handlebars">{{#linkTo 'upgradeAccount' disabledWhen=isPremiumUser}}
  Upgrade Account
{{/linkTo}}
</code></pre>
<p>Thanks to Trek Glowacki for this improvement.</p>]]></description><link>https://blog.emberjs.com/ember-1-0-rc4</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-rc4</guid><pubDate>Tue, 28 May 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 RC5]]></title><description><![CDATA[<p>Ember.js 1.0 RC5 has been released and is now available from the
main website as well as <a href="http://builds.emberjs.com">builds.emberjs.com</a>.</p>
<p>RC5 fixes several regressions and bugs found in RC4. Notably:</p>
<!-- alex disable hang -->
<ul>
<li>A performance regression caused by a change to run loop scheduling has
been fixed. Thanks to <a href="https://twitter.com/ebryn">Erik Bryn</a> for
working on this.</li>
<li>Promises returned from a route's <code>model</code> hook could cause the app to
hang on page refresh. This has been fixed thanks to <a href="https://twitter.com/machty">Alex Matchneer</a>.</li>
<li>The <code>ember-testing</code> package, which contains additional helpers for
testing Ember.js apps, is no longer included in the production build.
This means less JavaScript for end users to load over the network.</li>
</ul>
<!-- alex enable hang -->
<p>Thank you to everyone who filed issues and pull requests. Please try out
RC5 in your applications and report any issues or regressions you find
by filing an <a href="https://github.com/emberjs/ember.js/issues">issue on GitHub</a>.</p>
<p>Lastly, thanks to <a href="https://twitter.com/stefanpenner">Stefan Penner</a>, who
has been busting his tail to get Ember.js to the 1.0 finish line,
including doing the release engineering for these release candidates.
Thanks Stef!</p>]]></description><link>https://blog.emberjs.com/ember-1-0-rc5</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-rc5</guid><pubDate>Sat, 01 Jun 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 RC6.1, RC5.1, RC4.1, RC3.1, RC2.1 RC1.1 Released]]></title><description><![CDATA[<p>Because many Ember.js apps allow users to interact with private data, we
take security issues very seriously.</p>
<!-- alex ignore clearly -->
<p>In fact, we're one of the few JavaScript projects that has a
<a href="/security/">clearly outlined security policy</a> and a
<a href="https://groups.google.com/forum/#!forum/ember-security">low-traffic mailing list exclusively for security
announcements</a>.</p>
<p>We want developers to know that they can trust Ember enough to build
their businesses on top of it.</p>
<p>In that spirit, today we are announcing the release of Ember.js 1.0
RC6.1, RC5.1, RC4.1, RC3.1, RC2.1 and RC1.1. These are all security
releases that address a potential XSS security issue you can learn more
about by following this link:</p>
<ul>
<li><a href="https://groups.google.com/forum/#!topic/ember-security/dokLVwwxAdM">CVE-2013-4170</a></li>
</ul>
<p>It is recommended that you update immediately. In order to ease
upgrading, the only major change in each release is the security fix.</p>
<p>We would like to thank Mario Heiderich of <a href="https://cure53.de/">Cure53</a>
for responsibly disclosing this issue, working with us on the patch
and the advisory, and having patience while we went through our
security procedure for the first time.</p>
<p>Like a smoke detector or fire extinguisher, having a security procedure
is something that you hope that you don't need; but when you need it,
you're glad you have it.</p>
<p>We hope that we can set an example for other projects in the JavaScript
world when it comes to taking security seriously. Initiatives like the
<a href="https://nodesecurity.io/">Node Security Project</a> are a step in the
right direction.</p>
<p>We are very fortunate that this security issue is low severity. Due to
the sandboxed nature of the web browser, there are far fewer possible
exploit vectors for a JavaScript MVC framework to worry about than a
traditional server-side framework.</p>
<p>That being said, we will remain vigilant in ensuring that even small
security issues are taken care of properly. If you discover what you
believe may be a security issue in Ember.js, we ask that you follow
our <a href="/security/">responsible disclosure policy</a>.</p>
<p>Lastly, thanks to Yehuda Katz, Stefan Penner and Kris Selden, who
donated their valuable time to reviewing the patch, auditing other code
for similar vulnerabilities, and preparing the new releases.</p>]]></description><link>https://blog.emberjs.com/ember-1-0-rc6-1-rc5-1-rc4-1-rc3-1-rc2-1-and-rc1-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-rc6-1-rc5-1-rc4-1-rc3-1-rc2-1-and-rc1-1-released</guid><pubDate>Thu, 25 Jul 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 RC6]]></title><description><![CDATA[<p>Ember.js 1.0 RC6 has been released and is available from the
main website and at <a href="http://builds.emberjs.com">builds.emberjs.com</a>.  This
release features two big changes: 1) router update 2) Ember Components.</p>
<p><strong><em>Router Update</em></strong></p>
<p>The biggest change is router update (aka "router facelift"), which addresses
two major issues. The first was inconsistent semantics between URL-based transitions
and <code>transitionTo</code>. The second was spotty async support which made it difficult to
prevent or delay route entry in cases such as authentication and async code-loading.</p>
<p>We have now harmonized URL changes and <code>transitionTo</code> semantics and more fully embraced
asynchrony using promises.</p>
<p>Additionally, router transitions have become first-class citizens and there are
new hooks to prevent or decorate transitions:</p>
<p><code>willTransition</code>: fires on current routes whenever a transition is about to take place
 <code>beforeModel</code>/<code>model</code>/<code>afterModel</code>: hooks fired during the async validation phase</p>
<p>Finally there is an <code>error</code> event which fires whenever there is a rejected promise or
error thrown in any of the <code>beforeModel</code>/<code>model</code>/<code>afterModel</code> hooks.</p>
<p>For more on new router features, see:</p>
<ul>
<li><a href="https://machty.s3.amazonaws.com/ember-facelift-presentation/index.html#/1">New router overview given by Alex Matchneer's at the June Ember NYC Meetup</a></li>
<li><a href="https://gist.github.com/machty/5647589">Usage Examples</a></li>
<li><a href="http://www.embercasts.com/episodes/client-side-authentication-part-2">Client-side Authentication Part 2 Embercast</a></li>
</ul>
<!-- alex ignore special -->
<p>Special thanks to Alex Matchneer for his work on this!</p>
<p><strong><em>Ember Components</em></strong></p>
<p>The other major change is the introduction of Ember Components, which shares Web
Components' goal of facilitating creation of reusable higher-level page elements.</p>
<p>Ember Components will generally consist of a <code>template</code> and a <code>view</code> which encapsulate the <code>template</code>'s
property access and actions.  Any reference to outside constructs is handled through context
info passed into the <code>view</code>.  Components can be customized through subclassing.</p>
<p>Ember Components naming conventions are: 1) the <code>template</code>'s name begins with 'components/', and 2) the
Component's name must include a '-' (this latter convention is consistent with Web Components standards,
and prevents name collisions with built-in controls that wrap HTML elements). As an example, a component
might be named <code>'radio-button'</code>.  Its <code>template</code> would be <code>'components/radio-button'</code> and you would call
it as <code>{{radio-button}}</code> in other <code>templates</code>.</p>
<p>Stay tuned for more docs and examples of this exciting new feature.</p>]]></description><link>https://blog.emberjs.com/ember-1-0-rc6</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-rc6</guid><pubDate>Sun, 23 Jun 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 RC7 Released]]></title><description><![CDATA[<p>We’re pleased to announce the release of Ember 1.0 RC7 today! If all goes smoothly, this will be our penultimate RC before Ember 1.0.  This release includes a number of bug fixes and a few small improvements. We’ve got a few other bug fixes in the queue that weren’t quite ready but this release was overdue and we didn’t want to wait. To that end, we expect to release RC8 next week. Read on for more details on what we changed.</p>
<h3 id="importantchanges">Important Changes</h3>
<h4 id="routecontrollerfornolongerautogeneratescontrollers"><code>Route#controllerFor</code> no longer auto generates controllers</h4>
<p>In some cases, people have been relying on <code>controllerFor</code> to access controllers for routes that have not yet been entered, relying on its auto-generation ability. Unfortunately, this can actually lead to subtle bugs. When entering a route, Ember looks for a controller with a matching name. If that controller isn’t found, Ember generates one according to the type of the route’s model. If the model is an array, we generate an <code>ArrayController</code>; if it’s an object, an <code>ObjectController</code>; if neither, a standard <code>Controller</code>. In most cases, people using <code>controllerFor</code> outside of the route are not providing a model and Ember will create the basic <code>Controller</code>. If the route is later entered, the controller will not be re-created and the type of the controller may not match the provided model.</p>
<p>Due to this, we removed the auto-generation abilities of <code>controllerFor</code>. In most applications, this will not be an issue, but if you were relying on this behaviors, you will need to update your application. If you do have a controller that’s not associated with a route, you should explicitly define the controller's class instead of relying on
auto generation.</p>
<h4 id="removedoldrouter">Removed <code>old-router</code></h4>
<p>Ember’s old router was deprecated prior to the first RC and while it’s never been included in standard RC builds, some users have still been relying on it. Despite this, it’s become time to cut the ties. Increasingly, new features we are adding, especially containers, are incompatible with the old router. Because of this, we’ve removed the old router code from Ember’s repo and you are no longer able to make custom Ember builds with it. We strongly encourage everyone still using the old router to upgrade. However, if anyone is interested in maintaining an old router library independent of the main Ember repo, please let us know.</p>
<h3 id="otherchanges">Other changes</h3>
<ul>
<li><p><strong>Update Handlebars version to 1.0.0</strong> — Handlebars 1.0.0 was released almost simultaneously with RC6. Unfortunately, we hadn’t upgraded Ember to support it.</p></li>
<li><p><code>mergedProperties</code> — Similar to <code>concatenatedProperties</code> but for objects. It merges the properties of the two basic objects into a single object.</p></li>
<li><p><strong>Deprecate <code>template</code> in favor of <code>partial</code></strong> — There was a lot of overlap between these two methods. We’ve solidified around <code>partial</code> and no longer require an underscore-prefixed name.</p></li>
<li><p><strong>Update Backburner.js (Ember’s RunLoop) - fixes <code>debounce</code> adds <code>throttle</code></strong> — Previously, <code>Ember.run.debounce</code> actually performed throttling. <code>debounce</code> now actually performs a debounce and the thottling behavior has been moved to <code>Ember.run.throttle</code>.</p></li>
<li><p>Routes can now specify their controller class name with <code>controllerName</code></p></li>
<li><p>Add <code>Ember.Route#disconnectOutlet</code>, to allow for clearing a previously rendered outlet.</p></li>
<li><p>Added functionality to Router.map to allow it to be called multiple times without the map being overwritten. Allows routes to be added at runtime.</p></li>
</ul>
<p><em>UPDATE:</em> The post previously recommended the use of <code>Route#generateController</code> for cases where the controller was not associated with a route. We are now directing users to explicitly declare the controller's class instead of relying on generation.</p>]]></description><link>https://blog.emberjs.com/ember-1-0-rc7</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-rc7</guid><pubDate>Wed, 14 Aug 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 RC8 Released]]></title><description><![CDATA[<p>With Ember 1.0 RC8, we have reached the final RC before 1.0 final, which
we hope to release this weekend if all goes well.</p>
<p>This final release candidate comes with a couple of small breaking
changes that we are making before 1.0 because they should have a small
impact on application code but a large impact on performance.</p>
<p>We normally would not make changes of this nature this close to the 1.0
final release date. However, the performance improvements were so
dramatic we did not want to wait until Ember.js 2.0 to introduce the
change, and we are serious in our commitment to not breaking the API
post-1.0. This was our last chance to get these changes in before
putting the final stamp on the 1.0.</p>
<p>Both of the changes are related to observers. If you find yourself
writing code with lots of observers, you may be writing non-idiomatic
code. In general, you should only need to use observers when you are
bridging Ember code to other libraries that do not support bindings or
computed properties.</p>
<p>For example, if you were writing a component that wrapped a jQuery UI
widget, you might use an observer to watch for changes on the component
and reflect them on to the widget.</p>
<p>In your application code, however, you should be relying almost entirely
on computed properties.</p>
<p>If you are having trouble upgrading your application, please join us in
the IRC channel or post on StackOverflow for help.</p>
<h4 id="declarativeeventlisteners">Declarative Event Listeners</h4>
<p>There is now a way to declaratively add event listeners to Ember
classes. This is easier than manually setting up the listeners in
<code>init</code>.</p>
<p>Instead of:</p>
<pre><code class="javascript language-javascript">App.Person = DS.Model.extend({
  init: function() {
    this.on('didLoad', this, function() {
      this.finishedLoading();
    });
  },

  finishedLoading: function() {
    // do stuff
  }
});
</code></pre>
<p>You can just do this:</p>
<pre><code class="javascript language-javascript">App.Person = DS.Model.extend({
  finishedLoading: function() {
    // do stuff
  }.on('didLoad')
});
</code></pre>
<h4 id="arraycomputed">Array Computed</h4>
<p>Thanks to the tremendous work of David Hamilton, there is now a
convenient and robust way to build a computed property based on an array
that will only perform calculations on the updated portion.</p>
<p>For example, say that you have an array of people, and you want to
create a computed property that returns an Array of their ages.</p>
<p>Currently, the easiest way to do that is:</p>
<pre><code class="javascript language-javascript">App.Person = Ember.Object.extend({
  childAges: function() {
    return this.get('children').mapBy('age');
  }.property('children.@each.age')
});
</code></pre>
<p>This is pretty terse, but it must recalculate the entire array any time
a single element is added or removed. This works OK for small arrays,
but for larger arrays, or when these kinds of computed properties are
chained or doing expensive work, it can add up.</p>
<p>Enter Array Computed properties:</p>
<pre><code class="javascript language-javascript">App.Person = Ember.Object.extend({
  childAges: Ember.computed.mapBy('children', 'age')
});
</code></pre>
<p>You can also chain these Array computed properties together:</p>
<pre><code class="javascript language-javascript">App.Person = Ember.Object.extend({
  childAges: Ember.computed.mapBy('children', 'age'),
  maxChildAge: Ember.computed.max('childAges')
});
</code></pre>
<p>When an element is added or removed, the computation is only done once.
In this example, if a child is added, their age is appended to
<code>childAges</code>, and if that age is larger than the <code>maxChildAge</code>, that
property is updated.</p>
<p>These computed properties are always up to date, efficient, and
completely managed by Ember.</p>
<h4 id="emberextension">Ember Extension</h4>
<p>After months of testing, and tons of work by Teddy Zeenny, we're finally
ready to put the Ember Inspector in the Chrome Web Store.</p>
<p>Most recently, Teddy added support for loaded data. It already has
support for Ember Data, and Ember Model is actively working on adding
support.</p>
<p><img src="/images/blog/rc8-ember-data.png"></p>
<p>Teddy has also significantly improved the object inspector, adding
support for objects to group properties as they wish (e.g. attributes,
has many, belongs to in Ember Data) and editing records in the inspector
itself.</p>
<p><img src="/images/blog/rc8-editing.png"></p>
<p>You can also see a list of all routes in your app, along with the naming
you should use for associated objects. This should make remembering the
naming conventions a lot easier.</p>
<p><img src="/images/blog/rc8-routes.png"></p>
<p>And finally, a view tree that shows an overlay in your app with the
associated controller and model for your application's templates.</p>
<p><img src="/images/blog/rc8-view-tree.png"></p>
<p>It should be in the web store in the next day or so, so keep an eye out.
Follow @emberjs on Twitter to get the latest!</p>
<h4 id="releasecycle">Release Cycle</h4>
<p>We know that the Ember 1.0 RC cycle was a <strong>bit</strong> long. In truth, we
released RC1 too early. We're sorry if the release names caused
confusion.</p>
<p>Going forward, we plan to seriously tighten up our release process. We
will have a blog post outlining the new process together with the final
Ember 1.0 release.</p>
<h4 id="otherimprovements">Other Improvements</h4>
<ul>
<li>Several improvements to <code>yield</code> to make sure it always yields back to
the calling context [@kselden]</li>
<li>Performance improvement to range updates by not using the W3C range
API even if it's available [@eviltrout]</li>
<li>Completion of the 1.0 documentation audit [@trek]</li>
<li>Better error message if you try to use the same template name multiple
times by using <code>&lt;script&gt;</code> tags [@locks]</li>
<li>Add <code>currentRouteName</code> to <code>ApplicationController</code>, which you can use
in <code>link-to</code>, <code>transitionTo</code>, etc. [@machty]</li>
<li>Alias <code>linkTo</code> to <code>link-to</code> and <code>bindAttr</code> to <code>bind-attr</code> for
consistency with HTML naming. Old names remain but are soft-deprecated
[@ebryn]</li>
</ul>
<h4 id="changestldr">Changes TL;DR</h4>
<h5 id="observersdontfireduringconstruction">Observers Don't Fire During Construction</h5>
<p>Previously, observers would not fire for properties passed into
<code>create</code> or specified on the prototype, but they would fire if you <code>set</code>
a property in <code>init</code>.</p>
<p>Now, observers <strong>never</strong> fire until after <code>init</code>.</p>
<p>If you need an observer to fire as part of the initialization process,
you can no longer rely on the side effect of <code>set</code>. Instead, specify
that the observer should also run after <code>init</code> by using
<code>.on('init')</code>.</p>
<pre><code class="javascript language-javascript">App.Person = Ember.Object.extend({
  init: function() {
    this.set('salutation', "Mr/Ms");
  },

  salutationDidChange: function() {
    // some side effect of salutation changing
  }.observes('salutation').on('init')
});
</code></pre>
<h5 id="unconsumedcomputedpropertiesdonottriggerobservers">Unconsumed Computed Properties Do Not Trigger Observers</h5>
<p>If you never <code>get</code> a computed property, its observers will not fire even
if its dependent keys change. You can think of the value changing from
one unknown value to another.</p>
<p>This doesn't usually affect application code because computed properties
are almost always observed at the same time as they are fetched. For
example, you get the value of a computed property, put it in DOM (or
draw it with D3), and then observe it so you can update the DOM once the
property changes.</p>
<p>If you need to observe a computed property but aren't currently
retrieving it, just <code>get</code> it in your <code>init</code> method.</p>
<h5 id="newactionshashforroutescontrollersandviews">New Actions Hash for Routes, Controllers, and Views</h5>
<p>Previously, you could define actions for your routes in their <code>events</code> hash. In controllers and views however, actions were defined directly as methods on the instance. Not only was this inconsistent, it also lead to awkward naming conflicts. For instance, attempting to name your action <code>destroy</code> would conflict with the built-in <code>destroy</code> method and very bad things would happen.</p>
<p>To make things consistent and give more flexibility in action naming, we've standardized around using a hash called <code>actions</code>. When extending a class with <code>actions</code> defined, we'll merge the <code>actions</code> defined on the subclass or instance with those on the parent. We also support <code>_super</code> so you won't lose any flexibility with this approach.</p>
<p>The old behavior will continue to work for the time being but is now deprecated. In the event that you had a controller that was proxying to a model with an existing <code>actions</code> property, we internally rename the property to <code>_actions</code> to avoid any conflicts.</p>
<h5 id="enforcequotedstringsinhandlebarshelpers">Enforce Quoted Strings in Handlebars Helpers</h5>
<p>In the past, we were loose with our requirements for quoting strings in Handlebars helpers. Unfortunately, this meant we were unable to distinguish between string values and property paths. We are now strictly enforcing quoting if you want the value to be treated as a string. This means that for <code>link-to</code> the route names must be quotes. In the reverse direction, if you had custom bound helpers and were passing a property path as a quoted string, this will no longer work. Again, quotes for strings, no quotes for paths.</p>
<h4 id="settingpropertiesininit">Setting Properties in <code>init</code></h4>
<p>Currently, there is an inconsistency between properties set when passing
a hash to <code>create</code> and setting those same properties in <code>init</code>.</p>
<pre><code class="javascript language-javascript">App.Person = Ember.Object.extend({
  firstNameDidChange: function() {
    // this observer does not fire
  }.observes('firstName')
});

App.Person.create({ firstName: "Tom", lastName: "Dale" });
</code></pre>
<p>In this case, because the properties were set by passing a hash to
<code>create</code>, the observers are not fired.</p>
<p>But let's look at what happens in RC7 when the same initialization is
done via the <code>init</code> method:</p>
<pre><code class="javascript language-javascript">// WARNING: OLD BEHAVIOR

App.Person = Ember.Object.extend({
  init: function() {
    if (!this.get('firstName')) {
      this.set('firstName', "Tom");
    }
  },
  firstNameDidChange: function() {
    // this observer fires
  }.observes('firstName')
});

App.Person.create({ lastName: "Dale" });
</code></pre>
<p>In this case, the old behavior would trigger the observers if
<code>firstName</code> was not provided.</p>
<p>We intended the design of the object model to trigger observers only
after construction, which is why <code>create</code> behaves the way it does.</p>
<p>Also, because the only way to define initial properties that have arrays
or objects as values is in <code>init</code>, there is a further inconsistency:</p>
<pre><code class="javascript language-javascript">// WARNING: OLD BEHAVIOR

App.Person = Ember.Object.extend({
  // initial property value, does not trigger an initialization observer
  salutation: "Mr.",

  init: function() {
    // also initial property value, triggers an observer on
    // initialization
    this.set('children', []);
  }
});
</code></pre>
<p>In short, properties that get set during initialization, whether they
were already set on the prototype, passed as a hash to <code>create</code>, or set
in <code>init</code>, do not trigger observers.</p>
<p>If you have some code that you want to run both on initialization and
when a property changes, just mark it as a method that should also run
when initialization is done by using <code>.on('init')</code>. This will also be
more resiliant to refactoring, and not rely on a side effect of an
<code>init</code>-time <code>set</code>.</p>
<pre><code class="javascript language-javascript">App.Person = Ember.Object.extend({
  firstNameDidChange: function() {
    // some side effect that happens when first name changes
  }.observes('firstName').on('init')
});
</code></pre>
<h4 id="computedpropertyperformanceimprovements">Computed Property Performance Improvements</h4>
<p>The latest release of Ember.js contains a change to the way observers and
computed properties interact. This may be a breaking change in apps that
relied on the previous behavior.</p>
<p>To understand the change, let's first look at an example of a computed
property.  Imagine we are trying to model <a href="http://en.wikipedia.org/wiki/Schr%C3%B6dinger's_cat">Schrödinger's famous
cat</a> using an Ember.js
object.</p>
<pre><code class="javascript language-javascript">App.Cat = Ember.Object.extend({
  isDead: function() {
    return Math.rand() &gt; 0.5;
  }.property()
});

var cat = App.Cat.create();
</code></pre>
<p>Given this cat object, is it alive or is it dead? Well, that's determined at random.
Before observing the cat, we might say that it's <em>both</em> alive <em>and</em> dead, or
perhaps neither.</p>
<p>In reality, whether or not our cat has shuffled off this mortal coil is only
determined the first time we ask for it:</p>
<pre><code class="javascript language-javascript">cat.get('isDead');
// true
// …or false, half the time
</code></pre>
<p>After we have asked the cat object for its <code>isDead</code> property, we can
categorically say which it is. But before we ask, the value of the
computed property doesn't really <em>exist</em>.</p>
<p>Now, let's introduce observers into the mix. If the value of a computed
property doesn't exist yet, should observers fire if one of its
dependent keys changes?</p>
<p>In previous versions of Ember.js, the answer was "yes." For example,
given this class:</p>
<pre><code class="javascript language-javascript">App.Person = Ember.Object.extend({
  observerCount: 0,

  fullName: function() {
    return this.get('firstName') + ' ' + this.get('lastName');
  }.property('firstName', 'lastName'),

  fullNameDidChange: function() {
    this.incrementProperty('observerCount');
  }.observes('fullName')
});
</code></pre>
<p>Changing any of the dependent keys would trigger the observer:</p>
<pre><code class="javascript language-javascript">// WARNING: OLD BEHAVIOR DO NOT RELY ON THIS

var person = App.Person.create({
  firstName: "Yehuda",
  lastName: "Katz"
});

person.get('observerCount'); // =&gt; 0

person.set('firstName', "Tomhuda");
person.get('observerCount'); // =&gt; 1

person.set('lastName', "Katzdale");
person.get('observerCount'); // =&gt; 2
</code></pre>
<p>However, because the <code>fullName</code> property doesn't really "exist" until
it's requested, it is unclear if firing an observer is the correct
behavior.</p>
<p>A related problem affects computed properties if their dependent
keys contain a path. (Remember that dependent keys are just the property
names you pass to <code>.property()</code> when defining a CP.)</p>
<p>For example, imagine we are building a model to represent a blog post
that lazily loads the post's comments if they are used (in a template,
for instance).</p>
<pre><code class="javascript language-javascript">App.BlogPost = Ember.Object.extend({
  comments: function() {
    var comments = [];
    var url = '/post/' + this.get('id') + '/comments.json');

    $.getJSON(url).then(function(data) {
      data.forEach(function(comment) {
        comments.pushObject(comment);
      });
    });

    return comments;
  }.property()
});
</code></pre>
<p>Awesome! This will work as expected—a post's comments will only be loaded
over the network the first time we do <code>post.get('comments')</code> or use it
in a template:</p>
<pre><code class="handlebars language-handlebars">&lt;ul&gt;
{{#each comments}}
  &lt;li&gt;{{title}}&lt;/li&gt;
{{/each}}
&lt;/ul&gt;
</code></pre>
<p>However, now we want to add a computed property that selects the first
comment from the array of loaded comments:</p>
<pre><code class="javascript language-javascript">App.BlogPost = Ember.Object.extend({
  comments: function() {
    var comments = [];
    var url = '/post/' + this.get('id') + '/comments.json';

    $.getJSON(url).then(function(data) {
      data.forEach(function(comment) {
        comments.pushObject(comment);
      });
    });

    return comments;
  }.property(),

  firstComment: function() {
    return this.get('comments.firstObject');
  }.property('comments.firstObject')
});
</code></pre>
<p>Now we have a problem! Because the <code>firstComment</code> computed property has
a dependency on <code>comments.firstObject</code>, it will <code>get()</code> the <code>comments</code>
property in order to set up an observer on <code>firstObject</code>.</p>
<p>As you can see, just adding this computed property now means that the
comments are loaded for <em>all</em> blog posts in the app—whether their
comments are ever used or not!</p>
<p>To determine what to do, we spent some time looking at real-world
Ember.js apps. What we discovered is that <strong>this behavior carried with
it signficant performance penalties.</strong></p>
<ol>
<li>Firing observers on unmaterialized computed properties means we have
to set up listeners on all computed properties ahead of time, instead
of lazily the first time they are computed.</li>
<li>Many computed properties that never get used are nonetheless computed
because of path dependent keys.</li>
</ol>
<p>To fix these issues, <strong>RC8 makes the following changes</strong>:</p>
<ol>
<li>Observers that observe a computed property only fire after that
property has been used at least once.</li>
<li>Observing a path (<code>"foo.bar.baz"</code>), or using a path as a dependent key,
will not cause any parts of the path that are uncomputed to become
computed.</li>
</ol>
<p>The majority of Ember.js applications should not be affected by this
change, since:</p>
<ol>
<li>Most apps that observe computed properties also <code>get()</code> those
properties at object initialization time, thus triggering the correct
behavior.</li>
<li>In the case of computed property dependent keys, the new behavior is
what developers were expecting to happen all along.</li>
</ol>
<p>If your applications are affected by this change, the fix is
straightforward: just <code>get()</code> the computed property in your class's
<code>init</code> method.</p>
<p>For example, to update the observer example above, we can retain the
pre-RC8 behavior by "precomputing" the <code>fullName</code> property:</p>
<pre><code class="javascript language-javascript">App.Person = Ember.Object.extend({
  init: function() {
    this.get('fullName');
    this._super();
  },

  observerCount: 0,

  fullName: function() {
    return this.get('firstName') + ' ' + this.get('lastName');
  }.property('firstName', 'lastName'),

  fullNameDidChange: function() {
    this.incrementProperty('observerCount');
  }.observes('fullName')
});
</code></pre>
<h4 id="linktoboundparameters"><code>link-to</code> Bound Parameters</h4>
<p>The <code>link-to</code> helper (formerly <code>linkTo</code>, see above) now treats
all unquoted parameters (and non-numeric parameters)
as bound property paths, which means that when a property passed to
<code>link-to</code> changes, the <code>href</code> of the link will change. This includes
the first parameter (the destination route name) and any of the context
parameters that follow.</p>
<p>The following example template will look up the <code>destinationRoute</code> on the
current context (usually a controller) and use it to determine the
<code>href</code> of the link and the route that will be transitioned to when
the link is clicked.</p>
<pre><code class="handlebars language-handlebars">{{#link-to destinationRoute}}Link Text{{/link-to}}
</code></pre>
<p>The following example template will always point to the <code>articles.show</code>
route (since the route name parameter is in quotes), but when the value
of <code>article</code> changes, the link's <code>href</code> will update to the URL that
corresponds to the new value of <code>article</code>.</p>
<pre><code class="handlebars language-handlebars">{{#link-to 'articles.show' article}}Read More...{{/link-to}}
</code></pre>
<p>This might cause a few surprises in your app if you haven't been
distinguishing between quoted strings and property paths, so make sure
that any static string <code>link-to</code> parameters (such as route names) are
properly quoted in your templates when you upgrade to RC8.</p>
<h4 id="boundhelpersquotedstringsnumbersandpaths">Bound Helpers: Quoted Strings, Numbers, and Paths</h4>
<p>Invoking a custom bound helper (e.g. one defined via <code>Ember.Handlebars.helper</code>)
with quoted strings or raw numbers will pass that raw value directly
into the helper function you've defined, rather than treating everything
like a bound property path that will re-render the helper when changed.</p>
<pre><code class="handlebars language-handlebars">Pass the string 'hello' to myHelper:
{{myHelper 'hello'}}

Pass the property pointed-to by the path 'hello' to myHelper:
{{myHelper hello}}
</code></pre>
<p>This might cause a few surprises in your app if you've been invoking
bound helpers with quoted strings and expecting them to be treated as
bound property paths, so make sure that the only time you're passing
quoted strings to custom helpers is when you really intend to pass raw
strings (rather than the values of properties) to the helper.</p>]]></description><link>https://blog.emberjs.com/ember-1-0-rc8</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-rc8</guid><pubDate>Thu, 29 Aug 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.0 Released]]></title><description><![CDATA[<p>Today, we're excited to announce the final release of Ember.js 1.0.</p>
<p>The first commit to the repository that would become Ember.js happened on April
30th, 2011, almost two and a half years ago.</p>
<p>At the time, Backbone.js was rocketing to popularity. In response to large
JavaScript frameworks like SproutCore, Cappuccino, and Dojo, which tried to
abstract away HTML, most web developers began rejecting any solution whose
source code they couldn't read over in an afternoon. The "microlibrary" frenzy
had hit full tilt.</p>
<p>However, we knew that as web browsers became more and more powerful, these
simplistic abstractions wouldn't scale up to the kind of apps that users would
begin to demand.</p>
<p>We realized that helping developers grapple with the complexity of building
100% JavaScript web applications could only happen if we embraced the tools
that they were most comfortable with: HTML and CSS.</p>
<p>Based on the current popularity of frameworks like Ember, Angular and Knockout,
it's clear that this strategy turned out to be the right one.</p>
<p>As we began work on Ember.js, however, we soon realized that there was a
fundamental problem. Just having templates that were bound to models was
not enough. We also needed to help developers decide <em>which</em> templates and
models to display at any given time.</p>
<p>While struggling to figure out the best solution, we couldn't help but notice
that many JavaScript applications on the web felt broken. Basic things that
we had taken for granted for two decades all of a sudden stopped working.
Just clicking the browser's back button was enough to break many of these apps.</p>
<p>We realized that the solution to our problem had been sitting under our noses
all along: the URL is what web applications use to decide what to display!</p>
<p>We knew that we had to go back to the drawing board. We rebooted the entire
project mid-course to refocus on how to build JavaScript apps that not only
helped you architect large, multi-page applications, but helped you to do so
without breaking the basic building blocks of the web.</p>
<p>Over time, we've added even more features, like components, that help bring
solid UI architecture to the web. We are incredibly proud of the job that
the community has done to lay a solid foundation that we can build upon for the
years to come.</p>
<p>This 1.0 release is a promise from us: the pain that many experienced while we
were figuring out how to build a JavaScript framework for the future of the web
is now over. In keeping with the Semantic Versioning spec, there will be no
more intentional breaking changes until we release Ember 2.0, which we don't
anticipate happening for some time.</p>
<h2 id="recentdevelopments">Recent Developments</h2>
<h3 id="routerfacelift">Router Facelift</h3>
<p>Over the past few months, Alex Matchneer has taken the Ember router to the next
level. Alex's changes focus on making the router an excellent tool for managing
complex asynchronous flows (like authentication), and you can learn all about it
in his recently completed guides:</p>
<ul>
<li><a href="/guides/routing/asynchronous-routing/">Asynchronous Routing</a></li>
<li><a href="/guides/routing/preventing-and-retrying-transitions/">Preventing and Retrying Transitions</a></li>
</ul>
<h3 id="preparationformodules">Preparation for Modules</h3>
<p>In the years since we started Ember, the JavaScript module ecosystem has become
increasingly mature.</p>
<p>Today, tools like <a href="http://requirejs.org/">require.js</a> and module systems like <a href="https://github.com/amdjs/amdjs-api/wiki/AMD">AMD</a>, <a href="http://nodejs.org/api/modules.html">Node</a>,
and <a href="https://github.com/square/es6-module-transpiler">ES6 Modules</a> continue to gain traction. Increasingly, people are using
named modules and module loaders rather than storing their code in globals.</p>
<p>To prepare for this future, all of the code lookup and naming conventions in
Ember.js now go through a single <code>Resolver</code>. The default <code>Resolver</code> still looks
for code under global namespaces, but <a href="https://github.com/stefanpenner/ember-app-kit/blob/master/vendor/loader.js#L41-L136">Ember App Kit</a> already provides an
alternative resolver that looks for code in AMD modules.</p>
<p>In the near future, we plan to roll in first-class support for modules into the
framework, based on the experiences of users of the increasingly popular Ember
App Kit.</p>
<h3 id="embertesting">Ember Testing</h3>
<p>The Ember community has always been passionate about testing. Even at the earliest
meetups, testing was one of the most frequently asked-about topics, and testing
featured prominently in our thinking as we built out the new router.</p>
<p>As we got closer to Ember 1.0, we realized that we needed to provide an official
set of testing-framework agnostic testing helpers. The Ember Testing
package is the start of a longer-term focus on testing facilities that we plan
to improve even more in the 1.x timeframe.</p>
<p>You can see some of our thoughts for future improvements on the <a href="http://discuss.emberjs.com/t/ember-testing-improvements/1652">Ember
Discussion Forum</a>.</p>
<h3 id="emberinspectorforchrome">Ember Inspector for Chrome</h3>
<p>Teddy Zeenny's relentless work on the Ember Inspector has been some of the most
awe-inspiring work we've seen in open source.</p>
<p>The <a href="https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi">Ember Inspector</a> that ships with Ember 1.0 makes it easy to see how an
Ember application is laid out, and presents all of the naming conventions in an easy-to-read table.
If you're using Ember Data, it also lets you see all of the records that your application has loaded at
a glance.</p>
<p>Coming up next is asynchronous debugging to help make sense of some of the more
quirky behavior of Promises.</p>
<p><img src="https://lh6.googleusercontent.com/TGLbr4UoyLqBNvZACqghquEMo5bVWWrlA8f_UkCf4F5etIcqNM0HcBLVRRCQHHLWwBilJbznxrk=s1280-h800-e365-rw"></p>
<h3 id="performanceperformanceperformance">Performance, Performance, Performance</h3>
<p>A number of community members, especially Kris Selden, Erik Bryn and Robin Ward
have done heroic work lately on performance.</p>
<p>Over the years, Ember's internals have been significantly sped up time and
time again, and we will continue to hone the performance of Ember going forward.</p>
<p>In the 1.x timeframe, we have a number of ideas that should significantly
improve rendering performance and decrease the amount of GC during rendering,
so keep an eye out!</p>
<h3 id="docsdocsdocs">Docs, Docs, Docs</h3>
<p>The early lack of good documentation for Ember seriously pained us, as we're all
big believers in the idea that user confusion should be considered a bug in the
framework.</p>
<p>Over the past year, we've significantly improved both the <a href="/api">API documentation</a>
and the <a href="/guides">Guides</a>. Trek Glowacki has led up the effort, which has resulted in
comprehensive coverage of how to use Ember, an excellent, up-to-date Getting
Started Guide, and most recently, a Cookbook section for common scenarios.</p>
<p>For Ember 1.0, Trek led a documentation audit of all of the API documentation in
the entire codebase, which led to 1,700 new lines of documentation, and an
across-the-board freshening for new idioms and best practices.</p>
<h3 id="emberdata10beta1">Ember Data 1.0 Beta 1</h3>
<p>With the release of Ember 1.0, we're glad to also release the first beta of
Ember Data 1.0.</p>
<p>Ember Data 1.0 is a reboot of our data layer. The focus of the effort (codenamed
<code>jj-abrams</code>, famous for franchise reboots) was:</p>
<ul>
<li>A more flexible codebase, able to handle streaming, custom JSON, and edits
while saving with ease. If you've found Ember Data too inflexible for your
backend in the past, try it again!</li>
<li>Asynchronous operations are now all backed by promises. This will integrate
better with Ember's own asynchronous handling, and make it easier to combine
and pipeline asynchronous operations like <code>find</code> and <code>save</code>.</li>
<li>Better support for modules. Ember.js itself now has good support for modules,
through Ember App Kit's drop-in resolver, but Ember Data's reliance on global
lookups (through <code>App.Post.find</code>, etc.) made Ember Data hard to use with
modules. The Ember Data 1.0 API is much more friendly to modules, and
therefore the future of Ember.js and the web platform.</li>
<li>Much better documentation of Ember Data's APIs, including the adapter and
serializer APIs. Flexible APIs are no good if it's impossible to learn about
them.</li>
</ul>
<p>If you're a current user of Ember Data, you may want to check out the
<a href="https://github.com/emberjs/data/blob/master/TRANSITION.md">Transition Guide</a>. If you have issues upgrading that aren't covered in the
guide, please let us know right away so we can improve it.</p>
<p>Note: If you aren't ready to upgrade just yet, we've released Ember Data 0.14,
which includes a number of useful performance optimization for Ember Data 0.13
but no breaking changes.</p>
<h2 id="community">Community</h2>
<p>The Ember community is amazing.</p>
<blockquote class="twitter-tweet"><p>I love the Ember community</p>&mdash; Yehuda Katz (@wycats) <a href="https://twitter.com/wycats/statuses/372760498187427841">August 28, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>In addition to the insane amount of work that members of the Ember community
have been doing to prepare the Ember 1.0 release, the community has also been
churning out a number of awesome Ember-related projects.</p>
<ul>
<li><a href="https://github.com/stefanpenner/ember-app-kit">Ember App Kit</a>: An effort by a number of members of the Ember community
to work on tooling for Ember that will eventually become the core of official
Ember tools.</li>
<li><a href="https://github.com/rpflorence/ember-tools">Ember Tools</a>: Similar work by Ryan Florence, which will be merged into Ember
App Kit as we begin to bring tooling into core.</li>
<li><a href="http://ember-addons.github.io/bootstrap-for-ember/dist/">Bootstrap for Ember</a>: Twitter Bootstrap wrapped in Ember components!</li>
<li><a href="https://github.com/billysbilling/ember-animated-outlet">Ember Animated Outlet</a>: Support for animated <code>{{outlet}}</code>s and
<code>{{link-to}}</code> on top of the current Ember by Sebastian Seilund of Billy's
Billings.</li>
<li><a href="http://adminjs.com/">Admin.js</a>: An awesome, flexible and configurable admin for your site
written in Ember by Gordon Hempton. You can use it with an Ember app or just
to provide an admin interface for your Rails, Django, PHP, or whatever app!</li>
<li><a href="http://emberhotseat.com/">The Ember Hot Seat</a>: A regular podcast brought to you by DeVaris Brown.
It regularly features members of the Ember Core Team and prominent members of
the Ember community.</li>
<li><a href="https://twitter.com/EmberWatch">EmberWatch</a>: Philip Poot's EmberWatch Twitter account and website will
keep you up-to-date on the latest projects and news.</li>
<li><a href="http://emberweekly.com/">Ember Weekly</a>: Ember Weekly, curated by the inimitable Owain
Williams, packs all the Ember news that's fit to print into your inbox
every week.</li>
<li>And way more projects. Keep an eye out on this blog, or follow us on the
official @emberjs Twitter account. We plan to feature more projects like these
in the future.</li>
</ul>
<p>We've also been grateful to be the beneficiary of large amounts of support from
a number of companies over the years.</p>
<ul>
<li>LivingSocial, which funded much of the original work on Ember Data.</li>
<li>Yapp, whose employees have been working on Ember (and SproutCore before
Ember) for years, and which has dedicated countless hours to making Ember
better.</li>
<li>Zendesk, an early user and contributor to Ember. Thank you for betting on
Ember as early as you did.</li>
<li>McGraw-Hill Education Labs, which has been funding Ember work for over a year,
with great patience, resolve and vision.</li>
<li>Tilde, which employs Tom, Yehuda, Peter and Leah, and which handles much of
the (unseen) administrative work of the project.</li>
<li>Billy's Billings, which has given Sebastian Selund time to work on Ember, and
hosted the work on <code>ember-animated-outlet</code>, which will make its way into a
future version of Ember.</li>
</ul>
<p>Finally, a number of large open source projects have bet on Ember. These
projects contribute significantly to Ember's development, and also give Ember
users a place to look at large, real-world projects.</p>
<ul>
<li><a href="https://travis-ci.org/">Travis CI</a>: A very early Ember adopter. The Ember project makes heavy use of
Travis, so thank you!</li>
<li><a href="http://www.discourse.org/">Discourse</a>: The increasingly popular forum engine that now powers
TalkingPointsMemo and BoingBoing. These folks have contributed heavily to Ember
and its community.</li>
<li>Balanced: Balanced is an <a href="https://github.com/balanced">open-source</a>, <strong>open company</strong>. They use Ember
for their <a href="https://github.com/balanced/balanced-dashboard">dashboard</a>.</li>
</ul>
<h2 id="undefinedsemantics">Undefined Semantics</h2>
<p>There are two areas of Ember.js that have semantics that may accidentally work
in some cases today, but are the source of a number of bugs, and which we don't
plan to support in the future.</p>
<h3 id="observertiming">Observer Timing</h3>
<p>At present, Ember observers sometimes fire synchronously, but sometimes fire
asynchronously. The only thing your code should rely on is that the observer
will fire <strong>after</strong> the property it observes has changed.</p>
<p>We plan to bring all observers into alignment with <a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe">Object.observe</a>, a
future JavaScript feature. In the future, observers will <strong>never</strong> fire
synchronously. If you rely on specific timing, your code may break.</p>
<h3 id="observingpropertiesofframeworkobjects">Observing Properties of Framework Objects</h3>
<p>In general, you should not observe properties of framework objects defined by
the framework that are not explicitly documented as observable. Some of these
observations may happen to work today, but may not work in the future.</p>
<p>For example, you should not observe the <code>element</code> property on an Ember view or
component. Instead, you should use the <code>didInsertElement</code> hook.</p>
<p>If you find yourself observing a framework-defined property that is not
documented as observable to work around an issue, <strong>please</strong> file an issue with
us so we can give you a publicly defined API.</p>
<h2 id="thefuture">The Future</h2>
<p>Despite our commitment to stability, we are not resting on our laurels. We have
an aggressive pipeline of new features planned, which we'll be announcing soon.</p>
<p>We're also switching our releases to follow a more Chrome-like model. This means
that you can expect a new release every six weeks. We'll have more details about
this soon.</p>
<h2 id="thanks">Thanks</h2>
<p>Special thanks to a number of community members who have done heroic work
leading up to Ember 1.0:</p>
<ul>
<li>Eric Berry, for the new Cookbook section in the guides and examples</li>
<li>Paul Chavard, for help reviewing Ember Data 1.0 Beta 1</li>
<li>Domenic Denicola, for putting us on the right path with promises</li>
<li>Dan Gebhardt, for website infrastructure</li>
<li>David Hamilton, for the Array Computed feature</li>
<li>Robert Jackson, for the new emberjs.com/builds</li>
<li>Julien Knebel, for design work</li>
<li>Alex Matchneer, for the async router guide</li>
<li>Luke Melia, for <code>actions</code> namespacing, last minute bugfix work, and the Ember NYC community</li>
<li>Alex Navasardyan, for inline examples on the homepage and design work</li>
<li>Stanley Stuart, for testing infrastructure</li>
<li>Igor Terzic, for help reviewing Ember Data 1.0 Beta 1</li>
<li>Teddy Zeenny, for the Ember Inspector</li>
<li>The 300 people who submitted code and documentation to Ember 1.0</li>
<li>The 131 people who submitted code and documentation to Ember Data 1.0 Beta 1</li>
<li>The 269 people who helped with <a href="http://emberjs.com">emberjs.com</a></li>
</ul>
<p>Go forth and build great things!</p>]]></description><link>https://blog.emberjs.com/ember-1-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-0-released</guid><pubDate>Sat, 31 Aug 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.1.1 and 1.2 Beta Released]]></title><description><![CDATA[<p>Hot off the heels of our 1.0 release, we've got two new bundles of
goodness for you to try out today.</p>
<p>First up is Ember.js 1.1.1, the inaugural stable release after our
<a href="/blog/2013/09/06/new-ember-release-process.html">switch to a Chrome-like six week release
cycle</a>.</p>
<p>Because this is the kickoff release of the new process, there are very
few new features and the delta between 1.0 and 1.1.1 is very small. This
release is composed primarily of bug fixes and performance improvements,
so we recommend you upgrade right away.</p>
<p>For a list of exactly what's new, see the <a href="https://github.com/emberjs/ember.js/blob/v1.1.1/CHANGELOG">CHANGELOG</a>.</p>
<p>(If you're wondering why 1.1.1 and not 1.1, there was <a href="https://github.com/emberjs/ember.js/issues/3596">a regression
introduced in Ember.Object.create() that could break 1.0-compatible
apps</a> that we didn't
notice until after we'd tagged the 1.1 release.)</p>
<p>To coincide with the stable release, we've also got a new beta release
of Ember 1.2. Beta releases are intended to get more eyeballs on new
features that look ready to go, but may have bugs or edge cases that we
haven't yet sussed out.</p>
<p>The only changes between a beta release and the stable version should be
bug fixes and removing features that originally looked ready but didn't
end up making the cut.</p>
<p>For a full list of the new features in Ember 1.2 beta, see the <a href="https://github.com/emberjs/ember.js/blob/v1.2.0-beta.1/CHANGELOG">CHANGELOG</a>.</p>
<p>As always, Ember 1.1 and 1.2 beta are available at
<a href="/builds">emberjs.com/builds</a>. If you're feeling particularly
adventurous, you can also grab a Canary build to see what we're in the
middle of working on, though do note that all new APIs in Canary are
subject to change. To see what features are available to be enabled, see
<a href="https://github.com/emberjs/ember.js/blob/master/FEATURES.md">FEATURES.md</a>.</p>
<!-- alex ignore easy -->
<p>We're excited about kicking off the new release process because we think
that it will allow us to deliver a higher-quality product more
frequently. We also believe that using feature flags in our Canary
builds will allow us to more easily experiment with new APIs, which
translates to more features faster.</p>
<p>As always, if you find bugs or need help, please <a href="https://github.com/emberjs/ember.js/issues">file an issue on
GitHub</a>.</p>
<p>Lastly, my sincere thanks to everyone who has contributed features, bug
reports and bug fixes to this release.</p>
<p>In particular, I'd like to call out <a href="https://twitter.com/rwjblue">Robert Jackson
(@rwjblue)</a> and <a href="https://twitter.com/thomasABoyt">Thomas Boyt
(@thomasABoyt)</a> for their superheroic
efforts on the infrastructure required to make this type of release
process work smoothly.</p>
<p>Early on, Yehuda and I made a bet that investing in making Ember.js a
community project would pay dividends. We've sometimes questioned that
decision when going up against better-funded competitors, but this
release, I think, vindicates our decision.</p>
<p>This is <a href="https://github.com/emberjs/ember.js/pulse/monthly">a truly community-driven release</a>, and both Yehuda and I were
hands-off through most of it. I am deeply grateful to everyone who
sacrificed hours of their nights and weekends to help us build something
that matters.</p>
<p>If you'd like to be a part of it, we have a welcoming and helpful
community, and we'd love to have you join. Come see us in #emberjs on
Freenode to ask questions and get involved.</p>
<p>Enjoy the new releases, and go forth and build great things!</p>]]></description><link>https://blog.emberjs.com/ember-1-1-1-and-ember-1-2-0-beta-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-1-1-and-ember-1-2-0-beta-released</guid><pubDate>Thu, 24 Oct 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.1.2 Released]]></title><description><![CDATA[<p>Unfortunately, there was a second regression in 1.1 that didn't get
caught in time to make it into 1.1.1. On that account 1.1.2 is out now
to correct that issue. For more information about the problem see
<a href="https://github.com/emberjs/ember.js/issues/3637">Issue #3637</a>.</p>
<p>We recommend that everyone using 1.1.0 and 1.1.1 upgrade at their
nearest convenience. Head on over to <a href="/builds">emberjs.com/builds</a>
to download. Our apologies for the inconvenience.</p>
<h3 id="ember12beta2">Ember 1.2 Beta 2</h3>
<p>While we were at it, we also released the second 1.2 beta which includes
a couple of bug fixes. 1.2.0-beta.2 is also available at
<a href="/builds">emberjs.com/builds</a>.</p>]]></description><link>https://blog.emberjs.com/ember-1-1-2-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-1-2-released</guid><pubDate>Fri, 25 Oct 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 1.10.0 and 1.11 Beta Released]]></title><description><![CDATA[<p>We are pleased to announce the release of both Ember.js 1.10.0 and the
first beta in the 1.11 series. This comes as the tenth cycle of our
release process that began after 1.0 was released.</p>
<p>The 1.10 release represents the effort of at least 50 contributors
across over 553 commits.</p>
<h2 id="thehtmlbarstemplatingengine">The HTMLBars Templating Engine</h2>
<p>Throughout 2014 the Ember.js community has poured its shared effort into
a new templating solution. This new library, dubbed HTMLBars, makes available
features and performance improvements impossible to support with Handlebars
(the previous library). We are delighted to announce the inclusion of
the HTMLBars templating engine in Ember.js 1.10.</p>
<p>HTMLBars will enable the implementation of several APIs described in
<a href="https://github.com/emberjs/rfcs/pull/15">The Road to Ember 2.0</a>, and contributes
to our continued improvement of rendering performance. Additionally,
it will allow us to continue supporting all Ember 1.x template syntax.</p>
<p>This long-term effort would not have succeeded without the continued
contributions of the Ember community and core team. In no particular
order and with apologies to anyone we've missed we would like to thank
<a href="http://twitter.com/krisselden">@krisselden</a>, <a href="http://twitter.com/wycats">@wycats</a>,
<a href="http://twitter.com/_mmun">@_mmun</a>, <a href="http://twitter.com/nerd20">@nerd20</a>,
<a href="http://twitter.com/mixonic">@mixonic</a>, <a href="http://twitter.com/ebryn">@ebryn</a>,
<a href="https://twitter.com/salzhrani">@salzhrani</a>, <a href="http://twitter.com/rwjblue">@rwjblue</a>,
<a href="http://twitter.com/tomdale">@tomdale</a>, <a href="http://github.com/oneeman">oneeman</a>,
<a href="http://twitter.com/kpdecker">@kpdecker</a> and the many alpha and beta
testers who provided feedback and bug reports. You are the stuff "stability without
stagnation" is made of.</p>
<h2 id="newfeaturesinemberjs110">New Features in Ember.js 1.10</h2>
<h3 id="htmlbars085">HTMLBars 0.8.5</h3>
<p>Ember.js 1.10 is dependent on HTMLBars 0.8.5. To ease this and later template
library version changes, Ember's template compiler will be packaged as a
part of the release files. For example, a JSBin in Ember 1.9 would need to be
updated from:</p>
<pre><code class="html language-html">&lt;script src="http://builds.handlebarsjs.com.s3.amazonaws.com/handlebars-v2.0.0.js"&gt;&lt;/script&gt;
&lt;script src="http://builds.emberjs.com/tags/v1.9.1/ember.js"&gt;&lt;/script&gt;
</code></pre>
<p>to</p>
<pre><code class="html language-html">&lt;script src="http://builds.emberjs.com/tags/v1.10.0/ember-template-compiler.js"&gt;&lt;/script&gt;
&lt;script src="http://builds.emberjs.com/tags/v1.10.0/ember.debug.js"&gt;&lt;/script&gt;
</code></pre>
<p>The <code>ember-template-compiler.js</code> is only required for template compilation. The
runtime dependencies for HTMLBars are built into the framework file.</p>
<p>To smoothly upgrade to 1.10 and HTMLBars, Ember-CLI users should update to a
version at or after 0.1.12, remove
their application's Handlebars dependency, and modify the Brocfile to not load Handlebars.
<a href="https://github.com/rwjblue/components-in-subdirs/commit/78e7ed2d072f42d9cf0fd3d9fc2376f106ab762e">This diff</a>
shows the changes needed to upgrade an Ember-CLI app to 1.10.</p>
<p>Ember App-Kit users should upgrade to Ember-CLI.</p>
<p>Ember-Rails users should upgrade to version 0.16.1, then remove their Handlebars
dependency.</p>
<p>Developers of applications that follow a non-standard build pipeline should
review the instructions <a href="/blog/2015/02/05/compiling-templates-in-1-10-0.html">published by Robert Jackson this week</a>
and join the conversation at <a href="http://discuss.emberjs.com/">discuss.emberjs.com</a>
or on IRC.</p>
<h3 id="performanceimprovements">Performance Improvements</h3>
<p>Ember.js 1.8 introduced a performance regression that we expected to re-coup in
the 1.10 release. In December the team at <a href="http://www.discourse.org/">Discourse</a> created the
<a href="https://github.com/eviltrout/ember-performance">ember-performance</a> repo.
This project aids Ember developers in profiling and measuring performance in the
framework.</p>
<p>Using these benchmarks, we're pleased to report a twelve percent improvement
in common rendering scenarios between 1.7 and 1.10, and as much as a fifty
percent improvement between 1.9 and 1.10.</p>
<p>Better rendering and general framework performance continue to be a priority for
the core team and community. Specific goals include reactive rendering for
HTMLBars, more optimized metal views, limiting observation, and refinements to the Ember
object model.</p>
<h3 id="chainedelseblocks">Chained Else Blocks</h3>
<p>HTMLBars is built using the Handlebars parser, and will continue to gain
features related to template syntax. Ember 1.10 features support for chained
else helpers, the most common use being <code>else if</code>. An example:</p>
<pre><code class="handlebars language-handlebars">{{#if isAtWork}}
  Ship that code!
{{else if isReading}}
  You can finish War and Peace eventually...
{{/if}}
</code></pre>
<p>Chained else helpers work with any <code>else</code>, including those of <code>with</code> and <code>each</code>
helpers.</p>
<p>You can read more about the implemetation <a href="https://github.com/wycats/handlebars.js/pull/892">in the Handlebars repo</a>.
Thanks to <a href="http://twitter.com/kpdecker">@kpdecker</a> for this improvement.</p>
<h3 id="blockparams">Block Params</h3>
<p>Ember 1.10 introduces block parameters. Block params provide consistent
scope to templates, and allow components to pass internal values to a downstream
scope.</p>
<p>For example:</p>
<pre><code class="handlebars language-handlebars">{{currentUser.name}} {{! available on the controller }}
{{#each cars as |car|}}
  {{#with car.manufacturer as |make|}}
    {{make.name}}
    {{currentUser.name}} {{! still the controller scope }}
  {{/with}}
{{/each}}
</code></pre>
<p>Preserving template context results in easier to read templates, and passing
variables into child scopes allows for new patterns of component composition.</p>
<p>Block params are passed from a template via the <code>yield</code> helper. For example, this
component yields the <code>fullName</code> and <code>age</code> values:</p>
<pre><code class="javascript language-javascript">// app/components/x-customer.js
export default Ember.Component.extend({
  fullName: function(){
    var customer = this.get('customer');
    return [customer.get('firstName'), customer.get('lastName')].join(' ');
  }.property('customer.firstName', 'customer.lastName'),

  age: function(){
    return (new Date() - this.get('birthday')) / (86400000 * 365);
  }.property('birthday')
});
</code></pre>
<pre><code class="handlebars language-handlebars">{{!-- app/components/x-customer.hbs --}}
&lt;div class="customer"&gt;
  {{yield fullName age}}
&lt;/div&gt;
</code></pre>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/index.hbs --}}
&lt;div class="layout"&gt;
  {{#x-customer customer=model birthday=model.birthday as |fullName age|}}
    Hello, {{fullName}}. You are {{age}} years old.
  {{/x-customer}}
&lt;/div&gt;
</code></pre>
<p>Many thanks to <a href="https://twitter.com/_mmun">@_mmun</a> for the implementation of this new feature.</p>
<h3 id="injectedproperties">Injected Properties</h3>
<p>Ember 1.x has exposed two APIs for managing dependency injection. The first is
the application initializer API, using <code>register</code> and <code>inject</code> methods on an
application instance. The second allows configuration of an injection on
controllers via <code>needs</code>. You can read more about these patterns in
<a href="/guides/understanding-ember/dependency-injection-and-service-lookup/">the dependency injection guide</a>.</p>
<p>The new injected properties offer a more declarative API for dependency injection.</p>
<p>Use <code>Ember.inject.service()</code> to inject a service with the same name as the property
it is injected as. In this example, the <code>storage</code> service is injected onto the
<code>storage</code> property:</p>
<pre><code class="javascript language-javascript">export default Ember.Component.extend({
  storage: Ember.inject.service()
});
</code></pre>
<p>Passing a name to the <code>service()</code> method allows a different service to be injected.
For example:</p>
<pre><code class="javascript language-javascript">export default Ember.Component.extend({
  storage: Ember.inject.service('local-storage')
});
</code></pre>
<p>In addition to injecting services, controllers can be injected with <code>Ember.inject.controller</code>.</p>
<p>Importantly, these injections are lazy. When used within a unit test, a stubbed service can
be passed during <code>create</code>. For example:</p>
<pre><code class="javascript language-javascript">test("a value is saved on storage", function(){
  expect(1);
  var component = this.subject({
    storage: {
      write: function(){
        ok(true, 'value was written');
      }
    }
  });

  var element = this.append();
  element.click();
});
</code></pre>
<p>Refer to the <a href="/api/#method_inject_service">API documentation</a> to read about this new feature in
detail.</p>
<p>Thanks to <a href="https://github.com/slindberg">slindberg</a> for his implementation of this feature.</p>
<h3 id="notabledeprecations">Notable Deprecations</h3>
<p>As Ember.js moves forward, various APIs are deprecated to allow for their
removal in a later major release (such as 2.0). The
<a href="/deprecations/">deprecations page</a> summarizes
deprecations and demonstrates how to update to a new API.</p>
<ul>
<li>The explicit <code>{{bind}}</code> helper has been deprecated. This helper has
long been marked private, and was a legacy Sproutcore
feature. This helper will be removed in Ember 1.11.</li>
<li>Quote-less outlet names are deprecated in 1.10. An example of this is
<code>{{outlet modal}}</code>, which should be re-written as <code>{{outlet "modal"}}</code>.
This ensures the outlet helper is consistent with others, where unquoted
words are values and not string literals.</li>
<li>The <code>beforeObserver</code> feature is deprecated in Ember 1.10. Before observers
are rarely used, but introduce significant overhead to the observer system
in general. For observer use that requires the previous value of a property
be known, implementing a cache is easier and more efficient. Read more about
how to do this on <a href="/deprecations/v1.x#toc_deprecate-beforeobservers">the deprecations page</a>.</li>
<li>Observing the <code>childViews</code> array of a <code>ContainerView</code> is deprecated.</li>
<li>Setting the <code>childViews</code> property on a view definition is deprecated in
1.10. For example:</li>
</ul>
<pre><code class="javascript language-javascript">var ChildB = Ember.View.extend();

export default Ember.ContainerView.extend({
  childViews: [ 'childA', ChildB ],
  childA: Ember.View.extend()
});
</code></pre>
<p>This use of <code>childViews</code> is inconsistent with other uses throughout Ember, and
as a result is difficult to implement with good performance. Explicitly creating
views upon initialization is preferred:</p>
<pre><code class="javascript language-javascript">var ChildB = Ember.View.extend();

export default Ember.ContainerView.extend({
  init: function(){
    this._super();
    this.pushObject(this.createChildView(this.childA));
    this.pushObject(this.createChildView(ChildB));
  },
  childA: Ember.View.extend()
});
</code></pre>
<h2 id="newfeaturesinemberjs111beta">New Features in Ember.js 1.11 beta</h2>
<p>Ember.js 1.11 beta continues a series of releases iterating the framework
toward our 2.0 goals. In six weeks, these and a few other features will
be declared stable.</p>
<h3 id="inlineif">Inline if</h3>
<p>In 1.11 Ember's <code>if</code> helper can be used in the inline form:</p>
<pre><code class="handlebars language-handlebars">{{if isEnabled 'active' 'disabled'}}
</code></pre>
<p>Thanks to <a href="https://twitter.com/marciojunior_me">@marciojunior_me</a> for
implementing this feature.</p>
<h3 id="eachwithindex">Each with Index</h3>
<p>The <code>each</code> helper will support an <code>index</code> block param in Ember 1.11:</p>
<pre><code class="handlebars language-handlebars">{{#each people as |person index|}}
  {{! The first index value will be 0 }}
  &lt;div&gt;{{index}}: {{person.name}}&lt;/div&gt;
{{/each}}
</code></pre>
<p>Thanks to <a href="https://twitter.com/_mmun">@_mmun</a> for
implementing this feature.</p>
<h3 id="boundattributesyntax">Bound Attribute Syntax</h3>
<p>Current Ember developers are familiar with the <code>bind-attr</code> syntax, used
to declare an attribute binding on an HTML element. An original
motivation for HTMLBars was to improve on this syntax.</p>
<p>Ember 1.11 introduces a more intuitive API for attribute binding. For
example, here the <code>color</code> variable is bound to the class of a div:</p>
<pre><code class="handlebars language-handlebars">&lt;div class="{{color}}"&gt;&lt;/div&gt;
</code></pre>
<p>The inline if helper can also be used in these contexts:</p>
<pre><code class="handlebars language-handlebars">&lt;div class="{{color}} {{if isEnabled 'active' 'disabled'}}"&gt;&lt;/div&gt;
</code></pre>
<p>For some attributes, like the <code>disabled</code> boolean, passing a literal value
is desirable. An example:</p>
<pre><code class="handlebars language-handlebars">&lt;input disabled={{isDisabled}}&gt;
</code></pre>
<p>To allow the data-binding of non-string values to boolean properties and
custom element properties, bound attributes are implemented with a
<strong>property-first</strong> setter.</p>
<p>When binding to an attribute, Ember first checks to see if that attribute is a
property of the element's DOM node (with normalization of capitalization). If it
is, the value is set with a property. For example:</p>
<pre><code class="handlebars language-handlebars">&lt;input disabled={{isDisabled}}&gt;
</code></pre>
<pre><code class="javascript language-javascript">// disabled is a property of input elements, so...
input.disabled = true;
</code></pre>
<p>If the attribute is not present as a property, then its value is set as an
attribute:</p>
<pre><code class="handlebars language-handlebars">&lt;div class={{color}}&gt;
</code></pre>
<pre><code class="javascript language-javascript">// class is not a property of div elements, do...
div.setAttribute('class', 'red');
</code></pre>
<p>For SVG attributes and the style attribute, we've made a exceptions to this pattern.
Despite these exceptions, the property-first rule is a good way to describe what is
happening behind the scenes. In practice, the binding syntax feels natural.</p>
<p>Many thanks to <a href="http://twitter.com/mixonic">@mixonic</a>, <a href="http://twitter.com/_mmun">@_mmun</a>,
and <a href="http://twitter.com/wycats">@wycats</a> for their effort on the design and implementation
of this feature.</p>
<h3 id="namedsubstates">Named Substates</h3>
<p>Two routing substates exist for Ember routes. The <code>loading</code> substate will be entered
if the async hooks of a route are still processing, and the <code>error</code> substate will be
entered when an async hook promise is rejected.</p>
<p>Substates are sibling routes. When the <code>new</code> route of <code>cars.new</code> is loading, the <code>cars.loading</code>
substate is entered. The <code>application</code> route has no parent namespace to nest its siblings.
This makes using the <code>loading</code> and <code>error</code> substates impossible for an application route.</p>
<p>Named substates add a new lookup method for substates. The name of the route is pre-pended
onto the substate. So a valid loading substate for <code>application</code> can be defined as
<code>application_loading</code>.</p>
<p>Thanks to <a href="http://twitter.com/machty">@machty</a> for landing this feature.</p>
<h3 id="componenthelper">Component Helper</h3>
<p>Ember components can be bound via the <code>component</code> helper. For example this logic
in a template:</p>
<pre><code class="handlebars language-handlebars">{{#if isRed}}
  {{x-red}}
{{/if}}
{{if isBlue}}
  {{x-blue}}
{{/if}}
{{if isGreen}}
  {{x-green}}
{{/if}}
</code></pre>
<p>Can now be replaced by a computed property and the <code>component</code> helper.</p>
<pre><code class="handlebars language-handlebars">{{component colorComponentName}}
</code></pre>
<p>The property <code>colorComponentName</code> should have a value of <code>x-red</code>, <code>x-blue</code> etc. As
the value of the property changes, the rendered component will also change.</p>
<p>A big thank you to <a href="https://twitter.com/lukemelia">@lukemelia</a> for shipping
this new feature.</p>
<h3 id="notabledeprecationsin111">Notable Deprecations in 1.11</h3>
<p>The following deprecations are scheduled for release with Ember.js 1.11:</p>
<ul>
<li>The <code>ObjectController</code> will be removed in Ember 2.0. In Ember 1.11,
both explicitly using an <code>ObjectController</code> and using the proxying behavior
of a generated <code>ObjectController</code> will raise deprecation warnings.</li>
</ul>
<p>As the features included in Ember 1.12 are developed, additional deprecations
may be added to the 1.11 release.</p>
<h2 id="changelogs">Changelogs</h2>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.10.0/CHANGELOG.md">Ember.js 1.10.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.11.0-beta.1/CHANGELOG.md">Ember.js 1.11.0-beta.1 CHANGELOG</a></li>
</ul>
<p><em>Using Ember? Please take ten minutes to share your
feedback by participating in the <a href="http://goo.gl/forms/6yIsF3TNsQ">2015 Ember Community Survey</a>. Open
until February 20th.</em></p>]]></description><link>https://blog.emberjs.com/ember-1-10-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-10-0-released</guid><pubDate>Sat, 07 Feb 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 1.11.0 and 1.12 Beta Released]]></title><description><![CDATA[<p>We are pleased to announce the release of both Ember.js 1.11.0 and the
first beta in the 1.12 series. This comes as the eleventh cycle of our
release process that began after 1.0 was released.</p>
<p>The 1.11 release represents the effort of at least 87 contributors
across over 646 commits.</p>
<h2 id="newfeaturesinemberjs111">New Features in Ember.js 1.11</h2>
<h3 id="boundattributesyntax">Bound Attribute Syntax</h3>
<p>Current Ember developers are familiar with the <code>bind-attr</code> syntax, used
to declare an attribute binding on an HTML element. An original
motivation for HTMLBars was to improve on this syntax.</p>
<p>Ember 1.11 introduces a more intuitive API for attribute binding. For
example, here the <code>color</code> variable is bound to the class of a div:</p>
<pre><code class="handlebars language-handlebars">&lt;div class="{{color}}"&gt;&lt;/div&gt;
</code></pre>
<p>The inline if helper can also be used in these contexts:</p>
<pre><code class="handlebars language-handlebars">&lt;div class="{{color}} {{if isEnabled 'active' 'disabled'}}"&gt;&lt;/div&gt;
</code></pre>
<p>For some attributes, like the <code>disabled</code> boolean, passing a literal value
is desirable. An example:</p>
<pre><code class="handlebars language-handlebars">&lt;input disabled={{isDisabled}}&gt;
</code></pre>
<p>To allow the data-binding of non-string values to boolean properties and
custom element properties, bound attributes are implemented with a
<strong>property-first</strong> setter.</p>
<p>When binding to an attribute, Ember first checks to see if that attribute is a
property of the element's DOM node (with normalization of capitalization). If it
is, the value is set with a property. For example:</p>
<pre><code class="handlebars language-handlebars">&lt;input disabled={{isDisabled}}&gt;
</code></pre>
<pre><code class="javascript language-javascript">// disabled is a property of input elements, so...
input.disabled = true;
</code></pre>
<p>If the attribute is not present as a property, then its value is set as an
attribute:</p>
<pre><code class="handlebars language-handlebars">&lt;div class={{color}}&gt;
</code></pre>
<pre><code class="javascript language-javascript">// class is not a property of div elements, do...
div.setAttribute('class', 'red');
</code></pre>
<p>For SVG attributes and the style attribute, we've made an exception to this pattern
and use <code>setAttribute</code> at all times.
Despite these exceptions, the property-first rule is a good way to describe what is
happening behind the scenes. In practice, the binding syntax feels natural.</p>
<p>Many thanks to <a href="http://twitter.com/mixonic">@mixonic</a>, <a href="http://twitter.com/_mmun">@_mmun</a>,
and <a href="http://twitter.com/wycats">@wycats</a> for their effort on the design and implementation
of this feature.</p>
<h3 id="escapingcontentinhtmlbars">Escaping Content in HTMLBars</h3>
<p>Bound attribute syntax introduces several new uses of mustaches
(the <code>{{</code> syntax used in Ember templates). These new uses
come with new security considerations.</p>
<p>Two notable new considerations are mustache use inside style
contexts, and inside JavaScript contexts. For example, without
escaping this
binding would be vulnerable to an XSS attack (via ActiveX
controls) in IE8:</p>
<pre><code class="handlebars language-handlebars">&lt;div style="width: {{userProvidedWidth}}px;"&gt;&lt;/div&gt;
</code></pre>
<p>Implementing CSS and JavaScript context-sensitive escaping
will require further research and development. In Ember 1.11,
bound <code>style</code> attributes will warn when the value is not marked safe.</p>
<pre><code class="handlebars language-handlebars">{{! No escaping strategy, log a warning }}
&lt;a style="width: {{someProperty}}px"&gt;&lt;/a&gt;
</code></pre>
<p>The examples that follow are intended to demonstrate how this
works in practice.</p>
<pre><code class="handlebars language-handlebars">{{! Works as expected }}
&lt;a class="{{someProperty}}"&gt;&lt;/a&gt;

{{! Works as expected, and escapes unsafe urls }}
&lt;a href="{{someProperty}}"&gt;&lt;/a&gt;

{{! Works as expected, and escapes unsafe urls }}
&lt;img src="{{someProperty}}"&gt;&lt;/a&gt;
</code></pre>
<p>Warnings about unsafe bindings other than <code>style</code> will be introduced
before Ember 2.0.</p>
<pre><code class="handlebars language-handlebars">{{! No escaping strategy in 1.11 }}
&lt;a onmouseover="alert('{{someProperty}}');"&gt;&lt;/a&gt;

{{! No escaping strategy in 1.11 }}
&lt;style&gt;width: {{someProperty}}px&lt;/style&gt;
</code></pre>
<p>Strings that are known to be adequately escaped can be
passed through the <code>htmlSafe</code> function to mark them safe.</p>
<pre><code class="javascript language-javascript">import Ember from "ember";

export default Ember.Component.extend({
  layout: Ember.HTMLBars.compile("&lt;a style='width: {{someProperty}}px'&gt;"),
  someProperty: function(){
    return Ember.String.htmlSafe(this.get('someKnownSafeProperty'));
  }.property('someKnownSafeProperty')
});
</code></pre>
<p>A less savory alternative is to use the <code>{{{</code> "escaped mustache" style. There are
plans to improve escaped content as we approach 2.0.</p>
<h3 id="inlineif">Inline if</h3>
<p>In 1.11 Ember's <code>if</code> helper can be used in the inline form:</p>
<pre><code class="handlebars language-handlebars">{{if isEnabled 'active' 'disabled'}}
</code></pre>
<p>Thanks to <a href="https://twitter.com/eaf4">@eaf4</a> and <a href="https://twitter.com/marciojunior_me">@marciojunior_me</a> for
implementing this feature.</p>
<h3 id="eachwithindex">Each with Index</h3>
<p>The <code>each</code> helper will support an <code>index</code> block param in Ember 1.11:</p>
<pre><code class="handlebars language-handlebars">{{#each people as |person index|}}
  {{! The first index value will be 0 }}
  &lt;div&gt;{{index}}: {{person.name}}&lt;/div&gt;
{{/each}}
</code></pre>
<p>Thanks to <a href="https://twitter.com/timmyce">@timmyce</a> and <a href="https://twitter.com/_mmun">@_mmun</a> for
implementing this feature.</p>
<h3 id="namedsubstates">Named Substates</h3>
<p>Two routing substates exist for Ember routes. The <code>loading</code> substate will be entered
if the async hooks of a route are still processing, and the <code>error</code> substate will be
entered when an async hook promise is rejected.</p>
<p>Substates are sibling routes. When the <code>new</code> route of <code>cars.new</code> is loading, the <code>cars.loading</code>
substate is entered. The <code>application</code> route has no parent namespace to nest its siblings.
This makes using the <code>loading</code> and <code>error</code> substates impossible for an application route.</p>
<p>Named substates add a new lookup method for substates. The name of the route is pre-pended
onto the substate. So a valid loading substate for <code>application</code> can be defined as
<code>application_loading</code>.</p>
<p>Thanks to <a href="http://twitter.com/machty">@machty</a> for landing this feature.</p>
<h3 id="componenthelper">Component Helper</h3>
<p>Ember components can be bound via the <code>component</code> helper. For example this logic
in a template:</p>
<pre><code class="handlebars language-handlebars">{{#if isRed}}
  {{x-red}}
{{else if isBlue}}
  {{x-blue}}
{{else if isGreen}}
  {{x-green}}
{{/if}}
</code></pre>
<p>Can now be replaced by a computed property and the <code>component</code> helper.</p>
<pre><code class="handlebars language-handlebars">{{component colorComponentName}}
</code></pre>
<p>The property <code>colorComponentName</code> should either have a value of <code>x-red</code>, or <code>x-blue</code> etc. As
the value of the property changes, the rendered component will also change.</p>
<p>A big thank you to <a href="https://twitter.com/lukemelia">@lukemelia</a> for shipping
this new feature.</p>
<h3 id="performanceimprovements">Performance Improvements</h3>
<p>Ember.js 1.10 has favorable rendering performance compared to previous releases. We're
pleased that Ember 1.11 builds upon that progress. Compared to 1.10, common list
rendering scenarios have improved by about twenty percent and view instance
creation is over twice as fast. These measurements were made using the
<a href="https://github.com/eviltrout/ember-performance">ember-performance</a> repo.</p>
<p>Progress continues on the <a href="https://github.com/emberjs/ember.js/pull/10501">Glimmer rendering engine</a>
announced at EmberConf 2015. This dramatic performance improvement is expected to
land in Ember.js 1.13.</p>
<h3 id="notabledeprecationsin111">Notable Deprecations in 1.11</h3>
<p>The following deprecations are scheduled for release with Ember.js 1.11:</p>
<ul>
<li>The <code>ObjectController</code> will be removed in Ember 2.0. In Ember 1.11,
both explicitly using an <code>ObjectController</code> and using the proxying behavior
of a generated <code>ObjectController</code> will raise deprecation warnings. See the
<a href="/guides/deprecations#toc_objectcontroller">deprecation guide</a> for more details.</li>
<li>Initializing instances (via <code>container.lookup</code>) in initializers is deprecated. For
initialization that requires instances Ember has introduced "instance initializers". See
the <a href="/guides/deprecations#toc_access-to-instances-in-initializers">deprecation guide</a>
for more information, as well as this <a href="https://github.com/emberjs/website/pull/1951">documentation PR</a>
and <a href="https://github.com/emberjs/ember.js/pull/10256">the implementation PR</a>.</li>
<li>Not a deprecation, but related: The <code>{{bind}}</code> template helper was a private
helper, and has been deprecated
since Ember 1.10. It has been removed in Ember.js 1.11.</li>
</ul>
<h2 id="changelogs">Changelogs</h2>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.11.0/CHANGELOG.md">Ember.js 1.11.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.12.0-beta.1/CHANGELOG.md">Ember.js 1.12.0-beta.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-11-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-11-0-released</guid><pubDate>Fri, 27 Mar 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 1.11.1 Released]]></title><description><![CDATA[<p>Today we are releasing Ember.js 1.11.1, a patch-level release of Ember that
fixes several regressions introduced in the 1.11.0 release.</p>
<h3 id="collectionviewwithattributebindings">CollectionView with <code>attributeBindings</code></h3>
<p>During the 1.11.0 cycle much effort was put into making sure that <code>attributeBindings</code> used
the same logic that template bound attributes use.  Namely, that <code>attributeBindings</code> use
HTMLBars' attribute helpers instead of jQuery's.</p>
<p>Unfortunately, this work lead to an error when <code>CollectionView</code> instances were used with
<code>attributeBindings</code> specified.  This regression is fixed in 1.11.1.</p>
<!-- alex ignore invalid -->
<h3 id="invalidurls">Invalid URLs</h3>
<p>Refactoring in the router initialization process lead to a bug that caused the browsers URL
to become out of sync with the correct URL when the back button was pressed while using
<code>HistoryLocation</code>.</p>
<p>This regression is fixed in 1.11.1.</p>
<h3 id="handlebarshelperissues">Handlebars Helper Issues</h3>
<p>A couple regressions were fixed for Handlebars helpers with 1.11.1:</p>
<ul>
<li>The inverse template (aka <code>{{else}}</code> block) of Handlebars helpers was not properly accounted
for during the HTMLBars transition. Using an <code>{{else}}</code> block with a Handlebars helper has
not been function since 1.9.0.</li>
<li>The main block could not be rendered even if <code>options.fn()</code> was called within the helper. This
regression was first introduced in 1.11.0-beta.4.</li>
</ul>
<h3 id="incorrectassertionforeachfoositemcontrolerbar">Incorrect Assertion for {{each foos itemControler='bar'}}</h3>
<p>During the 1.11.0 cycle, an issue was reported regarding <code>{{each}}</code> when prototype extensions were turned off.
The solution to that issue was to add a much more helpful assertion when an <code>ArrayController</code>'s model
did not have <code>Ember.Array</code> mixed into it. Unfortunately, this assertion also was triggered when the
model was <code>undefined</code>. The assertion has been updated to ignore falsey <code>model</code>'s in 1.11.1.</p>
<h3 id="renderhelperwithview">{{render}} helper with View</h3>
<p>In 1.11.0 using the <code>{{render}}</code> helper (i.e. <code>{{render 'post'}}</code>) when a <code>PostView</code> is present would not
provide the view with a template (it was assumed to be manually specified in the view via <code>templateName</code>
property). As of 1.11.1 you can specify the <code>templateName</code> in the <code>{{render}}</code> helpers view (similarly to in 1.11.0),
but if you do not the views template will be defaulted to a template with the same name as the view itself.</p>
<h2 id="changelogs">Changelogs</h2>
<ul>
<li><a href="https://github.com/emberjs/ember.js/compare/v1.11.0…v1.11.1">Ember.js 1.11.0 to 1.11.1 commit log</a></li>
<li><a href="https://github.com/emberjs/ember.js/releases/tag/v1.11.1">Ember.js 1.11.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-11-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-11-1-released</guid><pubDate>Sat, 04 Apr 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 1.12 and 1.13 Beta (Glimmer!) Released]]></title><description><![CDATA[<p>We are please to announce the release of Ember.js 1.12 and the first beta in the 1.13 series.</p>
<p><strong>1.13 beta is the first Ember.js release that includes Glimmer, the new Ember
rendering engine, as well as the final batch of Ember 2.0 features.</strong> We will
discuss those details more below.</p>
<h2 id="newfeaturesinember112">New Features in Ember 1.12</h2>
<p>Ember 1.12 is a relatively light release, and includes features that move Ember
closer to ES6 class syntax and the first parts of the internal implementation
needed for a stable release of the FastBoot addon.</p>
<h3 id="newcomputedsyntax">New Computed Syntax</h3>
<p>Per <a href="https://github.com/emberjs/rfcs/pull/11">RFC #11</a>, Ember is introducing a
new syntax for computed properties. This change better aligns computed property
syntax with JavaScript getters and setters and makes writing settable computed
properties developer friendly.</p>
<p>It also has the nice side effect of improving performance, as the old syntax,
with its two-in-one function signatures, was harder for JavaScript engines to
optimize.</p>
<p>The simplest syntax for a computed property is to define the getter as a function:</p>
<pre><code class="javascript language-javascript">export default Ember.Object.extend({

  height: 100,
  goldenRatioWidth: Ember.computed('height', function(){
    return this.get('height') * 1.618;
  })

});
</code></pre>
<!-- alex ignore simple -->
<p>This is still the way to write simple getters, the most common use-case for
computed properties, in Ember 1.12.</p>
<p>To create a settable computed property in Ember 1.11 an <code>if</code> statement was used
to differentiate the get from the set logic. For example:</p>
<pre><code class="javascript language-javascript">export default Ember.Object.extend({

  height: 100,
  goldenRatioWidth: Ember.computed('height', function(key, value){
    if (arguments.length &gt; 1) {
      this.set('height', value / 1.618);
    } else {
      return this.get('height') * 1.618;
    }
  })

});
</code></pre>
<p>This syntax was functional but error-prone, verbose, and hard to understand
(for both humans and JavaScript engines).</p>
<p>In Ember 1.12, you can nicely separate the getter and setter into two different
functions.</p>
<pre><code class="javascript language-javascript">export default Ember.Object.extend({

  height: 100,
  goldenRatioWidth: Ember.computed('height', {
    get(key) {
      return this.get('height') * 1.618;
    },
    set(key, value) {
      this.set('height', value / 1.618);
      return value;
    }
  })

});
</code></pre>
<p>This also aligns Ember's API with JavaScript getters and setters, and
simplifies the path towards using JavaScript getters in Ember 2.0, after IE8
support is dropped.</p>
<p>For more information see the initial implementation in <a href="https://github.com/emberjs/ember.js/pull/9527">#9527</a></p>
<p>Many thanks to <a href="https://twitter.com/stefanpenner">@stefanpenner</a> and
<a href="https://twitter.com/MiguelCamba">@MiguelCamba</a> for championing and shipping
this feature.</p>
<p>One last thing: thanks to the experimental support for <a href="https://github.com/wycats/javascript-decorators">JavaScript
decorators</a> in Babel, we are also planning a further improvement in
the near future:</p>
<pre><code class="javascript language-javascript">export default Ember.Object.extend({

  height: 100,

  @computed('height')
  get goldenRatioWidth(key) {
    return this.get('height') * 1.1618;
  }

  set goldenRatioWidth(key, value) {
    this.set('height', value / 1.618);
  }

});
</code></pre>
<h3 id="instanceinitializers">Instance Initializers</h3>
<p>The next feature, instance initializers, makes it possible for FastBoot
applications to run many requests concurrently.</p>
<p>Before FastBoot, you would only ever run applications one at a time. Even in
automated tests, tests were run one at a time, in serial, so one application
was destroyed before the next one was created.</p>
<p>In FastBoot, it is important for a single node server to be able to serve
a second request while the first one is fetching its data.</p>
<p>Thankfully, Ember already ensures that all state is stored in the container,
so in theory, all you need to do is give each request its own container
instance and you get concurrent requests in FastBoot.</p>
<p>In practice, there was a minor API change we needed to make in order to
make it work involving initializers. In Ember 1.11, initializers would
run on app boot (or once per test). Some initializers were setting up
code (and injection rules), which are the same across all FastBoot requests,
while other initializers were creating instances, which are different
across requests.</p>
<p>In Ember.js 1.12 application boot is separated into two phases:</p>
<ul>
<li>Application initializers run. At this phase of boot, the goal of initializers
should be to register dependencies and injections. These initializers are doing
work that is shared across all FastBoot requests, and therefore should not
create instances. This phase runs <em>once</em>. Because these initializers may
load code, they are allowed to defer application readiness and advance it.</li>
<li>Instance initializers run next. This is the right time to do work that is
specific to each FastBoot request. You can create instances and modify their
state here. This phase runs when the browser application runs, for each
integration test, and for each FastBoot request. These initializers run
after code has loaded and are not allowed to defer readiness.</li>
</ul>
<p>The two-phase initialization process is safer when multiple addons may be
registering factories and injections.</p>
<p>Ember-CLI 0.2.3 supports instance initializers. For example:</p>
<pre><code class="javascript language-javascript">// app/instance-initializers/sleep.js

export function initialize(application) {
  application.container.lookup('service:websocket').connect();
}

export default {
  name: 'sleep',
  initialize: initialize
};
</code></pre>
<p>To define an instance initializer in globals mode use the <code>Ember.Application.instanceInitializer</code>
method. For more information about instance intializers see the
implementation in <a href="https://github.com/emberjs/ember.js/pull/10256">#10256</a>.</p>
<p>Thanks to <a href="https://twitter.com/tomdale">@tomdale</a>, <a href="https://twitter.com/wycats">@wycats</a> and
<a href="https://twitter.com/dgeb">@dgeb</a> for this feature and other
refactoring work around application initialization.</p>
<h3 id="initializercontext">Initializer Context</h3>
<p>Previously, the <code>this</code> scope of an initializer was the global scope.
<a href="https://github.com/emberjs/ember.js/pull/10179">#10179</a> changed initializer
scopes to be the initializer object itself.</p>
<p>Thanks to <a href="https://twitter.com/gf3">@gf3</a> for suggesting and adding this feature.</p>
<h2 id="ember113beta">Ember 1.13 Beta</h2>
<p>And now, the big enchilada!</p>
<p>Together with the release of Ember 1.12, we are releasing the first beta of Ember 1.13.</p>
<p>Ember 1.13 is:</p>
<ul>
<li>the last minor release in the 1.x series</li>
<li>the first release that includes the new <strong>Glimmer rendering engine</strong></li>
</ul>
<p>To recap; what is Glimmer?</p>
<!-- alex disable just -->
<ul>
<li>A new faster rendering engine that is especially fast at updates.</li>
<li>An implementation of the React-inspired "just re-render it" programming model
for components, with one-way data flow by default and better enforcement for
data-down, actions-up.</li>
<li>Supports angle-bracket components (<code>&lt;my-component /&gt;</code>), ergonomic attributes
(<code>&lt;my-link href="{{url}}.html"&gt;go home&lt;/my-link&gt;</code>), that hews closely to HTML
syntax with a few small enhancements.</li>
</ul>
<!-- alex enable just -->
<p>We'll be writing a blog post that expands on the programming model of Ember 2.0
and talks about the most important new features in the next few days, and full
docs are coming as well.</p>
<p>We'd like to give a big thank you to the entire community for all the nights and
weekends over the past few months getting Glimmer (<a href="https://www.isemberfastyet.com">almost</a>) over the
finish line. It's inspiring.</p>
<h3 id="the113xseries">The 1.13.x Series</h3>
<p>In most cases, you should expect Glimmer to be faster at both initial rendering
and updates. If you find performance regressions in idiomatic usage in your app,
we definitely want to hear about it. Please file bugs.</p>
<p>The Glimmer rendering engine changes parts of Ember that have been largely
untouched since the days of SproutCore 2.0. In practice, this means that you
may be relying on implementation details of the pre-Glimmer implementation
that were not captured by tests, and that were not discovered during the
Canary period.</p>
<p>Because of the magnitude of the internal change, we expect the first few
Ember 1.13 betas to be less stable than other betas in the 1.x series. <strong>We
need your help to find and fix compatibility regressions.</strong></p>
<p>Please report any incompatibilities that you discover. We will investigate and
consider shimming any regression that affects a significant number of apps,
even if the root cause is a change in internal implementation details.</p>
<p>We know that there will likely be some compatibility regressions, especially
in implementation details, that we do not catch during the 1.13 beta period.
We plan to continue to release point releases to the 1.13 series to fix
those details after 2.0 beta is released, and perhaps even for a while after
2.0 final is released.</p>
<p><strong>Our goal is to ensure that most applications can upgrade to Ember 1.13.x,
remove deprecations, and then upgrade to Ember 2.0 with minimal fuss.</strong> If
a significant number of apps that are earnestly trying to upgrade this way
cannot, we will continue to fix problems that are blocking upgrades.</p>
<p>For an in-depth look into our transition plan for users with existing Ember 1.x
apps, please see the recent <a href="http://emberjs.com/blog/2015/05/10/run-up-to-two-oh.html">Transition to Ember 2.0 in
Detail</a> blog post.</p>
<h2 id="changelogs">CHANGELOGS</h2>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.12.0/CHANGELOG.md">Ember 1.12.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.13.0-beta.1/CHANGELOG.md">Ember 1.13.0-beta.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-12-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-12-released</guid><pubDate>Wed, 13 May 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 1.13.0 and 2.0 Beta Released]]></title><description><![CDATA[<p>We are pleased to announce the release of both Ember.js 1.13.0 and the
first beta in the 2.0 series. This comes as the thirteenth cycle of our
release process that began after 1.0 was released.</p>
<p>The 1.13 release represents the effort of at least 43 contributors
across over 680 commits.</p>
<p><strong>Ember 1.13 is the last release in the 1.x series and the first release that includes the Glimmer rendering engine.</strong> It includes a number of deprecations that will ease the upgrade to Ember 2.0, which is due to land in six weeks.</p>
<p><strong>Ember 2.0 beta is the first release in the 2.x series.</strong> This means that many features deprecated during the 1.x series will be removed in Ember 2.0. If you encounter any unexpected changes in features not marked as deprecated in 1.13 while testing Ember 2.0 beta, please report them immediately. We would like to fix these unintentional regressions before the final release of 2.0 in six weeks.</p>
<p>The release of Ember 2.0 beta also means that the first features in Ember 2.1 (most notably angle bracket components), are in their final canary stretch. Now is a good time to comment on RFCs and pull requests related to those features.</p>
<h2 id="newfeaturesinemberjs113">New Features in Ember.js 1.13</h2>
<p>The Glimmer rendering engine, <a href="https://www.youtube.com/watch?v=o12-90Dm-Qs&feature=youtu.be&t=47m21s">announced at EmberConf</a> and introduced to Ember.js
Canary on <a href="/blog/2015/05/05/glimmer-merging.html">May 5th</a>, is released today
in Ember.js 1.13. Glimmer is the third overhaul of Ember's 1.x rendering
layer (wow, right?), and dramatically improves re-render performance in many
common scenarios. Additionally it lays important groundwork for the Ember 2.x
development model.</p>
<p><strong>We are tremendously excited to bring Glimmer to existing applications as
a 1.x compatible minor release.</strong> The herculean efforts of the Ember core team,
addon authors, and community to achieve this release has been inspiring.
Thank you! You are too many to possibly name.</p>
<p><strong>1.13 also marks the final minor release of the Ember 1.x cycle.</strong> As such,
it contains a number of deprecations ahead of Ember 2.0. Resolving these
deprecations in application code aligns that application with Ember's public
API in 2.0. In general, Ember apps running 1.13 without causing any deprecation notices
to fire should upgrade to 2.0 without changes.</p>
<p>The easiest way to work through deprecations is the <strong>Ember Inspector</strong>. Thanks to the work of Teddy Zeenny, deprecations will be routed to the "Deprecations" inspector pane, where you can get a grouped list of them as well as the line of code in your app that triggered the deprecation. You can also ask for a full stack trace of any deprecation.</p>
<h3 id="improvedrerenderperformance">Improved Rerender Performance</h3>
<p>Previous iterations of Ember's rendering engine <strong>relied</strong> on granular observation for efficiency. When a piece of dynamic content was rendered, Ember registered observers, updating the content when the value changed.</p>
<p>While this was reasonably efficient in cases where the developer could use <code>set</code> (and the array equivalents) to mutate values, it had two related issues:</p>
<!-- alex disable just -->
<ul>
<li>This forced developers to represent all changes in terms of granular
observers. In many cases this could be extremely awkward. This was
especially problematic when working with Arrays, since (for example)
representing a sort as a series of mutations is conceptually complex
and can be cost-prohibitive.</li>
<li>Ember itself was extremely inefficient when an entire object or
array was replaced, despite the fact that this was often the most
natural way to represent the change. This meant that while it was
usually possible in theory to "just re-render" a component, it was,
in practice, cost prohibitive (to say the least).</li>
</ul>
<!-- alex enable just -->
<p>To address these issues, Glimmer adopts a value-diffing strategy, using a virtual tree of the dynamic areas of the DOM. This means that even if the original data structure (for example, an array) is completely replaced, the DOM is not updated unless the resulting rendered content has changed.</p>
<p>When updating an array with a new array (because you got a new array from the server, or because you produced a new array through <code>.sort()</code>), you will see a large improvement in performance, <strong>making this kind of replacement plausible in Ember.</strong></p>
<p>Notably, the Ember strategy continues to support efficient updates via value observation, which we expect to be useful when communicating with services and models.</p>
<p>Glimmer's hybrid model can opportunistically take advantage of explicit mutation (via <code>set</code>) when it is used, while also supporting efficient re-renders of entire data structures, updating only the DOM  nodes that need to be changed.</p>
<p>The result is a stunning improvement in many rerender cases.</p>
<p>We would like to thank React for showing that full re-renders can be made efficient. While we did not use their precise Virtual DOM approach, their work with Virtual DOM was extremely influential to our approach in Glimmer.</p>
<p>Thanks to <a href="https://twitter.com/wycats">@wycats</a> and <a href="https://twitter.com/tomdale">@tomdale</a>
for their continued focus on improving
Glimmer's performance, and to <a href="http://www.linkedin.com">LinkedIn</a> and
<a href="http://www.bustle.com/">Bustle</a> for their
generous sponsorship of this work.</p>
<h3 id="componentlifecyclehooks">Component Lifecycle Hooks</h3>
<p>A number of new component lifecycle hooks have been introduced to Ember 1.13.
Using these hooks allows you to write data down, action up (DDAU) style
components today, despite the two-way data binding of curly components.</p>
<p>On first render (in order):</p>
<ul>
<li><code>didInitAttrs</code> runs after a component was created and passed attrs are guaranteed to be present. In Ember 1.13, the attributes will be available as <code>this.get('attrName')</code>.</li>
<li><code>didReceiveAttrs</code> runs after <code>didInitAttrs</code>, and it also runs on
subsequent re-renders, which is useful for logic that is the same
on all renders. It does not run when the component has been re-rendered from the inside.</li>
<li><code>willRender</code> runs before the template is rendered. It runs when the
template is updated for any reason (both initial and re-render, and
regardless of whether the change was caused by an attrs change or
re-render).</li>
<li><code>didInsertElement</code> runs after the template has rendered and the
element is in the DOM.</li>
<li><code>didRender</code> runs after <code>didInsertElement</code> (it also runs on subsequent
re-renders).</li>
</ul>
<p>On re-render (in order):</p>
<ul>
<li><code>didUpdateAttrs</code> runs when the attributes of a component have changed
(but not when the component is re-rendered, via <code>component.rerender</code>,
<code>component.set</code>, or changes in models or services used by the
template).</li>
<li><code>didReceiveAttrs</code>, same as above.</li>
<li><code>willUpdate</code> runs when the component is re-rendering for any reason,
including <code>component.rerender()</code>, <code>component.set()</code> or changes in
models or services used by the template.</li>
<li><code>willRender</code>, same as above</li>
<li><code>didUpdate</code> runs after the template has re-rendered and the DOM is
now up to date.</li>
<li><code>didRender</code>, same as above.</li>
</ul>
<p>Note that a component is re-rendered whenever:</p>
<ol>
<li>any of its attributes change</li>
<li><code>component.set()</code> is called</li>
<li><code>component.rerender()</code> is called</li>
<li>a property on a model or service used by the template has changed
(including through computed properties).</li>
</ol>
<p>Because of the Glimmer engine, these re-renders are fast, and avoid
unnecessary work.</p>
<h3 id="closureactions">Closure Actions</h3>
<p>In Ember 1.x, the actions system used bubbling as a solution for passing user
behavior to a parent scope. For example, when clicking a button an action
might bubble through several controllers then be handled on a route.</p>
<p>Action bubbling was difficult to debug, and plagued by an inability to have
a return value (since the return value of an action handler controlled further
bubbling).</p>
<p>Ember 2.x is component-driven, and replaces action bubbling with a function-passing
solution. This greatly simplifies working with actions (they are functions, after all),
enables return values, and introduces some powerful new currying capabilities.</p>
<p>For example, action <code>submit</code> is passed to <code>my-component</code> where it is called upon
click:</p>
<pre><code class="javascript language-javascript">// app/controllers/index.js
import Ember from "ember";

export default Ember.Controller.extend({
  actions: {
    setName(name) {
      model.set('name', name);
    }
  }
});
</code></pre>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/index.hbs --}}
{{my-component submit=(action 'setName')}}
</code></pre>
<pre><code class="javascript language-javascript">// app/components/my-component.js
import Ember from "ember";

export default Ember.Component.extend({
  click() {
    this.attrs.submit(this.get('name'));
  }
});
</code></pre>
<p>Actions:</p>
<ul>
<li>Can be passed multiple arguments</li>
<li>Return a value. For example <code>var result = this.attrs.submit();</code></li>
<li>Can curry. For example <code>submit=(action 'setName' 'Sal')</code> would pass <code>"Sal"</code> as
the first argument to <code>setName</code> when <code>submit</code> is called. Actions can curry
multiple times, adding arguments at each scope. For example <code>submit=(action attrs.actionPassedIn someProp)</code> adds an argument to any already curried onto <code>actionPassedIn</code>.</li>
</ul>
<p>Additionally the <code>action</code> helper has two options:</p>
<ul>
<li><code>(action 'save' target=session)</code> would look at the <code>actions</code> hash on the
<code>session</code> object instead of the current context.</li>
<li><code>(action 'save' value="currentTarget.value")</code> would read the path <code>currentTarget.value</code>
off whatever the first argument to the called action is. This is handy for
destructuring objects passed as the first argument (like DOM events).</li>
</ul>
<h3 id="noteanglebracketcomponents">Note: Angle Bracket Components</h3>
<p>Ember 2.1 will (likely) ship with angle-bracket components, which will introduce one-way data flow <strong>by default</strong>, and provide an opt-in for two-way data flow. Existing components maintain the existing behavior (for compatibility). While the internals of Ember 2.0 support a distinction between one-way and two-way bindings, that distinction will remain largely internal until Ember 2.1.</p>
<h3 id="newemberjshelperapi">New Ember.js Helper API</h3>
<p>Ember's helper story prior to 1.13 has been inconsistent and neglected. In
1.13, we're introducing a new API for writing helpers along with a set of
constraints and features informed by real-world experience.</p>
<p>Ember helpers:</p>
<ul>
<li>Represent a single value</li>
<li>Do not manage DOM or control flow</li>
<li>Can recompute themselves, similar to how a component can rerender</li>
<li>Can optionally access services</li>
<li>Do not require a dash</li>
</ul>
<p>Helpers come in two flavors. The first is a function-based API we call a
shorthand helper. For example, this shorthand helper joins a first and
last name:</p>
<pre><code class="javascript language-javascript">// app/helpers/full-name.js
import Ember from "ember";

export default Ember.Helper.helper(function(params, hash) {
  return params.join(' ');
});
</code></pre>
<p>This helper can be used in a variety of contexts:</p>
<pre><code class="handlebars language-handlebars">{{full-name "Daniel" model.lastName}}
{{my-component name=(full-name model.firstName "Smith")}}
{{! The following usage would set the model.name to the new full name
    when my-component calls the submit action. }}
{{my-component submit=(action (mut model.name) (full-name model.firstName "Smith"))}}
</code></pre>
<p>Helpers receive two arguments: <code>params</code> are the ordered params passed to a
helper, and <code>hash</code> contains the key-value options, for example <code>title="Mr."</code>.</p>
<p>This function version satisfies a wide array of use-cases and is quite powerful. In general, you should use this helper form unless you have a strong reason to do otherwise.</p>
<p>Some helpers, especially in addons, may require access to other parts of Ember (services), and
some control over their own invalidation and recomputation. In these cases, a helper class can be used.</p>
<p>For example, this helper computes a name based on a <code>name-builder</code> service. It
also recomputes whenever the <code>isAnonymized</code> state on that service changes:</p>
<pre><code class="javascript language-javascript">// app/helpers/full-name.js
import Ember from "ember";

export default Ember.Helper.extend({
  // This service name is only an example
  nameBuilder: Ember.inject.service(),
  compute(params, hash) {
    return this.get('nameBuilder').build(params, hash.title);
  },
  rebuildName: Ember.observer('nameBuilder.isAnonymized', function() {
    this.recompute();
  })
});
</code></pre>
<p>For more information on the new helper API please see <a href="https://github.com/emberjs/rfcs/blob/master/text/0053-helpers.md">RFC #53</a> on helpers and <a href="https://github.com/emberjs/rfcs/pull/58">RFC #58</a>
on dashless helpers. Thanks to the addon community (especially <a href="https://twitter.com/jamesarosen">@jamesarosen</a>) for bringing the
requirements for this API to our attention and testing changes with little notice.
Thanks to <a href="https://twitter.com/mixonic">@mixonic</a>
and <a href="https://twitter.com/rwjblue">@rwjblue</a> for the implementation.</p>
<h3 id="componentblockinfo">Component Block Info</h3>
<p>Ember.js 1.13 introduces two new template keywords that provide reflection on
how a component is called.</p>
<p><code>hasBlock</code> will be true when a component is invoked in block form. For example
given this component:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/components/show-full-name.hbs --}}
{{#if hasBlock}}
  {{yield fullName}}
{{else}}
  {{fullName}}
{{/if}}
</code></pre>
<p>Then these two usages would be valid:</p>
<pre><code class="handlebars language-handlebars">{{! app/index/template.hbs }}

Full name: {{show-full-name firstName=firstName lastName=lastName}}

{{#show-full-name firstName=firstName lastName=lastName as |fullName|}}
  Full name: {{fullName}}
{{/show-full-name}}
</code></pre>
<p>Additionally, <code>hasBlockParams</code> will be true if the component is invoked
with block params (invoke in block form with <code>as |someParam|</code>).</p>
<p>Thanks to <a href="https://twitter.com/_mmun">@mmun</a> and <a href="https://twitter.com/rwjblue">@rwjblue</a>
for implementing this feature.</p>
<h3 id="notabledeprecationsin113">Notable Deprecations in 1.13</h3>
<p>In preparation for Ember 2.0, 1.13 introduces many deprecations. These include:</p>
<ul>
<li>All view APIs in Ember. <a href="http://emberjs.com/deprecations/v1.x/#toc_ember-view">See deprecation guide</a><ul>
<li><code>Ember.CoreView</code>, <code>Ember.View</code>, <code>Ember.CollectionView</code>, <code>Ember.ContainerView</code></li>
<li><code>{{view 'some-helper'}}</code></li>
<li>The <code>{{view}}</code> keyword for accessing properties on a view</li>
<li><code>Ember.Select</code> and <code>{{view "select"}}</code>. <a href="http://emberjs.com/deprecations/v1.x/#toc_ember-select">See deprecation guide</a></li>
<li><code>Ember.LinkView</code> in favor of <code>Ember.LinkComponent</code>. <a href="http://emberjs.com/deprecations/v1.x/#toc_ember-linkview">See deprecation guide</a></li></ul></li>
<li>Options to the <code>{{#each</code> helper that trigger a legacy and poorly performing
legacy layer. These options are: <code>itemView</code>, <code>itemViewClass</code>, <code>tagName</code>, <code>emptyView</code> and <code>emptyViewClass</code>.</li>
<li>The <code>itemController</code> argument for <code>{{#each</code>.</li>
<li>The <code>bind-attr</code> helper. Using helpers and HTMLBars-style attribute binding
is preferred.</li>
<li>Reading <code>this.get('template')</code> to check for a yielded block on components.
Instead, use the <code>hasBlock</code> API.</li>
<li>Non-block param <code>{{with</code></li>
<li>The <code>view</code> and <code>viewClass</code> params for <code>{{outlet}}</code></li>
<li><code>Ember.reduceComputed</code> and <code>Ember.arrayComputed</code> in favor of plain normal
array manipulations. <a href="http://emberjs.com/deprecations/v1.x/#toc_ember-reducecomputed-ember-arraycomputed">See deprecation guide</a></li>
</ul>
<h2 id="ember20beta">Ember 2.0 beta</h2>
<p>Last November, @wycats and @tomdale published <a href="https://github.com/emberjs/rfcs/pull/15">The Road to Ember 2.0</a>,
an RFC summarizing Ember's goals for a 2.0 release. At EmberConf, when some of
these changes were already complete and others not begun, they announced
our intent to ship 2.0 beta on June 12th.</p>
<p>Together, the features summarized in the 2.0 RFC describe a new way to
author Ember applications. Model-View-Controller is replaced by
Model-Route-Component-Service. Two-way bindings are replaced by data down,
actions up (DDAU).</p>
<p>Ember 2.0 will not introduce the entirety of our improved development model.
However it will take significant steps in that direction, and allow the
removal of public APIs that have been difficult to maintain while we
iterate forward.</p>
<p>Because of the focus on landing migration paths for 1.x codebases in 1.13,
2.0 will have few new features. Among them are:</p>
<h3 id="eachinhelper">each-in helper</h3>
<p>The <code>each-in</code> helper allows the iteration of object properties. For example,
given this value for <code>items</code>:</p>
<pre><code class="javascript language-javascript">let items = {
  "Item 1": 1234,
  "Item 2": 3456
};
</code></pre>
<p>The following template will iterate the keys:</p>
<pre><code class="handlebars language-handlebars">{{#each-in items as |key value|}}
  &lt;p&gt;{{key}}: {{value}}&lt;/p&gt;
{{/each-in}}
</code></pre>
<p>Note that this helper is unbound. Adding a new property to <code>items</code> will not
cause a rerender, but <code>.set('items', val)</code> will.</p>
<p>Thanks to <a href="http://twitter.com/tomdale">@tomdale</a> and implementing this
feature, and to several others for helping push it to completion.</p>
<h3 id="gethelper">get helper</h3>
<p>The <code>get</code> helper provides a bound way to fetch a single property from an object.
For example given these items:</p>
<pre><code class="javascript language-javascript">let items = {
  "Item 1": 1234,
  "Item 2": 3456
};
</code></pre>
<p>The following template display <code>1234</code>:</p>
<pre><code class="handlebars language-handlebars">{{get items 'Item 1'}}
</code></pre>
<p>This becomes more powerful when the second argument is a bound path:</p>
<pre><code class="handlebars language-handlebars">{{get items somePathWithAKey}}
</code></pre>
<p>Thanks to <a href="https://twitter.com/jmurphyau">@jmurphyau</a> for implementing this feature.</p>
<h3 id="notablebreakingchangesinember20">Notable Breaking Changes in Ember 2.0</h3>
<p>Ember 2.0 will remove a number of public APIs, all of which should have been
deprecated in the 1.13 release and have a viable migration path. The Ember
<a href="http://emberjs.com/deprecations/v1.x/">Deprecation Guide</a> should provide a
clear migration path for commonly used APIs.</p>
<p>During the 2.0 beta cycle we will be removing and disabling already
deprecated APIs. Much of this work has not yet started, but the following
represents what we believe the breaking changes will be.</p>
<p>Many controller APIs are removed in Ember 2.0. Routeable controllers still
exist, but all other uses have been deprecated. This includes:</p>
<ul>
<li><code>{{render "some-controller"}}</code></li>
<li><code>{{each item itemController="some-controller"}}</code> - This usage can be replaced
by nesting a component inside the item, and by using helpers.</li>
<li><code>Ember.ObjectController</code></li>
<li><code>Ember.ArrayController</code></li>
<li>The <code>{{controller}}</code> keyword</li>
<li><code>needs:</code> on controllers</li>
</ul>
<p>All view APIs are removed in Ember 2.0. This includes:</p>
<ul>
<li><code>Ember.CoreView</code>, <code>Ember.View</code>, <code>Ember.ContainerView</code> and <code>Ember.CollectionView</code></li>
<li><code>Ember._Metamorph</code>, <code>Ember._MetamorphView</code></li>
<li>The <code>{{view "some-view"}}</code> helper</li>
<li>The <code>{{view}}</code> keyword</li>
<li><code>{{each itemView=</code>, <code>{{each itemViewClass=</code>, <code>{{each tagName=</code>, <code>{{each emptyView=</code>, <code>{{each emptyViewClass</code></li>
<li><code>Ember.Select</code> and <code>{{view "select"}}</code></li>
<li><code>Ember.Checkbox</code> is not removed, but will become a component instead of a view</li>
</ul>
<p>The most commonly used parts of the <code>view</code> API will be supported into the forseeable future via a core-supported addon.</p>
<p>All Handlebars APIs are removed in Ember 2.0. This includes:</p>
<ul>
<li><code>Ember.Handlebars.helper</code>, <code>Ember.Handlebars.makeBoundHelper</code> and <code>Ember.Handlebars.helper</code></li>
<li><code>Ember.Handlebars.compile</code></li>
</ul>
<p>Several template helpers are removed in Ember 2.0. These include:</p>
<ul>
<li><code>{{bindAttr}}</code></li>
<li><code>{{bind-attr}}</code> (use HTMLBars-style attribute bindings instead)</li>
<li><code>{{bind}}</code></li>
<li><code>{{template}}</code> (use <code>{{partial}}</code> instead)</li>
<li><code>{{linkTo}}</code> (use <code>{{link-to}}</code> instead)</li>
<li><code>{{collection items}}</code></li>
<li>Non-block params versions of <code>{{#each}}</code> and <code>{{#with}}</code></li>
<li>Legacy arguments to <code>{{#each}}</code>, <code>{{outlet}}</code></li>
</ul>
<p>The following routing APIs are removed:</p>
<ul>
<li><code>#hash</code> paths with no forward leading slash</li>
</ul>
<p>Other APIs:</p>
<ul>
<li><code>Ember.tryFinally</code></li>
<li><code>Ember.tryCatchFinally</code></li>
<li><code>Ember.required</code></li>
<li><code>Ember.Map#remove</code></li>
<li><code>Ember.Set</code></li>
<li><code>Ember.computed.defaultTo</code></li>
<li><code>Ember.DeferredMixin</code></li>
<li><code>Ember.Deferred</code> (use <code>Ember.RSVP.Promise</code> instead)</li>
<li><code>Ember.reduceComputed</code> and <code>Ember.arrayComputed</code> (use plain array manipulation)</li>
<li><code>Ember.Freezable</code> (use Object.freeze instead)</li>
</ul>
<p>Additionally, IE8 is no longer supported in Ember 2.x. IE9+ is supported.</p>
<p>Many of these deprecated APIs will be moved into core-supported addons, or have already been moved.</p>
<h2 id="changelogs">Changelogs</h2>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.13.0/CHANGELOG.md">Ember.js 1.13.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v2.0.0-beta.1/CHANGELOG.md">Ember.js 2.0.0-beta.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-13-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-13-0-released</guid><pubDate>Fri, 12 Jun 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.2.0 and 1.3 Beta Released]]></title><description><![CDATA[<p>What better way to celebrate the holiday season than with two
brand-spankin' new releases of Ember.js?</p>
<p>Hot off the presses, we've got 1.2.0 and 1.3.0 beta on deck for
you. Since we started following a <a href="/blog/2013/09/06/new-ember-release-process.html">Chrome-like release
cycle</a>, we'll have two
new releases for you every six weeks. 1.2.0 is the newest stable
release; 1.3.0 beta is the latest beta channel release.</p>
<p>Beta releases are intended to get more eyeballs on new
features that look ready to go, but may have bugs or edge cases that we
haven't yet sussed out.</p>
<h3 id="newin12">New in 1.2</h3>
<h4 id="loadinganderrorsubstates">Loading and Error Substates</h4>
<p>While we'd all like to write apps that are fast and bullet-proof,
sometimes your backend may be slow to respond, or generate an error,
when your Ember app requests a model.</p>
<p>Dealing with those cases is much easier in Ember.js 1.2, thanks to
conventional loading and error routes.</p>
<p>To learn how to set these up, see <a href="/guides/routing/loading-and-error-substates/">Loading and Error
Substates</a> section of the
guides.</p>
<h4 id="nonblockformlinktohelper">Non-block form {{link-to}} helper</h4>
<p>Previously, the <code>{{link-to}}</code> helper required that you use it in block
form:</p>
<pre><code class="handlebars language-handlebars">{{#link-to "about"}}About Us{{/link-to}}
</code></pre>
<p>Ember 1.2 introduces a non-block form that is less verbose:</p>
<pre><code class="handlebars language-handlebars">{{link-to "About Us" "about"}}
</code></pre>
<p>In the non-block form, the first argument is the text to wrap in an
<code>&lt;a&gt;</code> tag, and the second argument is the route to link to.</p>
<h4 id="sortby">sortBy</h4>
<p>All objects that implement the <code>Ember.Enumerable</code> protocol now have a
<code>sortBy</code> method that sorts the enumerable based on a property of each
of the members.</p>
<p>For an example, see <a href="http://emberjs.jsbin.com/OFozANOz/1/">this JSBin</a>.</p>
<h4 id="otherimprovements">Other Improvements</h4>
<p>As usual, there are a ton of bug fixes and small improvements in this
release. You can see a list of all the changes in the CHANGELOG:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.2.0/CHANGELOG">Ember.js 1.2.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.3.0-beta.1/CHANGELOG.md">Ember.js 1.3.0 beta 1 CHANGELOG</a></li>
</ul>
<!-- alex ignore special -->
<p>A very big thank you to everyone who contributed, and a special thank you to our release team that have collectively poured hours of their free time into automating the infrastructure around the release process.</p>
<p>As usual, you can always find the latest stable, beta, and canary
releases at <a href="/builds">emberjs.com/builds</a>.</p>
<p>While you're there, check out the new illustrations, courtesy of <a href="https://twitter.com/wifelette">Leah
Silber</a> and <a href="http://designcarnivore.com/">Design
Carnivore</a>.</p>]]></description><link>https://blog.emberjs.com/ember-1-2-0-and-ember-1-3-0-beta-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-2-0-and-ember-1-3-0-beta-released</guid><pubDate>Wed, 04 Dec 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.3.0 and 1.4 Beta Released]]></title><description><![CDATA[<p>We are pleased to announce that both Ember.js 1.3.0 and the first beta in the 1.4 series
have been released. This comes as the third cycle of our six-week release
process that began after 1.0 was released.</p>
<h3 id="newin13">New in 1.3</h3>
<h4 id="nonarraydependenciesforreducecomputed">Non-array Dependencies for ReduceComputed</h4>
<p>Generally, using <code>reduceComputed</code> is all about efficiently computing the resulting value, but
occasionally you might need to recompute every time. It is now possible to instruct
<code>reduceComputed</code> to completely recompute when an item is added/removed (instead of calling
the <code>addedItem</code> and <code>removedItem</code> callbacks).</p>
<p>This is done by using either non-array dependent keys or adding <code>.[]</code> to an array dependency.</p>
<p>Take a look at the following example:</p>
<pre><code class="javascript language-javascript">Ember.Object.extend({
  // When `string` is changed, `computed` is completely recomputed.
  string: 'a string',

  // When an item is added to `array`, `addedItem` is called.
  array: [],

  // When an item is added to `anotherArray`, `computed` is completely
  // recomputed.
  anotherArray: [],

  computed: Ember.reduceComputed('string', 'array', 'anotherArray.[]', {
    addedItem: addedItemCallback,
    removedItem: removedItemCallback
  })
});
</code></pre>
<h4 id="testing">Testing</h4>
<p>Testability of Ember applications is an ongoing priority, and the 1.3 release
contains a number of updates that result in a dramatic improvement.</p>
<h5 id="customwaithooks">Custom <code>wait()</code> Hooks</h5>
<p>You can now specify custom hooks to notify the asynchronous test helpers when all
async actions have completed. Under Ember 1.2 if you need to wait for an IndexDB
action, the default <code>wait</code> implementation would not wait until that
action finished. Now you can register your own hook that will instruct wait
that it is truly time to continue.</p>
<p>For example:</p>
<pre><code class="javascript language-javascript">Ember.Test.registerWaiter(function() {
  return hasPendingTransactions() == 0;
});
</code></pre>
<p>This instructs the <code>wait</code> helper that the async actions are not finished until
<code>hasPendingTransactions</code> is zero.</p>
<p>You can find more details <a href="https://github.com/emberjs/ember.js/pull/3433">here</a>.</p>
<h5 id="lazyrouting">Lazy Routing</h5>
<p>Under Ember.js 1.2 routing is started as soon as you boot your application and <em>before</em>
you call <code>visit</code>. This results in duplicate routing which slows down your tests and also
potentially causes your tests to be less isolated.</p>
<p>Under Ember.js 1.3 routing isn't started until you call <code>visit</code> for the first time. This
provides a couple of improvements to the way you test:</p>
<ul>
<li>You do not need to call <code>App.advanceReadiness()</code> in your test setup since the application
is automatically in a deferred state until calling <code>visit</code>.</li>
<li><code>App.reset()</code> now leaves the application in the same state as <code>App.setupForTesting()</code> (a
deferred state).</li>
</ul>
<p>You can find more details <a href="https://github.com/emberjs/ember.js/pull/3695">here</a>.</p>
<h5 id="stubbablecontrollersproperty">Stubbable <code>controllers</code> Property</h5>
<!-- alex ignore easy -->
<p>Prior to Ember 1.3 you could not easily stub out any dependencies specified with <code>needs</code>.
Now you can unit test controllers and stub their dependencies all within
<code>TheControllerClass.create()</code> instead of having to use a container, register stubbed
dependencies, and instantiate the controller via <code>container.lookup()</code>.</p>
<p>Simplified example:</p>
<pre><code class="javascript language-javascript">var BrotherController = Ember.Controller.extend({
  needs: 'sister',
  foo: Ember.computed.alias('controllers.sister.foo')
});

var broController = BrotherController.create({
  controllers: {
    sister: { foo: 5 }
  }
});

equal(broController.get('foo'), 5, "`needs` dependencies can be stubbed");
</code></pre>
<p>Previously, specifying <code>controllers</code> to <code>BrotherController</code> would have resulted in an error,
and now under Ember.js 1.3 this works as expected.</p>
<h4 id="promiseimprovements">Promise Improvements</h4>
<p>Ember.js 1.3 has updated to <code>RSVP</code> 3.0.3 which brings considerable performance improvements, a number
of new features, and significantly improved documentation coverage.</p>
<p><code>RSVP</code> has added a number of features that allow external tooling to be able to inspect and track the labels, states, and
values of promises. These improvements will be extremely useful when used with the next major
version of the <a href="https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi">Ember Inspector</a>.
Which will allow you to see a tree of promises and inspect their names, state, and fulfilled/rejected values.</p>
<p><code>RSVP</code> added a number of additional methods to <code>Promise</code>:</p>
<ul>
<li><code>Promise.cast</code> - Coerces the given argument into a promise, or returns the argument if it is
already a promise.</li>
<li><code>Promise.catch</code> - <code>catch</code> is essentially syntactic sugar for <code>then(undefined, onRejection)</code> which
makes it the same as the <code>catch</code> block of a <code>try</code>/<code>catch</code> statement.</li>
<li><code>Promise.finally</code> - The callback provided to <code>Promise.finally</code> will be invoked regardless of the
promises fate (both fulfilled and rejected promises). This is essentially similar to native
<code>try</code>/<code>catch</code>/<code>finally</code> statements.</li>
<li><code>Promise.race</code> - Will return a new promise which will be settled with the value of
the first promise that settles. In other words: given an array of promises <code>Promise.race</code>
will return the value from the first argument that settles (like the winner in a "race").</li>
</ul>
<p>Please review <a href="/api/classes/RSVP.html">the documentation</a> for more information.</p>
<h4 id="otherimprovements">Other Improvements</h4>
<p>As usual, there are a ton of bug fixes and small improvements in this
release. You can see a list of all the changes in the CHANGELOG:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.3.0/CHANGELOG.md">Ember.js 1.3.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.4.0-beta.1/CHANGELOG.md">Ember.js 1.4.0 beta 1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-3-0-and-ember-1-4-0-beta-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-3-0-and-ember-1-4-0-beta-released</guid><pubDate>Mon, 06 Jan 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.4.0 and 1.5 Beta Released]]></title><description><![CDATA[<p>We are pleased to announce that both Ember.js 1.4.0 and the first beta in the 1.5 series
have been released. This comes as the fourth cycle of our six-week release
process that began after 1.0 was released.</p>
<h3 id="newfeaturesin14">New features in 1.4</h3>
<h4 id="propertybraceexpansion">Property Brace Expansion</h4>
<p>In prior versions of Ember if you wanted to observe both <code>foo</code> and <code>bar</code> on <code>baz</code>
you would need to setup both <code>baz.foo</code> and <code>baz.bar</code> as dependent keys.</p>
<pre><code class="javascript language-javascript">var obj = Ember.Object.extend({
  baz: {foo: 'BLAMMO', bar: 'BLAZORZ'},

  something: function(){
    return this.get('baz.foo') + ' ' + this.get('baz.bar');
  }.property('baz.foo', 'baz.bar')
});
</code></pre>
<p>With the new property brace expansion, you could setup the computed properties dependencies
instead like:</p>
<pre><code class="javascript language-javascript">  something: function(){
    return this.get('baz.foo') + ' ' + this.get('baz.bar');
  }.property('baz.{foo,bar}')
</code></pre>
<p>This allows much less duplication/redundancy when your dependent keys are mostly similar.</p>
<p>See the original PR <a href="https://github.com/emberjs/ember.js/pull/3538">#3538</a> for more details.</p>
<h4 id="emberrunbind">Ember.run.bind</h4>
<p><code>Ember.run.bind</code> provides a useful utility when integrating with non-Ember libraries
that provide asynchronous callbacks.</p>
<p>Ember utilizes a run-loop to batch and coalesce changes. This works by
marking the start and end of Ember-related JavaScript execution.</p>
<p>When using events such as a View's click handler, Ember wraps the event
handler in a run-loop, but when integrating with non-Ember libraries this
can be tedious.</p>
<p>For example, the following is rather verbose but is the correct way to combine
third-party events and Ember code.</p>
<pre><code class="javascript language-javascript">var that = this;
jQuery(window).on('resize', function(){
  Ember.run(function(){
    that.handleResize();
  });
});
</code></pre>
<p>To reduce the boilerplate, the following can be used to construct a
run-loop-wrapped callback handler.</p>
<pre><code class="javascript language-javascript">jQuery(window).on('resize', Ember.run.bind(this, this.handleResize));
</code></pre>
<p>For more details please reference the recently added <a href="/guides/understanding-ember/run-loop/">run-loop guide</a>
(much thanks to <a href="https://github.com/bfbriggs">Brendan Briggs</a>).</p>
<h4 id="withcontroller">With Controller</h4>
<p>The <code>{{with}}</code> helper can now accept a <code>controller</code> option. Adding <code>controller='something'</code>
instructs the <code>{{with}}</code> helper to create and use an instance of the specified controller
with the new context as its content.</p>
<p>This is very similar to using the <code>itemController</code> option with the <code>{{each}}</code> helper.</p>
<pre><code class="handlebars language-handlebars">{{#with users.posts controller='userBlogPosts'}}
  {{!- The current context is wrapped in our controller instance }}
{{/with}}
</code></pre>
<p>In the above example, the template provided to the <code>{{with}}</code> block is now wrapped in the
<code>userBlogPost</code> controller, which provides a very elegant way to decorate the context with custom
functions/properties.</p>
<h4 id="lazilyboundattributes">Lazily Bound Attributes</h4>
<p>Previously, every attribute that was bound added some degree of cost (mostly associated with maintaining
the bindings/observers themselves). This lead us to limit the list of attributes that were automatically
bound for <code>Ember.TextField</code>, <code>Ember.TextArea</code>, and friends. This is a common source of frustration as
more and more people want to bind to HTML5 attributes, but find that to do so they must reopen the
<code>Ember.TextField</code> class and add the attributes they need.</p>
<p>This might look like:</p>
<pre><code class="javascript language-javascript">Ember.TextField.reopen({
  attributeBindings: ['autofocus']
});
</code></pre>
<p>Then from the template:</p>
<pre><code class="handlebars language-handlebars">{{input autofocus=omgAutofocusMe}}
</code></pre>
<!-- alex ignore just -->
<p>This certainly is not ideal, and causes many issues for people that expect it to "just work".</p>
<p>Thankfully, this has gotten MUCH better with the 1.4 release. In 1.4 any attribute bindings that do not
exist at the time the view is first rendered will not have observers setup (therefore removing the original
performance concern), but if/when the attribute is set on the view later (after the first render) an observer
is setup at that time.</p>
<p>This means that we are only creating observers for actual properties that are present, but we can list every
valid HTML attribute in the <code>attributeBindings</code> property so that you can use them without having to reopen
internal classes.</p>
<p>As of Ember 1.4 you should be able to use any HTML5 attribute with <code>{{input type="text"}}</code>, <code>{{textarea}}</code>, and
<code>{{checkbox}}</code>.</p>
<h4 id="otherimprovements">Other Improvements</h4>
<p>As usual, there are a ton of bug fixes and small improvements in this
release. You can see a list of all the changes in the CHANGELOG:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.4.0/CHANGELOG.md">Ember.js 1.4.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.5.0-beta.1/CHANGELOG.md">Ember.js 1.5.0-beta.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-4-0-and-ember-1-5-0-beta-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-4-0-and-ember-1-5-0-beta-released</guid><pubDate>Wed, 12 Feb 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.5.0 and 1.6 Beta Released]]></title><description><![CDATA[<p>We are pleased to announce that both Ember.js 1.5.0 and the first beta in the 1.6 series
have been released. This comes as the fifth cycle of our six-week release
process that began after 1.0 was released.</p>
<h3 id="newfeaturesin15">New features in 1.5</h3>
<!-- alex disable savage -->
<h4 id="handlebarsloggingofprimitivevalues">Handlebars Logging of Primitive Values</h4>
<p>This feature allows you to log primitive values (strings, numbers, etc) from within your templates. Previously, the <code>{{log}}</code> helper only allowed usage of bound property lookup.</p>
<!-- alex enable savage -->
<pre><code class="handlebars language-handlebars">{{log "**LOOKEY HERE**"}}
</code></pre>
<h4 id="newtestinghelpers">New Testing Helpers</h4>
<h5 id="routinghelpers">Routing Helpers</h5>
<p>A few new testing helpers have been added to make it easier to make assertions on the state
of routing in your application (for example to confirm clicking a given link results in a
redirect to a specific route).</p>
<p>New routing test helpers: <code>currentRouteName</code>, <code>currentPath</code>, and <code>currentURL</code>.</p>
<h5 id="triggereventhelper">Trigger Event Helper</h5>
<p>A new <code>triggerEvent</code> helper has been created to allow triggering of arbitrary events on an element.</p>
<pre><code class="javascript language-javascript">triggerEvent('#some-element-id', 'dblclick');
</code></pre>
<h4 id="embercomputedreadonly">Ember.computed.readOnly</h4>
<p>Generally, when you use <code>Ember.computed.oneWay</code> you would also need to call <code>readOnly</code> to ensure no data
propagates back up.</p>
<pre><code class="javascript language-javascript">// prior to Ember.computed.readOnly you would have to do the following:
Ember.computed.oneWay('foo').readOnly()

// in 1.5 you can use the following for the same result:
Ember.computed.readOnly('foo')
</code></pre>
<h4 id="emberisblank">Ember.isBlank</h4>
<p>A new shortcut for checking if a particular object is empty or an empty string:</p>
<pre><code class="javascript language-javascript">Ember.isBlank();                // true
Ember.isBlank(null);            // true
Ember.isBlank(undefined);       // true
Ember.isBlank('');              // true
Ember.isBlank([]);              // true
Ember.isBlank('\n\t');          // true
Ember.isBlank('  ');            // true
Ember.isBlank({});              // false
Ember.isBlank('\n\t Hello');    // false
Ember.isBlank('Hello world');   // false
Ember.isBlank([1,2,3]);         // false
</code></pre>
<h4 id="eagerupdatingurl">Eager Updating URL</h4>
<p>Previously, the URL in the address bar would only update at the very end of
the transition. This change causes the URL update to happen immediately unless
the transition was aborted/redirected within the same run loop, which provides
for a better UX 99% of the time.</p>
<h4 id="autolocation">Auto Location</h4>
<p>Adds <code>auto</code> as a <code>location</code> option for the app's <code>Router</code>.</p>
<pre><code class="javascript language-javascript">App.Router.reopen({
  location: 'auto'
});
</code></pre>
<p>When used, Ember will select the best location option based off browser
support with the priority order: history, hash, none.</p>
<p>Clean pushState paths accessed by hashchange-only browsers will be redirected
to the hash-equivalent and vice versa so future transitions look consistent.</p>
<h4 id="boundactionlookup">Bound Action Lookup</h4>
<p>The <code>{{action}}</code> helper will now use a non-quoted parameter and perform a bound property
lookup against the action's target at the time the event is triggered. This allows usage
of a dynamic action name (determined by looking up the property).</p>
<h4 id="routesinheritmodel">Routes Inherit Model</h4>
<p>Ember routes and leaf resources (without nested routes) will inherit the parent route's model.</p>
<p>Take the following example:</p>
<pre><code class="javascript language-javascript">App.Router.map(function(){
  this.resource('post', function(){
    this.route('edit');
  });
});

App.PostRoute = Ember.Route.extend({
  model: function(){
    return {title: 'ZOMG', text: 'AWESOME'};
  }
});

App.PostEditRoute = Ember.Route.extend({
  model: function(){
    return this.modelFor('post');
  }
});
</code></pre>
<p>Now in 1.5, you do not have to define the <code>model</code> hook for <code>PostEditRoute</code> as the default implementation
is to use the parent routes model.</p>
<h3 id="othernotablechanges">Other Notable Changes</h3>
<h4 id="everpresent_superbreakingbugfix">Ever-present _super (Breaking Bugfix)</h4>
<p>Prior versions of Ember.js used a super mechanism that was un-safe for mixins. If more than
one <code>_super</code> was called for a given function name and there was no terminating function, an
infinite loop would occur. See <a href="https://github.com/emberjs/ember.js/issues/3523">#3523</a> for
further discussion.</p>
<p>The solution released in 1.5 fixes this behavior (see <a href="https://github.com/emberjs/ember.js/pull/3683">#3683</a>),
but also breaks the edge-case of using <code>_super</code> out of line. For instance:</p>
<pre><code class="JavaScript language-JavaScript">  doIt: function(){
    Ember.run.once(this, this._super);
  }
</code></pre>
<p>Is no longer a supported use of <code>_super</code>. See <a href="http://emberjs.jsbin.com/xuroy/1/edit?html,js,output">this jsbin</a>
for a live example. If this change impacts you, please comment on <a href="https://github.com/emberjs/ember.js/pull/4301">#4632</a>.</p>
<h4 id="handlebarseachhelperchecksmarkup">Handlebars {{each}} Helper Checks Markup</h4>
<p>In some cases, the browser may add or fix tags, which change the parentage of metamorph tags. This problem happens frequently when the
developer doesn't include the TBODY tag inside a table for example.  This prevents the framework from updating or cleaning the underlying DOM
elements.</p>
<p>An assertion has been added in non-production builds that indicates that the metamorph start and end tags have different parents.
This is most commonly caused by using an <code>{{each}}</code> inside of a <code>&lt;table&gt;</code> tag without specifying a <code>&lt;tbody&gt;</code>.</p>
<p>Example demonstrating the assertion (<a href="http://emberjs.jsbin.com/fotin/3/edit">JSBin here</a>):</p>
<pre><code class="handlebars language-handlebars">&lt;table&gt;
  {{#each}}
    &lt;tr&gt;&lt;/tr&gt;
  {{/each}}
&lt;/table&gt;
</code></pre>
<p>And the resolution is to include a <code>&lt;tbody&gt;</code> (<a href="http://emberjs.jsbin.com/fotin/2/edit">JSBin here</a>):</p>
<pre><code class="handlebars language-handlebars">&lt;table&gt;
  &lt;tbody&gt;
    {{#each}}
      &lt;tr&gt;&lt;/tr&gt;
    {{/each}}
  &lt;/tbody&gt;
&lt;/table&gt;
</code></pre>
<h3 id="otherimprovements">Other Improvements</h3>
<p>As usual, there are a ton of bug fixes and small improvements in this
release. You can see a list of all the changes in the CHANGELOG:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.5.0/CHANGELOG.md">Ember.js 1.5.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.6.0-beta.1/CHANGELOG.md">Ember.js 1.6.0-beta.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-5-0-and-ember-1-6-beta-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-5-0-and-ember-1-6-beta-released</guid><pubDate>Sun, 30 Mar 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.6.0 and 1.7 Beta Released]]></title><description><![CDATA[<p>We are pleased to announce that both Ember.js 1.6.0 and the first beta in the 1.7 series
have been released. This comes as the sixth cycle of our release process that began after 1.0 was released.</p>
<h3 id="delaysdetailed">Delays Detailed</h3>
<p>As many of you know, the 1.6 release is the first to be published after converting the
codebase to ES6 modules. The 1.6+ builds are now transpiled by the <a href="https://github.com/square/es6-module-transpiler">es6-module-transpiler</a>
into AMD and use a <a href="https://github.com/stefanpenner/loader.js">small AMD loader</a> to handle
loading the transpiled modules. Unfortunately, adding the additional loader overhead on
boot has a fairly significant performance impact on boot speed of older mobile clients
(approximately 5-10% boot time penalty).</p>
<p>This regression was brought to our attention before 1.6.0 was intended to ship (late
May), and we decided to hold the release until a fix could be applied. In retrospect this
was absolutely the wrong decision. The fix has taken much longer than originally anticipated
and in the meantime folks are stuck with 1.5.1. Many of our users either are not affected
or do not care about this regression, and they are forced to use beta/canary channels for
certain bug fixes that have already been made.</p>
<p>As a group the core team has decided that this type of delay is absolutely unacceptable and
apologize for the lack of clarity into what is going on.</p>
<h3 id="newfeaturesin16">New features in 1.6</h3>
<h4 id="embercomputedempty">Ember.computed.empty</h4>
<p><code>Ember.computed.empty</code> has been updated to automatically respect arrays without forcing users to use <code>array.[]</code>
as the dependent key.</p>
<h4 id="testfriendlypromises">Test Friendly Promises</h4>
<p>With 1.5.1 you were forced to wrap any Promise <code>resolve</code> and/or <code>reject</code> calls in an <code>Ember.run</code> loop
while in testing, but the same code did not need to be wrapped in a run loop for normal operation.</p>
<p>In 1.6.0 you do not need to do this promise run loop wrapping for the purposes of testing.</p>
<h4 id="emberrouteprototyperendernowhasamodeloption">Ember.Route.prototype.render Now has a model Option</h4>
<p>Previously, you would need to set the model explicitly on the other controller using
<code>controllerFor</code> (while trying to render a different template with <code>renderTemplate#render</code>).</p>
<p>Now <code>render</code> has an option to set the model that set the controller's content after the controller has been
looked-up.</p>
<p>Before:</p>
<pre><code class="javascript language-javascript">App.HomeRoute = Ember.Route.extend({
  renderTemplate: function(controller, model){
    this.controllerFor('bio').set('content', model);
    this.render('bio');
  }
});
</code></pre>
<p>After:</p>
<pre><code class="javascript language-javascript">App.HomeRoute = Ember.Route.extend({
  renderTemplate: function(controller, model){
    this.render('bio', {
      model: model
    });
  }
});
</code></pre>
<h3 id="othernotablechanges">Other Notable Changes</h3>
<ul>
<li>Add better debugging for Resolver Lookup</li>
</ul>
<p>A <code>LOG_RESOLVER</code> flag can now be added to your application instance to get nice logging output
showing each lookup the resolver is doing, including which were "hits" and which were "misses"
(checked items are "hits"):</p>
<pre><code class="bash language-bash">[ ] route:application ..........................................  App.ApplicationRoute
[✓] route:index ................................................  App.IndexRoute
[ ] controller:application .....................................  App.ApplicationController
</code></pre>
<ul>
<li>Ensure context is unchanged when using keywords with <code>itemController</code> for <code>{{each}}</code> or <code>controller</code> for <code>{{with}}</code>.</li>
</ul>
<p>Previously the following code would bind <code>this</code> in the template block to the
itemController's content (even though the keyword form of <code>{{each}}</code> or <code>{{with}}</code> is used). In 1.6.0
the context of the  block will correctly be unchanged, and the <code>post</code> property will be wrapped in the <code>post</code> controller.</p>
<pre><code class="handlebars language-handlebars">{{#each post in posts itemController='post'}}
  {{this}} - Should be the surrounding context, NOT changed to that of the itemController.
{{/each}}

{{#with post as somethingElse controller='post'}}
  {{this}} - Should be the surrounding context, NOT changed to that of the controller specified.
{{/with}}
</code></pre>
<ul>
<li>Fix swallowed rejections in asynchronous route hooks (this may mean that errors that were previously completely
swallowed are now surfaced in your application).</li>
<li><code>Ember.copy</code> and <code>Ember.isEqual</code> now support <code>Date</code> objects.</li>
<li>Backburner and RSVP now use the <code>Ember.onerror</code> handler if present to log errors.</li>
<li>An error is now thrown when injecting a factory into all factories of the same type.</li>
</ul>
<h3 id="queryparamsin17beta">Query Params in 1.7 Beta</h3>
<p>Thanks to the tireless work of <a href="https://github.com/machty">@machty</a> and team, query params support has finally landed and is
enabled by default in the 1.7 beta series! Please test and report any issues you come across.</p>
<h3 id="otherimprovements">Other Improvements</h3>
<p>As usual, there are a ton of bug fixes and small improvements in this
release. You can see a list of all the changes in the CHANGELOG:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.6.0/CHANGELOG.md">Ember.js 1.6.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.7.0-beta.1/CHANGELOG.md">Ember.js 1.7.0-beta.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-6-0-and-ember-1-7-0-beta-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-6-0-and-ember-1-7-0-beta-released</guid><pubDate>Mon, 07 Jul 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.6.1 Released]]></title><description><![CDATA[<p>Shortly after Ember 1.6.0 was released a regression was identified regarding custom error substates.
The error handling that was added to make debugging errors thrown in the Router's promise hooks
inadvertently caused the error substates to be completely ignored.</p>
<p>For more details review the following links:</p>
<ul>
<li>Failing <a href="http://emberjs.jsbin.com/juqij/2/edit?html,js,output">JSBin</a> from the original <a href="https://github.com/emberjs/ember.js/issues/5148">bug report</a>.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/5166">Fixing PR</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.6.1/CHANGELOG.md">Ember.js 1.6.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-6-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-6-1-released</guid><pubDate>Tue, 15 Jul 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 1.7.0 and 1.8 Beta Released]]></title><description><![CDATA[<p>We are pleased to announce that both Ember.js 1.7.0 and the first beta in the 1.8 series
have been released. This comes as the seventh cycle of our release process that began after 1.0 was released.</p>
<p>This release brings bug fixes, potentially breaking changes and new features.</p>
<h2 id="newfeatures">New Features</h2>
<h3 id="nestablethisroute">Nestable <code>this.route</code></h3>
<p>This change removes the restriction that only <code>this.resource</code> can have nested
child routes.</p>
<p>Prior to this change, using <code>this.resource</code> would reset the namespace and in order
to preserve it you had to do the following:</p>
<pre><code class="javascript language-javascript">this.resource('foo', function() {
  this.resource('foo.bar', function() {
    this.resource('foo.bar.baz', function() {
      // All this repetition to get an
      // intuitively-named FooBarBazRoute
    });
  });
});
</code></pre>
<p><code>this.route</code> can be nested like <code>this.resource</code>, but unlike this.resource, the namespace
of child routes is appended rather than reset to a top-level namespace, allowing the above to be
written as:</p>
<pre><code class="javascript language-javascript">this.route('foo', function() {
  this.route('bar', function() {
    this.route('baz', function() {
       // uses FooBarBazRoute
       // generates foo.bar.baz.index
       // generates FooBarBazIndexRoute
     });
   });
});
</code></pre>
<p>Unnested <code>this.route</code> works the same way as before.</p>
<h3 id="queryparams">Query Params</h3>
<p>Thanks to the tireless work of <a href="https://github.com/machty">@machty</a> and team, query params
support has finally landed and is a part of the 1.7.0 release!</p>
<p>Ember now has first class support for URL query parameters (e.g. <code>/?page=1&amp;sort=last_name</code>).
With this API, each query param is bound to a property on a controller, such that changes made
to query params in the URL (e.g. user presses the back button) will update the controller property,
and vice versa.</p>
<p>The API handles many of tricky aspects of maintaining a binding to a URL, such as:</p>
<ul>
<li>coalescing multiple controller property changes into a single URL update</li>
<li>correctly casting new URL query param values to the datatype expected by the controller property
(e.g. <code>"true"</code> for a boolean property casts to <code>true</code>, <code>"123"</code> for a numeric property casts to <code>123</code>)</li>
<li>omitting default query param values from the URL so as to not unnecessarily clutter the URL
with default values</li>
</ul>
<p>Please read the <a href="/guides/routing/query-params/">Query Params Guide</a> for more information.</p>
<h2 id="breakingchangesanddeprecations">Breaking Changes and Deprecations</h2>
<p>The following are a few deprecation warnings and breaking changes that have been included in 1.7.
Please review the new <a href="http://emberjs.com/deprecations/">Deprecations Page</a> for more details.</p>
<h3 id="controllersmodelproperty">Controller's <code>model</code> property</h3>
<!-- alex ignore simple -->
<p>On Controllers, the content property is now derived from model. This reduces many caveats with model/content, and also sets a simple ground rule: Never set a controller's content, rather always set its model.</p>
<h3 id="bindattrandemptyarrays"><code>bind-attr</code> and empty arrays</h3>
<p>An empty array is treated as falsy value in <code>bind-attr</code> to be in consistent with <code>if</code> helper.
Breaking for apps that relies on the previous behaviour which treats an empty array as
truthy value in <code>bind-attr</code>.</p>
<h2 id="otherimprovements">Other Improvements</h2>
<p><code>Ember</code> is now using <code>RSVP</code> 3.0.13 and brings fixes for <code>RSVP.hash</code> in IE8.</p>
<h2 id="ember180beta1">Ember 1.8.0-beta.1</h2>
<h3 id="supportforie6and7">Support for IE 6 and 7</h3>
<p>Usage of Ember is deprecated for Internet Explorer 6 and 7, support will be removed
in the next major version.</p>
<h3 id="refactoredviewlayer">Refactored view layer</h3>
<p>Internal implementation of the view layer has been refactored. Many of you remember
<code>script</code> tags in the DOM:</p>
<pre><code class="html language-html">&lt;script id="metamorph-1-start" type="text/x-placeholder"&gt;&lt;/script&gt;
&lt;script id="metamorph-1-end" type="text/x-placeholder"&gt;&lt;/script&gt;
</code></pre>
<p>That's how <code>Ember</code> knows how to update the values in the DOM. This refactor removes
the need for <code>script</code> tags.</p>
<h3 id="actionslookuponcontroller">Actions lookup on controller</h3>
<p>Some of you might remember that you could define action handlers in the root of the
controller, like so:</p>
<pre><code class="javascript language-javascript">App.HomeController = Ember.ObjectController.extend({
  someAction: function() {
    // handle the action
  }
});
</code></pre>
<p>A deprecation warning was added in late 2013 that would print a nice deprecation notice
if you happen to use an action name that was also found in the root of the controller.
Unfortunately, even with the deprecation, we still have the possibility to conflict
with controller level methods and properties.</p>
<p>To define action handler, you should place it under <code>actions</code> hash, like so:</p>
<pre><code class="javascript language-javascript">App.HomeController = Ember.ObjectController.extend({
  actions: {
    someAction: function() {
      // handle the action
    }
  }
});
</code></pre>
<p>This change will remove support for older action lookup in the root of the controller
completely, and finally allow usage of nearly any action name without the need to
check if that name was also used by the controller.</p>
<p>Also, this release introduces numerous bug fixes and small improvements. You can see a list of all the changes in the CHANGELOG:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.7.0/CHANGELOG.md">Ember.js 1.7.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.8.0-beta.1/CHANGELOG.md">Ember.js 1.8.0-beta.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-7-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-7-0-released</guid><pubDate>Sat, 23 Aug 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 1.8.0 and 1.9 Beta Released]]></title><description><![CDATA[<p>We are pleased to announce that both Ember.js 1.8.0 and the first beta in the
1.9 series have been released. This comes as the eighth cycle of our release
process that began after 1.0 was released.</p>
<p>This release represents the effort of at least 40 contributors across over 600 commits.</p>
<h2 id="majorrenderinglayerrefactormetalviews">Major rendering-layer refactor ("metal-views")</h2>
<p>In previous versions of Ember.js, the HTML of a page was created (via
Handlebars) and assembled (via the render tree) using string concatenation. In
Ember.js 1.8, fragments of a page are still created (via Handlebars) as
strings, but are then parsed into DOM and assembled as a DOM tree.</p>
<p>Metal-views is the first part of the HTMLBars effort to land in Ember. It is
an important step towards the complete removal of strings from the Ember.js
rendering pipeline.</p>
<p>Introducing HTMLBars into Ember incrementally demonstrates the community's
commitment to semantic versioning, and to improving the framework without
abandoning existing codebases.</p>
<p>Some of the immediate benefits of this refactor are:</p>
<ul>
<li>The removal of recursion from the rendering layer. This decreases garbage
collection pressure during rendering and allows the re-use of objects during
render (for example, the render buffer).</li>
<li>Improved HTML namespace and contextual element tracking. This introduces
support for components, data-binding, and logic within inline SVG documents.
<a href="http://jsbin.com/woxes/8/">Example JSBin</a></li>
<li>Prior versions of Ember.js relied upon script tags to mark
regions of data bound content. For example, a template that has <code>{{name}}</code>
might be rendered into the page as:</li>
</ul>
<pre><code class="html language-html">&lt;script id="metamorph-1-start" type="text/x-placeholder"&gt;&lt;/script&gt;
Bob
&lt;script id="metamorph-1-end" type="text/x-placeholder"&gt;&lt;/script&gt;
</code></pre>
<p>These script tags could interfere with <code>:first-child</code> and other CSS selectors,
and were a general nuisance. In Ember.js 1.8 the library powering these
bindings (<a href="https://github.com/tomhuda/metamorph.js/">metamorph.js</a>) has been
replaced with a completely re-written engine that uses blank text nodes
(<a href="https://github.com/tildeio/htmlbars/blob/master/packages/morph/lib/morph.js">morph.js</a>). One of the major touted benefits of HTMLBars, the Ember team is
happy to make this a reality in 1.8.</p>
<p>Many thanks to <a href="https://twitter.com/krisselden">@krisselden</a>,
<a href="https://twitter.com/ebryn">@ebryn</a>, <a href="https://twitter.com/_mmun">@mmun</a>,
<a href="https://twitter.com/mixonic">@mixonic</a>, and all developers who took time to
test their applications on 1.8 beta. Delivering this update without breaking
1.x API compatibility took a significant community effort.</p>
<h2 id="performanceimprovements">Performance Improvements</h2>
<p>Ember.js 1.8 comes with several performance improvements in other parts of the
codebase.</p>
<ul>
<li>Ember.js APIs often require the use of a string to lookup a class or route.
Often these strings must be passed through a normalization step before they are
used, such as pluralizing, singularizing, or changing snake_case to camelCase.
1.8 introduces several caches for these operations, resulting in common
operations being performed far fewer times.</li>
<li>The refactoring of commonly de-optimized functions in v8 and other browsers.</li>
<li>The conversion of <code>MANDATORY_SETTER</code> from a runtime flag into a build-time
feature flag. This allows relevant code paths in <code>get</code> and <code>set</code> to be slimmer
in production builds.</li>
</ul>
<p>Thanks to <a href="https://twitter.com/stefanpenner/">@stefanpenner</a> and
<a href="https://twitter.com/twokul">@twokul</a> for their continued efforts on
performance tuning.</p>
<h2 id="notabledeprecations">Notable Deprecations</h2>
<p>As Ember.js moves forward, various APIs are deprecated to allow for their
removal in a later major release (such as 2.0). With this release a
<a href="http://emberjs.com/deprecations/">deprecations page</a> has been added to
the Ember.js website. This guide will help developers refactor their code away
from old APIs.</p>
<p>Four notable deprecations are added with the release of 1.8.</p>
<ul>
<li><code>Ember.Set</code> is a class for managing an unordered collection of objects (<a href="http://emberjs.com/api/classes/Ember.Set.html">api
docs</a>). It is a private API and
thus subject to change, however several libraries have chosen to use it despite
this. Since the addition of this API to Ember, the ES6 draft has matured in its
description of a native JavaScript Set class. <code>Ember.Set</code> is not compatible
with the upcoming API, and is now deprecated.</li>
<li>In an effort to more closely align <code>Ember.Map</code> with ES6, the <code>remove</code> method
has been deprecated in favor of <code>delete</code>.</li>
<li>The <code>currentWhen</code> property on links is deprecated in favor of <code>current-when</code>.
This property name more closely tracks how component properties will be used in the
future.</li>
<li>Old versions of Ember.js, the guides, and the API documentation suggested
looking up views as globals. For example <code>{{view App.SomeView}}</code>. In
Ember.js 1.8 this style of view lookup is deprecated in favor of using a
string, similar to how other class lookups behave in Ember. <a href="http://emberjs.com/deprecations/v1.x#toc_global-lookup-of-views">See
this page</a>
for details about transitioning away from global view lookups.</li>
<li>URLs containing a hash and no <code>/</code>, such as <code>/foo#bar</code> are handled by the
router's <code>hash</code> location handler. When using the <code>auto</code> location handler, the
presence of <code>#</code> will cause the <code>hash</code> handler to be chosen over the <code>history</code>
handlers, despite the lack of a leading <code>/</code> in the path (for example <code>/foo#/bar</code>.
This makes using anchors with the <code>history</code> handler impossible. Ember.js
1.9 will correct this bug, and in 1.8 a deprecation is raised.</li>
</ul>
<h2 id="breakingchanges">Breaking Changes</h2>
<p>Ember.js strives to maintain strict API compatibility across minor releases.
In cases of API inconsistency or where behavior is unspecified, breaking changes
may be introduced to resolve the issue. Additionally, deprecated APIs may
be removed if they were from a previous major release (such as pre-1.0
deprecations).</p>
<p>In this release there are several small breaking changes that may impact your
application.</p>
<ul>
<li><code>didInsertElement</code> is now always called on a child view before it is called
on a rendering parent view. In previous releases of Ember.js <code>didInsertElement</code>
would often be called first on a parent view, however this behavior was
inconsistent. In general, developers are encouraged
to consider scheduling work into the <code>afterRender</code> queue if it includes
accessing DOM not immediately under that view's control.</li>
<li>Actions defined directly on the controller object
and not in the <code>actions:</code> hash have been deprecated since Ember.js 1.0. In
Ember.js 1.8 support for those actions has been removed.</li>
<li><code>Ember.Map</code> has been tweaked to more closely match the ES6 spec for <code>Map</code>. The
<code>forEach</code> callback now takes <code>value,key,map</code> as arguments. Previously it was passed
<code>key,value</code>. This API is private, but several libraries have chosen to use it
despite this. Ember-Data now includes <a href="https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/map.js">a polyfill</a>. <code>Ember.OrderedSet</code>, a super class of <code>Ember.Map</code>, has
also had minor ES6 cleanups applied.
to allow consistent usage across the pre-1.8 and 1.8 API.</li>
<li>Ember.js has long had an run-time flag called <code>MANDATORY_SETTER</code>. With this
flag enabled, attempts to set an observed object property without the use of
<code>Ember.set()</code> would throw an error (a desirable behavior for development
builds). This runtime flag has been changed to a
standard build-time feature flag named <code>mandatory-setter</code>, allowing it to
be removed from production builds entirely.</li>
</ul>
<h2 id="emberjs19beta">Ember.js 1.9 beta</h2>
<p>As with any minor release of Ember.js, the current canary branch is forked
to become the next beta. This ensures a constant graduation of features and
improvements for release. Builds of beta are made available every
week for six weeks, then promoted to release.</p>
<p>In Ember.js 1.9 several new features and changes will be introduced.</p>
<ul>
<li>"Streams" are a new Ember.js internal that replace bindings at the lowest
level of the Ember rendering pipeline. They greatly simplify the implementation
of template helpers and are yet another important step toward the landing of
HTMLBars.</li>
<li>Handlebars 2.0 will be required for Ember.js 1.9. See <a href="http://emberjs.com/blog/2014/10/16/handlebars-update.html">this summary
of the transition</a>
for more details.</li>
<li>Further performance improvements and bugfixes.</li>
</ul>
<h2 id="changelogs">Changelogs</h2>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.8.0/CHANGELOG.md">Ember.js 1.8.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.9.0-beta.1/CHANGELOG.md">Ember.js 1.9.0-beta.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-8-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-8-0-released</guid><pubDate>Sun, 26 Oct 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 1.8.1 Released]]></title><description><![CDATA[<p>Today we are releasing Ember.js 1.8.1, a patch-level release of Ember that
fixes several minor regressions introduced in the 1.8 release.</p>
<h3 id="throwexceptionwhenattributebindingsincludesclass">Throw exception when <code>attributeBindings</code> includes <code>class</code></h3>
<p>Prior to 1.8, it was possible to make <code>class</code> part of <code>attributeBindings</code> and have
those values merged with <code>classNameBindings</code>. For example, with the following template
and code "from-template" and "from-class" would be merged into the DOM node's class
list.</p>
<pre><code class="handlebars language-handlebars">{{foo-bar class="from-template"}}
</code></pre>
<pre><code class="javascript language-javascript">App.FooBarComponent = Ember.Component.extend({
  classNameBindings: [':from-class'],
  attributeBindings: ['class']
});
</code></pre>
<p>The intent of this code is unclear and the pre-1.8 behavior was unintentional. In Ember
1.8.1 an exception is thrown for including <code>class</code> in <code>attributeBindings</code>.</p>
<h3 id="viewinstances">View instances</h3>
<p>Passing view instances to the <code>{{view}}</code> helper was broken in Ember.js 1.8. This behavior
has been restored.</p>
<h3 id="workaroundprovidedformoreios8armv7jitbugs">Work-around provided for more iOS8 ARMv7 JIT Bugs</h3>
<p>iOS8 has introduced a severe bug in optimized ARMv7 code. In 1.8.0 we worked around the issue
in a number of modules, and we have expanded our work around for more modules in 1.8.1</p>
<p>Further Reading:</p>
<ul>
<li><a href="https://bugs.webkit.org/show_bug.cgi?id=138038">https://bugs.webkit.org/show_bug.cgi?id=138038</a></li>
<li><a href="https://github.com/emberjs/ember.js/issues/5606">https://github.com/emberjs/ember.js/issues/5606</a></li>
</ul>
<h3 id="supportrenderingofnullprototypeobjects">Support rendering of null-prototype objects</h3>
<!-- alex ignore special -->
<p>meta-data objects in Ember-Data are null-prototype, a special kind of object created
with <code>Object.create(null)</code>. In 1.8 these objects could not be rendered. 1.8.1 repairs
this.</p>
<h3 id="supportnonstringunescapedcontent">Support non-string unescaped content</h3>
<p>In Ember 1.8 rendering an unescaped value that was not a string <code>{{{someNumberLiteral}}}</code>
would raise an exception. This has been fixed.</p>
<h3 id="supportmultipleoptionrenderingtemplateblocks">Support multiple option-rendering template blocks</h3>
<p>In Ember 1.8, template strings are parsed into DOM via <code>innerHTML</code>. Creating a stand-alone
option tag this way results in that tag being considered "selected" even if it is not
explicitly so. Consequently the last option of a select would often be selected upon
render instead of the first.</p>
<p>We've restored support for templates like this:</p>
<pre><code class="handlebars language-handlebars">&lt;select&gt;
  &lt;option&gt;First option is selected at render in 1.8.1&lt;/option&gt;
  {{#each item in items}}
    &lt;option&gt;{{item.name}}&lt;/option&gt;
  {{/each}}
&lt;/select&gt;
</code></pre>
<!-- alex disable whitespace -->
<h3 id="knownwhitespaceissuesinchrome">Known whitespace issues in Chrome</h3>
<p>Some templates may result in missing whitespace in Chrome. For example,
if the following template renders initially with no names, then updates
via data-binding later, the space between names may not be visible.</p>
<!-- alex enable whitespace -->
<pre><code class="handlebars language-handlebars">{{firstName}} {{lastName}}
</code></pre>
<p>In Ember.js 1.9 we expect to land a refactor to the morph library that
updates dynamic DOM content, and this should alleviate this issue. Merging
the refactor into a point release is
too risky, so we have labelled this issues a wont-fix.</p>
<p>The Chrome team has been notified of this bug and you can track
progress <a href="https://code.google.com/p/chromium/issues/detail?id=428313">here</a>.</p>
<h2 id="changelogs">Changelogs</h2>
<ul>
<li><a href="https://github.com/emberjs/ember.js/compare/v1.8.0…stable">Ember.js 1.8.0 to 1.8.1 commit log</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.8.1/CHANGELOG.md">Ember.js 1.8.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-8-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-8-1-released</guid><pubDate>Tue, 04 Nov 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 1.9.0 and 1.10 Beta Released]]></title><description><![CDATA[<p>We are pleased to announce the release of both Ember.js 1.9.0 and the
first beta in the 1.10 series. This comes as the ninth cycle of our
release process that began after 1.0 was released.</p>
<p>The 1.9 release represents the effort of at least 52 contributors across over 436 commits.</p>
<h2 id="theroadtoember20">The Road to Ember 2.0</h2>
<p>In early November Tom, Yehuda, and the Ember.js Core Team shared <a href="https://github.com/emberjs/rfcs/pull/15">The Road to Ember 2.0</a>.
This RFC document acts as a map for the next several releases of Ember.js.</p>
<p>Ember.js 1.9 introduces several important deprecations that signal upcoming changes. Additionally, many view-layer internals are
refactored to take advantage of the "streams" observation pattern.</p>
<p>Ember.js 1.10 (beta) begins a series of releases that will
introduce new APIs while deprecating ones to be removed in 2.0.</p>
<p>To that end, and with much excitement, <strong>we are extremely pleased to announce the introduction
of the HTMLBars templating engine into Ember.js 1.10</strong>. This new rendering pipeline
marks a significant milestone for the framework, and by maintaining
complete API compatibility it demonstrates our commitment to stability without stagnation.</p>
<h2 id="newfeaturesanddeprecationsinemberjs19">New Features and Deprecations in Ember.js 1.9</h2>
<h3 id="handlebars20">Handlebars 2.0</h3>
<p>As <a href="http://emberjs.com/blog/2014/10/16/handlebars-update.html">announced in October</a>, Ember.js 1.9
adds support for Handlebars 2.0 templates and removes support for Handlebars 1.x templates. This
change does not affect the template syntax or public API of Ember applications.</p>
<p>Projects using an Ember-CLI version less than 0.1.5 will require a bump
of the Handlebars dependency version:</p>
<pre><code class="markup language-markup">bower install --save handlebars#2.0.0
</code></pre>
<p>Additionally the template pre-compiler (installed via npm)
will require an update:</p>
<pre><code class="bash language-bash">npm uninstall --save-dev broccoli-ember-hbs-template-compiler
npm install --save-dev ember-cli-htmlbars@0.6.0
</code></pre>
<p>Non-CLI applications will likewise require a bump of their Handlebars dependency version.</p>
<h3 id="streams">Streams</h3>
<p>Data-binding in Ember.js has traditionally been based on the concept of a key-value
observer. In Ember 1.x, KVO observers fire immediately upon the change of a value,
giving them performance characteristics that cannot be changed until Ember 2.0. In
comparison, streams distinguish change notification from value calculation. The value of
a stream can be described as "lazy", as it is not computed until needed.</p>
<p>The addition of streams to Ember and their use throughout the view layer
improves the performance of rendering, simplifies many helpers, and prepares
Ember's codebase for HTMLBars.</p>
<p>Thanks to <a href="https://twitter.com/_mmun">@_mmun</a>, <a href="https://twitter.com/ebryn">@ebryn</a>, and <a href="https://twitter.com/krisselden">@krisselden</a> who wrote an Ember.js stream
implementation then updated every Handlebars helper to the new API.</p>
<h3 id="activateanddeactivateevents">Activate and Deactivate Events</h3>
<p>Ember.js routes have long supported an <code>activate</code> and <code>deactivate</code> hook.
For example:</p>
<pre><code class="javascript language-javascript">// app/routes/index.js
export default Ember.Route.extend({
  activate: function(){
    collectAnalytics();
  }
});
</code></pre>
<p>Ember.js 1.9 introduces corresponding events for these hooks.</p>
<pre><code class="javascript language-javascript">// app/routes/index.js
export default Ember.Route.extend({
  collectAnalytics: function(){
    collectAnalytics();
  }.on('activate')
});
</code></pre>
<p>Thanks to <a href="https://twitter.com/pangratz">@pangratz</a> for the addition of this feature.</p>
<h3 id="pausetest">pauseTest</h3>
<p>When debugging an Ember acceptance test, it can be helpful to
pause and inspect the DOM or application state.
Ember.js 1.9 adds a new test helper for indefinitely pausing
test execution.</p>
<pre><code class="javascript language-javascript">test('clicking login authenticates', function(){
  visit('/');
  return pauseTest();
  // The test will never proceed to execute this click
  click('a:contains(Login)');
});
</code></pre>
<p>Thanks to <a href="https://twitter.com/katiegengler">@katiegengler</a> for the addition of this feature.</p>
<h3 id="keyupandkeydownactions">key-up and key-down actions</h3>
<p>The <code>{{input}}</code> and <code>{{textarea}}</code> helpers in Ember emit several
actions, including <code>enter</code>, <code>insert-newline</code>, <code>escape-press</code>, <code>focus-in</code>,
<code>focus-out</code>, and <code>key-press</code>.</p>
<p>This release introduces <code>key-up</code> and <code>key-down</code> actions. For example:</p>
<pre><code class="handlebars language-handlebars">{{! call the `validateName` action on the current controller
    or component scope: }}
{{input value=name key-up="validateName"}}
</code></pre>
<h3 id="performanceimprovements">Performance Improvements</h3>
<p>Ember.js 1.9 comes with several performance improvements.</p>
<ul>
<li>The implementation of <code>_super</code> in Ember is fairly complex, and can
perform badly. Ember 1.9 uses a check against the string version of a
function to determine if all parts of the implementation are needed, or
if some work can be skipped.</li>
<li>Additional improvements to the performance of <code>Ember.Map</code> have been made.</li>
</ul>
<p>Thanks to <a href="https://twitter.com/stefanpenner">@stefanpenner</a> for his continued
efforts on performance tuning.</p>
<h3 id="notabledeprecations">Notable Deprecations</h3>
<p>As Ember.js moves forward, various APIs are deprecated to allow for their
removal in a later major release (such as 2.0). The
<a href="http://emberjs.com/deprecations/">deprecations page</a> summarizes
deprecations and demonstrates how to update to a new API.</p>
<p>Ember 1.9 deprecates context switching in templates. Templates with context
switching are difficult to read, and the concept is challenging for new
developers. The removal of context switching from templates in
Ember 2.0 aims to make scoping consistent and predictable. This deprecation
is a step toward that goal.</p>
<p>Two Ember helpers support context switching. The first is <code>{{each}}</code>:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/people.hbs --}}
{{! this context is the controller }}
{{#each model}}
  {{name}} {{! this context is each person }}
{{/each}}
</code></pre>
<p>The non-context switching version of this helper is now preferred:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/people.hbs --}}
{{! this context is the controller }}
{{#each person in model}}
  {{person.name}} {{! this context is still the controller }}
{{/each}}
</code></pre>
<p>The second helper is <code>{{with}}</code>:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/people.hbs --}}
{{! this context is the controller }}
{{#with model}}
  {{name}} {{! this context is the person }}
{{/with}}
</code></pre>
<p>The non-context switching version of this helper is now preferred:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/people.hbs --}}
{{! this context is the controller }}
{{#with model as person}}
  {{person.name}} {{! this context is still the controller }}
{{/with}}
</code></pre>
<h2 id="newfeaturesanddeprecationsinemberjs110">New Features and Deprecations in Ember.js 1.10</h2>
<p>Ember.js 1.10 marks the migration of Ember's rendering pipeline from a
string-based process to a DOM-based one. <strong>Existing application templates require
no modification to run HTMLBars</strong>. New syntaxes enabled by Ember's DOM-based
rendering pipeline and HTMLBars will land over the next several releases.</p>
<p>Before branching into 1.10 beta, HTMLBars was available for nearly two weeks
behind a canary feature flag. We thank the community members who took time from
work or weekends to test the change and provide feedback.</p>
<p>Teasing apart the HTMLBars project to ship it incrementally has ensured
that existing codebases can make the jump without modification. This release
lays the infrastructural groundwork for features and even greater performance
improvements to come.</p>
<p>Input and feedback on the 1.10 beta from real-world use will help us ensure a
smooth transition to release.</p>
<p>To test your Ember-CLI codebase on Ember.js 1.10 and HTMLBars, follow these steps
to upgrade Ember:</p>
<pre><code class="bash language-bash">rm -rf bower_components
bower install --save ember#beta
bower install
</code></pre>
<p>Then update your template compiler to HTMLBars:</p>
<pre><code class="bash language-bash">npm uninstall --save-dev broccoli-ember-hbs-template-compiler
npm install --save-dev ember-cli-htmlbars
</code></pre>
<p>Over the beta cycle, we expect to see 3rd party libraries and
build pipelines update to support HTMLBars. If you manage a project
and have any difficulty, reach out to the community and core team
on the <a href="http://discuss.emberjs.com/">forum</a> or <code>#ember-dev</code> IRC chatroom.</p>
<h3 id="blockparams">Block Params</h3>
<p>Block parameters are a new feature introduced with 1.10. They address
two problems in Ember:</p>
<ul>
<li>The non-context switching version of <code>{{#each}}</code> and <code>{{#with}}</code> are inconsistent.
<code>{{#each car in cars}}</code> and <code>{{#with model as car}}</code> have similar meaning but
different syntaxes.</li>
<li>Ember's components are strictly encapsulated. Values are explicitly passed
in, and only actions are emitted from components. The inability to pass values
makes composition of components difficult.</li>
</ul>
<p>Block params add a template syntax that allows values to be yielded from
one helper or component to a child scope. The new syntax makes
the named value version of <code>{{#each}}</code> and <code>{{#with}}</code> consistent. For
example:</p>
<pre><code class="handlebars language-handlebars">{{currentUser.name}} {{! available on the controller }}
{{#each cars as |car|}}
  {{#with car.manufacturer as |make|}}
    {{make.name}}
    {{currentUser.name}} {{! still the controller scope }}
  {{/with}}
{{/each}}
</code></pre>
<p>Preserving template scope context results in easier to read templates.</p>
<p>Any component in Ember 1.10 can use this feature. For example:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/components/my-unordered-list.hbs --}}
&lt;ul&gt;
  {{#each items as |item|}}
    &lt;li&gt;{{yield item}}&lt;/li&gt;
  {{/each}}
&lt;/ul&gt;
</code></pre>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/index.hbs --}}
{{#my-unordered-list items=cars as |car|}}
  Auto: {{car.name}}
{{/my-unordered-list}}
</code></pre>
<p>The <code>my-unordered-list</code> component is called, passing <code>cars</code> as <code>items</code>. The
component template iterates through
each <code>item</code> in <code>items</code>, yielding to the calling template with a block
param. The calling template accepts the block param as <code>car</code> and displays the
car's name.</p>
<p>Many thanks to <a href="https://twitter.com/_mmun">@_mmun</a> for the implementation of this important new feature.</p>
<h3 id="renamingreleasefiles">Renaming Release Files</h3>
<p>A release of Ember.js consists of three files:</p>
<ul>
<li><code>ember.prod.js</code> - an un-minified production build (no asserts)</li>
<li><code>ember.min.js</code> - a minified production build</li>
<li><code>ember.js</code> - a development build (with asserts)</li>
</ul>
<p>The non-production build of Ember will not perform as well as the
production build. To ensure there is no confusion about using the
<code>ember.js</code> build in production, Ember.js 1.10 and later will use a
new filename:</p>
<ul>
<li><code>ember.prod.js</code> - an un-minified production build (no asserts)</li>
<li><code>ember.min.js</code> - a minified production build</li>
<li><code>ember.debug.js</code> - a development build (with asserts)</li>
</ul>
<p>An <code>ember.js</code> file will continue to be provided with a deprecation warning.</p>
<h3 id="notabledeprecationsin110">Notable Deprecations in 1.10</h3>
<p>The following deprecations are scheduled for release with Ember.js 1.10:</p>
<ul>
<li>Setting the <code>childViews</code> property on a view definition will be deprecated in
1.10. For example:</li>
</ul>
<pre><code class="javascript language-javascript">var ChildB = Ember.View.extend();

export default Ember.ContainerView.extend({
  childViews: [ 'childA', ChildB ],
  childA: Ember.View.extend()
});
</code></pre>
<p>This use of <code>childViews</code> is inconsistent with other uses throughout Ember, and
as a result is difficult to implement with good performance. Explicitly creating
views upon initialization is preferred:</p>
<pre><code class="javascript language-javascript">var ChildB = Ember.View.extend();

export default Ember.ContainerView.extend({
  init: function(){
    this._super();
    this.pushObject(this.createChildView(this.childA));
    this.pushObject(this.createChildView(ChildB));
  },
  childA: Ember.View.extend()
});
</code></pre>
<ul>
<li>The <code>beforeObserver</code> feature is deprecated in Ember 1.10. Before observers
are rarely used, but introduce significant overhead to the observer system
in general. For observer use that requires the previous value of a property
be known, implementing a cache is easier and more efficient. Read more about
how to do this in <a href="http://emberjs.com/deprecations/v1.x#toc_deprecate-beforeobservers">the deprecations page</a>.</li>
<li>Quote-less outlet names are deprecated in 1.10. An example of this is
<code>{{outlet modal}}</code>, which would be re-written as <code>{{outlet "modal"}}</code>.
This ensures the outlet helper is consistent with others, where unquoted
words are values and not string literals.</li>
</ul>
<p>As the features included in Ember 1.11 are developed, additional deprecations
may be added to the 1.10 release.</p>
<h2 id="changelogs">Changelogs</h2>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.9.0/CHANGELOG.md">Ember.js 1.9.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.10.0-beta.1/CHANGELOG.md">Ember.js 1.10.0-beta.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-9-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-9-0-released</guid><pubDate>Mon, 08 Dec 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 1.9.1 Released]]></title><description><![CDATA[<p>Today, the Ember team is pleased to announce the release of Ember.js
1.9.1. Ember 1.9.1 fixes one regression and introduces more conservative
escaping of attributes to help developers guard against inadvertent cross-site
scripting (XSS) vulnerabilities.</p>
<h3 id="viewhelperinstances">{{view}} Helper &amp; Instances</h3>
<p>The 1.9.0 release introduced a regression where the Handlebars
<code>{{view}}</code> helper would only work with <code>Ember.View</code> subclasses, not
instances. In 1.9.1, passing a view instance to the helper has been
fully restored.</p>
<p>We intended to deprecate this functionality, not remove it entirely.
If your app was relying on this behavior, first, please accept our
apologies for the accidental regression. Second, please consider
refactoring your code to use components instead of views, as support for
this API will be removed in Ember 2.0.</p>
<h3 id="xssimprovementsforboundattributes">XSS Improvements for Bound Attributes</h3>
<p>XSS vulnerabilities happen when you unintentionally put unescaped
user-supplied content into the DOM, creating a vector for attackers
to trick the browser into evaluating JavaScript that has the same access
to data as your legitimate JavaScript.</p>
<p>Since its inception, Ember.js has automatically guarded against these
attacks by HTML-escaping any bound data that goes into the DOM. For
example, given this model data:</p>
<pre><code class="javascript language-javascript">{
  "firstName": "&lt;script type=javascript&gt;alert('pwned!');&lt;/script&gt;"
}
</code></pre>
<p>The following template would not be vulnerable to XSS:</p>
<pre><code class="handlebars language-handlebars">Hello, {{firstName}}!
</code></pre>
<p>That's because Ember automatically replaces the &lt; and &gt; characters
with <code>&amp;lt;</code> and <code>&amp;gt;</code>.</p>
<p>However, there is still another potential exploit vector: bound attributes.</p>
<p>Let's say you display a profile for your users and allow them to supply
an arbitrary homepage that your app links to:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/user.hbs --}}
First Name: {{firstName}}
Homepage: &lt;a {{bind-attr href=homepageUrl}}&gt;{{homepageUrl}}&lt;/a&gt;
</code></pre>
<p>While this template may look harmless at first glance, imagine a
malicious user provides the following data:</p>
<pre><code class="javascript language-javascript">{
  "firstName": "Guardians of Peace",
  "homepageUrl": "javascript:alert('Kim Jong Un is not to be
disrespected!')"
}
</code></pre>
<p>If the attacker can induce another user to click the profile link, you
will have inadvertently allowed their JavaScript to be evaluated in the
same origin as your trusted code.</p>
<p>As of Ember 1.9.1, we will automatically escape any bound <code>href</code>, <code>src</code>
or <code>background</code> attributes that contain a <code>javascript:</code> or <code>vbscript:</code>
protocol handler by prefixing their value with <code>unsafe:</code>.</p>
<p>We are also releasing a new beta version of Ember 1.10 that contains
even more targeted fixes. Thanks to the additional power the HTMLbars
parser gives us, these attributes will only be escaped on elements where
they trigger a top-level navigation and thus a potential exploit: <code>a</code>,
<code>body</code>, <code>link</code>, <code>iframe</code>, and <code>img</code>.</p>
<p>We'd like to thank Mano and Manoharan from Zoho for responsibly disclosing
this potential XSS vector and working with us to find a solution that helps developers write secure apps.</p>
<h2 id="changelogs">Changelogs</h2>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.9.1/CHANGELOG.md">Ember.js 1.9.1 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/ember.js/blob/v1.10.0-beta.2/CHANGELOG.md">Ember.js 1.10.0-beta.2 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-1-9-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-1-9-1-released</guid><pubDate>Tue, 23 Dec 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 2.0 Released]]></title><description><![CDATA[<p>Ember 2.0 is not a traditional major release. After thirteen point releases in
almost two years, we're taking a turn to focus entirely on sweeping out
built-up cruft as a foundation for continued progress.</p>
<p><strong>Ember 2.0 only removes features that were deprecated as of Ember 1.13, so
apps that run on Ember 1.13 without any deprecation warnings should run
without issues on Ember 2.0.</strong></p>
<p>New applications should begin using Ember 2.0 today. Apps requiring Ember-Data
should use Ember-Data 2.0.0-beta.1 (2.0 release coming shortly!).</p>
<h4 id="newfeaturesinemberjs20">New Features in Ember.js 2.0</h4>
<ul>
<li><strong><em>&lt;This space intentionally left blank!&gt;</em></strong></li>
</ul>
<p>Major releases of most libraries try to do two things. They introduce new APIs,
and remove deprecated ones. Our release focuses on doing one thing well:
<strong>Instead of introducing new features, the goal of Ember 2.0 is to remove
accumulated cruft.</strong></p>
<p>Since Ember 1.0, adherence to semantic versioning has helped us grow an amazing
community. Ember powers extremely ambitious applications, and most of those
applications have been able to move forward over 13+ releases as new features
arrived.</p>
<p>We are committed to giving every Ember codebase a path into 2.x. To ensure
this, we've flagged everything removed in 2.0 with a deprecation in the 1.x
series. <strong>If your app runs on Ember 1.13 without raising deprecations, it
should run on 2.0.</strong> There are no new features to adapt to or adopt.</p>
<p>In the first few releases in Ember 2.x, we plan to land a variety of exciting
features. We are all the more excited that thousands of existing apps will be
ready to use them immediately. More about this below.</p>
<h4 id="removedapis">Removed APIs</h4>
<p>Internally, we've taken to calling Ember 2.0 a "garbage collection" release.
Two years is a lot of framework development, and there are many things dropped
in today's release.</p>
<p>Developers migrating forward will find these resources helpful:</p>
<ul>
<li>The <a href="http://emberjs.com/deprecations/v1.x/">1.x Deprecation Guide</a> contains
a summary and migration path for many deprecations since Ember 1.7.
Additionally, this guide is linked to from deprecation messages in your
browser's console.</li>
<li>The <a href="https://github.com/emberjs/ember-inspector#ember-inspector-">Ember Inspector</a>
is an essential tool for debugging Ember apps, and provides some tooling for
managing deprecations.</li>
<li>Core team members <a href="https://twitter.com/rwjblue">Robert Jackson</a> and
<a href="https://twitter.com/mixonic">Matthew Beale</a> published the
<a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a>
addon in July. This tool helps to manage upgrades to your codebase through
deprecation messages. Watch Robert present on upgrade workflows in this
<a href="https://www.youtube.com/watch?v=ltzN4v-ymo4&feature=youtu.be&t=1h25m55s">NYC meetup video</a>.</li>
<li>The <a href="https://github.com/rwjblue/ember-debug-handlers-polyfill">ember-debug-handlers-polyfill</a>
addon provides a future-safe API for writing your own upgrade tooling.</li>
</ul>
<p>Some of the major API removals follow.</p>
<p><strong>Views</strong> have been removed in Ember 2.0. Components, which provide better
isolation and scoping semantics, fulfill the use-cases views were introduced
for.</p>
<p>We recognize that existing apps will not complete their migration away from
views for several months, so we have published the
<a href="https://github.com/emberjs/ember-legacy-views">ember-legacy-views</a>
compatibility addon, that will allow you to spread out the transition over more
releases. We are committed to maintain support for this addon until at least
Ember 2.6.</p>
<p>If you are building a new application, the use-case for views have completely
been subsumed by Components. Existing apps should refactor away from the
<code>{{view}}</code> helper and <code>Ember.View</code>s in favor of Components.</p>
<p>However, existing applications that make use of top-level Views do not need to
immediately refactor those views to components. The future Routable Components
will provide a softer transition path for this use-case and we commit to
support the compatibility addon until the community has had a chance to
transition to Routable Components.</p>
<p>Similarly, the use-cases for <strong>Controllers</strong> have largely been eliminated.</p>
<p>As with views, we have published the
<a href="https://github.com/emberjs/ember-legacy-controllers">ember-legacy-controllers</a>
compatibility addon that you can use to spread out the transition. This addon
will also be maintained until at least Ember 2.6.</p>
<p>If you are building a new application, you should almost never need controllers
except to manage query parameters and communicate with the route (ala
<code>transitionTo</code>). For these cases, Ember 2.0 retains support for top-level
controllers with no addon required. While we plan to completely replace these
use-cases during the 2.x series, everything that works without the
compatibility addon will continue to work until 3.0.</p>
<p>Existing applications should refactor away from using the <code>{{controller}}</code>
property, use of proxying controllers (<code>ArrayController</code> and
<code>ObjectController</code>), <code>itemController</code>, etc.</p>
<p>However, existing applications that make use of top-level Controllers do not
need to immediately eliminate those controllers. As with top-level views, the
future Routable Components will provide a softer transition for this use-case
and we commit to support the compatibility addon until the community has had a
chance to transition to Routable Components.</p>
<p><strong>ReduceComputed and ArrayComputed</strong> have been made obsolete by the Glimmer
rendering engine introduced in Ember 1.13. These APIs allowed array operations
to be performed without creating new arrays. Glimmer's value diffing makes this
unnecessary. Computed property macros that operate on arrays are still present,
but they are not backed by <code>ReduceComputed</code>.</p>
<p><strong>Context shifting in templates</strong> (<code>{{#each}}</code> and <code>{{#with}}</code> without block
params) is removed in Ember 2.0. For any template, there is now only one this
and it cannot be changed for part of that template by any helper. This makes
templates easier to reason about, and unlocks opportunities for performance
improvements.</p>
<p><strong>IE8 support</strong> has been dropped for Ember 2.0. For the 2.x series, IE9+ will
be supported.</p>
<p><strong>Legacy Handlebars helpers</strong> are removed in favor of the <code>Ember.Helper</code> API.
This API does not provide a mechanism for helpers to take a block, but does
introduce support for nested helpers which can be used in concert with built-in
helpers (like <code>{{#if}}</code> and <code>{{#each}}</code>) to achieve the same ends.</p>
<p>Please see the <a href="https://github.com/emberjs/ember.js/releases/tag/v2.0.0">CHANGELOG.md</a>
for an authoritative list of cleanups.</p>
<h4 id="theroadahead">The Road Ahead</h4>
<p>Over the last few releases of Ember 1.x, we added a large number of new
features. These additions, including a whole new rendering engine, were
introduced while maintaining backwards compatibility. Unsurprisingly,
maintaining support for the semantics of two rendering engines (among other
things) introduced a large amount of cruft. Continuing to provide backwards
compatible legacy APIs has a non-trivial impact on the performance of Ember
applications, and on the project’s momentum.</p>
<p>Ember 2.0 allowed us to purge much of that built-up cruft. That was no small
task; removing code, documenting deprecations, and building new workflows for
managing these changes would not have happened without lots of hands. It was an
incredible effort, and we'd like to thank the community for making it happen.</p>
<p>With the garbage collection sweep out of our way, we can continue to expand on
the foundation solidified in Ember’s 1.x series.</p>
<h5 id="improvedreleasecadence">Improved Release Cadence</h5>
<p>Since Ember 1.0, we have followed <a href="http://semver.org/">Semantic Versioning</a>,
working very hard to maintain public API compatibility while adding new
features. In the lead-up to breaking changes in Ember 2.0, we made a number of
mistakes that caused our users to experience a great deal of churn.</p>
<p>While we successfully followed our existing policies regarding deprecation
before removal, and ensured that each deprecated feature had a viable
replacement, we did not do a good job of distinguishing between different kinds
of deprecations. Additionally, many deprecations landed very late and all at
once. These factors combined made the entire process feel overwhelming.</p>
<p>The feeling of "churn" is contrary to all our release process goals. In
addition to the continued maintenance of a six-week release cycle, we have a
number of tweaks to the process planned for 2.x. These are intended to help us
avoid a similar problem late in the 2.x cycle.</p>
<p>Some examples of improvements are:</p>
<ul>
<li><strong>LTS (Long-Term Support) Releases</strong> (<a href="https://github.com/emberjs/rfcs/pull/56">RFC #56</a>),
which can give users who want to upgrade less often than every six week a
sanctioned way to do so.</li>
<li><strong>Mandatory docs</strong>. No new features will be added to the Ember 2.0 release
channel without accompanying documentation.</li>
<li><strong>More informative deprecations</strong>. All deprecations will include which
release their behavior will be removed in, as well as a link to transition
instructions.</li>
<li><strong>Improved deprecation tooling</strong>. More informative deprecations allow us to
make the Ember inspector's deprecation pane smarter, and more useful for
incrementally working through deprecations. In particular, we can avoid
nagging you (by default) about removals that will not happen until far in the
future. For more information see
<a href="https://github.com/emberjs/rfcs/pull/65">RFC #65</a> and the included comments.</li>
<li><strong>Svelte Builds</strong>, which allow you to ask Ember CLI not to include deprecated
features you are no longer using. This will reduce pressure on future major
releases.</li>
</ul>
<h4 id="ember2xthemes">Ember 2.x Themes</h4>
<p>In addition to a better release process, you can look forward to several
high-level areas of improvement throughout the 2.x series.</p>
<p><strong>Alignment with JavaScript</strong>. Throughout 2.x, we will continue our efforts to
align Ember with ES6 and future versions of JavaScript. As the JavaScript
decorator proposal stabilizes, and as transpilers improve their
implementations, we plan to adapt computed properties and other APIs to that
syntax.</p>
<p><strong>JavaScript Modules</strong>. We will also continue to evolve further towards a
modules development style and away from a globals style. Among other things,
this will allow us to more aggressively automate the removal of dead code
paths.</p>
<p><strong>Stabilization and Integration</strong>. The Ember ecosystem will continue to
stabilize and integrate tightly. Ember-Data and Ember CLI will be versioned in
lockstep with Ember itself. Putting these projects on the "release train" with
Ember will mean they adhere to the same backwards compatible and incremental
change policies as Ember did through 1.x.</p>
<p><strong>Ember Data</strong>. With the release of Ember 2.0, Ember Data is now a stable part
of Ember's releases. It will adhere to Semantic Versioning policies like Ember
itself, and every release of Ember will include a compatible release of Ember
Data. Along those lines, Ember Data will not make any breaking changes until
3.0.</p>
<h5 id="newfeaturesinthepipeline">New Features in the Pipeline</h5>
<p>Many of our other plans have already been proposed via the RFC process and
discussions on GitHub, but here's a recap.</p>
<p>We are actively working on the implementation of these features, and expect
them to land gradually over several releases.</p>
<p><strong>Angle-Bracket Components and One-Way Data Flow</strong>. Ember 2.x will transition
to angle-bracket components. For example <code>&lt;my-button&gt;</code> instead of
<code>{{my-button}}</code>. These will operate with one-way binding as part of a larger
transition to a "data down, actions up", or "DDAU", style of programming that
you will read about as features land. We expect these components to land in
2.2 and be refined over the next few releases. See
<a href="https://github.com/emberjs/rfcs/pull/60">RFC #60</a> and
<a href="https://github.com/emberjs/ember.js/pull/12011">PR #12011</a> for more details
about our progress.</p>
<p><strong>Pods</strong>. We are also actively working on finalizing the pods directory layout
for applications, which makes it easier to group related parts of your
application together. This change will be completely opt-in, and existing
layouts will continue to work.</p>
<p><strong>Routable Components</strong>. After angle-bracket components and the pods layout
land, we will be able to transition the last few use-cases for controllers to
the much-anticipated Routable Components.
<a href="https://github.com/emberjs/rfcs/pull/38">RFC #38</a> and
<a href="https://github.com/emberjs/ember.js/pull/11939">PR #11939</a> track our progress
so far.</p>
<p><strong>FastBoot</strong>, Ember's alpha release server-side pre-rendering library, will
continue to improve and stabilize over the 2.x lifecycle. Find it on GitHub as
<a href="https://github.com/tildeio/ember-cli-fastboot">ember-cli-fastboot</a>.</p>]]></description><link>https://blog.emberjs.com/ember-2-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-0-released</guid><pubDate>Thu, 13 Aug 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 2.1 Beta Released]]></title><description><![CDATA[<p>Ember.js 2.1 beta is released today. As a minor release, Ember 2.1 will be
backwards compatible with Ember 2.0. Any changes to the API will be additive.
This continues Ember's commitment to <a href="http://semver.org/">Semantic Versioning</a>
we began with the 1.0 release.</p>
<p>In addition it means many of the first features for Ember 2.2, most notably angle
bracket components, have landed in Canary behind a feature flag. If you're
interested in help us progress with those features, now is a good time to
try them out.</p>
<p>On to the changes coming in our late September/early October release.</p>
<h2 id="newfeaturesinemberjs21">New Features in Ember.js 2.1</h2>
<p>Ember.js 2.1 will be a minor release of Ember. This means changes to the API are
made in an additive, backwards compatible manner. In roughly six weeks, these
features will be part of the 2.1 stable version.</p>
<p>A summary of the new features in today's release follows.</p>
<h3 id="gethelper"><code>{{get}}</code> Helper</h3>
<p>The <code>{{get}}</code> helper allows dynamic property lookup on objects in templates.
For example, these two usages are equivalent:</p>
<pre><code class="handlebars language-handlebars">{{user.name}}
{{get user "name"}}
</code></pre>
<p>A property with a value of a string can be passed as the second argument,
making both the object and the property being read dynamic. For example:</p>
<pre><code class="handlebars language-handlebars">{{get user somePropertyName}}
</code></pre>
<p>For more information on the <code>{{get}}</code> helper, reference the implementation
in <a href="https://github.com/emberjs/ember.js/pull/11196">PR #11196</a> and
<a href="https://github.com/emberjs/ember.js/pull/11691">PR #11691</a>.</p>
<p>Big thanks to <a href="https://twitter.com/jmurphyau">@jmurphyau</a> for the
implementation of this feature, and for his excellent
<a href="https://github.com/jmurphyau/ember-get-helper">ember-get-helper</a> addon that
demonstrated how useful this helper would be. Trying his
<a href="https://github.com/jmurphyau/ember-truth-helpers">ember-truth-helpers</a> addon
is highly recommended.</p>
<h3 id="eachinhelper"><code>{{each-in}}</code> Helper</h3>
<p>The <code>{{each-in}}</code> helper iterates keys and values of an object. It is similar
conceptually to the <code>for (key in object) {</code> syntax of JavaScript. For example,
this code would display a list of all property names and values on the <code>user</code>
object:</p>
<pre><code class="handlebars language-handlebars">&lt;ul&gt;
{{#each-in user as |key value|}}
  &lt;li&gt;{{key}}: {{value}}&lt;/li&gt;
{{/each-in}}
&lt;/ul&gt;
</code></pre>
<p>When using <code>{{each-in}}</code>, the iterated list of keys will be unbound. If a new
property is set on <code>user</code> with <code>user.newProp = 'newVal';</code>, the new property
will not appear.</p>
<p>For more information on the <code>{{each-in}}</code> helper, reference
<a href="https://github.com/emberjs/ember.js/pull/11171">PR #11171</a>.</p>
<p>Thanks to <a href="https://twitter.com/tomdale">@tomdale</a> for the
implementation of this feature, and thanks to
<a href="https://twitter.com/miguelcamba">@miguelcamba</a> for his followup PRs.</p>
<h3 id="deprecateandwarnhandlers">Deprecate and Warn Handlers</h3>
<p>In the run up to Ember 2.0, it became clear that the tooling for management of
deprecations was poor. One of the reasons for this was the lack of a public,
documented API for deciding how a deprecations and warnings should be handled.
2.1 introduces a proper API for our tooling to build upon.</p>
<p>The default behavior of a deprecation or warning is to log to the console. To change
this behavior, register a handler and write custom logic. For example this
handler would throw an exception for any deprecation messages with the word
<code>should</code> in them:</p>
<pre><code class="javascript language-javascript">Ember.Debug.registerDeprecationHandler((message, options, next) =&gt; {
  if (message.indexOf('should') !== -1) {
    throw new Error('Deprecation message with should: '+message);
  } else {
    // defer to whatever handler was registered before this one
    next(message, options);
  }
});
</code></pre>
<p>In this example, all warnings are silenced:</p>
<pre><code class="javascript language-javascript">// next is not called, so no warnings get the default behavior
Ember.Debug.registerWarnHandler(() =&gt; {});
</code></pre>
<p>Handlers are provided with the following data through arguments:</p>
<ul>
<li><code>message</code> is the text logged by default</li>
<li><code>next</code> is a caller for the previously registered handler. Often, this is the
default handler.</li>
<li><code>options.id</code> is an id in the format <code>package-name.specific-deprecation</code></li>
</ul>
<p>Deprecation handlers will also be provided:</p>
<ul>
<li><code>options.until</code> is the version of Ember this feature and deprecation will be
removed in</li>
</ul>
<p>As of Ember 2.0, <code>deprecate</code> and <code>warn</code> calls must provide an <code>id</code> option,
and <code>deprecate</code> calls must additionally provide an <code>until</code> option.
Addons not providing this data during
2.x will trigger a deprecation warning.</p>
<p>For more information see <a href="https://github.com/emberjs/rfcs/blob/master/text/0065-deprecation-warning-handlers.md">RFC #65</a>
and the implementation in <a href="https://github.com/emberjs/ember.js/pull/11833">PR #11833</a>.
This API can be used with older versions of Ember via the
<a href="https://github.com/rwjblue/ember-debug-handlers-polyfill">ember-debug-handlers-polyfill</a>,
though <code>id</code> and <code>until</code> data is not provided until Ember 2.0.</p>
<p>Thanks to <a href="https://twitter.com/rwjblue">@rwjblue</a> for
shipping this API and the polyfill addon, and to <a href="https://twitter.com/mixonic">@mixonic</a>
for the RFC.</p>
<h3 id="registryandcontainerreform">Registry and Container Reform</h3>
<p>The Ember.js registry and container are some of the most extensively used
private APIs in the framework. They
provided one of the only ways to lookup arbitrary objects from Ember's
dependency container.</p>
<p>In 2.x, we are committed to stabilizing this part of the framework and
offering public APIs. This first step creates a normalized way to interact
with <code>register</code> and <code>lookup</code> that we expect to last through the 2.x cycle
and beyond.</p>
<p><code>Ember.Application</code> instances are passed as the first argument to <code>initializer</code>
hooks in 2.1. <code>initializer</code> hooks are where dependencies between object types
can be configured, and factories can be registered. Several public APIs will
exist on <code>Ember.Application</code> instances, some of them new:</p>
<ul>
<li><code>register</code> - register a factory</li>
<li><code>inject</code> - inject a factory into another factory, or all factories of a type</li>
<li><code>unregister</code> - remove a factory from registration</li>
<li><code>resolveRegistration</code> - fetch a registed factory</li>
<li><code>hasRegistration</code> - check for a registered factory</li>
<li><code>registerOption</code>, <code>registeredOption</code>, <code>registerOptions</code>, <code>registeredOptions</code>,
<code>registerOptionsForType</code>, <code>registeredOptionsForType</code> which manage options
for a factory (is it a singleton, can it be instantiated).</li>
</ul>
<p><code>Ember.ApplicationInstance</code> instances are passed as the first argument to
<code>instanceInitializer</code> hooks in 2.1. <code>instanceInitializer</code> hooks are where
objects and classes can be fetched out of the configured and booted application.
Two new relevent public APIs will exist on <code>Ember.ApplicationInstance</code>s:</p>
<ul>
<li><code>lookup</code> - fetch an instance of a factory (with dependencies)</li>
</ul>
<p>For more information about these changes read
<a href="https://github.com/emberjs/rfcs/blob/master/text/0046-registry-reform.md">RFC #46</a>
and the initial implementation in
<a href="https://github.com/emberjs/ember.js/pull/11440">PR #11440</a>. To better
understand dependency management in Ember and how to use these APIs, see the
section on <a href="http://guides.emberjs.com/v1.13.0/understanding-ember/dependency-injection-and-service-lookup/#toc_dependency-management-in-ember-js">dependency management</a> in
the 1.13 guides.</p>
<p>This feature also introduces two minor deprecations:</p>
<ul>
<li>Calling <code>appInstance.container.lookup</code> on the first argument to an instance
initializer is deprecated in favor of <code>appInstance.lookup</code>.</li>
<li>Expecting two arguments for an initializer hook is deprecated</li>
</ul>
<p>Deprecations flag where we expect to change an API in the future. It is not
recommended that you use deprecated functionality, but you can also safely
silence a deprecation message and continue to use that functionality until
its removal date.</p>
<p>Huge thanks to <a href="https://twitter.com/dgeb">@dgeb</a> for
his tireless work on the RFC and implementation for this work, as well as
his patience building consensus around changes to Ember's internals.</p>
<p>For more details on changes landing in 2.1, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.1.0-beta.1/CHANGELOG.md">Ember.js 2.1.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-2-1-beta-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-1-beta-released</guid><pubDate>Sun, 16 Aug 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 2.1 and 2.2 Beta Released]]></title><description><![CDATA[<p>Ember.js 2.1, a minor version release of Ember with additive features only, is released today. This release represents the work of over 82 direct contributors, and over 850 commits.</p>
<p>Ember.js 2.2 beta, the branch of Ember that will be released as stable in roughly six weeks, is also being released today.</p>
<h2 id="newfeaturesinemberjs21">New Features in Ember.js 2.1</h2>
<p>Changes to the Ember's API in 2.1 are backwards compatible. A summary of the new features in today's release follows.</p>
<h3 id="gethelper"><code>{{get}}</code> Helper</h3>
<p>The <code>{{get}}</code> helper allows dynamic property lookup on objects in templates.
For example, these two usages are equivalent:</p>
<pre><code class="handlebars language-handlebars">{{user.name}}
{{get user "name"}}
</code></pre>
<p>A property with a value of a string can be passed as the second argument,
making both the object and the property being read dynamic. For example:</p>
<pre><code class="handlebars language-handlebars">{{get user somePropertyName}}
</code></pre>
<p>For documentation on <code>get</code>, reference the <a href="http://emberjs.com/api/classes/Ember.Templates.helpers.html#method_get">API documentation</a>.</p>
<p>Big thanks to <a href="https://twitter.com/jmurphyau">@jmurphyau</a> for the
implementation of this feature, and for his excellent
<a href="https://github.com/jmurphyau/ember-get-helper">ember-get-helper</a> addon that
demonstrated how useful this helper would be. Using his
<a href="https://github.com/jmurphyau/ember-truth-helpers">ember-truth-helpers</a> addon
in 1.13 codebases is highly recommended.</p>
<h3 id="eachinhelper"><code>{{each-in}}</code> Helper</h3>
<p>The <code>{{each-in}}</code> helper iterates keys and values of an object. It is similar
conceptually to the <code>for (key in object) {</code> syntax of JavaScript. For example,
this code would display a list of all property names and values on the <code>user</code>
object:</p>
<pre><code class="handlebars language-handlebars">&lt;ul&gt;
{{#each-in user as |key value|}}
  &lt;li&gt;{{key}}: {{value}}&lt;/li&gt;
{{/each-in}}
&lt;/ul&gt;
</code></pre>
<p>When using <code>{{each-in}}</code>, the iterated list of keys will be unbound. If a new
property is set on <code>user</code> with <code>user.newProp = 'newVal';</code>, the new property
will not appear.</p>
<p>For documentation on the <code>{{each-in}}</code> helper, see the <a href="http://emberjs.com/api/classes/Ember.Templates.helpers.html#method_each-in">API documentation</a>.</p>
<p>Thanks to <a href="https://twitter.com/tomdale">@tomdale</a> for the
implementation of this feature, and thanks to
<a href="https://twitter.com/miguelcamba">@miguelcamba</a> for his followup PRs.</p>
<h3 id="registryandcontainerreform">Registry and Container Reform</h3>
<p>The Ember.js registry and container are some of the most extensively used
private APIs in the framework. They
provided one of the only ways to lookup arbitrary objects from Ember's
dependency container.</p>
<p>We are committed to stabilizing this part of the framework and
offering public APIs. This first step creates a normalized way to interact
with <code>register</code> and <code>lookup</code> that we expect to last through the 2.x cycle
and beyond.</p>
<p>In 2.1, <code>Ember.Application</code> instances are passed as the first argument to <code>initializer</code>
hooks. <code>initializer</code> hooks are where dependencies between object types
can be configured, and factories can be registered. Several public APIs will
exist on <code>Ember.Application</code> instances, some of them new:</p>
<ul>
<li><code>register</code> - register a factory</li>
<li><code>inject</code> - inject a factory into another factory, or all factories of a type</li>
<li><code>unregister</code> - remove a factory from registration</li>
<li><code>resolveRegistration</code> - fetch a registered factory</li>
<li><code>hasRegistration</code> - check for a registered factory</li>
<li><code>registerOption</code>, <code>registeredOption</code>, <code>registerOptions</code>, <code>registeredOptions</code>,
<code>registerOptionsForType</code>, <code>registeredOptionsForType</code> which manage options
for a factory (is it a singleton, can it be instantiated).</li>
</ul>
<p><code>Ember.ApplicationInstance</code> instances are passed as the first argument to
<code>instanceInitializer</code> hooks in 2.1. <code>instanceInitializer</code> hooks are where
factories can be fetched out of the configured and booted application.
One relevant public APIs exists on <code>Ember.ApplicationInstance</code>s:</p>
<ul>
<li><code>lookup</code> - fetch an instance of a factory (with dependencies)</li>
</ul>
<p>You can find updates to the guides regarding initializers in the revamped <a href="http://guides.emberjs.com/v2.1.0/applications/applications-and-instances/">Application Concerns</a> section. The
API documentation is similarly updated at the <a href="http://emberjs.com/api/modules/ember-application.html">ember-application namespace</a>, <a href="http://emberjs.com/api/classes/Ember.Application.html">Ember.Application</a> class, and <a href="http://emberjs.com/api/classes/Ember.ApplicationInstance.html">Ember.ApplicationInstance</a> class.</p>
<p>This feature also introduces two minor deprecations:</p>
<ul>
<li>Expecting two arguments for an initializer hook is deprecated</li>
<li>Calling <code>appInstance.container.lookup</code> on the first argument to an instance
initializer is deprecated in favor of <code>appInstance.lookup</code>.</li>
</ul>
<p>Deprecations flag where we expect to change an API in the future. It is not
recommended that you use deprecated functionality, but you can also safely
silence a deprecation message and continue to use that functionality until
its removal date.</p>
<p>A huge thanks to the tireless <a href="https://twitter.com/dgeb">@dgeb</a> for his work on the
RFC, implementation, and documentation for these changes. They represent a significant
improvement in Ember's dependency injection system.</p>
<h3 id="deprecateandwarnhandlers">Deprecate and Warn Handlers</h3>
<p>In the run up to Ember 2.0, it became clear that the tooling for management of
deprecations was poor. One of the reasons for this was the lack of a public,
documented API for deciding how a deprecations and warnings should be handled.
2.1 introduces a proper API for our tooling to build upon.</p>
<p>The default behavior of a deprecation or warning is to log to the console. To change
this behavior, register a handler and write custom logic. For example this
handler would throw an exception for any deprecation messages with the word
<code>should</code> in them:</p>
<pre><code class="javascript language-javascript">Ember.Debug.registerDeprecationHandler((message, options, next) =&gt; {
  if (message.indexOf('should') !== -1) {
    throw new Error('Deprecation message with should: '+message);
  } else {
    // defer to whatever handler was registered before this one
    next(message, options);
  }
});
</code></pre>
<p>In this example, all warnings are silenced:</p>
<pre><code class="javascript language-javascript">// next is not called, so no warnings get the default behavior
Ember.Debug.registerWarnHandler(() =&gt; {});
</code></pre>
<p>Handlers are provided with the following data through arguments:</p>
<ul>
<li><code>message</code> is the text logged by default</li>
<li><code>options</code> is an object containing at minimum the property <code>id</code> in the format <code>package-name.specific-deprecation</code></li>
<li><code>next</code> is a caller for the previously registered handler. Often, this is the
default handler.</li>
</ul>
<p>Deprecation handlers will also be provided:</p>
<ul>
<li><code>options.until</code> is the version of Ember this feature and deprecation will be
removed in</li>
</ul>
<p>As of Ember 2.0, <code>deprecate</code> and <code>warn</code> calls must provide an <code>id</code> option,
and <code>deprecate</code> calls must additionally provide an <code>until</code> option.
Addons not providing this data during
2.x will trigger a deprecation warning.</p>
<p>For more information see the <a href="http://emberjs.com/api/classes/Ember.Debug.html">Ember.Debug</a>
API documentsion. This API can be used with previous versions of Ember via the
<a href="https://github.com/rwjblue/ember-debug-handlers-polyfill">ember-debug-handlers-polyfill</a>,
though <code>id</code> and <code>until</code> data is not provided until Ember 2.0.</p>
<p>Thanks to <a href="https://twitter.com/rwjblue">@rwjblue</a> for
shipping this API and the polyfill addon, and to <a href="https://twitter.com/mixonic">@mixonic</a>
for the RFC.</p>
<p>For more details on changes landing in 2.1, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.1.0/CHANGELOG.md">Ember.js 2.1.0 CHANGELOG</a>.</p>
<h2 id="emberjs22beta">Ember.js 2.2 beta</h2>
<p>No new features are slated for Ember 2.2. During the canary cycle leading to this beta, the core team and community have been primarily focused on performance improvements or feature work still behind a feature flag.</p>
<p>For more details on changes landing in 2.2, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.2.0-beta.1/CHANGELOG.md">Ember.js 2.2.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-2-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-1-released</guid><pubDate>Sun, 04 Oct 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 2.10 and 2.11 Beta Released]]></title><description><![CDATA[<p>Today, the Ember project is releasing Ember.js, Ember Data and Ember CLI
version 2.10.0.</p>
<p>This also kicks off the 2.11 beta cycle for all sub-projects. We encourage our
community (especially addon authors) to help test these beta builds and report
any bugs before they are published as a final release in six weeks' time. The
<a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to
continuously test your projects against the latest Ember releases.</p>
<p>Starting with this release, we will be publishing a single, unified release
blog post summarizing all the changes for all three sub-projects in one place.
You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs210">Changes in Ember.js 2.10</h3>
<p>Ember.js 2.10 is the first release to include <a href="http://emberjs.com/blog/2016/07/29/announcing-the-glimmer-2-alpha.html">Glimmer 2</a>,
a ground-up rewrite of Ember's rendering engine.</p>
<p>Despite all the changes that took place under-the-hood, we are committed to
making this a <strong>drop-in, completely backwards compatible upgrade for virtually
all Ember.js users</strong>. Over the past few months, we have been <a href="http://emberjs.com/blog/2016/10/17/ember-2-9-released.html#toc_ember-js-2-10-beta">hard at work</a>
to make this a reality.</p>
<p>Thanks to everyone in the community who took the time to test their apps and
addons against the Glimmer 2 alpha and beta builds, this has been one of the
most rigorously tested releases in the history of the Ember project. We are
quite confident that upgrade will go smoothly for most apps. However, if you
encounter any issues, please do report them to the <a href="https://github.com/emberjs/ember.js/issues/">issue tracker</a>.</p>
<p>While this release is focused on compatibility and does not expose any new
capabilities, the new rendering engine has unlocked a lot of <a href="http://emberjs.com/blog/2016/07/29/announcing-the-glimmer-2-alpha.html#toc_a-whole-lot-more-to-come">new frontiers</a>
for us, creating a much better foundation for adding new features as well as
room for future performance impovements. With the initial integration now out
of the way, we are quite excited to return our efforts to those areas in
upcoming releases.</p>
<h4 id="othernotablechanges">Other notable changes</h4>
<p>In addition to the Glimmer 2 integration, a few other notable changes are also
included in this release.</p>
<p>First, <a href="https://github.com/trentmwillis">Trent Willis</a>, <a href="https://github.com/nathanhammond">Nathan Hammond</a>
and <a href="https://github.com/alexspeller">Alex Speller</a> have contributed a series of
patches to address some long-standing issues and edge cases in the routing
layer, particularly in the area of query params.</p>
<p>Second, thanks to <a href="https://github.com/rwjblue">Robert Jackson</a>, we now use
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap">WeakMap</a>
to <a href="https://github.com/emberjs/ember.js/pull/13783">store object metadata</a> on
browsers that supports them. A pleasant side-effect of this internal change is
that Ember no longer adds an <code>__ember_meta__</code> property to every object.</p>
<p>Finally, it has come to our attention that it is quite common for developers to
accidentally mutate the arguments passed into a helper. This is problematic as
these objects are often shared or reused, causing subtle issues that are very
difficult to debug.</p>
<p>To help track down these kind of issues, these objects are now <a href="https://github.com/emberjs/ember.js/pull/14244">frozen</a>
in the debug build before they are passed into helpers. As a result, you will
get an error if you attempt to modify these objects directly. It is recommended
that you clone these objects (e.g. using <code>Object.assign</code> and <code>Array#slice</code>)
before making any modifications to them.</p>
<p>(It has been brought to our attention that the last change might have an
<a href="https://github.com/emberjs/ember.js/pull/14649">unintended consequence</a>.
A fix is being worked on by <a href="https://github.com/mixonic">Matthew Beale</a>. Please
refer to the linked issue for a detailed description and suggested workaround.)</p>
<p>For more details on the changes in Ember.js 2.10, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.10.0">Ember.js 2.10.0 release page</a>.</p>
<h3 id="upcomingchangesinemberjs211">Upcoming changes in Ember.js 2.11</h3>
<p>Currently, no new features are planned for 2.11. However, there are a few
notable changes:</p>
<ul>
<li><p>Similar to the change to helper arguments, concatenated properties (such as
<code>classNames</code> and <code>classNameBindings</code>) are now <a href="https://github.com/emberjs/ember.js/pull/14389">frozen</a>
in debug builds to help track down unintended mutations.</p></li>
<li><p>The legacy <code>render</code> helper (i.e. <code>{{render 'foo'}}</code>) has been <a href="https://github.com/emberjs/ember.js/pull/14441">deprecated</a>.</p></li>
<li><p>The private <code>Component#renderToElement</code> API has also been <a href="https://github.com/emberjs/ember.js/pull/14482">deprecated</a>.</p></li>
</ul>
<p>For more details on the upcoming changes in Ember.js 2.11, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.11.0-beta.1">Ember.js 2.11.0-beta.1 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the offical data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata210">Changes in Ember Data 2.10</h3>
<p>Ember Data 2.10 represents the work of more than 10 direct contributors with
over 20 commits.</p>
<p>There have been no user facing changes in Ember Data 2.10. Under the
hood, <a href="https://github.com/runspired">Chris Thoburn</a> has instrumented
Ember Data with internal tools making it easier to track the
performance of Ember Data. This instrumentation is stripped from
production builds and should have no impact on existing
applications.</p>
<p>Chris also
<a href="https://github.com/emberjs/data/pull/4578">improved the messaging</a>
around assertions and warnings when an adapter responds with no <code>id</code>
for a record.</p>
<p>For more details on the changes in Ember Data 2.10, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.10.0">Ember Data 2.10.0 release page</a>.</p>
<h3 id="upcomingchangesinemberdata211">Upcoming changes in Ember Data 2.11</h3>
<p>Ember Data 2.11 is already shaping up to be a big release with many
performance and documentation improvements.</p>
<h4 id="hasmanycomputedpropertykeys">HasMany Computed Property Keys</h4>
<p>One of the performance improvements included in Ember Data
2.11 fixes an issue where changes to the records of a
<code>DS.hasMany()</code> caused unnecessary work. As a result,
Ember Data would over-eagerly invalidate computed
properties that depended on these <code>hasMany</code> relationships. Due to the
nature of the fix application code depending on a relationship array
without watching the contents of that array may need to be updated. For
example you may need to update computed property keys that depended on
<code>record.someHasManyRelationshipName</code> to <code>record.someHasManyRelationshipName.[]</code>.</p>
<h4 id="deprecationsinemberdata211">Deprecations in Ember Data 2.11</h4>
<p>Ember Data now issues deprecation warnings for
<code>store#serialize()</code>. Instead, it is recommended that you use
<code>record.serialize()</code> in place of
<code>store.serialize(record)</code>.</p>
<p><code>store#lookupAdapter()</code> and <code>store#lookupSerializer()</code> have also been
deprecated starting in Ember 2.11. These methods were never publicly
documented. In their place we recommend you use <code>store#adapterFor()</code>
and <code>store#serializerFor()</code> respectively.</p>
<p><code>store#recordIsLoaded()</code> is deprecated in favor of
<code>store#hasRecordForId()</code>, as the logic in these two methods has been
identical since
<a href="https://github.com/emberjs/data/pull/2875">March 2015</a>.</p>
<p>All of the deprecated methods mentioned above will be supported until
Ember Data 3.0. Until then they will log a deprecation warning to
encourage use of the recommended replacement APIs.</p>
<h4 id="movedsimprovedajaxoutofbetachannel">Move <code>ds-improved-ajax</code> out of <code>beta</code> channel</h4>
<p>The <code>ds-improved-ajax</code> implemented in
<a href="https://github.com/emberjs/data/pull/3099">PR #3099</a> aims to provide
public hooks on the <code>rest</code> adapter for customizing requests. For example
to specify the HTTP method or
provide custom HTTP headers per request. This feature has been available
in beta builds since the 2.8 beta cycle.</p>
<!-- alex ignore invalid -->
<p>Unfortunately, this feature slipped into the code base without going
though a proper RFC process. Despite being enabled in the beta channel
for a while now, we decided that it should be disabled again in favour
of a feature which has gone though the RFC process and benefited from
valuable community feedback.</p>
<p>We are aware that it is quite rare for a feature to be backed out from
the beta channel but we consider the ability to do so a strength of
our release process. We would like to thank everyone who took the time
to test their applications against the beta channel and we would
highly appreciate your feedback on the proposed replacement to this
functionality in
<a href="https://github.com/emberjs/rfcs/pull/171">RFC #171</a>.</p>
<p>For more details on the upcoming changes in Ember Data 2.11, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.11.0-beta.1">Ember Data 2.11.0-beta.1 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! To upgrade
your projects using <code>yarn</code> run <code>yarn upgrade ember-cli</code>. To upgrade your
projects using <code>npm</code> run <code>npm install --save-dev ember-cli</code>. After running the
upgrade command run <code>ember init</code> inside of the project directory to apply the
blueprint changes. You can view those changes for <a href="https://github.com/ember-cli/ember-new-output/compare/v2.9.1…v2.10.0">applications here</a>
and <a href="https://github.com/ember-cli/ember-addon-output/compare/v2.9.1…v2.10.0">addons here</a>.</p>
<h3 id="changesinembercli210">Changes in Ember CLI 2.10</h3>
<p>Ember CLI 2.10 no longer supports Node.js 0.10 per the
<a href="http://emberjs.com/blog/2016/09/07/ember-node-lts-support.html">Ember Node.js LTS Support policy</a>.
Further, it is the last release which will officially support Node.js 0.12
which will be <a href="https://github.com/nodejs/LTS#lts-schedule">removed from support at the end of this year</a>.
Please make sure you begin your migration to a newer version of Node.js as soon
as possible.</p>
<h4 id="sortingofpackagejson">Sorting of <code>package.json</code></h4>
<p>In order to guarantee consistency with <code>npm</code> and other tools Ember CLI now
<a href="https://github.com/ember-cli/ember-cli/pull/6272">sorts <code>package.json</code> in accordance with the upstream patterns</a>.
This may result in changes in execution order of the addons in your application
which should be non-breaking. If you experience issues you will
<a href="https://ember-cli.com/extending/#configuring-your-ember-addon-properties">need to specify <code>before</code> and/or <code>after</code> in your addon</a>.</p>
<h4 id="concatenation">Concatenation</h4>
<p>Concatenation of assets has been implicit based upon file-system ordering. An
update to <code>broccoli-concat</code> which changed the walk order of the file system to
guarantee consistency and stable concatenation broke the implicit reliance we
had on that ordering. To ensure that we remain backwards compatible
<a href="https://github.com/ember-cli/ember-cli/pull/6081">we have changed our invocation pattern to reproduce the intended behavior</a>.
Child modules without specific ordering will now be sorted lexicographically
inside of your assets.</p>
<p>We also moved to a <a href="https://github.com/ember-cli/ember-cli/issues/6300">system-independent line separator</a>
to guarantee that builds are reproducible across different operating systems.</p>
<h4 id="npmupgrade"><code>npm</code> Upgrade</h4>
<p><a href="https://github.com/dfreeman">Dan Freeman</a> has <a href="https://github.com/ember-cli/ember-cli/pull/6306">updated our bundled <code>npm</code> dependency</a>
to <code>npm@3</code>. This will change the resulting <code>node_modules</code> folder layout inside
of your application when you run <code>ember install</code>. This will likely only cause
problems if you tried to guess at the path to a module based upon install
behavior. If you need to identify the path to a module inside of the <code>node</code>
JavaScript world be sure you're using <code>require.resolve('module-name');</code>.</p>
<h4 id="testingaddons">Testing Addons</h4>
<p>Ember CLI 2.10 removes Ember.js 1.13 from the default testing matrix in the
addon blueprint. Given that we now have two LTS releases in the Ember.js 2.x
series, we no longer feel that supporting Ember.js 1.13 is a reasonable
default for newly-created addons. You may continue to support Ember.js 1.13 in
your addons by adding it back into the testing matrix.</p>
<p>For more details on the changes in Ember CLI 2.10 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.10.0">Ember CLI 2.10.0 release page</a>.</p>
<h3 id="upcomingchangesinembercli211">Upcoming changes in Ember CLI 2.11</h3>
<p>In our continous incremental progress toward making <code>bower</code> optional inside of
Ember CLI we have moved to include Ember.js itself via
<a href="https://www.npmjs.com/package/ember-source"><code>ember-source</code></a>–provided via <code>npm</code>.
In 2.11 we will no longer have any packages provided by <code>bower</code> in a brand
new Ember.js application!</p>
<p>Ember CLI 2.11 will not officially support Node.js 0.12 per the
<a href="http://emberjs.com/blog/2016/09/07/ember-node-lts-support.html">Ember Node.js LTS Support policy</a>.
Please make sure you begin your migration to a newer version of Node.js as soon
as possible.</p>
<p>We have a litany of other smaller improvements in this release:</p>
<ul>
<li>We bundle a new and improved version of <code>ember-welcome-page</code>, the learning
team's addon for providing a quick start introduction for users.</li>
<li>We <a href="https://github.com/ember-cli/ember-cli/pull/6436">watch the <code>vendor</code> folder by default</a>,
making rebuilds work for changes in that directory.</li>
<li>Stefan Penner made it so we do a better job at <a href="https://github.com/ember-cli/ember-cli/pull/6423">cleanup upon exit of Ember CLI</a>
preventing pollution of the <code>tmp</code> folder inside of your applications.</li>
<li>Robert Jackson dramatically <a href="https://github.com/ember-cli/ember-cli/pull/6453">reduced the number of merge steps</a> inside of the build,
speeding up the build process.</li>
</ul>
<p>For more details on the changes in Ember CLI 2.11.0-beta.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.11.0-beta.1">Ember CLI 2.11.0-beta.1 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of
these releases serve as a reminder that the Ember project would not have been
possible without your continued support. We are extremely grateful to our
contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-2-10-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-10-released</guid><pubDate>Wed, 30 Nov 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 2.11 and 2.12 Beta Released]]></title><description><![CDATA[<p><em>Updated on December 19, 2017 to include information about Ember.js 2.4-LTS.</em></p>
<p>Today, the Ember project is releasing Ember.js, Ember Data and Ember CLI
version 2.11.0.</p>
<p>This also kicks off the 2.12 beta cycle for all sub-projects. We encourage our
community (especially addon authors) to help test these beta builds and report
any bugs before they are published as a final release in six weeks' time. The
<a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to
continuously test your projects against the latest Ember releases.</p>
<p>This release also marks the conclusion of critical bugfixes support for Ember.js
2.4-LTS and we strongly recommend LTS users to migrate to 2.8-LTS immediately.
2.4-LTS will continue to receive security patches for another four releases
(around July 2017). 2.4-LTS was released in April of 2016, and was the first
Long-Term Support release of Ember.js. We're pleased with the impact of LTS
releases on the Ember project and look forward to continuing the practice.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs211">Changes in Ember.js 2.11</h3>
<p>Ember.js 2.11 continues to build on the foundation of Glimmer 2, incorporating
many bug fixes to improve compatibility and stability since 2.10.</p>
<p>Among other improvements and thanks to the work of <a href="https://github.com/gavinjoyce/">Gavin Joyce</a>,
this release provides a <a href="https://github.com/emberjs/ember.js/pull/14723">much improved</a>
"backtracking re-render" assertion message. The new message provides actionable
information that can help track down the source of a backtracking re-render.
If you had previously encountered this assertion while
upgrading to 2.10, we recommend giving 2.11 a try.</p>
<p>Additionally, the <a href="https://github.com/emberjs/ember.js/pull/14649">last-minute issue regarding frozen helper arguments</a>
mentioned in the <a href="/blog/2016/11/30/ember-2-10-released.html">2.10 blog post</a> has been
fixed in this release.</p>
<p>Starting with 2.11, Ember.js releases will be available on npm via the
<a href="https://www.npmjs.com/package/ember-source"><code>ember-source</code></a> package. Please
refer the Ember CLI section below for more details.</p>
<p>Finally, following the mitigation section in the recent <a href="/blog/2016/12/14/security-incident-aws-s3-key-exposure.html">security incident
report</a>, this is
also the first Ember.js release to be published by our automated build system.</p>
<h4 id="othernotablechanges">Other Notable Changes</h4>
<ul>
<li><p>Concatenated properties (such as <code>classNames</code> and <code>classNameBindings</code>) are
now <a href="https://github.com/emberjs/ember.js/pull/14389">frozen</a> in debug builds
to prevent unintended and unsupported mutations.</p></li>
<li><p>The legacy <code>render</code> helper (i.e. <code>{{render 'foo'}}</code>) has been deprecated
(<a href="https://github.com/emberjs/ember.js/pull/14441">issue</a>, <a href="http://emberjs.com/deprecations/v2.x/#toc_code-rendertoelement-code">deprecation
guide</a>).</p></li>
<li><p>The private <code>Component#renderToElement</code> API has also been deprecated
(<a href="https://github.com/emberjs/ember.js/pull/14482">issue</a>, <a href="http://emberjs.com/deprecations/v2.x/#toc_code-render-code-helper">deprecation
guide</a>).</p></li>
</ul>
<p>For more details on the changes in Ember.js 2.11, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.11.0">Ember.js 2.11.0 release page</a>.</p>
<h3 id="upcomingchangesinemberjs212">Upcoming Changes in Ember.js 2.12</h3>
<p>Ember.js 2.12 will serve as the basis of the next <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">LTS release</a>
and includes additional stability, compatibility and performance improvements.</p>
<p>In addition to those improvements, it also implemented several changes arising
from the <a href="https://github.com/emberjs/rfcs">RFC</a> process:</p>
<ul>
<li><p><a href="https://github.com/emberjs/rfcs/blob/master/text/0150-factory-for.md">RFC #150</a>
adds <code>factoryFor</code> as a public API to replace the widely used <code>_lookupFactory</code>
private API, which is now deprecated. In addition to providing a public API
for a sorely needed feature, it also unlocks the opportunity to eliminate one
of the major performance hotspot in the Ember.js object-model. This will
happen in a future release once the community has had the chance to migrate to
the new API. See pull request <a href="https://github.com/emberjs/ember.js/pull/14360">#14360</a>
for additional details.</p></li>
<li><p><a href="https://github.com/emberjs/rfcs/blob/master/text/0178-deprecate-ember-k.md">RFC #178</a>
deprecates the <code>Ember.K</code> utility function. See pull request <a href="https://github.com/emberjs/ember.js/pull/14751">#14751</a>
for additional details.</p></li>
<li><p><a href="https://github.com/emberjs/rfcs/blob/master/text/0191-deprecate-component-lifecycle-hook-args.md">RFC #191</a>
deprecates the private arguments passed to the component lifecycle hooks
(<code>didInitAttrs</code>, <code>didReceiveAttrs</code> and <code>didUpdateAttrs</code>). Please note that
this only deprecates the usage of the arguments passed to this hook, not the
hooks themselves. See pull request <a href="https://github.com/emberjs/ember.js/pull/14711">#14711</a>
for additional details.</p></li>
</ul>
<p>For more details on the upcoming changes in Ember.js 2.12, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.12.0-beta.1">Ember.js 2.12.0-beta.1 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata211">Changes in Ember Data 2.11</h3>
<p>Ember Data 2.11 represents the work of 15 direct contributors
and over 70 commits.</p>
<p>Ember Data 2.11 continues to expand on the performance improvements
started in Ember Data
2.10. <a href="https://github.com/runspired">Chris Thoburn</a> and
<a href="https://github.com/stefanpenner">Stefan Penner</a> contributed several
pull requests that allow Ember Data to defer work until it is needed by an
application or avoid the work all together if it is never
needed. Overall the process of pushing records into the store in Ember
Data 2.11 is about twice as fast as it was in 2.10.</p>
<p>The Ember Data 2.11 release concludes an effort to audit the existing
API docs for Ember Data. The Ember Data community has checked all of
the API docs and ensured they are clear and contain code examples of
how to use the API. You can see the improved documentation
<a href="http://emberjs.com/api/data/">here</a>.</p>
<h4 id="deprecationsinemberdata211">Deprecations in Ember Data 2.11</h4>
<p>Ember Data now issues deprecation warnings for
<code>store#serialize()</code>. Instead, it is recommended that you use
<code>record.serialize()</code> in place of
<code>store.serialize(record)</code>.</p>
<p><code>store#lookupAdapter()</code> and <code>store#lookupSerializer()</code> have also been
deprecated starting in Ember 2.11. These methods were never publicly
documented. In their place we recommend you use <code>store#adapterFor()</code>
and <code>store#serializerFor()</code> respectively.</p>
<p><code>store#recordIsLoaded()</code> is deprecated in favor of
<code>store#hasRecordForId()</code>, as the logic in these two methods has been
identical since
<a href="https://github.com/emberjs/data/pull/2875">March 2015</a>.</p>
<p>All of the deprecated methods mentioned above will be supported until
Ember Data 3.0. Until then they will log a deprecation warning to
encourage use of the recommended replacement APIs.</p>
<h4 id="issueswithemberdatamodelfragments">Issues with Ember Data Model Fragments</h4>
<p>Due to internal refactoring, Ember Data 2.11 has
compatibility issues with older versions of the popular
<a href="https://www.npmjs.com/package/ember-data-model-fragments">Ember Data Model Fragments</a>
addon. If you are using this addon it
is recommended that you upgrade to
<a href="https://github.com/lytics/ember-data-model-fragments/pull/227">Ember Data Model Fragments 2.11</a>
at the same time as you upgrade Ember Data.</p>
<p>For more details on the changes in Ember Data 2.11, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.11.0">Ember Data 2.11.0 release page</a>.</p>
<h3 id="upcomingchangesinemberdata212">Upcoming changes in Ember Data 2.12</h3>
<p>Ember Data 2.12 contains further performance improvements, and is
looking to be the fastest ever release of Ember Data.</p>
<p>A new <code>serializeId()</code> method has been added to <code>JSONSerializer</code>,
<code>RESTSerializer</code> and <code>JSONAPISerializer</code>. This is useful if you are
working with a backend that requires your ids to be something other
than a string.</p>
<pre><code class="javascript language-javascript">// app/serializers/application.js
import DS from 'ember-data';

export default DS.JSONSerializer.extend({
  serializeId(snapshot, json, primaryKey) {
    var id = snapshot.id;
    json[primaryKey] = parseInt(id, 10);
   }
});
</code></pre>
<h4 id="deprecationsinemberdata212">Deprecations in Ember Data 2.12</h4>
<p>There are no planned deprecations for Ember Data 2.12.</p>
<p>For more details on the upcoming changes in Ember Data 2.11, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.12.0-beta.1">Ember Data 2.12.0-beta.1 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! To upgrade
your projects using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the
upgrade command run <code>ember init</code> inside of the project directory to apply the
blueprint changes. You can preview those changes for <a href="https://github.com/ember-cli/ember-new-output/compare/v2.10.0…v2.11.0">applications</a>
and <a href="https://github.com/ember-cli/ember-addon-output/compare/v2.10.0…v2.11.0">addons</a>.</p>
<h3 id="changesinembercli211">Changes in Ember CLI 2.11</h3>
<p>Ember CLI 2.11 no longer supports Node.js 0.12 per the
<a href="http://emberjs.com/blog/2016/09/07/ember-node-lts-support.html">Ember Node.js LTS Support policy</a>.
This also applies to a litany of sub-projects in the Ember community. Please
upgrade your Node.js version. We recommend adopting the most-recently-released
Node.js LTS.</p>
<p>Following the mitigation section in the recent <a href="/blog/2016/12/14/security-incident-aws-s3-key-exposure.html">security incident
report</a> we have
begun the process of migrating repositories in the <a href="https://github.com/ember-cli">ember-cli GitHub organization</a>
to be published automatically via their automated build systems. Ember CLI
itself has not yet been migrated and as such continues to follow our
<a href="https://github.com/ember-cli/ember-cli/blob/master/RELEASE.md">manual release process</a>.</p>
<h4 id="embernolongersuppliedviabower">Ember No Longer Supplied Via <code>bower</code></h4>
<p>We've been preparing for this moment for over a year now, but using <code>bower</code> is
now completely optional inside of Ember CLI! Beginning with 2.11 we now provide
Ember via the <a href="https://www.npmjs.com/package/ember-source"><code>ember-source</code> npm package</a>.
This means that when you run <code>ember new</code> after installing 2.11 you can expect
to have an empty (but present) <code>bower.json</code> file. Further work in 2.12 has been
done to remove <code>bower</code> itself as a dependency. Addon developers please ensure
that you're able to successfully test your addons with <code>ember-try</code>.</p>
<h4 id="updatedemberwelcomepage">Updated <code>ember-welcome-page</code></h4>
<p>The Learning Team has spent an incredible amount of time and energy improving
the new user experience. As part of that we've updated the <code>ember-welcome-page</code>
addon to the newest version which they have released. We're calling this out
because it adds <code>application.hbs</code> back into the default blueprint and includes
assets in a non-production build. Make sure that you always ship a <em>production</em>
build when you publish your application; otherwise you will also include the
assets from <code>ember-welcome-page</code> into your application.</p>
<h4 id="othernotablechanges-1">Other Notable Changes</h4>
<p>We have a litany of other smaller improvements in this release:</p>
<ul>
<li>We <a href="https://github.com/ember-cli/ember-cli/pull/6436">watch the <code>vendor</code> folder by default</a>,
making rebuilds work for changes in that directory. This may have performance
consequences, please monitor the resource consumption in your applications to
ensure that we have not regressed.</li>
<li>Stefan Penner and David Hamilton made it so we do a better job at
<a href="https://github.com/ember-cli/ember-cli/pull/6423">cleanup upon exit of Ember CLI</a>.
This work prevents the pollution of the <code>tmp</code> folder inside of your applications.</li>
<li>Robert Jackson dramatically <a href="https://github.com/ember-cli/ember-cli/pull/6453">reduced the number of merge steps</a>
inside of the build, speeding up the build process.</li>
</ul>
<p>For more details on the changes in Ember CLI 2.11 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.11.0">Ember CLI 2.11.0 release page</a>.</p>
<h3 id="upcomingchangesinembercli212">Upcoming Changes in Ember CLI 2.12</h3>
<p>We adopted the standard six week release cycle for Ember CLI shortly following
EmberConf 2016. This constant cadence allows us to get the improvements we've
collectively been working on into our applications. Ember CLI 2.12 will be the
most work we've ever had in a single release cycle and we're ecstatic to get all
300+ commits (not including merges or upstream changes!) into your hands.</p>
<h4 id="babel">Babel</h4>
<p>We've made changes in the way you configure Babel in your applications and also
now require that addons which need Babel transpilation supply their own
<code>ember-cli-babel</code> dependency. The root application is <em>no longer</em> wholly
responsible for the transpilation of all dependent addons. There is a
deprecation message which should guide you through the steps to make the
necessary changes in your application. This also means that addons themselves
are responsible for transpiling their code into AMD modules.</p>
<p>We no longer overload the <code>babel</code> key inside of <code>ember-cli-build.js</code> to
conditionally use certain arguments for <code>babel</code> and others for
<code>ember-cli-babel</code>. This is categorically better, and we've provided deprecation
messages to help guide you to the new correct usage pattern.</p>
<p>Rather than trying to walk through how to make these changes, please test this
out during the beta period and let us know if the messages are able to guide you
to the newly correct setup.</p>
<h4 id="eslintallthethings">ESLint All The Things!</h4>
<p>Tobias Bieniek has been on a mission; we've now completed the move to ESLint
as the newly recommended linting tool for Ember applications. After upgrading to
Ember CLI 2.12 and running <code>ember init</code> you will be presented with options to
remove the existing <code>ember-cli-jshint</code> and rules and adopt <code>ember-cli-eslint</code>.
The process should be relatively straightforward, though you'll have to migrate
your styling rules from JSHint to ESLint. Please test it out and let us know how
it works in your applications during the beta period.</p>
<h4 id="nestedaddonpreprocesstreeandpostprocesstreeinvocation">Nested Addon <code>preprocessTree</code> and <code>postprocessTree</code> Invocation</h4>
<p>In an oversight, we did not invoke <code>preprocessTree</code> and <code>postprocessTree</code>
against addon trees which were nested inside of other addons preventing them
from interacting with their parent addons in the ideal manner. This has been
fixed but it is possible that this bug-fix will change the build outcome of your
applications. We manually reviewed all public addons and didn't identify any
likely issues, please report back with any problems you discover in your private
addons.</p>
<h4 id="performance">Performance</h4>
<p>One of the major themes for this release cycle has been a focus on the build
performance of Ember CLI. We've added instrumentation to understand where we're
spending time and have begun the consistent incremental work required to bring
build times down without changing the build output. This has been a team effort
with contributions from David Hamilton, Robert Jackson, Stefan Penner, Trent
Willis, and more.</p>
<h4 id="globalnpmusage">Global <code>npm</code> Usage</h4>
<p>Rather than bundling our own copy of <code>npm</code> into Ember CLI we now delegate to the
system-installed version of <code>npm</code>. This should dramatically reduce the install
time for your <code>node_modules</code> directory. Note that we have set the minimum
supported version to be <code>npm@3</code>. If you need to update the version on your
system you can do so by running <code>npm install -g npm</code>.</p>
<h4 id="developersdevelopersdevelopersdevelopers">Developers, Developers, Developers, Developers</h4>
<p>We've made a tremendous number of behind-the-scene changes to Ember CLI in
2.12. Our goal is to make contributing to Ember CLI simpler and quicker. Some
of the improvements include:</p>
<ul>
<li>We've adopted ESLint for Ember CLI itself, painted a few bikesheds, and
now have a much more consistent codebase. PR comments around code style should
come with an associated style rule change to enforce that behavior so that it
is consistent given the multitude of reviewers we have.</li>
<li>Now that we have dropped support for Node.js 0.12 we have begun adoption of
all of the nice things we weren't previously able to use; most-specifically
<strong>ES6 classes</strong>! We've modified <code>core-object</code> as well in order to make it
compatible with ES6 classes.</li>
<li>We've adopted Yarn for development of Ember CLI. We now use it for CI and are
using this to lay a foundation for making <code>yarn</code> a default and <em>supported</em>
option for package management in applications.</li>
<li>By virtue of a lot of work in CI and on caching test run times have been
reduced to seven minutes. Check out <a href="https://github.com/ember-cli/ember-cli/blob/master/tests/helpers/package-cache.js">PackageCache</a>
which got us most of the reward. More work is being done to allow offline tests.</li>
<li>We've introduced an experiments API which allows us to incrementally land
invasive changes behind an experiment flag. The experiment flag prevents their
use except on the <code>canary</code> branch. This allows us to experiment with API shape
and understand problems without committing to publishing a feature. Currently
the instrumentation changes are behind an experiment flag which allows us to
understand the needs and write a <a href="https://github.com/ember-cli/rfcs/pull/90">much more complete RFC</a>.</li>
</ul>
<p>We will continue this effort in upcoming releases.</p>
<h4 id="othernotablechanges-2">Other Notable Changes</h4>
<ul>
<li><code>ember new</code> and <code>ember addon</code> correctly support the <code>--directory</code> argument and
allow you to specify an existing empty directory.</li>
<li>Removed <code>ember-data</code> and <code>ember-cli-app-version</code> from the default
<code>ember addon</code> blueprint.</li>
<li>Duplicate calls to <code>.import('assetname.js)'</code> will no longer include the asset
in the output file twice.</li>
<li>Given that we no longer require <code>bower</code> in the default scenario, we now lazily
install it into your application the first time that you need it.</li>
<li>Krati Ahuja split and removed the internal <code>serve-files</code> addon which was
responsible for serving of assets in <code>ember serve</code>. This enables progress on
FastBoot.</li>
</ul>
<p>For more details on the changes in Ember CLI 2.12.0-beta.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.12.0-beta.1">Ember CLI 2.12.0-beta.1 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of
these releases serve as a reminder that the Ember project would not have been
possible without your continued support. We are extremely grateful to our
contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-2-11-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-11-released</guid><pubDate>Mon, 23 Jan 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 2.12 and 2.13 Beta Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 2.12.0 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 2.13 beta cycle for all sub-projects. We encourage our
community (especially addon authors) to help test these beta builds and report
any bugs before they are published as a final release in six weeks' time. The
<a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to
continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs212">Changes in Ember.js 2.12</h3>
<p>The
2.12.0 release is an Ember.js Long-Term Support candidate. In six weeks, the 2.12.x series
will become the latest LTS release and six weeks after that the 2.8 LTS branch
will no longer receive bugfix patches.</p>
<p>For more information about Ember's LTS policies, see the
<a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">announcement blog
post</a> and
<a href="http://emberjs.com/builds/">builds page</a>.</p>
<p>Ember 2.12 implements the <code>factoryFor</code> API as described in <a href="https://github.com/emberjs/rfcs/blob/master/text/0150-factory-for.md">RFC #150</a>.
This public API replaces the intimate API of <code>_lookupFactory</code>, and additionally
discourages developers from setting properties on classes returned from the
container. For more information about this API see the <a href="http://emberjs.com/api/classes/ContainerProxyMixin.html#method_factoryFor">API
docs</a>
and <a href="http://emberjs.com/deprecations/v2.x/#toc_migrating-from-_lookupfactory-to-factoryfor"><code>_lookupFactory</code> deprecation guide</a>.</p>
<p>Addon authors and others should consider if the
<a href="https://github.com/rwjblue/ember-factory-for-polyfill">ember-factory-for-polyfill</a>
addon can help them avoid the deprecation warning for <code>_lookupFactory</code>.</p>
<p>Additionally, this release of Ember contains an incremental performance
improvement for the Glimmer rendering engine (you may have seen it
referred to as the "binary VM"). By avoiding runtime
compilation of syntax objects, initial rendering performance will benefit.</p>
<h4 id="deprecationsinember212">Deprecations in Ember 2.12</h4>
<ul>
<li><p>The <code>Ember.K</code> utility function is deprecated per <a href="https://github.com/emberjs/rfcs/blob/master/text/0178-deprecate-ember-k.md">RFC #178</a>.
See the <a href="http://emberjs.com/deprecations/v2.x/#toc_code-ember-k-code">deprecation guide</a>
and pull request <a href="https://github.com/emberjs/ember.js/pull/14751">#14751</a>
for additional details.</p></li>
<li><p>Arguments to the component lifecycle hooks of <code>didInitAttrs</code>, <code>didReceiveAttrs</code>, and <code>didUpdateAttrs</code>
are deprecated. These arguments were private and undocumented. Please see
<a href="https://github.com/emberjs/rfcs/blob/master/text/0191-deprecate-component-lifecycle-hook-args.md">RFC #191</a>
for further context and discussion.
Please note that
this only deprecates the usage of the arguments passed to this hook, not the
hooks themselves. See pull request <a href="https://github.com/emberjs/ember.js/pull/14711">#14711</a>
for additional details.</p></li>
</ul>
<p>For more details on the changes in Ember.js 2.12, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.12.0">Ember.js 2.12.0 release page</a>.</p>
<h3 id="upcomingchangesinemberjs213">Upcoming Changes in Ember.js 2.13</h3>
<p>Building on the addition of <code>factoryFor</code> in Ember 2.12, Ember 2.13 will change
the way dependency injection is implemented in the framework. Until 2.12,
dependencies were injected onto an instance using <code>extend</code> to create a subclass.
This created an excessive number of subclasses during the execution of an
application. In Ember 2.13 injections will be passed to an object via <code>create</code>
during instantiation. This results in a notable performance improvement
that grows in impact with the complexity of an application.</p>
<p>See <a href="https://github.com/emberjs/rfcs/blob/master/text/0150-factory-for.md">RFC #150</a>
and pull request <a href="https://github.com/emberjs/ember.js/pull/14360">#14360</a> for
more details about this change.</p>
<p>Additionally, this release contains a further refinement on the "binary VM"
change landed in 2.12. By using integers for common Glimmer wire-format strings,
compiled template sizes in 2.13 will see an incremental size reduction.</p>
<p>In addition to these and other improvements, several changes arising
from the <a href="https://github.com/emberjs/rfcs">RFC</a> process have been implemented:</p>
<ul>
<li><a href="https://github.com/emberjs/rfcs/issues/146">RFC issue #146</a> advocated for the
addition of <code>resumeTest</code> as a compliment to <code>pauseTest</code>. This was implemented
in <a href="https://github.com/emberjs/ember.js/pull/13663">#13663</a>.</li>
<li><a href="https://github.com/emberjs/rfcs/blob/master/text/0186-track-unique-history-location-state.md">RFC #186</a>
describes the addition of <code>uuid</code> as a property on <code>HistoryLocation</code> adapters
for the router. This addition makes it possible to track scroll locations
to a point in browsing history. See pull request <a href="https://github.com/emberjs/ember.js/pull/14011">#14011</a>
for more details.</li>
</ul>
<p>For more details on the upcoming changes in Ember.js 2.13, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.13.0-beta.1">Ember.js 2.13.0-beta.1 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata212">Changes in Ember Data 2.12</h3>
<p>Ember Data 2.12 represents the work of 19 direct contributors
and over 90 commits.</p>
<p>Ember Data 2.12 continues to reflect our focus on performance improvements, and
we are happy to report this is the fastest release of Ember Data yet.</p>
<p>A new <code>serializeId()</code> method has been added to <code>JSONSerializer</code>,
<code>RESTSerializer</code> and <code>JSONAPISerializer</code>. This is useful if you are
working with a backend that requires your ids to be something other
than a string. For example:</p>
<pre><code class="javascript language-javascript">// app/serializers/application.js
import DS from 'ember-data';

export default DS.JSONSerializer.extend({
  serializeId(snapshot, json, primaryKey) {
    var id = snapshot.id;
    json[primaryKey] = parseInt(id, 10);
   }
});
</code></pre>
<p>For more information see the <a href="http://emberjs.com/api/data/classes/DS.JSONSerializer.html#method_serializeId"><code>serializeId</code> API
docs</a>.</p>
<h4 id="deprecationsinemberdata212">Deprecations in Ember Data 2.12</h4>
<p>Ember Data 2.12 contains no new deprecations.</p>
<p>For more details on the changes in Ember Data 2.12, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.12.0">Ember Data 2.12.0 release page</a>.</p>
<h3 id="upcomingchangesinemberdata213">Upcoming changes in Ember Data 2.13</h3>
<p>The <code>ds-extended-errors</code> (<a href="https://github.com/emberjs/data/pull/3586">#3586</a> <a href="https://github.com/emberjs/data/pull/4287">#4287</a>) feature has been enabled on the beta branch for Ember Data 2.13.</p>
<p>This feature introduces an <code>extend</code> method on errors which allows
users to create their own custom errors that extend from
<code>DS.AdapterError</code>.</p>
<pre><code class="javascript language-javascript">const MyCustomError = DS.AdapterError.extend({ message: "My custom error." });
</code></pre>
<p>The feature also introduces some new errors to rest adapter which will
be used to reject the adapter promises based on http status of the API
response.</p>
<ul>
<li>[401] <code>DS.UnauthorizedError</code></li>
<li>[403] <code>DS.ForbiddenError</code></li>
<li>[404] <code>DS.NotFoundError</code></li>
<li>[409] <code>DS.ConflictError</code></li>
<li>[500] <code>DS.ServerError</code></li>
</ul>
<p>Thanks to <a href="https://github.com/tchak">tchak</a> and
<a href="https://github.com/tchak">twokul</a> for their work on this feature and
<a href="https://github.com/lindyhopchris">lindyhopchris</a> for his help
documenting the feature.</p>
<p>For more details on the upcoming changes in Ember Data 2.13, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.13.0-beta.1">Ember Data 2.13.0-beta.1 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! To upgrade
your projects using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the
upgrade command run <code>ember init</code> inside of the project directory to apply the
blueprint changes. You can preview those changes for <a href="https://github.com/ember-cli/ember-new-output/compare/v2.11.0…v2.12.0">applications</a>
and <a href="https://github.com/ember-cli/ember-addon-output/compare/v2.11.0…v2.12.0">addons</a>.</p>
<h3 id="changesinembercli212">Changes in Ember CLI 2.12</h3>
<h4 id="switchtoeslint">Switch to ESLint</h4>
<!-- alex ignore simple -->
<p>Ember CLI will now generate new projects with an ESLint setup. This changes the default linting system from JSHint (which has been used since we initially added linting support to Ember CLI) to ESLint. The new project setup uses a fairly simple <code>.eslinrc.js</code> relying largely on ESLint's own <code>recommended</code>.</p>
<p>Using JSHint in projects and addons generated by prior versions of Ember CLI is still supported, but we recommend that you update to
ESLint as you upgrade your project and addons to newer Ember CLI versions.</p>
<h4 id="reduceddependencies">Reduced Dependencies</h4>
<p>In order to avoid inconsistencies and issues due to supporting many <code>npm</code> client versions, Ember CLI has had <code>npm</code> as a dependency
for quite some time. This is used for both <code>ember new foo</code> (to initially install dependencies for a newly generated application) and
to install packages via <code>ember install ember-cli-template-lint</code> (to install the addon specified). Having <code>npm</code> as a dependency
introduces roughly 19MB to a freshly generated application's <code>node_modules</code> size. As the <code>npm</code> client has become more stable (3.x series and
newer) this has seemed more and more wasteful.</p>
<p>Starting with Ember CLI 2.12, <code>npm</code> is no longer a dependency. If a suitable version of <code>npm</code> is present on the system,
it will be used. If <code>npm</code> is not found, or a version older than <code>3.0.0</code> is found, Ember CLI will emit an error when you run commands that would utilize
<code>npm</code> (e.g. <code>ember install</code>, <code>ember new</code>, <code>ember addon</code>, <code>ember init</code>).</p>
<p>Similarly, Ember CLI had a dependency on <code>bower</code> in order to support the <code>bower install</code> phase while generating new projects and installing
addons.
As of Ember CLI 2.11 a new application has no dependencies via <code>bower.json</code>. This means the dependency on <code>bower</code> itself is also potential bloat.
Having <code>bower</code>
as a dependency added roughly 21MB to a new application's total <code>node_modules</code> size. In Ember CLI 2.12, bower is only added as a dependency if a command
requires <code>bower</code>.</p>
<p>Combined, these changes result in a <code>node_modules</code> size reduction of approximately 40MB for newly generated applications.</p>
<h4 id="othernotablechanges">Other Notable Changes</h4>
<ul>
<li><code>ember-data</code> has been removed from the addon blueprint.</li>
<li>Properly call <code>preprocessTree</code> / <code>postprocessTree</code> for addons.</li>
<li>Split serving assets into separate internal addons. This enables work to push ember-cli-fastboot towards 1.0.0.</li>
</ul>
<p>For more details on the changes in Ember CLI 2.12 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.12.0">Ember CLI 2.12.0 release page</a>.</p>
<h3 id="upcomingchangesinembercli213">Upcoming Changes in Ember CLI 2.13</h3>
<h4 id="addsupportforusingyarn">Add support for using <code>yarn</code></h4>
<p>Ember CLI projects have been able to utilize <code>yarn</code> for dependency management for quite some time, however it was not well supported by
the default generators. In 2.13 Ember CLI is now "yarn aware", and will use <code>yarn</code> for tasks such as <code>ember install</code> if it detects that
<code>yarn</code> is installed and a <code>yarn.lock</code> exists in the project. You can even instruct <code>ember new</code> to generate a new project with a <code>yarn.lock</code>
for you via <code>ember new foo --yarn</code>.</p>
<h4 id="enableinstrumentationhooks">Enable Instrumentation Hooks</h4>
<p>Ember CLI has had the ability to generate custom instrumentation output for builds for a few years now (introduced on 2015-08-24), but
this information has not been readily accessible. In 2.13 ember-cli exposes this information to addons that implement the <code>instrumentation</code>
hook. This allows addons to access many things that were previously very difficult (e.g. reliable build time reporting).</p>
<p>Thanks to <a href="https://github.com/hjdivad">@hjdivad</a> for proposing and implementing this feature. Please read through <a href="https://github.com/ember-cli/rfcs/blob/master/complete/0091-addon-instrumentation-experimental-hooks.md">the RFC</a>
for more details.</p>
<h4 id="targets">Targets</h4>
<p>In order to allow addons to understand the desired target platforms of the app that they are operating in, a new file has been added
to all generated projects: <code>config/targets.js</code>. This file exposes the supported targets so that tooling such as <a href="https://github.com/postcss/autoprefixer">autoprefixer</a>
and <a href="https://github.com/babel/babel-preset-env">babel-preset-env</a> can properly understand the level of transpilation that is needed.</p>
<p>The default <code>config/targets.js</code> looks like:</p>
<pre><code class="javascript language-javascript">module.exports = {
  browsers: [
    'ie 9',
    'last 1 Chrome versions',
    'last 1 Firefox versions',
    'last 1 Safari versions'
  ]
};
</code></pre>
<p>The target information is exposed to addons via <code>this.project.targets</code>.</p>
<p>Thanks to <a href="https://github.com/cibernox">@cibernox</a> for proposing and implementing this feature. Please read through <a href="https://github.com/ember-cli/rfcs/blob/master/complete/0095-standardise-targets.md">the RFC</a>
for more insight.</p>
<h4 id="babel6">Babel 6</h4>
<p>Babel 6 was introduced on stage during EmberCamp London way back on 2015-10-29. However, Ember CLI and its ecosystem
have continued to use the aging and nearly unsupported Babel 5. Babel 6 was a massive shift for Babel and the migration posed quite a
challenge for ember-cli.</p>
<p>After much work, Babel 6 support has been added to Ember CLI internally and for newly generated projects (both applications and addons).
The latest beta of <code>ember-cli-babel@6</code> takes advantage of the new <code>project.targets</code> API along with <a href="https://github.com/babel/babel-preset-env"><code>babel-preset-env</code></a>
to allow applications to have significantly better control of exactly what is transpiled. <code>babel-preset-env</code> utilizes the <a href="http://caniuse.com/">caniuse</a> and
<a href="https://github.com/kangax">@kangax</a>'s <a href="https://kangax.github.io/compat-table/es6/">ES6 compatibility database</a> to know which features are available natively and which
require transpilation. For example, with the proper targets configuration <code>ember-cli-babel</code> will no longer transpile <code>const</code> / <code>let</code>,
<code>() =&gt; { }</code> functions, <code>class</code>, etc.</p>
<p>The work done in <code>ember-cli-babel</code> allows both <code>ember-cli-babel@5</code> and <code>ember-cli-babel@6</code> to coexist peacefully, so it is safe for addon authors
to begin updating their internal <code>ember-cli-babel</code> dependency so that applications can take advantage of more of these <code>babel@6</code> features.</p>
<p>Please test your applications and addons with <code>ember-cli-babel@6</code> and report any issues you encounter. Due to the large number of changes required
internally, we would like a larger than normal beta testing base to ensure things are as stable as possible before 2.13.0 is released.</p>
<h4 id="othernotablechanges-1">Other Notable Changes</h4>
<ul>
<li><code>bower.json</code> is no longer included in a newly generated project.</li>
<li>Fix command interruption issues on windows.</li>
<li>Added <code>filesToRemove</code> property for custom blueprints.</li>
</ul>
<p>For more details on the changes in Ember CLI 2.13.0-beta.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.13.0-beta.1">Ember CLI 2.13.0-beta.1 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of
these releases serve as a reminder that the Ember project would not have been
possible without your continued support. We are extremely grateful to our
contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-2-12-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-12-released</guid><pubDate>Sun, 19 Mar 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 2.12-LTS, Ember 2.13 and 2.14 Beta Released]]></title><description><![CDATA[<p><em>Updated on December 19, 2017 to include information about Ember.js 2.12-LTS.</em></p>
<p>Today the Ember project is releasing Ember.js 2.12 LTS (a long-term support
release) and version 2.13.0 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release also kicks off the 2.14 beta cycle for all sub-projects. We encourage
our community (especially addon authors) to help test these beta builds and report
any bugs before they are published as a final release in six weeks' time. The
<a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to
continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="emberjs212lts">Ember.js 2.12-LTS</h3>
<p>Ember 2.12-LTS is our third long-term support release. You can install it
by upgrading <code>ember-source</code> to <code>~2.12.2</code> in your <code>package.json</code>.</p>
<p>The LTS channel is designed for Ember users who would like to upgrade less
frequently, while still getting support from the project and the wider
ecosystem. At the same time, it allows addon authors to know which versions
of Ember to focus their effort on.</p>
<p>Per our <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">usual policy</a>,
Ember 2.12-LTS is released six weeks after the
<a href="https://www.emberjs.com/blog/2017/03/19/ember-2-12-released.html">2.12.0 stable release</a>.
This allows ample time to fix any reported regressions and ensures a rock
solid LTS release. It will continue to receive critical bugfixes for six
release cycles (roughly Janurary 2018), and security patches for ten release
cycles (roughly June 2018).</p>
<p>Meanwhile, Ember 2.8-LTS will continue to receive critical bugfixes for another
two release cycles (roughly July 2017), and security patches for six release
cycles (roughly February 2018). Users of Ember 2.8-LTS should make use of this
overlapping period to transition over to Ember 2.12-LTS.</p>
<hr />
<p>For more details on the changes landing in Ember.js 2.12-LTS, please review the
<a href="https://github.com/emberjs/ember.js/blob/v2.12.2/CHANGELOG.md">Ember.js 2.12.2 CHANGELOG</a>.</p>
<h3 id="changesinemberjs213">Changes in Ember.js 2.13</h3>
<p>Building on the addition of <code>factoryFor</code> in Ember 2.12, Ember 2.13 changes
the way dependency injection is implemented in the framework. Until 2.12,
dependencies were injected onto an instance using <code>extend</code> to create a subclass.
This created an excessive number of subclasses during the execution of an
application. In Ember 2.13 injections are passed to an object via <code>create</code>
during instantiation. This results in a notable performance improvement
that grows in impact with the complexity of an application.</p>
<p>See <a href="https://github.com/emberjs/rfcs/blob/master/text/0150-factory-for.md">RFC #150</a>
and pull request <a href="https://github.com/emberjs/ember.js/pull/14360">#14360</a> for
more details about this change.</p>
<p>Additionally, this release contains a further refinement on the "binary VM"
change landed in 2.12. By using integers for common Glimmer wire-format strings,
compiled template sizes in 2.13 will see an incremental size reduction.</p>
<p>In addition to these and other improvements, several changes arising
from the <a href="https://github.com/emberjs/rfcs">RFC</a> process have been implemented:</p>
<ul>
<li><a href="https://github.com/emberjs/rfcs/issues/146">RFC issue #146</a> advocated for the
addition of <code>resumeTest</code> as a compliment to <code>pauseTest</code>. This was implemented
in <a href="https://github.com/emberjs/ember.js/pull/13663">#13663</a>.</li>
<li><a href="https://github.com/emberjs/rfcs/blob/master/text/0186-track-unique-history-location-state.md">RFC #186</a>
describes the addition of <code>uuid</code> as a property on <code>HistoryLocation</code> adapters
for the router. This addition makes it possible to track scroll locations
to a point in browsing history. See pull request <a href="https://github.com/emberjs/ember.js/pull/14011">#14011</a>
for more details.</li>
</ul>
<h4 id="deprecationsinember213">Deprecations in Ember 2.13</h4>
<p>A bit of cleanup has been done to reduce confusion (during implementation of the <a href="https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md">router service</a>) which resulted in adding a deprecation for accessing the private <code>router</code> property
of the router. This property has always been private API, but a number of addons have resorted to
using it due to lack of public API options (though the router service should address these remaining
cases). Please review the <a href="https://emberjs.com/deprecations/v2.x/#toc_ember-router-router-renamed-to-ember-router-_routermicrolib">deprecation guide</a>
for more details.</p>
<p>For more details on the changes in Ember.js 2.13, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.13.0">Ember.js 2.13.0 release page</a>.</p>
<h3 id="upcomingchangesinemberjs214">Upcoming Changes in Ember.js 2.14</h3>
<p>Ember 2.14 is shaping up to be largely a bugfix release, containing a significant amount of internal cleanup.</p>
<p>For more details on the upcoming changes in Ember.js 2.14, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.14.0-beta.1">Ember.js 2.14.0-beta.1 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata213">Changes in Ember Data 2.13</h3>
<p>Ember Data 2.13 represents the work of 20 direct contributors
and over 120 commits.</p>
<p>The <code>ds-extended-errors</code> (<a href="https://github.com/emberjs/data/pull/3586">#3586</a> <a href="https://github.com/emberjs/data/pull/4287">#4287</a>) feature has been enabled for Ember Data 2.13.</p>
<p>This feature introduces an <code>extend</code> method on errors which allows
users to create their own custom errors that extend from
<code>DS.AdapterError</code>.</p>
<pre><code class="javascript language-javascript">const MyCustomError = DS.AdapterError.extend({ message: "My custom error." });
</code></pre>
<p>The feature also introduces some new errors to the REST adapter which will
be used to reject the adapter promises based on http status of the API
response.</p>
<ul>
<li>[401] <code>DS.UnauthorizedError</code></li>
<li>[403] <code>DS.ForbiddenError</code></li>
<li>[404] <code>DS.NotFoundError</code></li>
<li>[409] <code>DS.ConflictError</code></li>
<li>[500] <code>DS.ServerError</code></li>
</ul>
<p>Thanks to <a href="https://github.com/tchak">tchak</a> and
<a href="https://github.com/twokul">twokul</a> for their work on this feature and
<a href="https://github.com/lindyhopchris">lindyhopchris</a> for his help
documenting the feature.</p>
<h4 id="deprecationsinemberdata213">Deprecations in Ember Data 2.13</h4>
<p>Ember Data 2.13 deprecates the <code>data-adapter</code>, <code>injectStore</code>,
<code>transforms</code>, and <code>store</code> Ember application initializers that Ember Data injects
into apps. The deprecation was proposed via <a href="https://github.com/emberjs/rfcs/blob/master/text/0181-deprecate-ember-data-initializers.md">an RFC</a>,
and the Ember Data team proactively submitted pull-requests for all usages of
these initializers in open source addons.</p>
<p>For more details on the changes in Ember Data 2.13, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.13.0">Ember Data 2.13.0 release page</a>.</p>
<h3 id="upcomingchangesinemberdata214">Upcoming changes in Ember Data 2.14</h3>
<p>In 2.14, Ember Data continues its internal refactorings and performance work without
impacting public APIs. It is shaping up nicely with reduced asset size (~ 3KB savings),
better warnings and errors around malformed JSONAPI payloads, and simplified internals.</p>
<h4 id="deprecationsinemberdata214">Deprecations in Ember Data 2.14</h4>
<p>Ember Data 2.14
<a href="https://github.com/emberjs/data/pull/4909/files">deprecates</a> the
private method <code>didUpdateAll</code>. If you are using it in your codebase
please use the updated methods name <code>_didUpdateAll</code>.</p>
<p>For more details on the upcoming changes in Ember Data 2.14, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.14.0-beta.1">Ember Data 2.14.0-beta.1 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! To upgrade
your projects using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the
upgrade command run <code>ember init</code> inside of the project directory to apply the
blueprint changes. You can preview those changes for <a href="https://github.com/ember-cli/ember-new-output/compare/v2.12.0…v2.13.0">applications</a>
and <a href="https://github.com/ember-cli/ember-addon-output/compare/v2.12.0…v2.13.0">addons</a>.</p>
<h3 id="changesinembercli213">Changes in Ember CLI 2.13</h3>
<h4 id="addsupportforusingyarn">Add support for using <code>yarn</code></h4>
<p>Ember CLI projects have been able to utilize <code>yarn</code> for dependency management for quite some time, however it was not well supported by
the default generators. In 2.13, Ember CLI is now "yarn aware", and will use <code>yarn</code> for tasks such as <code>ember install</code> if it detects that
<code>yarn</code> is installed and a <code>yarn.lock</code> exists in the project. You can even instruct <code>ember new</code> to generate a new project with a <code>yarn.lock</code>
for you via <code>ember new foo --yarn</code>.</p>
<h4 id="enableinstrumentationhooks">Enable Instrumentation Hooks</h4>
<p>Ember CLI has had the ability to generate custom instrumentation output for builds for a few years now (introduced on 2015-08-24), but
this information has not been readily accessible. In 2.13, ember-cli exposes this information to addons that implement the <code>instrumentation</code>
hook. This allows addons to access many things that were previously very difficult (e.g. reliable build time reporting).</p>
<p>Thanks to <a href="https://github.com/hjdivad">@hjdivad</a> for proposing and implementing this feature. Please read through <a href="https://github.com/ember-cli/rfcs/blob/master/complete/0091-addon-instrumentation-experimental-hooks.md">the RFC</a>
for more details.</p>
<h4 id="targets">Targets</h4>
<p>In order to allow addons to understand the desired target platforms of the app that they are operating in, a new file has been added
to all generated projects: <code>config/targets.js</code>. This file exposes the supported targets so that tooling such as <a href="https://github.com/postcss/autoprefixer">autoprefixer</a>
and <a href="https://github.com/babel/babel-preset-env">babel-preset-env</a> can properly understand the level of transpilation that is needed.</p>
<p>Thanks to <a href="https://github.com/cibernox">@cibernox</a> for proposing and implementing this feature. <a href="https://github.com/rwjblue">@rwjblue</a>
recently wrote a blog post reviewing the new feature and how to utilize it: <a href="http://rwjblue.com/2017/04/21/ember-cli-targets/">Ember CLI Targets</a>.</p>
<h4 id="babel6">Babel 6</h4>
<p>Babel 6 support has been added to Ember CLI internally and is now used by default for newly generated projects (both applications and addons).
Due to the way that Ember CLI handles transpilation this transition can be done gradually by updating each addon to utilize newer versions of
<a href="https://github.com/babel/ember-cli-babel">ember-cli-babel</a>. Here's how to update your application to start using Babel 6 for its own transpilation:</p>
<pre><code class="bash language-bash"># if using yarn:
yarn upgrade ember-cli-babel@6

# if using npm:
npm install --save-dev ember-cli-babel@6
</code></pre>
<h4 id="othernotablechanges">Other Notable Changes</h4>
<ul>
<li><code>bower.json</code> is no longer included in a newly generated project.</li>
<li>Fix command interruption issues on windows.</li>
<li>Added <code>filesToRemove</code> property for custom blueprints.</li>
</ul>
<p>For more details on the changes in Ember CLI 2.13 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.13.0">Ember CLI 2.13.0 release page</a>.</p>
<h3 id="upcomingchangesinembercli214">Upcoming Changes in Ember CLI 2.14</h3>
<p>In Ember CLI 2.14, support was added to <code>ember new</code> to allow a blueprint to be consumed from an NPM package. This enables projects to utilize Ember CLI's
ergonomics to generate non-Ember applications. Common examples of this are:</p>
<ul>
<li>Generate a new <a href="https://glimmerjs.com/">Glimmer.js</a> application. See <a href="https://github.com/glimmerjs/glimmer-blueprint">glimmerjs/glimmer-blueprint</a>.</li>
<li>Generate a new <a href="http://ember-cli-deploy.com/">ember-cli-deploy</a> plugin. See <a href="https://github.com/ember-cli-deploy/plugin-blueprint">ember-cli-deploy/plugin-blueprint</a>.</li>
</ul>
<p>To do so, run in your terminal:</p>
<pre><code class="bash language-bash">npm install -g ember-cli@2.14.0-beta.1
ember new ember-cli-deploy-hello -b @ember-cli-deploy/plugin-blueprint
</code></pre>
<p>For more details on the changes in Ember CLI 2.14.0-beta.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.14.0-beta.1">Ember CLI 2.14.0-beta.1 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of
these releases serve as a reminder that the Ember project would not have been
possible without your continued support. We are extremely grateful to our
contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-2-13-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-13-released</guid><pubDate>Sat, 29 Apr 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 2.14 and 2.15 Beta Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 2.14.0 of Ember.js, Ember Data, and Ember CLI. You may have noticed we're a few weeks late on this release, as the
start of summer may have left us a little distracted 😅.</p>
<p>This release kicks off the 2.15 beta cycle for all sub-projects. We encourage our
community (especially addon authors) to help test these beta builds and report
any bugs before they are published as a final release in six weeks' time. The
<a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to
continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs214">Changes in Ember.js 2.14</h3>
<p>Ember.js 2.14.0 is an incremental, backwards compatible release of Ember with
bug-fixes, performance improvements, and minor deprecations.</p>
<p>A notable change that began in Ember 2.13.0 and continues in 2.14.0 is improved packaging of the
framework itself. This includes adoption of <a href="https://babeljs.io/">Babel</a> 6 and using
<a href="https://rollupjs.org/">Rollup</a> on internal Ember packages.</p>
<p>The 2.14.0 release of Ember.js comes in as 7k smaller than 2.13.3 (minified
and gzipped). Additionally, initial render time of real world apps continues to
improve. This benchmark shows time-to-initial render of
<a href="http://emberaddons.com/">emberaddons.com</a> measured using
<a href="https://github.com/krisselden/ember-macro-benchmark">ember-macro-benchmark</a>:</p>
<p><img src="/images/blog/2017-07-03/initial-render.png" alt="A comparison render times among Ember 2.12, 2.13, and 2.14" /></p>
<p>We're continuing to make similar improvements across the Ember project
libraries. By measuring the impact of these changes as we make them, we
will ensure complicated build changes avoid unintended regressions.</p>
<h4 id="deprecationsinember214">Deprecations in Ember 2.14</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date.</p>
<p>Each deprecation has an entry in the deprecation guide describing the migration
path to more stable API. Deprecated public APIs are not removed until a major
release of the framework.</p>
<p>Consider using the
<a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a>
addon if you would like to upgrade your application without immediately addressing
deprecations.</p>
<p>Two new deprecations are introduces in Ember 2.14.0:</p>
<ul>
<li><code>Ember.MODEL_FACTORY_INJECTIONS</code> is deprecated. This flag enabled DI behavior
required by Ember Data prior to changes landed in Ember 2.11. It is intimate
API scheduled for removal in Ember 2.17.0. If your application sets this
flag you can safely remove it. See the <a href="https://www.emberjs.com/deprecations/v2.x/#toc_ember-model_factory_injections-removed">deprecation guide
entry</a> and the <a href="https://github.com/emberjs/ember.js/pull/15204">implementation PR</a>
for more details.</li>
<li>Use of the <code>eventManager</code> property on components and the <code>canDispatchToEventManager</code>
property on <code>EventManager</code>s has been deprecated. These rarely used and
undocumented parts of the already obscure event manager API where designed for
touch-event use cases that now have other and better solutions. See the
<a href="https://www.emberjs.com/deprecations/v2.x/#toc_custom-eventmanger-deprecated">deprecation
guide</a>
and
<a href="https://github.com/emberjs/ember.js/pull/15078">deprecation PR</a> for more
details.</li>
</ul>
<p>For more details on changes in Ember.js 2.14.0, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.14.0">Ember.js 2.14.0 release page</a>.</p>
<h3 id="upcomingchangesinemberjs215">Upcoming Changes in Ember.js 2.15</h3>
<p>Ember.js 2.15.0 will introduce two new features:</p>
<ul>
<li><a href="https://github.com/emberjs/rfcs/pull/225">RFC #225</a> adds the argument
<code>model</code> to the <code>{{mount}}</code> engine helper. For example <code>{{mount 'admin'
model=(hash user=user)}}</code> would provide the object with <code>{user}</code> as a <code>model</code>
property on the engine's application route. See the <a href="https://github.com/emberjs/ember.js/pull/15174">implementation
PR</a> and
<a href="https://github.com/emberjs/ember.js/pull/15325/files">followup PR</a> for more
details.</li>
<li>Implementation phase 1 for <a href="https://github.com/emberjs/rfcs/pull/95">RFC #95</a>,
the routing service.
This RFC describes a first-class
public API routing service. Amongst other changes, the service provides a way for
Ember components to interact with routing state and controls. This initial
phase of the work includes all of the routing RFC besides the <code>RouteInfo</code>
objects. See the
major <a href="https://github.com/emberjs/ember.js/pull/14805">implementation</a>
<a href="https://github.com/emberjs/ember.js/pull/14980">pull</a>
<a href="https://github.com/emberjs/ember.js/pull/15414">requests</a> for more details.</li>
</ul>
<p>For more details on the upcoming changes in Ember.js 2.15, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.15.0-beta.1">Ember.js 2.15.0-beta.1 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata214">Changes in Ember Data 2.14</h3>
<p>Ember Data 2.14 brings with it a number of performance related optimizations.
Ember Data 2.14.0 was released on June 18th, and the current released
version is 2.14.3.</p>
<p>In addition to a large number of minor tweaks, three changes stand out:</p>
<h4 id="filesizeimprovements">File-size Improvements</h4>
<p>Starting in Ember Data 2.14.0, builds of Ember Data use Rollup
to produce a single micro-lib module. This helps with parse/eval time at boot
and reduces both the pre and post-gzip sizes by ~23Kb and ~3Kb respectively. We
also used Babel 6 and some manual tuning to further reduce the transpiled size.</p>
<h4 id="lazyrelationships">Lazy Relationships</h4>
<p>Previously, Ember Data would immediately create the connections between records
necessary for relationships.  This is unnecessary overhead if these
relationships aren't immediately accessed. In Ember Data 2.14.0 relationship
connections are established only upon access to the relationship.</p>
<h4 id="deferredserializerlookup">Deferred serializer lookup</h4>
<p>Previously, Ember Data would lookup the serializer for a requested data type
immediately after making the network request. This strategy allowed the cost of
serializer instantiation to be paid while waiting for the network to resolve.
However, this strategy essentially traded initial render performance for a
faster load of non-critical data. In this release, we're re-tuned this part of
the system to be more friendly to initial rendering by deferring serializer
lookup until data returns from the network.</p>
<h4 id="knownissues">Known Issues</h4>
<p>Unfortunately, changes in Ember Data 2.14 appear to have introduced a number of
regressions in less well defined areas of Ember Data's usage. If you experience
trouble after upgrading to 2.14, we suggest locking to 2.13 and either
commenting on an existing issue or opening a new issue as appropriate.</p>
<p>See the <a href="https://github.com/emberjs/data/issues">Ember Data issues</a> for more
information.</p>
<h4 id="deprecationsinemberdata214">Deprecations in Ember Data 2.14</h4>
<p>Several private but non-underscored methods ("intimate" API) have been
deprecated in favor of underscored variants.  <code>didUpdateAll</code> is now
<code>_didUpdateAll</code>.  <code>buildInternalModel</code> is now <code>_buildInternalModel</code>. These
APIs will be removed in Ember Data 2.15.0. See <a href="https://github.com/emberjs/data/pull/4909">PR #4949
</a> for more details.</p>
<p>For more details on the changes in Ember Data 2.14, please review the
<a href="https://github.com/emberjs/data/blob/release/CHANGELOG.md#release-2142-june-19-2017">Ember Data release
changelog</a></p>
<p>For more details on the upcoming changes in Ember Data 2.15, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.15.0-beta.1">Ember Data 2.15.0-beta.1 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data. To upgrade
your projects using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the
upgrade command run <code>ember init</code> inside of the project directory to apply the
blueprint changes. You can preview those changes for <a href="https://github.com/ember-cli/ember-new-output/compare/v2.13.0…v2.14.0">applications</a>
and <a href="https://github.com/ember-cli/ember-addon-output/compare/v2.13.0…v2.14.0">addons</a>.</p>
<h3 id="changesinembercli214">Changes in Ember CLI 2.14</h3>
<p>Majority of the changes in this release happened under the hood to improve documentation as well as code cleanup and better integration with <code>yarn</code>.</p>
<h4 id="npm5andnode8support">NPM 5 and Node 8 support</h4>
<p>Ember CLI now supports Node 8 and npm 5 out of the box, make sure to try it out! Some developers reported issues with <code>node@8.1.0</code> where Ember CLI would be unresponsive. After upgrading to version <code>node@8.1.2</code>+ this issue no longer appeared.</p>
<h4 id="specifyingablueprintforanewapp">Specifying a blueprint for a new app</h4>
<p>Ember CLI 2.14.0 brings support for initial blueprint packages as an argument to
<code>ember new</code>. This empowers other projects to better utilize Ember CLI as a part
of their own ecosystem. In addition it permits experimentation with non-default
Ember application setups.</p>
<p>For example to generate an <a href="http://ember-cli-deploy.com/"><code>ember-cli-deploy</code></a>
plugin use the <code>@ember-cli-deploy/plugin-blueprint</code> package (<a href="https://github.com/ember-cli-deploy/plugin-blueprint">repo on
GitHub</a>):</p>
<pre><code class="bash language-bash">ember new my-new-deploy-plugin -b @ember-cli-deploy/plugin-blueprint
</code></pre>
<p>The package will be downloaded from NPM and used to provide the initial
blueprint for your Ember CLI app.</p>
<p>Two other examples of this feature being used in the wild are:</p>
<ul>
<li>Generate a new <a href="https://glimmerjs.com/">Glimmer.js</a> application. See <a href="https://github.com/glimmerjs/glimmer-blueprint">glimmerjs/glimmer-blueprint</a>.</li>
<li>Experiment with Ember's "Module Unification" filesystem layout by using the <a href="https://github.com/emberjs/ember-module-unification-blueprint">ember-module-unification-blueprint</a> package.</li>
</ul>
<h4 id="othernotablechanges">Other Notable Changes</h4>
<ul>
<li>Node 7.x on Windows is now supported.</li>
<li>By default, Ember CLI collects usage information. Documentation has now been
added describing what is collected and who has access to this information.
See
<a href="https://github.com/ember-cli/ember-cli/blob/master/Analytics.md">Analytics.md</a>
for more information.</li>
<li>A flag <code>--no-welcome</code> has been added for <code>ember new</code> and <code>ember init</code>. Use
this flag to skip the inclusion of <code>ember-welcome-page</code> as a dependency in
newly created projects.</li>
<li>The Ember CLI team recommends Ember Addons use the lowest supported Node release when
running CI. As of this release, that means Node 4.x.</li>
</ul>
<p>For more details on the changes in Ember CLI 2.14.0 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.14.0">Ember CLI 2.14.0 release page</a>.</p>
<h3 id="upcomingchangesinembercli215">Upcoming Changes in Ember CLI 2.15</h3>
<p>Ember CLI 2.15.0 will introduce improved error messages that appear in your browser.
This change means less checking of the console for build errors. For example:</p>
<p><img src="/images/blog/2017-07-03/error.png" alt="A screenshot of improved error messages in Ember 2.15" /></p>
<p>For more details on the changes in Ember CLI 2.15.0-beta.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.15.0-beta.1">Ember CLI 2.15.0-beta.1 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of
these releases serve as a reminder that the Ember project would not have been
possible without your continued support. We are extremely grateful to our
contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-2-14-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-14-released</guid><pubDate>Thu, 06 Jul 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 2.15 and 2.16 Beta Released]]></title><description><![CDATA[<p><em>Updated on December 19, 2017 to include information about Ember.js 2.8-LTS.</em></p>
<p>Today the Ember project is releasing version 2.15.0 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 2.16 beta cycle for all sub-projects. We encourage our
community (especially addon authors) to help test these beta builds and report
any bugs before they are published as a final release in six weeks' time. The
<a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to
continuously test your projects against the latest Ember releases.</p>
<p>This release also marks the conclusion of critical bugfixes support for Ember.js
2.8-LTS, which was released in October 2016. We strongly recommend LTS users to
migrate to 2.12-LTS immediately. 2.8-LTS will continue to receive security patches
for another four releases (around May 2017).</p>
<p>At the same time, this release also concludes security patch support for Ember.js
2.4-LTS, which was released in April of 2016.</p>
<p>We're pleased with the impact of LTS releases on the Ember project and look forward
to continuing the practice.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs215">Changes in Ember.js 2.15</h3>
<p>Ember.js 2.15.0 is an incremental, backwards compatible release of Ember with
bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="publicrouterservicephase1">Public Router Service: Phase 1</h4>
<p>Initial support for the public router service API
(described in <a href="https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md">RFC #95</a>)
is included in this release. The effort on this feature has been split
into two phases:</p>
<p><strong>Phase 1</strong> is completed in 2.15.0.</p>
<ul>
<li>Implement a public service named <code>'router'</code>.</li>
<li>Expose the <code>currentRouteName</code>,
<code>currentURL</code>, <code>location</code>, and <code>rootURL</code> on the service.</li>
<li>Additionally expose
<code>transitionTo</code> and <code>replaceWith</code> as methods on the service.</li>
<li>Provide the method <code>urlFor</code> to the service for generating URLs based on a
route name and models.</li>
</ul>
<p>An example of this API would be to transition to another route from a
component:</p>
<pre><code class="javascript language-javascript">import Ember from 'ember';

export default Ember.Component.extend({
  router: Ember.inject.service(),

  actions: {
    save(model) {
      model.save().then(() =&gt; {
        if (this.isDestroyed) { return; }
        this.get('router').transitionTo('index');
      });
    }
  }

});
</code></pre>
<p>For more details on these APIs see the <a href="https://www.emberjs.com/api/ember/2.15/classes/RouterService">RouterService API
documentation</a>.</p>
<p><strong>Phase 2</strong> is pending implementation of the new public <code>RouteInfo</code> API. It is
not included in Ember 2.15.0.</p>
<ul>
<li>Expand the service with the methods <code>isActive</code>, <code>recognize</code>, and
<code>recognizeAndLoad</code>.</li>
<li>Deprecate the <code>willTransition</code> and <code>didTransition</code> router hooks (not the
route actions of the same name). Replace them with events emitted by the
router service which have improved timing and public API arguments:
<code>routeWillChange</code> and <code>routeDidChange</code>.</li>
</ul>
<p>Addons that wish to use the router service API and support Ember releases prior to
2.15.0 should consider the
<a href="https://github.com/rwjblue/ember-router-service-polyfill">ember-router-service-polyfill</a>.</p>
<h4 id="mounthelpermodelargument"><code>{{mount}}</code> helper <code>model</code> argument</h4>
<p>Ember 2.15.0 implements
<a href="https://github.com/status200/rfcs/blob/ember-engines-mount-params/text/0000-ember-engines-mount-params.md">RFC #225</a> with some minor tweaks. The <code>{{mount}}</code>
helper, used to invoke an Ember engine, now accepts the named argument of
<code>model</code> for an engine's application controller.</p>
<p>For example, in an application you might pass some values from a template:</p>
<pre><code class="handlebars language-handlebars">&lt;div&gt;
 &lt;h1&gt;Application template!&lt;/h1&gt;
 {{mount 'admin' model=(hash
    title='Secret Admin'
    signInButton=(component 'sign-in-button')
 )}}
&lt;/div&gt;
</code></pre>
<p>And in an engine access those values on the <code>model</code> property:</p>
<pre><code class="handlebars language-handlebars">{{!-- admin/app/templates/application.hbs --}}
&lt;h2&gt;Admin area: {{model.title}}&lt;/h2&gt;
&lt;div&gt;
  Please sign in: {{model.signInButton}}
&lt;/div&gt;
</code></pre>
<h4 id="otherchangesin215">Other changes in 2.15</h4>
<p>Other changes include:</p>
<ul>
<li>Ember 2.15.0 blueprints will no longer generate names for initializers and
instance initializers.</li>
<li>The deprecated API <code>_lookupFactory</code> has been removed in this release. See
the <a href="https://www.emberjs.com/deprecations/v2.x/#toc_migrating-from-_lookupfactory-to-factoryfor">deprecation
guide</a>
for details about moving away from this API.</li>
<li>The Glimmer-VM rendering engine has been updated in this release, matching
Ember's rendering engine to that of the Glimmer.js library at its EmberConf
release. Included are VM improvement such as the "stack VM", improved
assertion stripping in production builds, and a more complete Glimmer-VM
implementation of the <code>(component</code> helper.</li>
</ul>
<p>No new deprecations are included in Ember 2.15.0</p>
<p>For more details on changes in Ember.js 2.15.0, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.15.0">Ember.js 2.15.0 release page</a>.</p>
<h3 id="upcomingchangesinemberjs216beta">Upcoming Changes in Ember.js 2.16-beta</h3>
<p>Ember.js 2.16-beta continues to improve the framework with minor bug fixes.
Additionally there is a major change in conventional usage coming in 2.16.</p>
<h4 id="emberjsmodulesapi">Ember.js Modules API</h4>
<p>In Ember.js 2.16 the recommended way to access framework code in Ember
applications will be via the JavaScript modules API described in
<a href="https://github.com/emberjs/rfcs/blob/master/text/0176-javascript-module-api.md">RFC #176</a>. For example this basic component definition in 2.15.0:</p>
<pre><code class="javascript language-javascript">import Ember from 'ember';

export default Ember.Component.extend({
  session: Ember.inject.service(),
  title: 'The Curious Case'
});
</code></pre>
<p>Would in 2.16 conventions be written as:</p>
<pre><code class="javascript language-javascript">import { inject as service } from '@ember/service';
import Component from '@ember/component';

export default Component.extend({
  session: service(),
  title: 'The Curious Case'
});
</code></pre>
<p>JavaScript modules make the framework easier to document, make the distinction
between public and private API much easier to maintain, and provide
opportunities for performance work such as tree-shaking. Adopting a new
convention for importing the framework is a big task that impacts application
code, documentation, generators/blueprints, and more.</p>
<h4 id="updatingyourapplication">Updating your application</h4>
<p>To help us test the migration path, existing applications can move to adopt
the new import style immediately. Using 2.16-beta of Ember is suggested, but
not actually required. To update an application:</p>
<ul>
<li>Upgrade ember-cli-babel to v6.8.0 or greater. This may require you to upgrade
ember-cli generally depending on your current version.</li>
<li>Install and run the
<a href="https://github.com/ember-cli/ember-modules-codemod">ember-modules-codemod</a>.
This command will migrate legacy code that imports the <code>'ember'</code> package to
the new modules, updating files in place.</li>
</ul>
<pre><code class="bash language-bash">npm install ember-modules-codemod -g
cd my-ember-app
ember-modules-codemod
</code></pre>
<p>You're using the new import API!</p>
<p>Many applications use the
<a href="https://github.com/ember-cli/ember-cli-shims">ember-cli-shims</a>
package. This provides the module for <code>import Ember from 'ember'</code>. It also
provides an earlier design of Ember's module API. This package continues
to work, however in 2.16 it will no longer be a dependency for new
Ember applications.</p>
<p>The
<a href="https://github.com/ember-cli/eslint-plugin-ember">eslint-plugin-ember</a>
package provides a linting rule that can remove usage of the legacy modules
provided by ember-cli-shims.
To run this follow these steps:</p>
<ul>
<li>Install eslint-plugin-ember v4.3.0 or greater as a dev dependency for your
application.</li>
<li>Follow the eslint-plugin-ember
<a href="https://github.com/ember-cli/eslint-plugin-ember#-usage">usage instructions</a>
and update your <code>.eslintrc.js</code> appropriately.
For more detailed instructions, see this excellent blog post:
<a href="https://medium.com/@Dhaulagiri/embers-javascript-modules-api-b4483782f329">How To Use Ember’s New Module Import Syntax Today</a></li>
<li>Run <code>./node_modules/.bin/eslint --fix</code> to convert ember-cli-shims module usage to plain <code>'ember'</code>
imports.</li>
<li>Run the ember-modules-codemod as described above.</li>
</ul>
<p>By trying these migration steps on your applications, you can provide valuable
feeback to improve the final process announced with 2.16.</p>
<h4 id="preparingyouraddonfor216">Preparing your Addon for 2.16</h4>
<p>To prepare your addons for Ember 2.16, we encourage you to take the following
steps during the beta cycle:</p>
<ul>
<li>Upgrade your ember-cli-babel dependency to v6.8.0. This will permit your addon
to use the new modules in the <code>addon/</code> and <code>test/</code> directories.</li>
<li>Ensure the <code>app/</code> and <code>test-support/</code> directories (both part of the dependent
app's build) contain only re-exports.</li>
</ul>
<p>This will ensure applications have a path forward in 2.16 to drop
ember-cli-shims from their dependencies.</p>
<p>If you have questions please join us in <a href="https://embercommunity.slack.com/messages/C045BNHAP/"><code>#-ember-cli</code> on the Ember.js
Community Slack</a>.</p>
<h4 id="deprecationsinemberjs216beta">Deprecations in Ember.js 2.16-beta</h4>
<p>One new deprecation is introduced in Ember.js 2.16-beta:</p>
<ul>
<li>For historical reasons, Ember controllers have a private property <code>content</code>
that aliases the <code>model</code> property. Relying on this legacy behavior is
deprecated and will be unsupported in Ember 2.17. See the
<a href="https://www.emberjs.com/deprecations/v2.x/#toc_controller-content-alias">deprecation guide</a>
for more details.</li>
</ul>
<p>For more information on the upcoming changes in Ember.js 2.16, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.16.0-beta.1">Ember.js 2.16.0-beta.1 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata215">Changes in Ember Data 2.15</h3>
<p>Ember Data 2.14 contained a number of performance improvements summarized
in the <a href="https://emberjs.com/blog/2017/07/06/ember-2-14-released.html#toc_changes-in-ember-data-2-14">2.14 release
post</a>.
Most of the development effort in the beta cycle has been to address regressions
introduced by those changes. 2.15.0 contains no new features or deprecations,
but does include the same bugfixes as can be found in 2.14.11.</p>
<p>For details on changes in Ember Data 2.15.0, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.15.0">Ember Data 2.15.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data!
There is a new experimental tool for Ember CLI upgrades called
<a href="https://github.com/kellyselden/ember-cli-update.git">ember-cli-update</a>.
To use it, run this command to install it globally:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
</code></pre>
<p>Then run:</p>
<pre><code class="bash language-bash">ember-cli-update
</code></pre>
<p>It runs your system git merge tool if it finds a conflict. This can be pretty
overwhelming for beginners, so you can run</p>
<pre><code class="bash language-bash">ember-cli-update --ignore-conflicts
</code></pre>
<p>to handle the conflicts yourself.</p>
<p>If this new tool is giving you problems, you can still upgrade your projects
manually. To upgrade your projects using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the
upgrade command run <code>ember init</code> inside of the project directory to apply the
blueprint changes. You can preview those changes for <a href="https://github.com/ember-cli/ember-new-output/compare/v2.14.0…v2.15.0">applications</a>
and <a href="https://github.com/ember-cli/ember-addon-output/compare/v2.14.0…v2.15.0">addons</a>.</p>
<h3 id="changesinembercli215">Changes in Ember CLI 2.15</h3>
<h4 id="chromebydefault">Chrome by default</h4>
<p>Ember CLI will configure new apps to run tests in <a href="https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md">headless Chrome</a>
by default, instead of PhantomJS.</p>
<p>PhantomJS has served the wider JavaScript community well for a long time, being
a practical alternative to running browsers headless via tools like Xvbf. It
has, however, been a proxy for what we really want to test– the browsers that
users are running.</p>
<p>Now that we can test in headless Chrome, the motivation for using
PhantomJS has diminished, and as a result it is <a href="https://groups.google.com/d/msg/phantomjs/9aI5d-LDuNE/5Z3SMZrqAQAJ">no longer actively maintained</a>.</p>
<h4 id="appimportfileswithinnode_modules">app.import files within node_modules</h4>
<p>Ember CLI has an API for importing individual files into the built assets, by
calling <code>app.import</code> within <code>ember-cli-build.js</code>. This API now supports
importing files from within <code>node_modules</code>, making it easier to consume
dependencies using only npm, rather than a more complicated mix of npm and
bower.</p>
<h4 id="nodejs8support">Node.js 8 Support</h4>
<p>Per the Ember CLI <a href="https://github.com/ember-cli/ember-cli/blob/cac87e69f8c636d8b64889a6e214e987428c8dc7/docs/node-support.md">Node.js version support policy</a>, Ember CLI officially supports Node 8 as the active Node.js version and will continue to do so throughout its upcoming <a href="https://github.com/nodejs/LTS/tree/d9cb7b3059a478a6e33649cfb0a202cf456b2e28#nodejs-long-term-support-working-group">Active LTS window</a>.</p>
<p>As part of this support, Ember CLI will no longer report warnings when run under
Node 8.</p>
<h4 id="improvederrormessages">Improved Error Messages</h4>
<p>The improved error messages promised in the 2.14.0 release <a href="https://www.emberjs.com/blog/2017/07/06/ember-2-14-released.html#toc_upcoming-changes-in-ember-cli-2-15">blog post</a> is shipping with Ember CLI 2.15.0.  No more checking the console for template compilation errors 🎉!</p>
<h4 id="othernotablechanges">Other Notable Changes</h4>
<p>Work has begun on internal changes to support tree-shaking.  This is still in
its early stages but is a focus of current development.</p>
<p>For more details on the changes in Ember CLI 2.15 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.15.0">Ember CLI  2.15.0 release page</a>.</p>
<h3 id="upcomingchangesinembercli216">Upcoming Changes in Ember CLI 2.16</h3>
<h4 id="addonapiforcustomtransforms">Addon API for Custom Transforms</h4>
<p>Ember CLI 2.16.0 will support addon import transformations via
<code>importTransforms</code>, an implementation of <a href="https://github.com/kratiahuja/rfcs/blob/add-import-api/active/0000-add-custom-transform.md">RFC 108</a>.
This allows addons to register custom transformations to be run for vendor
resources included via <code>app.import</code>.  This is an advanced feature for addon
authors.  It is particularly useful for
<a href="https://github.com/ember-fastboot/fastboot">FastBoot</a> to allow FastBoot-aware
addons to use a declarative API for conditionally importing code in Node.js or
browser environments.</p>
<p>Thanks to <a href="https://github.com/kratiahuja">@kratiahuja</a> for proposing and implementing this feature.</p>
<p>For more details on the changes in Ember CLI 2.16.0-beta.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.16.0-beta.1">Ember CLI 2.16.0-beta.1 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of
these releases serve as a reminder that the Ember project would not have been
possible without your continued support. We are extremely grateful to our
contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-2-15-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-15-released</guid><pubDate>Fri, 01 Sep 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 2.16 and 2.17 Beta Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 2.16.0 of Ember.js, Ember Data, and Ember CLI.</p>
<p>After six weeks as a stable release, Ember.js 2.16 will be promoted to
<a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">long term support</a>,
under which it will receive bugfixes for the next 6 releases and security fixes
for the next 10 release.</p>
<p>This release also kicks off the 2.17 beta cycle for all sub-projects. We encourage our
community (especially addon authors) to help test these beta builds and report
any bugs before they are published as a stable release in six weeks' time.</p>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs216">Changes in Ember.js 2.16</h3>
<p>Ember.js 2.16 continues to improve the framework with minor bug fixes.
Additionally, it introduces a major change in conventional usage. As of Ember
2.16, newly generated Ember applications will use the JavaScript modules API
described in detail below.</p>
<p>No APIs are deprecated as part of these changes. Although we encourage
applications to upgrade to the new modules API, we plan to wait until
the module API is proven and more addons across the community are upgraded
before introducing a deprecation for the <code>Ember</code> namespace object.</p>
<h4 id="emberjsmodulesapi">Ember.js Modules API</h4>
<p>In Ember.js 2.16 the recommended way to access framework code in Ember
applications is via the JavaScript modules API described in
<a href="https://github.com/emberjs/rfcs/blob/master/text/0176-javascript-module-api.md">RFC #176</a>. For example this basic component definition in 2.15:</p>
<pre><code class="javascript language-javascript">import Ember from 'ember';

export default Ember.Component.extend({
  session: Ember.inject.service(),
  title: 'The Curious Case'
});
</code></pre>
<p>Would in 2.16 conventions be written as:</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';
import { inject as service } from '@ember/service';

export default Component.extend({
  session: service(),
  title: 'The Curious Case'
});
</code></pre>
<p>JavaScript modules make the framework easier to document, make the distinction
between public and private API much easier to maintain, and provide
opportunities for performance work such as tree-shaking.</p>
<p>Adopting a new
convention for importing the framework is a big task that impacts application
code, documentation, generators/blueprints, and more. We've made the following
changes to prepare for the shift in usage:</p>
<ul>
<li>The <a href="https://emberjs.com/api/">Ember.js
API documentation</a> and
<a href="https://guides.emberjs.com/v2.16.0/">Ember guides</a> have been updated to reflect the new API.</li>
<li>The <a href="https://github.com/ember-cli/ember-cli/tree/master/blueprints/app">application
blueprints</a>
for newly generated applications have been updated. You can review
the output of the new application generators in the
<a href="https://github.com/ember-cli/ember-new-output">ember-new-output</a> repo.</li>
<li>A migration strategy for existing applications has been authored.</li>
</ul>
<p>In rolling out the changes to Ember's API documentation we uncovered a few bugs
in the website itself. We're tracking fixes in <a href="https://github.com/emberjs/website/issues/3024">emberjs/website#3024: Directly loaded URLs for
/api/ fail to load</a> and
<a href="https://github.com/ember-learn/ember-api-docs/issues/355">ember-learn/ember-api-docs#355: Get the Guides links to work with post 2.16 package restructure</a>.</p>
<h4 id="updatingyourapplication">Updating your application</h4>
<p>Existing applications can move to adopt the new import style immediately.
To update an application:</p>
<ul>
<li>Upgrade Ember CLI to 2.16.1, specifically the ember-cli-babel dependency
must be upgraded to v6.8.0 or greater.</li>
<li>Install and run the
<a href="https://github.com/ember-cli/ember-modules-codemod">ember-modules-codemod</a>.
This command will migrate legacy code that imports the <code>'ember'</code> package to
the new modules, updating files in place.</li>
</ul>
<pre><code class="bash language-bash">npm install ember-modules-codemod -g
cd my-ember-app
ember-modules-codemod
</code></pre>
<p>You're using the new import API!</p>
<p>Many applications use the
<a href="https://github.com/ember-cli/ember-cli-shims">ember-cli-shims</a>
package. This provides
an earlier design of Ember's module API. This package continues
to work and will be provided by default in new Ember applications, however it will
be removed in a future version of Ember CLI. Migrating to the new modules
API is a good time to remove any usage of these legacy modules.</p>
<p>The
<a href="https://github.com/ember-cli/eslint-plugin-ember">eslint-plugin-ember</a>
package provides a linting rule that can remove usage of the legacy modules
provided by ember-cli-shims.
To run this follow these steps:</p>
<ul>
<li>Install eslint-plugin-ember v4.3.0 or greater as a dev dependency for your
application.</li>
<li>Follow the eslint-plugin-ember
<a href="https://github.com/ember-cli/eslint-plugin-ember#-usage">usage instructions</a>
and update your <code>.eslintrc.js</code> appropriately.
For more detailed instructions, see this excellent blog post:
<a href="https://medium.com/@Dhaulagiri/embers-javascript-modules-api-b4483782f329">How To Use Ember’s New Module Import Syntax Today</a></li>
<li>Run <code>./node_modules/.bin/eslint --fix</code> to convert ember-cli-shims module usage to plain <code>'ember'</code>
imports.</li>
<li>Run the ember-modules-codemod as described above. If you already ran it before
running <code>eslint --fix</code>, you will need to run it a second time. This will convert the
<code>'ember'</code> imports to their modern module API equivalents.</li>
</ul>
<p>Your application no longer contains any usage of the legacy modules.</p>
<h4 id="updatingyouraddons">Updating your addons</h4>
<p>To provide addon users the best experience, we suggest you take the following
steps as an addon maintainer (or contributor!):</p>
<ul>
<li>Upgrade your ember-cli-babel dependency to v6.8.0 or greater. This will permit your addon
to use the new modules in its <code>addon/</code> and <code>test/</code> directories.</li>
<li>Ensure the <code>app/</code> and <code>test-support/</code> directories (both part of the dependent
app's build) contain only re-exports from the <code>addon/</code> directory. The files
in <code>app/</code> should avoid importing any Ember APIs in any manner. In this
way an addon will be decoupled from the consuming application's build and runtime
Ember API support.</li>
</ul>
<p>Taking these steps will ensure your addon's users have a smooth path from previous
versions of Ember to 2.16, and beyond.</p>
<p>If you have questions please join us in <a href="https://embercommunity.slack.com/messages/C045BNHAP/"><code>#-ember-cli</code> on the Ember.js
Community Slack</a>.</p>
<h4 id="deprecationsinemberjs216">Deprecations in Ember.js 2.16</h4>
<p>One new deprecation is introduced in Ember.js 2.16:</p>
<ul>
<li>For historical reasons, Ember controllers have a private property <code>content</code>
that aliases the <code>model</code> property. Relying on this legacy behavior is
deprecated and will be unsupported in Ember 2.17. See the
<a href="https://www.emberjs.com/deprecations/v2.x/#toc_controller-content-alias">deprecation guide</a>
for more details.</li>
</ul>
<p>For more details on changes in Ember.js 2.16, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.16.0">Ember.js 2.16.0 release page</a>.</p>
<h3 id="upcomingchangesinemberjs217">Upcoming Changes in Ember.js 2.17</h3>
<p>Ember.js 2.17 will contain no new features. Instead it will primarily
include bug fixes, performance, and stability work.</p>
<p>For more details on the upcoming changes in Ember.js 2.17, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.17.0-beta.1">Ember.js 2.17.0-beta.1 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<p>Ember Data 2.16.2 is the latest stable release at this time.</p>
<h3 id="changesinemberdata216">Changes in Ember Data 2.16</h3>
<p>Ember Data 2.16 is a bugfix release. It contains no new features but
it does have several bug fixes for <a href="https://github.com/emberjs/data/pull/5196">build warnings</a>,
<a href="https://github.com/emberjs/data/pull/5029">header parsing</a> and
<a href="https://github.com/emberjs/data/pull/5044">outdated dependencies</a>.</p>
<p>There are no new deprecations introduced in Ember Data 2.16.</p>
<p>For more details on changes in Ember Data 2.16, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.16.0">Ember Data 2.16.0 release page</a>.
Again, 2.16.2 was published shortly after 2.16.0 with minor bug fixes.</p>
<h3 id="upcomingchangesinemberdata217">Upcoming changes in Ember Data 2.17</h3>
<p>Due to a late start in the Ember Data 2.16 beta cycle the Ember Data
2.17.0-beta.1 release is currently the same code as 2.16.0. The beta
releases will continue to receive beta bug fixes and it is expected to
diverge from Ember Data 2.16.0 by the time 2.17.0 is released in 6
weeks.</p>
<h4 id="deprecationsinemberdata217">Deprecations in Ember Data 2.17</h4>
<p>There are no planned deprecations introduced in Ember Data 2.17.</p>
<p>For more details on the upcoming changes in Ember Data 2.17.0-beta.1, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.17.0-beta.1">Ember Data 2.17.0-beta.1 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<p>The latest version of Ember CLI is 2.16.1, as a small bug fix went out shortly
after release.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! To upgrade
your projects using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the
upgrade command run <code>ember init</code> inside of the project directory to apply the
blueprint changes. You can preview those changes for <a href="https://github.com/ember-cli/ember-new-output/compare/v2.15.0…v2.16.0">applications</a>
and <a href="https://github.com/ember-cli/ember-addon-output/compare/v2.15.0…v2.16.0">addons</a>.</p>
<h3 id="changesinembercli216">Changes in Ember CLI 2.16</h3>
<p>Ember CLI 2.16.0 upgrades the application build pipeline to use uglify-es.
uglify-es introduces support for minification of modern JavaScript features.
With this change, Ember CLI can now generate minified production builds of
non-transpiled JavaScript code.</p>
<p>Ember CLI 2.16.0 adds support for addons to transform vendor resources via
<code>importTransforms</code>, an implementation of <a href="https://github.com/ember-cli/rfcs/blob/master/active/0000-add-custom-transform.md">Ember CLI RFC 108</a>.
"Vendor resource" describes any file included via <code>app.import</code>. This is an
advanced feature for addon authors, and is particularly useful for
<a href="https://ember-fastboot.com/">FastBoot</a>. In a future release FastBoot-aware
addons will be provided a declarative API for conditionally importing code in
Node.js or browser environments. See
<a href="https://github.com/ember-fastboot/ember-cli-fastboot/pull/470">ember-fastboot/ember-cli-fastboot#470</a> for more
details.</p>
<p>Thanks to <a href="https://github.com/kratiahuja">@kratiahuja</a> for proposing
and implementing this feature.</p>
<p>Other changes in 2.16.0 include:</p>
<ul>
<li>Project configuration is now cached as a performance optimization. See
<a href="https://github.com/ember-cli/ember-cli/pull/7333">ember-cli/ember-cli#7333</a>,
<a href="https://github.com/ember-cli/ember-cli/pull/7309">ember-cli/ember-cli#7309</a>,
and
<a href="https://github.com/ember-cli/ember-cli/pull/7270">ember-cli/ember-cli#7270</a>
for more details.</li>
<li><code>ember install</code> now supports scoped npm packages, for example <code>ember install @cardstack/git</code>.
See <a href="https://github.com/ember-cli/ember-cli/pull/7109">ember-cli/ember-cli#7109</a> for more details.</li>
<li>Several internal refactoring efforts were undertaken that begin support for the
un-merged <a href="https://github.com/ember-cli/rfcs/pull/110">Ember CLI strategies
RFC</a>.</li>
</ul>
<p>No new deprecations are added in Ember CLI 2.16.</p>
<p>For more details on the changes in Ember CLI 2.16 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.16.0">Ember CLI 2.16.0 release page</a>.
Please note that 2.16.1 was published shortly after 2.16.0 and is the lastest
release.</p>
<h3 id="upcomingchangesinembercli217">Upcoming Changes in Ember CLI 2.17</h3>
<p>Ember CLI 2.17 introduces no major functionality changes or deprecations.</p>
<p>For more details on the changes in Ember CLI 2.17.0-beta.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.17.0-beta.1">Ember CLI 2.17.0-beta.1 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of
these releases serve as a reminder that the Ember project would not have been
possible without your continued support. Thanks to all our contributors for
their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-2-16-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-16-released</guid><pubDate>Wed, 11 Oct 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 2.16-LTS, Ember 2.17 and 2.18 Beta Released]]></title><description><![CDATA[<p><em>Updated on December 19, 2017 to include information about Ember.js 2.16-LTS.</em></p>
<p>Today the Ember project is releasing Ember.js 2.16 LTS (a long-term support
release) and version 2.17.0 of Ember.js, Ember Data, and
Ember CLI.</p>
<p>This release also kicks off the 2.18 beta cycle for all sub-projects. We encourage
our community (especially addon authors) to help test these beta builds and
report any bugs before they are published as a final release in six weeks' time.
The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to
continuously test your projects against the latest Ember releases.</p>
<p>Despite an initial delay on these releases, and an additional delay on this announcement,
the <a href="https://emberjs.com/blog/2017/10/03/the-road-to-ember-3-0.html#toc_the-ember-3-0-release-schedule">Ember 3.0 Release Schedule</a> is unchanged.
This means that Ember 2.18 and the first beta of Ember 3.0 will be release on January 1st, 2018.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="emberjs216lts">Ember.js 2.16-LTS</h3>
<p>Ember 2.16-LTS is the latest long-term support release. You can install it
by upgrading <code>ember-source</code> to <code>~2.16.2</code> in your <code>package.json</code>.</p>
<p>The LTS channel is designed for Ember users who would like to upgrade less
frequently, while still getting support from the project and the wider
ecosystem. At the same time, it allows addon authors to know which versions
of Ember to focus their effort on.</p>
<p>Per our <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">usual policy</a>,
Ember 2.16-LTS is released six weeks after the
<a href="https://www.emberjs.com/blog/2017/10/11/ember-2-16-released.html">2.16.0 stable release</a>.
This allows ample time to fix any reported regressions and ensures a rock
solid LTS release. It will continue to receive critical bugfixes for six
release cycles (roughly August 2018), and security patches for ten release
cycles (roughly Janurary 2019).</p>
<p>Meanwhile, Ember 2.12-LTS will continue to receive critical bugfixes for another
two release cycles (roughly Feburary 2018), and security patches for six release
cycles (roughly August 2018). Users of Ember 2.12-LTS should make use of this
overlapping period to transition over to Ember 2.16-LTS.</p>
<hr />
<p>For more details on the changes landing in Ember.js 2.16-LTS, please review the
<a href="https://github.com/emberjs/ember.js/blob/v2.16.2/CHANGELOG.md">Ember.js 2.16.2 CHANGELOG</a>.</p>
<h3 id="changesinemberjs217">Changes in Ember.js 2.17</h3>
<p>Ember.js 2.17 is an incremental, backwards compatible release of Ember with
bugfixes and performance improvements.</p>
<p>Some of the more notorious fixes were:</p>
<ul>
<li>The <code>filter</code>/<code>map</code>/<code>sort</code> computed properties now <a href="https://github.com/emberjs/ember.js/pull/15855">properly expand dependent keys using braces, like <code>items.@each.{prop1,prop2}</code></a>.</li>
<li>Unhandles rejections are <a href="https://github.com/emberjs/ember.js/pull/15871">no longer thrown twice</a>.</li>
<li>Passing <code>false</code> to <code>link-to</code>'s <code>activeClass</code> no longer <a href="https://github.com/emberjs/ember.js/pull/15265">erroneously appends transitioning classes</a>.</li>
<li>Not passing all query params to <code>RouterService</code>'s <code>transitionTo</code> no longer <a href="https://github.com/emberjs/ember.js/pull/15613">throws an error</a>.</li>
</ul>
<h4 id="deprecationsinember217">Deprecations in Ember 2.17</h4>
<p>There were no new deprecations introduced in 2.17.</p>
<p>For more details on changes in Ember.js 2.17, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.17.0">Ember.js 2.17.0 release page</a>.</p>
<h3 id="upcomingchangesinemberjs218">Upcoming Changes in Ember.js 2.18</h3>
<p>Ember.js 2.18 will see the <a href="https://github.com/emberjs/ember.js/pull/15754">removal of the <code>router.router</code> deprecations</a> and respective code.</p>
<h4 id="deprecationsinemberjs218">Deprecations in Ember.js 2.18</h4>
<p>One new deprecation was introduced in Ember.js 2.18:</p>
<ul>
<li><a href="/deprecations/v2.x/#toc_code-targetobject-code"><code>targetObject</code></a>.</li>
</ul>
<p>For more details on the upcoming changes in Ember.js 2.18, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.18.0-beta.1">Ember.js 2.18.0-beta.1</a> and <a href="https://github.com/emberjs/ember.js/releases/tag/v2.18.0-beta.2">Ember.js 2.18.0-beta.2</a> release pages.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata217">Changes in Ember Data 2.17</h3>
<p>Ember.js 2.17 will contain no new features. The changes introduced in
Ember Data 2.17 mostly focus on bug fixes, improved documentation and
build improvments to support changes in the ember-cli ecosystem and
fix a regression in support for build using Node 4.x.</p>
<h4 id="deprecationsinemberdata217">Deprecations in Ember Data 2.17</h4>
<p>No new deprecations are introduced in Ember Data 2.17.</p>
<p>For more details on changes in Ember Data 2.17, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.17.0">Ember Data 2.17.0 release page</a>.</p>
<h3 id="upcomingchangesinemberdata218">Upcoming changes in Ember Data 2.18</h3>
<p>No major new features are planned for Ember Data 2.18. The Ember Data
2.18 is expected to focus on bug fixes around relationships. Some of
the bigger bug fixes are expected to be backported to older releases
durring the 2.18 beta cycle.</p>
<h4 id="deprecationsinemberdata218">Deprecations in Ember Data 2.18</h4>
<p>No new deprecations are planned in Ember Data 2.18.</p>
<p>For more details on the upcoming changes in Ember Data 2.18, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.18.0-beta.1">Ember Data 2.18.0-beta.1 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! To upgrade
your projects using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the upgrade command run <code>ember init</code> inside of the project
directory to apply the blueprint changes. You can preview those changes for
<a href="https://github.com/ember-cli/ember-new-output/compare/v2.15.0…v2.17.0">applications</a>
and
<a href="https://github.com/ember-cli/ember-addon-output/compare/v2.15.0…v2.17.0">addons</a>.</p>
<h3 id="changesinembercli217">Changes in Ember CLI 2.17</h3>
<p>Ember CLI previously displayed a warning when you removed <code>ember-cli-shims</code>, but
the dependency is no longer needed if none of your dependencies are using the
old shims and all of them are using <code>ember-cli-babel</code> 6.6.0 or above. Due to
that, the warning has been removed in the new release.</p>
<p>With the release of Ember 2.17, Ember 2.16 becomes an LTS release. To ensure
that the default <code>ember-try</code> configurations are up to date for new applications,
Ember 2.8 LTS was retired from the configuration and Ember 2.16 was added.</p>
<p>Ember CLI has been using headless Chrome for <code>ember test</code> for a while. In Ember
CLI 2.17 you now have the option to run your tests in a browser window using
<code>ember test --server</code>.</p>
<h4 id="nodejs9support">Node.js 9 Support</h4>
<p>Per the Ember CLI Node.js version support policy, Ember CLI officially supports
Node 9 as the active Node.js version and will continue to do so throught its
<a href="https://github.com/ember-cli/ember-cli/blob/026cefd5de36c0ae448883067450f51f2e127bbf/docs/node-support.md">Active window</a>.</p>
<p>As part of this support, Ember CLI will no longer report warnings when run under
Node 9.</p>
<p>Node 7 will report warnings as its support period has terminated.</p>
<h4 id="othernotablechanges">Other Notable Changes</h4>
<ul>
<li>The build pipeline went through an internal refactoring to make it more
flexible and composable.</li>
<li>Fixed bug where the <code>app/</code> tree was being linted even if it was not present.</li>
<li>Ensured <code>test-support</code> and <code>addon-test-support</code> trees are linted.</li>
</ul>
<h4 id="deprecationsinembercli217">Deprecations in Ember CLI 2.17</h4>
<p>No new deprecations were added in Ember CLI 2.17.</p>
<h3 id="upcomingchangesinembercli218">Upcoming Changes in Ember CLI 2.18</h3>
<p>The next version of Ember CLI will see some user experience improvements.</p>
<p><code>crossdomain.xml</code> will no longer be generated for new applications. The file was
an artifact from a time when Flash was a popular vector for security exploits.
Now that that is no longer a concern, the file is not necessary.</p>
<p>The <code>livereload</code> URL was removed from the output of <code>ember server</code>. Users would
get confused because this URL is printed right away when running the development
server, but the actual URL the application is running under will only be shown
when the build is finished. Users would click the <code>livereload</code> URL and be
greeted with a blank page and errors.</p>
<p>If you used <code>npm link</code> with a dependency that had itself <code>npm link</code>
dependencies, they would be silently dropped in previous versions of Ember CLI.
This is now addressed.</p>
<h4 id="deprecationsinembercli218">Deprecations in Ember CLI 2.18</h4>
<p>There are no deprecations planned for Ember CLI 2.18.</p>
<p>For more details on the changes in Ember CLI 2.18.0-beta.1 and detailed upgrade
instructions, please review the
<a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.18.0-beta.1">Ember CLI 2.18.0-beta.1 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these
releases serve as a reminder that the Ember project would not have been possible
without your continued support. We are extremely grateful to our contributors
for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-2-17-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-17-released</guid><pubDate>Mon, 20 Nov 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 2.18 and 3.0 Beta Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 2.18.0 of Ember.js, Ember Data,
and Ember CLI.</p>
<p><strong>After 2.5 years and 18 minor releases, Ember 2.18 marks the end of the project's 2.x series</strong>.
To ensure a smooth upgrade path going into the 3.x series, 2.18 has been
declared an LTS candidate. In six weeks the latest 2.18 build will succeed
Ember 2.16.2 as the latest LTS release. As an LTS, it will
receive bug fixes until Ember 3.5 is released.</p>
<p><strong>Today we also kick off the 3.0 beta cycle for all sub-projects.</strong> Ember 3.0
introduces no new features. Instead, it removes support for deprecated public APIs,
all of which have been deprecated since at least Ember 2.14 (released July 2017).
Extended support for removed Ember.js APIs will be provided via an
optional addon through Ember 3.4.</p>
<p>Ember 3.0 removes support for Microsoft Internet Explorer 9,
IE 10, and PhantomJS. This includes support for these platforms by Ember.js,
Ember Data, and Ember CLI. For more details about this decision see
<a href="https://github.com/emberjs/rfcs/blob/master/text/0252-browser-support-changes.md">RFC 252</a>
and the discussion on <a href="https://github.com/emberjs/rfcs/pull/252">RFC PR #252</a>.</p>
<p>We need the help of the Ember community (especially addon authors) to test
the 3.0 beta builds and transition path for 2.x codebases. If you encounter any
unexpected changes while testing Ember 3.0 beta, especially in features not
previously marked as deprecated by 2.14, please open an issue on the appropriate repo.</p>
<p>You can read more about our detailed transition plans through Ember 3.5
in
<a href="https://www.emberjs.com/blog/2017/10/03/the-road-to-ember-3-0.html">The Road to Ember 3.0</a>
and below.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core of the Ember framework. It provides routing,
rendering, and dependency injection features.</p>
<h3 id="changesinemberjs218">Changes in Ember.js 2.18</h3>
<p>Ember.js 2.18 is an incremental and backwards compatible release which
includes minor bug fixes. No new features or public API deprecations are
introduced.</p>
<p>2.18 is light on changes because we want the final release of the 2.x cycle to
be as stable and battle-tested as possible. 2.18 is an LTS candidate, which means
that after six weeks it will be promoted to an LTS release. As an LTS release it
will receive bug fixes until Ember 3.5 is released and security patches until
Ember 3.9 is released.</p>
<p>2.18 is the final release of Ember.js to support IE9, IE10, and PhantomJS. It is
also the final release published for Bower.</p>
<p>"Intimate API" refers to API surface that maintainers never intended to become
public, but which still has some small use in the wild. 2.18.0 adds an intimate
API deprecation for passing <code>targetObject</code> to a component invocation. Support
for this API will be removed in Ember 3.5. See
<a href="https://github.com/emberjs/ember.js/pull/14590">PR #14590</a> for more details.</p>
<p>For more details on changes in Ember.js 2.18, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v2.18.0">Ember.js 2.18.0 release page</a>.</p>
<h3 id="upcomingchangesinemberjs30">Upcoming Changes in Ember.js 3.0</h3>
<p>Ember.js 3.0 is the first release in the 3.x series. It introduces no new
public API or deprecations. Instead, it is comprised of bug fixes and the removal of
previously deprecated public API from the 2.x cycle. This release drops support
for IE9, IE10, and PhantomJS.</p>
<h4 id="removedapisinemberjs30">Removed APIs in Ember.js 3.0</h4>
<p>The public APIs removed in 3.0-beta.1 do not yet represent the complete list
of removals planned for 3.0 stable.
For an exhaustive list of planned 3.0 removals and migration guidance see the
<a href="https://www.emberjs.com/deprecations/v2.x/">Ember.js 2.x deprecation guide</a>
(any entry "until: 3.0") and the quest issue
<a href="https://github.com/emberjs/ember.js/issues/15876">emberjs/ember.js#15876</a>.</p>
<p>The list of public API removals included in 3.0-beta.1 are:</p>
<ul>
<li>The <code>{{render}}</code> helper has been removed. Any remaining usage should be
<a href="https://emberjs.com/deprecations/v2.x/#toc_code-render-code-helper">migrated to components</a>.</li>
<li><code>didInitAttrs</code> is removed and can be <a href="https://www.emberjs.com/deprecations/v2.x/#toc_ember-component-didinitattrs">replaced with <code>init</code></a></li>
<li>Declaring an observer with dependent keys after the callback is removed. Dependent keys should be passed before the callback as described in the <a href="https://emberjs.com/api/ember/2.17/classes/@ember%2Fobject/methods/observer?anchor=observer">API docs</a>.</li>
<li><code>Enumerable#contains</code> and <code>Array#contains</code> methods are removed. Instead usage should be <a href="https://www.emberjs.com/deprecations/v2.x/#toc_enumerable-contains">replaced with <code>includes</code></a>.</li>
<li><code>{{link-to}}</code> unwrapped the <code>model</code> property from passed controllers. This
behavior has been removed.</li>
<li>Specifying <code>defaultLayout</code> on a component rather than <a href="https://www.emberjs.com/deprecations/v2.x/#toc_ember-component-defaultlayout"><code>layout</code></a> has been removed.</li>
<li><code>Ember.Handlebars.SafeString</code> has been removed. Instead, use <a href="https://www.emberjs.com/deprecations/v2.x/#toc_use-ember-string-htmlsafe-over-ember-handlebars-safestring"><code>Ember.String.htmlSafe</code></a> or the <code>import { htmlSafe } from '@ember/string'</code>.</li>
<li><code>Ember.K</code> has been removed. Usage should be replaced with <a href="https://www.emberjs.com/deprecations/v2.x/#toc_deprecations-added-in-2-12">inline functions</a>.</li>
<li>Support for legacy initializers with two arguments (container, application)
has been removed in favor of
<a href="https://emberjs.com/deprecations/v2.x/#toc_initializer-arity">a single argument of <code>application</code></a>.</li>
</ul>
<p>Further planned public API removals for 3.0 include:</p>
<ul>
<li>Ember's legacy binding system, including <code>Ember.Binding</code> and the <code>fooBinding</code>
micro-syntax. See the <a href="https://emberjs.com/deprecations/v2.x/#toc_ember-binding">migration guide</a> for details.</li>
<li>Ember's <code>Map</code>, <code>MapWithDefault</code>, and <code>OrderedSet</code> classes. These should be
replaced with native features or with implementations from other libraries.</li>
</ul>
<p>Please see <a href="https://github.com/emberjs/ember.js/issues/15876">emberjs/ember.js#15876</a>
for more details (including about previously deprecated private or intimate
API removals) and updates during the beta cycle.</p>
<h4 id="transitioningto3xwithember2legacy">Transitioning to 3.x with ember-2-legacy</h4>
<p>Public APIs removed in Ember.js 3.0 have each been ported to the
<a href="https://github.com/emberjs/ember-2-legacy">ember-2-legacy</a> addon. This addon
makes it possible for applications to adopt 3.0 even if they still
require features unsupported by the core of the framework.</p>
<p>This addon will not include support for removed intimate or private APIs, nor
will it enable support for IE9, IE10, PhantomJS, or Bower. In <a href="https://www.emberjs.com/blog/2017/10/03/the-road-to-ember-3-0.html#toc_transitioning-to-3-0">The Road to Ember
3.0</a>
we committed to support this addon through Ember.js 3.4, the first LTS
candidate of the 3.x cycle.</p>
<h4 id="otheremberjs30changes">Other Ember.js 3.0 Changes</h4>
<p>Ember.js 3.0 removes support for IE9,
IE 10, and PhantomJS. For more details about this decision see
<a href="https://github.com/emberjs/rfcs/blob/master/text/0252-browser-support-changes.md">RFC 252</a>
and the discussion on <a href="https://github.com/emberjs/rfcs/pull/252">RFC PR #252</a>.</p>
<p>Finally, Ember.js 3.0 will not be published for Bower.</p>
<p>For more details on the upcoming changes in Ember.js 3.0, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v3.0.0-beta.1">Ember.js 3.0.0-beta.1 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata218">Changes in Ember Data 2.18</h3>
<p>Ember Data 2.18 contains no new features. The changes introduced in
Ember Data 2.18 mostly focus on bug fixes and improved documentation.</p>
<p>One public API deprecation targeting <strong>Ember Data 4.0</strong> is introduced in Ember Data 2.18:</p>
<ul>
<li>Support for "production-like" values of <code>EMBER_ENV</code> <a href="https://github.com/emberjs/data/pull/5239">will be removed</a>.
For example, custom production names like <code>production-qa</code> should be replaced with <code>production</code></li>
</ul>
<p>For more details on changes in Ember Data 2.18, please review the
<a href="https://github.com/emberjs/data/releases/tag/v2.18.0">Ember Data 2.18.0 release page</a>.</p>
<h3 id="upcomingchangesinemberdata30">Upcoming changes in Ember Data 3.0</h3>
<p>Ember Data 3.0 contains major improvements in the testing blueprints
that are shipped with Ember Data and used by Ember CLI when you use
<code>ember generate</code> <code>model</code>, <code>adapter</code>, or <code>serializer</code>.  Big thanks to
<a href="https://github.com/alexander-alvarez">@alexander-alvarez</a> for all his
work on the <a href="https://github.com/emberjs/data/issues/5292">QUnit Blueprints Quest
Issue</a>.</p>
<p>There are no deprecations introduced in Ember Data 3.0.</p>
<p>For more details on the upcoming changes in Ember Data 3.0, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.0.0-beta.1">Ember Data 3.0.0-beta.1 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<h3 id="changesinembercli218">Changes in Ember CLI 2.18</h3>
<p>Ember CLI 2.18 is an incremental release featuring bug fixes and improvements.
This release does not introduce any new deprecations.</p>
<h4 id="eslintconfigurationchanges">ESLint configuration changes</h4>
<p>Newly generate Ember applications will now have only a single <code>.eslintrc.js</code>
file. This file uses the "overrides" feature of ESLint to customize rules
appropriately for test or Node files.</p>
<p>For more details see:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/7443">ember-cli/ember-cli#7443</a> Use overrides for a single <code>.eslintrc.js</code>.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/7455">ember-cli/ember-cli#7455</a> Add eslint-plugin-ember to default linting config.</li>
</ul>
<h4 id="node7removedfromcitestingmatrix">Node 7 removed from CI testing matrix</h4>
<p>According to the <a href="https://github.com/ember-cli/ember-cli/blob/master/docs/node-support.md">Node support policy</a> of the Ember CLI project,
Node 7 is removed from the testing matrix.
If you are developing an application using Ember CLI, it is recommended that you upgrade your Node to one of the <a href="https://github.com/nodejs/Release">active LTS</a> versions to guarantee security updates.</p>
<h4 id="addondependencieswhenusingnpmlink">Addon dependencies when using npm link</h4>
<p>Previously, if you were npm-linking an addon that had itself npm-linked a dependency, Ember CLI would fail to find it. This is now fixed.</p>
<h4 id="crossdomainxmlremovedfornewapplications"><code>crossdomain.xml</code> removed for new applications</h4>
<!-- alex ignore hostesses-hosts -->
<p><code>crossdomain.xml</code> was originally introduced to limit vulnerabilities when
using the Flash Player. It did this by declaring which hosts the Flash Player could connect to outside the one hosting the file.
Browsers have since disabled Flash for security reasons, rendering the file moot.
Ember CLI 2.18 will no longer generate the file for new applications.</p>
<p>For more details on the changes in Ember CLI 2.18 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v2.18.0">Ember CLI 2.18.0 release page</a>.</p>
<h3 id="upcomingchangesinembercli30">Upcoming Changes in Ember CLI 3.0</h3>
<p>Ember CLI 3.0 will feature a much improved README for the addon blueprint.
The improvements include:</p>
<ul>
<li>An automatically generated "Installation" section</li>
<li>An empty "Usage" section</li>
<li>A "License" section</li>
<li><a href="http://spec.commonmark.org/0.28/#setext-heading">Setext headings</a> to emphasize sections when in raw text mode.</li>
</ul>
<p>Ember CLI 3.0 does not introduce any new deprecations.</p>
<p>For more details on the changes in Ember CLI 3.0.0-beta.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.0.0-beta.1">Ember CLI 3.0.0-beta.1 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of
these releases serve as a reminder that the Ember project would not have been
possible without your continued support. We are extremely grateful to our
contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-2-18-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-18-released</guid><pubDate>Mon, 01 Jan 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 2.2 and 2.3 Beta Released]]></title><description><![CDATA[<p>Ember.js 2.2, a minor version release of Ember with backwards compatible
changes, is released today. This release represents the work of over 60
contributors.</p>
<p>Ember.js 2.3 beta, the branch of Ember that will be released as stable in
roughly six weeks, is also being released today.</p>
<h3 id="changesinemberjs22">Changes in Ember.js 2.2</h3>
<p>Ember.js releases occur every six weeks, regardless of how significant the
changes are. 2.2 introduces no new features, but does include performance
improvements and bug fixes.</p>
<p>Notable improvements include a performance fix for Ember's <code>_super</code>
implementation under minification, and the skipping of <code>view</code> and <code>controller</code>
template locals logic when operating without the view and controller legacy
addons.</p>
<p>For more details on changes landing in 2.2, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.2.0/CHANGELOG.md">Ember.js 2.2.0 CHANGELOG</a>.</p>
<h3 id="emberjs23beta">Ember.js 2.3 beta</h3>
<p>Ember.js 2.3 beta is released today, and in six weeks it will become the
new stable version of Ember. This beta cycle introduces several new features
and a notable deprecation.</p>
<h4 id="visitapi"><code>visit</code> API</h4>
<p><a href="https://github.com/tildeio/ember-cli-fastboot">Ember FastBoot</a> and new testing
APIs motivated the addition of a <code>visit</code> method for <code>Ember.Application</code> and
<code>Ember.ApplicationInstance</code> objects. Called on <code>Ember.Application</code> this
method accepts several configuration options.</p>
<p>For example, you might use this API to manually boot an Ember application
and then instruct it to visit a URL:</p>
<pre><code class="javascript language-javascript">import MyApp from 'my-app';

$(function() {
  let App = MyApp.create({ autoboot: false });
  let options = {
    // Prevent this application from updating the URL in the address bar
    location: 'none',
    // Override the default `rootElement` to render into a specific `div`
    // on the page
    rootElement: '#demo'
  };
  App.visit('/demo', options).then((/* appInstance */) =&gt; {
    $('#loading').fadeOut(); // Or any other logic after rendering
  });
});
</code></pre>
<p>Importantly, the addition of this API means <strong>FastBoot
is now usable with Ember.js beta</strong>. FastBoot itself remains experimental,
however this is the first time you can use it with a stock build of Ember.js.
The <a href="https://github.com/tildeio/ember-cli-fastboot">README.md for ember-cli-fastboot</a>
is the best place to start if you want to try FastBoot.</p>
<p>You can read more about the <code>visit</code> API and its use cases in the <a href="https://github.com/emberjs/ember.js/blob/0810d913f9d358e5d37d25a1efd2295ebaebc6e2/packages/ember-application/lib/system/application.js#L985-L1181">unpublished
<code>visit</code> API documentation</a>.
Reviewing the main implementation PR at <a href="https://github.com/emberjs/ember.js/pull/12394">emberjs/emberjs #12394</a> and the integration into FastBoot at
<a href="https://github.com/tildeio/ember-cli-fastboot/pull/71">tildeio/ember-cli-fastboot #71</a>
may also be helpful.</p>
<p>Many thanks to <a href="https://twitter.com/tomdale">@tomdale</a> and
<a href="https://twitter.com/chancancode">@chancancode</a> for their work implementing
this API and for their continued work on FastBoot.</p>
<h4 id="hashhelper">Hash Helper</h4>
<p>The <code>(hash</code> helper creates an object from arguments passed to it during
invocation, and then returns that object. For example this usage would create an object with
the property <code>name</code>:</p>
<pre><code class="handlebars language-handlebars">{{#with (hash name='Bob') as |person|}}
  Hello, my name is {{person.name}}
{{/with}}
</code></pre>
<p>This helper is introduced to make the new contextual components feature
more convenient, and it will often be used with the <code>{{yield</code> helper. For
example:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/components/nice-person.hbs --}}
{{yield (hash name='Bob')}}
</code></pre>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/index.hbs --}}
{{#nice-person as |person|}}
  Hello, my name is {{person.name}}
{{/nice-person}}
</code></pre>
<p>See the <a href="https://github.com/emberjs/ember.js/blob/04ec1c639e3ac7aa93ec24bf7fcf35e18c62fed6/packages/ember-htmlbars/lib/helpers/hash.js#L6-L31">unpublished documentation</a> for
for details on this helper, and read the contextual components section below
for further context.</p>
<p>Thanks to <a href="https://twitter.com/serabe">@Serabe</a> for his implementation of this
feature and to <a href="https://twitter.com/MiguelCamba">@MiguelCamba</a> for his fantastic
<a href="https://github.com/cibernox/ember-hash-helper-polyfill">ember-hash-helper-polyfill</a>
addon. Using the polyfill you can start using <code>(hash</code> with Ember.js 1.13 or
later.</p>
<h4 id="contextualcomponents">Contextual Components</h4>
<p>The new contextual components feature allows for multiple components to
privately share data, but be invoked in a flexible manner. For example,
this <code>{{alert-box}}</code> component yields a contextual component composed
of the <code>alert-box-button</code> component and the attribute <code>onclick</code>:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/components/alert-box.hbs --}}
&lt;div class="alert-box"&gt;
  {{yield (hash
    close-button=(component 'alert-box-button' onclick=(action 'close'))
  )}}
&lt;/div&gt;
</code></pre>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/index.hbs --}}
{{#alert-box as |box|}}
  Danger, Will Robinson!
  &lt;div style="float:right"&gt;
    {{#box.close-button}}
      It's just a plain old meteorite.
    {{/box.close-button}}
  &lt;/div&gt;
{{/alert-box}}
</code></pre>
<p>Contextual components are created using the nested form of the
<code>component</code> helper, and may be passed attrs and positional params. Contextual
components must be invoked with a <code>.</code> in their path, unless they are being
passed to the invoking <code>{{component</code> helper.</p>
<p>This new feature is a powerful tool for addon authors, allowing them to
yield components without having arguments to those components become de-facto
public API. In addition, when the local lookup feature of Ember's pods
architecture arrives the combination of these features will permit
completely private components to be yielded.</p>
<p>For more information about contextual components see the <a href="https://github.com/emberjs/ember.js/blob/04ec1c639e3ac7aa93ec24bf7fcf35e18c62fed6/packages/ember-htmlbars/lib/keywords/component.js#L52-L73">unpublished
documentation</a>. Further details about the API design decisions can be found in
<a href="https://github.com/emberjs/rfcs/blob/master/text/0064-contextual-component-lookup.md">RFC #64</a>.</p>
<p>Thanks again to <a href="https://twitter.com/serabe">@Serabe</a> for his implementation
of this feature as well as <a href="https://twitter.com/mixonic">@mixonic</a> and
<a href="https://twitter.com/_mmun">@_mmun</a> for their efforts on the RFC and design.</p>
<h4 id="introducingownersanddeprecatingcontainers">Introducing Owners and Deprecating Containers</h4>
<p>Ember's container API is one of the more commonly used private APIs still
exposed. In Ember.js 2.1, a major refactor of application
boot removed access to the container from initializers and instance initializers,
creating public API alternatives.</p>
<p><strong>In Ember 2.3, accessing the <code>container</code> property on a framework-generated
object will be deprecated in favor of a public owner API.</strong></p>
<p>For example, this component will dynamically lookup an audio service based
on the <code>audioType</code> of its model:</p>
<pre><code class="javascript language-javascript">import Ember from 'ember';
const {
  Component,
  computed,
  getOwner
} = Ember;

// Usage:
//
//   {{play-audio model=audioModel}}
//
export default Component.extend({
  audioService: computed('model.audioType', function() {
    let owner = getOwner(this);
    let serviceName = this.get('model.audioType');
    return owner.lookup(`service:audio-${serviceName}`);
  }),
  click() {
    let player = this.get('audioService');
    player.play(this.get('model.file'));
  }
});
</code></pre>
<p>The return value of <code>getOwner</code> will be an <a href="http://emberjs.com/api/classes/Ember.ApplicationInstance.html"><code>Ember.ApplicationInstance</code></a>
for objects generated by the framework.</p>
<p><strong>This change means ember-qunit 0.4.16+ is required for use with Ember 2.3.</strong></p>
<p>For more information about migrating code from using <code>container</code> to <code>getOwner</code>,
see the <a href="http://emberjs.com/deprecations/v2.x/#toc_injected-container-access">deprecation guide</a>.
Further details about the API design decisions can be found in
<a href="https://github.com/emberjs/ember.js/pull/11874">emberjs/emberjs #11874</a>
and <a href="https://github.com/emberjs/ember.js/issues/12555">emberjs/emberjs #12555</a>.</p>
<p>Many thanks to <a href="https://twitter.com/dgeb">@dgeb</a> for his tireless efforts
implementing this feature, and for his time buildling consensus around
improvements to the Ember dependency injection API. Additionally credit is
due to <a href="https://twitter.com/rwjblue">@rwjblue</a> for his upgrade PRs to
<a href="https://github.com/emberjs/data/pull/3912">Ember Data</a>, <a href="https://github.com/ef4/liquid-fire/pull/388">Liquid-Fire</a>, and <a href="https://github.com/jamesarosen/ember-i18n/pull/336">Ember-i18n</a>.
These provide a good example of how to upgrade any addon or app codebase.</p>
<p>For more details on changes landing in 2.3, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.3.0-beta.1/CHANGELOG.md">Ember.js 2.3.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-2-2-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-2-released</guid><pubDate>Mon, 16 Nov 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 2.3 and 2.4 Beta Released]]></title><description><![CDATA[<p>Ember.js 2.3, a minor version release of Ember with backwards compatible
changes, is released today.</p>
<p>Ember.js 2.4 beta, the branch of Ember that will be released as stable in
roughly six weeks, is also being released today.</p>
<h3 id="changesinemberjs23">Changes in Ember.js 2.3</h3>
<p>Ember.js 2.3 introduces a number of features we're excited to see in a stable
release.</p>
<p><strong>ember-qunit 0.4.16+ is required for your codebase's test suite to be
compatible with Ember 2.3.</strong> See "Introducing Owners and Deprecating Containers"
below for more detail.</p>
<h4 id="visitapi"><code>visit</code> API</h4>
<p><a href="https://github.com/tildeio/ember-cli-fastboot">Ember FastBoot</a> and new testing
APIs motivated the addition of a <code>visit</code> method for <code>Ember.Application</code> and
<code>Ember.ApplicationInstance</code> objects. Called on <code>Ember.Application</code> this
method accepts several configuration options.</p>
<p>For example, you might use this API to manually boot an Ember application
and then instruct it to visit a URL:</p>
<pre><code class="javascript language-javascript">import MyApp from 'my-app';

$(function() {
  let App = MyApp.create({ autoboot: false });
  let options = {
    // Prevent this application from updating the URL in the address bar
    location: 'none',
    // Override the default `rootElement` to render into a specific `div`
    // on the page
    rootElement: '#demo'
  };
  App.visit('/demo', options).then((/* appInstance */) =&gt; {
    $('#loading').fadeOut(); // Or any other logic after rendering
  });
});
</code></pre>
<p>Importantly, the addition of this API means <strong>FastBoot
is now usable with Ember.js 2.3 stable</strong>. FastBoot itself remains experimental,
however this is the first time you can use it with a release build of Ember.js.
The <a href="https://github.com/tildeio/ember-cli-fastboot">README.md for ember-cli-fastboot</a>
is the best place to start if you want to try FastBoot.</p>
<p>You can read more about the <code>visit</code> API and its use cases in the
<a href="http://emberjs.com/api/classes/Ember.Application.html#method_visit"><code>visit</code> API documentation</a>.
Reviewing the main implementation PR at <a href="https://github.com/emberjs/ember.js/pull/12394">emberjs/emberjs #12394</a> and the integration into FastBoot at
<a href="https://github.com/tildeio/ember-cli-fastboot/pull/71">tildeio/ember-cli-fastboot #71</a>
may also be helpful.</p>
<p>Many thanks to <a href="https://twitter.com/tomdale">@tomdale</a> and
<a href="https://twitter.com/chancancode">@chancancode</a> for their work implementing
this API and for their continued work on FastBoot.</p>
<h4 id="hashhelper">Hash Helper</h4>
<p>The <code>(hash</code> helper creates an object from arguments passed to it during
invocation, and then returns that object. For example this usage would create an object with
the property <code>name</code>:</p>
<pre><code class="handlebars language-handlebars">{{#with (hash name='Bob') as |person|}}
  Hello, my name is {{person.name}}
{{/with}}
</code></pre>
<p>This helper is introduced to make the new contextual components feature
more convenient, and it will often be used with the <code>{{yield</code> helper. For
example:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/components/nice-person.hbs --}}
{{yield (hash name='Bob')}}
</code></pre>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/index.hbs --}}
{{#nice-person as |person|}}
  Hello, my name is {{person.name}}
{{/nice-person}}
</code></pre>
<p>See the <a href="http://emberjs.com/api/classes/Ember.Templates.helpers.html#method_hash"><code>hash</code> API documentation</a> for
for details on this helper, and read the contextual components section below
for further context.</p>
<p>Thanks to <a href="https://twitter.com/serabe">@Serabe</a> for his implementation of this
feature and to <a href="https://twitter.com/MiguelCamba">@MiguelCamba</a> for his fantastic
<a href="https://github.com/cibernox/ember-hash-helper-polyfill">ember-hash-helper-polyfill</a>
addon. Using the polyfill you can start using <code>(hash</code> with Ember.js 1.13 or
later.</p>
<h4 id="contextualcomponents">Contextual Components</h4>
<p>The new contextual components feature allows for multiple components to
privately share data, but be invoked in a flexible manner. For example,
this <code>{{alert-box}}</code> component yields a contextual component composed
of the <code>alert-box-button</code> component and the attribute <code>onclick</code>:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/components/alert-box.hbs --}}
&lt;div class="alert-box"&gt;
  {{yield (hash
    close-button=(component 'alert-box-button' onclick=(action 'close'))
  )}}
&lt;/div&gt;
</code></pre>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/index.hbs --}}
{{#alert-box as |box|}}
  Danger, Will Robinson!
  &lt;div style="float:right"&gt;
    {{#box.close-button}}
      It's just a plain old meteorite.
    {{/box.close-button}}
  &lt;/div&gt;
{{/alert-box}}
</code></pre>
<p>Contextual components are created using the nested form of the
<code>component</code> helper, and may be passed attrs and positional params. Contextual
components must be invoked with a <code>.</code> in their path, unless they are being
passed to the invoking <code>{{component</code> helper.</p>
<p>This new feature is a powerful tool for addon authors, allowing them to
yield components without having arguments to those components become de-facto
public API. In addition, when the local lookup feature of Ember's pods
architecture arrives the combination of these features will permit
completely private components to be yielded.</p>
<p>For more information about contextual components see the <a href="http://emberjs.com/api/classes/Ember.Templates.helpers.html#method_component">component helper
API documentation</a>.
Further details about the API design decisions can be found in
<a href="https://github.com/emberjs/rfcs/blob/master/text/0064-contextual-component-lookup.md">RFC #64</a>.</p>
<p>Thanks again to <a href="https://twitter.com/serabe">@Serabe</a> for his implementation
of this feature as well as <a href="https://twitter.com/mixonic">@mixonic</a> and
<a href="https://twitter.com/_mmun">@_mmun</a> for their efforts on the RFC and design.</p>
<h4 id="introducingownersanddeprecatingcontainers">Introducing Owners and Deprecating Containers</h4>
<p>Ember's container API is one of the more commonly used private APIs still
exposed. In Ember.js 2.1, a major refactor of application
boot removed access to the container from initializers and instance initializers,
creating public API alternatives.</p>
<p><strong>In Ember 2.3, accessing the <code>container</code> property on a framework-generated
object is deprecated in favor of a public owner API.</strong></p>
<p>For example, this component will dynamically lookup an audio service based
on the <code>audioType</code> of its model:</p>
<pre><code class="javascript language-javascript">import Ember from 'ember';
const {
  Component,
  computed,
  getOwner
} = Ember;

// Usage:
//
//   {{play-audio model=audioModel}}
//
export default Component.extend({
  audioService: computed('model.audioType', function() {
    let owner = getOwner(this);
    let serviceName = this.get('model.audioType');
    return owner.lookup(`service:audio-${serviceName}`);
  }),
  click() {
    let player = this.get('audioService');
    player.play(this.get('model.file'));
  }
});
</code></pre>
<p>The return value of <code>getOwner</code> will be an <a href="http://emberjs.com/api/classes/Ember.ApplicationInstance.html"><code>Ember.ApplicationInstance</code></a>
for objects generated by the framework.</p>
<p><strong>ember-qunit 0.4.16+ includes important compatability patches for Ember
2.3. Please upgrade ember-qunit to ensure your test suite continues to work
properly and without deprecation warnings.</strong> Specifically 0.4.16+ includes
<a href="https://github.com/switchfly/ember-test-helpers/pull/119">PR #119 to ember-test-helpers</a>
adding <code>getOwner</code> compatibilty.</p>
<p>For more information about migrating code from using <code>container</code> to <code>getOwner</code>,
see the <a href="http://emberjs.com/deprecations/v2.x/#toc_injected-container-access">deprecation guide</a>.
Further details about the API design decisions can be found in
<a href="https://github.com/emberjs/ember.js/pull/11874">emberjs/emberjs #11874</a>
and <a href="https://github.com/emberjs/ember.js/issues/12555">emberjs/emberjs #12555</a>.</p>
<p>The <a href="https://github.com/rwjblue/ember-getowner-polyfill">ember-getowner-polyfill addon</a>
provides compatibility for <code>getOwner</code> back to Ember.js 1.10.</p>
<p>Many thanks to <a href="https://twitter.com/dgeb">@dgeb</a> for his tireless efforts
implementing this feature, and for his time buildling consensus around
improvements to the Ember dependency injection API. Additionally credit is
due to <a href="https://twitter.com/rwjblue">@rwjblue</a> for his polyfill and upgrade PRs to
<a href="https://github.com/emberjs/data/pull/3912">Ember Data</a>, <a href="https://github.com/ef4/liquid-fire/pull/388">Liquid-Fire</a>, and <a href="https://github.com/jamesarosen/ember-i18n/pull/336">Ember-i18n</a>.
These provide a good example of how to upgrade any addon or app codebase.</p>
<h4 id="removingthejqueryversionassertion">Removing the jQuery version assertion</h4>
<p>Ember has long had an assertion that ensured only supported versions of jQuery
were present. With the introduction of Ember-CLI and ability to use package
managers for client-side code, this assertion is redundant.</p>
<p>Recent releases of jQuery have triggered the outdated assertion. Since it is
not really required any longer, we've <a href="https://github.com/emberjs/ember.js/pull/12793">removed it</a>.
Ember remains compatible with jQuery 1.7+.</p>
<p>Ember.js 2.3.0+, 2.2.2, and 1.13.12 have this assertion removed.</p>
<p>For more details on changes landing in 2.3, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.3.0/CHANGELOG.md">Ember.js 2.3.0 CHANGELOG</a>.</p>
<h3 id="emberjs24beta">Ember.js 2.4 beta</h3>
<p>No new features are slated for Ember 2.4. During the canary cycle leading to
this beta, the core team and community have been primarily focused on
performance improvements or feature work still behind a feature flag.</p>
<p>For more details on changes landing in 2.4, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.4.0-beta.1/CHANGELOG.md">Ember.js 2.4.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-2-3-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-3-released</guid><pubDate>Fri, 15 Jan 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 2.4 and 2.5 Beta Released]]></title><description><![CDATA[<p>Ember.js 2.4, a minor version release of Ember with backwards compatible
changes, is released today. After an additional six-week maturation cycle
as a stable release version, 2.4 will be declared Ember's first Long-Term
Support (LTS) release. For more about the LTS process and what you should
expect, see last week's post
<a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Announcing Ember's First LTS Release</a>.</p>
<p>Ember.js 2.5 beta, the branch of Ember that will be released as stable in
roughly six weeks, is also being released today.</p>
<h3 id="changesinemberjs24">Changes in Ember.js 2.4</h3>
<p>No new features are added in Ember core in 2.4. Instead this release
is primarily comprised of bugfixes making it an excellent LTS candidate. In
general the core team and
community have remained active around other highly visible parts of
the Ember stack (Ember CLI, Ember Data, FastBoot, Glimmer, etc).</p>
<p>In six weeks, the current release build of 2.4 will become Ember's first
LTS release. Builds on the LTS channel will receive critical bugfixes covering the
subsequent six release cycles (~36 weeks), and security patches for the subsequent
ten release cycles (~60 weeks). If your organization intends to remain on the
LTS channel, we strongly suggest you attempt updating your application to
2.4 and open any issues in the next six weeks.</p>
<p>For more details on changes landing in 2.4, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.4.1/CHANGELOG.md">Ember.js 2.4.1 CHANGELOG</a>.</p>
<h3 id="emberjs25beta">Ember.js 2.5 beta</h3>
<p>Ember 2.5 introduces several minor public API additions.</p>
<h4 id="emberassign"><code>Ember.assign</code></h4>
<p><code>Ember.assign</code> is a polyfill for the ES2015 <code>Object.assign</code> feature. <code>assign</code>
copies the values of all enumerable own properties from one or more source
objects to a target object. For example:</p>
<pre><code class="javascript language-javascript">let a = {first: 'John'};
let b = {last: 'Lennon'};
let c = {band: 'The Beatles'};

Ember.assign(a, b, c);

// a === {first: 'John', last: 'Lennon', band: 'The Beatles'}
// b === {last: 'Lennon'}
// c === {band: 'The Beatles'}
</code></pre>
<p>For more specifics on <code>assign</code>, see the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign">MDN documentation</a>.</p>
<h4 id="locallookupcompatibility">Local Lookup Compatibility</h4>
<p>As part of the "pods" directory layout, we intend to introduce a feature called
"local lookup". This feature will allow for the creation of components available
only in a single template, instead of being globally scoped as they must be
today. <code>lookup</code> and <code>resolve</code> in Ember 2.5 will accept an optional <code>source</code> property
on their <code>options</code> argument. This API change will local
lookup to be implemented outside of Ember via the
<a href="https://github.com/ember-cli/ember-resolver">ember-cli/ember-resolver</a> library.</p>
<h4 id="nativeeventtesthelpers">Native Event Test Helpers</h4>
<p>Ember's acceptance test helpers, such as <code>click()</code> have previously used
jQuery event triggers. In 2.5 this behavior has been altered to trigger
native events via <a href="https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent"><code>dispatchEvent</code></a>.
This change is expected to be completely backwards compatible, and enable
the triggering of non-jQuery event listeners in acceptance tests.</p>
<p>For more details on changes landing in 2.5, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.5.0-beta.1/CHANGELOG.md">Ember.js 2.5.0-beta.1 CHANGELOG</a>.</p>
<h3 id="updateember241released">Update: Ember 2.4.1 Released</h3>
<p>Shortly after Ember 2.4.0 was released, we have identified a regression that
caused incorrect deprecation warnings to be emitted. Specifically, we intended
to emit deprecation warnings when either (or both) of the legacy addons are
installed. Instead, the check was inverted, causing the deprecation warnings to
be emitted only if the addons are <em>not</em> installed.</p>
<p>Ember 2.4.1 has been released to address this error.</p>
<p>It should be noted that the production builds for 2.4.0 are <em>not</em> affected by
this regression, since deprecation warnings are only present in development
builds.</p>]]></description><link>https://blog.emberjs.com/ember-2-4-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-4-released</guid><pubDate>Mon, 29 Feb 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 2.4-LTS, 2.5, and 2.6 Beta Released]]></title><description><![CDATA[<p>Ember 2.4-LTS, the first Ember Long-Term Support release, lands today as Ember
2.4.5. Future versions of 2.4 will be considered part of the LTS channel.
The LTS channel comes with a commitment
that low-risk critical bugfixes and security patches will be backported to
these versions. Additionally, any change to commonly used private APIs must be deprecated
in at least one LTS release before removal, making LTS releases a slower
moving target for addons to support.</p>
<p>2.4-LTS will receive critical bugfixes for the next 6 release cycles (until
roughly November 2016) and security patches for the next 10 release cycles
(until roughly April 2017). For more information about how the LTS process works,
see the blog post <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Announcing Ember's First LTS Release</a>.</p>
<p>Ember 2.5, a minor version release of Ember with backwards compatible
changes, is also released today.</p>
<p>Ember 2.6 beta, the branch of Ember that will be released as stable in
roughly six weeks, is released today.</p>
<h3 id="notabledeprecationsinember24lts">Notable deprecations in Ember 2.4-LTS</h3>
<p>Ember 2.4-LTS deprecates two private APIs. Support for these private APIs will
be removed in Ember 2.6.</p>
<ul>
<li>The <a href="https://github.com/emberjs/ember-legacy-views">ember-legacy-views</a> and <a href="https://github.com/emberjs/ember-legacy-controllers">ember-legacy-controllers</a>
addons, which rely upon private API, will be supported on Ember 2.4-LTS with a deprecation notice. Although Ember 2.5 will also
support these addons, 2.4-LTS will be a supported platform for much longer than
2.5. Ember 2.6 and 2.8-LTS, when they are released, will not support these addons.</li>
<li>Use of the <code>{{#render}}</code> helper in block form is deprecated. Block form usage was an
un-documented and un-intended feature, and will be removed in Ember 2.6. In general,
uses of <code>{{render}}</code> should be replaced with components.</li>
</ul>
<h3 id="changesinember25">Changes in Ember 2.5</h3>
<p>Ember 2.5 introduces several minor public API additions.</p>
<h4 id="emberassign"><code>Ember.assign</code></h4>
<p><code>Ember.assign</code> is a polyfill for the ES2015 <code>Object.assign</code> feature. <code>assign</code>
copies the values of all enumerable own properties from one or more source
objects to a target object. For example:</p>
<pre><code class="javascript language-javascript">let a = {first: 'John'};
let b = {last: 'Lennon'};
let c = {band: 'The Beatles'};

Ember.assign(a, b, c);

// a === {first: 'John', last: 'Lennon', band: 'The Beatles'}
// b === {last: 'Lennon'}
// c === {band: 'The Beatles'}
</code></pre>
<p>For more specifics on <code>assign</code>, see the <a href="http://emberjs.com/api/#method_assign">Ember API documentation</a>
and <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign">MDN documentation</a>.</p>
<h4 id="locallookupcompatibility">Local Lookup Compatibility</h4>
<p>As part of the new directory layout effort currently organized around the
<a href="https://github.com/emberjs/rfcs/pull/124">Module Normalization RFC</a>,
we intend to introduce a feature called
"local lookup". This feature will allow for the creation of components or helpers available
only in a single template, instead of being globally scoped as they must be
today. <code>lookup</code> and <code>resolve</code> in Ember 2.5 will accept an optional <code>source</code> property
on their <code>options</code> argument. This API change will allow local
lookup to be implemented outside of Ember via the
<a href="https://github.com/ember-cli/ember-resolver">ember-cli/ember-resolver</a> library.</p>
<h4 id="nativeeventtesthelpers">Native Event Test Helpers</h4>
<p>Ember's acceptance test helpers, such as <code>click()</code>, have previously used
jQuery event triggers. In 2.5 this behavior has been altered to trigger
native events via <a href="https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent"><code>dispatchEvent</code></a>.
This change is expected to be completely backwards compatible and was
uncontroversial during the six week beta cycle. It allows the triggering of
non-jQuery event listeners in acceptance tests.</p>
<p>For more details on changes landing in Ember 2.5, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.5.0/CHANGELOG.md">Ember.js 2.5.0 CHANGELOG</a>.</p>
<h3 id="emberjs26beta">Ember.js 2.6 beta</h3>
<p>No new features are added in Ember core in 2.6. In
general the core team and
community have remained active around other highly visible parts of
the Ember stack (Ember Data, FastBoot, Glimmer, etc).</p>
<h4 id="notabledeprecations">Notable Deprecations</h4>
<p>The following deprecations are scheduled for release with Ember 2.6 and will be
removed in Ember 3.0:</p>
<ul>
<li><code>Ember.String.htmlSafe(aString)</code> is the preferred API for marking a string
XSS safe for the rendering layer. Use of <code>Ember.Handlebars.SafeString</code> as
a constructor for safe strings is deprecated, and will be removed.
See the <a href="http://emberjs.com/deprecations/v2.x/#toc_use-ember-string-htmlsafe-over-ember-handlebars-safestring">deprecation guide</a> for more details.</li>
<li>The <code>didInitAttrs</code> hook for component lifecycles is deprecated in favor of
using <code>init</code>. <code>didInitAttrs</code> had confusing timing
issues, and <code>init</code> fulfills the same role. See the <a href="http://emberjs.com/deprecations/v2.x/#toc_ember-component-didinitattrs">deprecation guide</a> for more details.</li>
<li>Passing a <code>model</code> argument to <code>{{render}}</code> is deprecated in favor of using
a component for the same cases. For example <code>{{render 'chat' roomModel}}</code>
can be refactored into a <code>chat-room</code> component.
See the <a href="http://emberjs.com/deprecations/v2.x/#toc_model-param-in-code-render-code-helper">deprecation guide</a> for more details.</li>
</ul>
<p>For more details on changes landing in 2.6 beta, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.6.0-beta.1/CHANGELOG.md">Ember.js 2.6.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-2-5-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-5-released</guid><pubDate>Mon, 11 Apr 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 2.6 and 2.7 Beta Released]]></title><description><![CDATA[<p>Ember.js 2.6, a minor version release of Ember with backwards compatible
changes, is released today.</p>
<p>Ember.js 2.7 beta, the branch of Ember that will be released as stable in
roughly six weeks, is also being released today.</p>
<h3 id="changesinemberjs26">Changes in Ember.js 2.6</h3>
<p>No new features are added in Ember core in 2.6. In general the core team and
community have remained active around other highly visible parts of the Ember
stack (Ember Data, FastBoot, Glimmer, etc).</p>
<h4 id="notabledeprecations">Notable Deprecations</h4>
<p>The following deprecations are scheduled for release with Ember 2.6 and will be
removed in Ember 3.0:</p>
<ul>
<li>The <code>didInitAttrs</code> hook for component lifecycles is deprecated in favor of
using <code>init</code>. <code>didInitAttrs</code> had confusing timing
issues, and <code>init</code> fulfills the same role. See the <a href="http://emberjs.com/deprecations/v2.x/#toc_ember-component-didinitattrs">deprecation guide</a> for more details.</li>
<li>Passing a <code>model</code> argument to <code>{{render}}</code> is deprecated in favor of using
a component for the same cases. For example <code>{{render 'chat' roomModel}}</code>
can be refactored into a <code>chat-room</code> component.
See the <a href="http://emberjs.com/deprecations/v2.x/#toc_model-param-in-code-render-code-helper">deprecation guide</a> for more details.</li>
</ul>
<p>For more details on changes landing in 2.6, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.6.0/CHANGELOG.md">Ember.js 2.6.0 CHANGELOG</a>.</p>
<h3 id="emberjs27beta">Ember.js 2.7 Beta</h3>
<p>Ember 2.7 beta introduces one new backward compatible API:</p>
<h4 id="embercomputeduniqby"><code>Ember.computed.uniqBy</code></h4>
<p>In general, the core team is hesitant about adding any new computed macros
or array prototype extensions to the framework. Instead, we encourage developers
to adopt an addon such as <a href="https://github.com/cibernox/ember-cpm">ember-cpm</a>
if they desire an expanded list of macros.</p>
<p>However contributor <a href="https://github.com/seanjohnson08">@seanjohnson08</a> correctly pointed out there is a logical
gap in the APIs Ember provides today. Although each of <code>find</code>, <code>map</code>, <code>filter</code>,
and <code>reject</code> have a comparable <code>xxxBy</code> method (for example <code>findBy</code>) no
comparable method exists for <code>uniq</code>.</p>
<p>Ember 2.7 adds <code>uniqBy</code> as an computed property macro. For example:</p>
<pre><code class="javascript language-javascript">import Ember from 'ember';

export default Ember.Component.extend({
  accidents: Ember.computed(function() {
    return [{
      description: 'Flipped over',
      car: { id: 1, make: 'Saturn' }
    },{
      description: 'Aliens',
      car: { id: 2, make: 'Toyota' }
    },{
      description: 'Road rage',
      car: { id: 1, make: 'Saturn' }
    }];
  }),
  carsInAccidents: Ember.computed.mapBy('accidents', 'car'), 
  uniqueCarsInAccidents: Ember.computed.uniqBy('carsInAccidents', 'id')
});
</code></pre>
<p><code>uniqBy</code> is also added as an array method. For example:</p>
<pre><code class="javascript language-javascript">import Ember from 'ember';

export default Ember.Component.extend({
  accidents: Ember.computed(function() {
    return [{
      description: 'Flipped over',
      car: { id: 1, make: 'Saturn' }
    },{
      description: 'Aliens',
      car: { id: 2, make: 'Toyota' }
    },{
      description: 'Road rage',
      car: { id: 1, make: 'Saturn' }
    }];
  }),
  uniqueCarsInAccidents: Ember.computed('accidents.@each.car', function() {
    return this.get('accidents').mapBy('car').uniqBy('id');
  })
});
</code></pre>
<p>For more information on these methods, see the <a href="http://emberjs.com/api/classes/Ember.computed.html#method_uniqBy">API docs for the
computed macro</a>, <a href="http://emberjs.com/api/classes/Ember.Array.html#method_uniqBy">API docs for the array method</a>, and <a href="https://github.com/emberjs/ember.js/pull/12875">PR #12875</a>
introducing these changes.</p>
<p>For more details on changes landing in 2.7 beta, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.7.0-beta.1/CHANGELOG.md">Ember.js 2.7.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-2-6-and-2-7-beta-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-6-and-2-7-beta-released</guid><pubDate>Wed, 08 Jun 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 2.7 and 2.8 Beta Released]]></title><description><![CDATA[<p>Ember.js 2.7, a minor version release of Ember with backwards compatible
changes, is released today.</p>
<p>Ember.js 2.8 beta is also being released today. This branch will be released as
stable in roughly six weeks and will then go on to be the next <a href="/blog/2016/02/25/announcing-embers-first-lts.html">LTS release</a>
roughly six weeks after that.</p>
<h3 id="changesinemberjs27">Changes in Ember.js 2.7</h3>
<p>Ember 2.7 introduces one new backward compatible API:</p>
<h4 id="embercomputeduniqby"><code>Ember.computed.uniqBy</code></h4>
<p>In general, the core team is hesitant about adding any new computed macros
or array prototype extensions to the framework. Instead, we encourage developers
to adopt an addon such as <a href="https://github.com/cibernox/ember-cpm">ember-cpm</a>
if they desire an expanded list of macros.</p>
<p>However contributor <a href="https://github.com/seanjohnson08">@seanjohnson08</a> correctly
pointed out there is a logical gap in the APIs Ember provides today. Although
each of <code>find</code>, <code>map</code>, <code>filter</code>, and <code>reject</code> have a comparable <code>xxxBy</code> method
(for example <code>findBy</code>) no comparable method exists for <code>uniq</code>.</p>
<p>Ember 2.7 adds <code>uniqBy</code> as an computed property macro. For example:</p>
<pre><code class="javascript language-javascript">import Ember from 'ember';

export default Ember.Component.extend({
  accidents: Ember.computed(function() {
    return [{
      description: 'Flipped over',
      car: { id: 1, make: 'Saturn' }
    },{
      description: 'Aliens',
      car: { id: 2, make: 'Toyota' }
    },{
      description: 'Road rage',
      car: { id: 1, make: 'Saturn' }
    }];
  }),
  carsInAccidents: Ember.computed.mapBy('accidents', 'car'),
  uniqueCarsInAccidents: Ember.computed.uniqBy('carsInAccidents', 'id')
});
</code></pre>
<p><code>uniqBy</code> is also added as an array method. For example:</p>
<pre><code class="javascript language-javascript">import Ember from 'ember';

export default Ember.Component.extend({
  accidents: Ember.computed(function() {
    return [{
      description: 'Flipped over',
      car: { id: 1, make: 'Saturn' }
    },{
      description: 'Aliens',
      car: { id: 2, make: 'Toyota' }
    },{
      description: 'Road rage',
      car: { id: 1, make: 'Saturn' }
    }];
  }),
  uniqueCarsInAccidents: Ember.computed('accidents.@each.car', function() {
    return this.get('accidents').mapBy('car').uniqBy('id');
  })
});
</code></pre>
<p>For more information on these methods, see the <a href="http://emberjs.com/api/classes/Ember.computed.html#method_uniqBy">API docs for the computed
macro</a>, <a href="http://emberjs.com/api/classes/Ember.Array.html#method_uniqBy">API
docs for the array
method</a>, and
<a href="https://github.com/emberjs/ember.js/pull/12875">PR #12875</a> introducing these
changes.</p>
<h4 id="notabledeprecations">Notable Deprecations</h4>
<p>The following deprecations are scheduled for release with Ember 2.7:</p>
<ul>
<li><p><code>Ember.Backburner</code> was private throughout the Ember 2.x series and will be
removed after Ember 2.8, as mentioned in the
<a href="http://emberjs.com/deprecations/v2.x/#toc_ember-backburner">deprecation guide</a>.</p></li>
<li><p><code>Ember.Binding</code> has not been needed for some time and is deprecated in favor
of computed properties and services (depending on what you were binding to).
It will be removed in Ember 3.0. See the
<a href="http://emberjs.com/deprecations/v2.x/#toc_ember-binding">deprecation guide</a>
for more details.</p></li>
</ul>
<p>For more details on changes landing in 2.7, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.7.0/CHANGELOG.md">Ember.js 2.7.0 CHANGELOG</a>.</p>
<h3 id="emberjs28beta">Ember.js 2.8 Beta</h3>
<p>Ember 2.8 beta introduces the following new backward compatible APIs:</p>
<h4 id="engines">Engines</h4>
<p>As described in the <a href="https://github.com/emberjs/rfcs/pull/10">RFC</a>, "engines
allow multiple logical applications to be composed together into a single
application from the user's perspective."</p>
<p>The best way to use this feature in your apps is through the <a href="http://github.com/dgeb/ember-engines">ember-engines addon</a>.
To get started, check out the excellent <a href="https://github.com/dgeb/ember-engines/blob/master/guides/01-introduction.md">guides</a>
written by <a href="https://github.com/trentmwillis">@trentmwillis</a>.</p>
<p>This release will introduce a set of low-level APIs for the core functionailty
along with the ususal semver guarentee. While the ember-engines addon itself
remains experimental, the introduction of these public APIs means that <strong>ember-engines
is now usable with Ember.js 2.8 beta</strong>.</p>
<p>Work on engines has proceeded over the past year in both Ember core as well as
the addon. Ember's architecture has been enhanced to provide the base classes
and hooks needed to support engines. The addon then makes use of these interfaces
to provide a smooth experience building and consuming engines.</p>
<p>Until now, none of the engine-related classes and hooks in Ember have been
exposed publicly. However, starting with Ember 2.8, the following APIs will be
made public:</p>
<ul>
<li><p><code>Ember.Engine</code> class - The base class for <code>Ember.Application</code>. Its only public
interface is related to initializers and instance initializers, which is
then inherited by applications.</p></li>
<li><p><code>Ember.EngineInstance</code> class - The base class for <code>Ember.ApplicationInstance</code>.</p></li>
<li><p><code>mount</code> keyword - Allows for the mounting of routeless engines in templates.
This keyword currently only takes one argument, the name of the engine.</p></li>
<li><p><code>mount</code> router DSL - Allows routable engines to be mounted at a location in
a route map.</p></li>
</ul>
<p>By making these APIs public, ember-engines and other addons will be able to
access them without a feature-flag in a (soon-to-be) stable release of Ember. By
accessing only public interfaces in Ember, an addon won't need to rely on
private overrides and can provide as stable an experience as possible.</p>
<p>We predict that engines will grow in popularity once work on lazy loading is
complete. By delaying the loading of engines until they're accessed, we can
decrease the initial payload size and startup time for applications. If you're
interested in helping to implement or test lazy loading of engines, please check
out the thorough <a href="https://github.com/dgeb/ember-engines/issues/154">attack plan</a>
written up by <a href="https://github.com/nathanhammond">@nathanhammond</a>.</p>
<h4 id="enumerableincludesandarrayincludes"><code>Enumerable#includes</code> and <code>Array#includes</code></h4>
<p>In an effort to remain inline with ES standards, the methods
<code>Enumerable#contains</code> and <code>Array#contains</code> have been deprecated in favor of the
new methods <code>Enumerable#includes</code> and <code>Array#includes</code>.</p>
<p>Thanks to <a href="https://github.com/alexspeller">@alexspeller</a> for the <a href="https://github.com/emberjs/rfcs/blob/master/text/0136-contains-to-includes.md">RFC</a>
that proposed this change.</p>
<p>Thanks as well to <a href="https://github.com/bmeurant">@bmeurant</a> for the
<a href="https://github.com/emberjs/ember.js/pull/13553">PR</a> that implemented the change.</p>
<h4 id="emberstringishtmlsafe"><code>Ember.String.isHTMLSafe</code></h4>
<p>The new method <code>Ember.String.isHTMLSafe</code> detects if a string was decorated using
<code>Ember.String.htmlSafe</code>.</p>
<p>For example:</p>
<pre><code class="javascript language-javascript">var plainString = 'plain string',
    safeString = Ember.String.htmlSafe('&lt;div&gt;someValue&lt;/div&gt;');

Ember.String.isHTMLSafe(plainString); // false
Ember.String.isHTMLSafe(safeString);  // true
</code></pre>
<p>Thanks to <a href="https://github.com/workmanw">@workmanw</a> for the
<a href="https://github.com/emberjs/rfcs/pull/139">RFC</a> that proposed this new API, as
well as the <a href="https://github.com/emberjs/ember.js/pull/13666">PR</a> that
implemented it.</p>
<p>On a related note, please create safe strings with <code>Ember.String.htmlSafe</code>
instead of the deprecated <code>Ember.Handlebars.SafeString</code>. See the <a href="http://emberjs.com/deprecations/v2.x/#toc_use-ember-string-htmlsafe-over-ember-handlebars-safestring">deprecation
guide</a>
for details.</p>
<h4 id="embertestcheckwaiters"><code>Ember.Test.checkWaiters</code></h4>
<!-- alex ignore simple -->
<p>The new method <code>Ember.Test.checkWaiters</code> provides a simple mechanism for test
tooling to determine whether all async test waiters have settled. This replaces
the intimate API <code>Ember.Test.waiters</code>, which has been deprecated and will be
removed in Ember 2.8 final.</p>
<p>Thanks to <a href="https://github.com/rwjblue">@rwjblue</a> and
<a href="https://github.com/krisselden">@krisselden</a> for implementing this method.</p>
<hr />
<p>For more details on changes landing in 2.8 beta, review the
<a href="https://github.com/emberjs/ember.js/blob/v2.8.0-beta.1/CHANGELOG.md">Ember.js 2.8.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-2-7-and-2-8-beta-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-7-and-2-8-beta-released</guid><pubDate>Mon, 25 Jul 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 2.8 and 2.9 Beta Released]]></title><description><![CDATA[<p>Today, the Ember core team is happy to announce two new Ember.js releases –
Ember.js 2.8 and Ember.js 2.9 beta.</p>
<h2 id="emberjs28">Ember.js 2.8</h2>
<p>Ember.js 2.8 is a minor release with only backwards compatible changes.</p>
<h3 id="ltscandidate">LTS Candidate</h3>
<p>The Ember.js 2.8 release is considered a release candidate for the LTS
(long-term support) channel. As described in the <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">original LTS announcement</a>,
the 2.8 branch will be moved into the LTS channel six weeks after today's
release. Although we don't anticipate any issues, this process ensures the LTS
releases will be rock solid.</p>
<h3 id="engines">Engines</h3>
<p>Ember.js 2.8 introduced a new <a href="https://github.com/emberjs/rfcs/pull/10">Engines</a>
API, which allows multiple logical applications to be composed together into a
single application from the user's perspective.</p>
<p>The best way to use this feature in your apps is through the <a href="http://github.com/dgeb/ember-engines">ember-engines addon</a>.
To get started, check out the excellent <a href="https://github.com/dgeb/ember-engines/blob/master/guides/01-introduction.md">guides</a>
written by <a href="https://github.com/trentmwillis">@trentmwillis</a>.</p>
<p>This release introduced a set of low-level APIs for the core functionality
along with the usual semver guarantees. While the ember-engines addon itself
remains experimental, the introduction of these public APIs means that
<strong>ember-engines is now usable with Ember.js 2.8</strong> without feature flags.</p>
<p>Work on engines has proceeded over the past year in both Ember core as well as
the addon. Ember's architecture has been enhanced to provide the base classes
and hooks needed to support engines. The addon then makes use of these
interfaces to provide a smooth experience building and consuming engines.</p>
<p>Until now, none of the engine-related classes and hooks in Ember have been
exposed publicly. However, starting with Ember.js 2.8, the following APIs are
now public:</p>
<ul>
<li><p><code>Ember.Engine</code> class - The base class for <code>Ember.Application</code>. Its only
public interface is related to initializers and instance initializers, which
is then inherited by applications.</p></li>
<li><p><code>Ember.EngineInstance</code> class - The base class for <code>Ember.ApplicationInstance</code>.</p></li>
<li><p><code>{{mount}}</code> helper - Allows for the mounting of routeless engines in
templates. This helper currently only takes one argument, the name of the
engine, e.g. <code>{{mount "chat-engine"}}</code>.</p></li>
<li><p><code>mount</code> router DSL - Allows routable engines to be mounted at a location in
a route map.</p></li>
</ul>
<p>By making these APIs public, ember-engines and other addons will be able to
access them without a feature-flag. By accessing only public interfaces in
Ember, an addon won't need to rely on private overrides and can provide as
stable an experience as possible.</p>
<p>We predict that engines will grow in popularity once work on lazy loading is
complete. By delaying the loading of engines until they're accessed, we can
decrease the initial payload size and startup time for applications. If you're
interested in helping to implement or test lazy loading of engines, please
check out the thorough <a href="https://github.com/dgeb/ember-engines/issues/154">attack plan</a>
written up by <a href="https://github.com/nathanhammond">@nathanhammond</a>.</p>
<h3 id="othernotablefeatures">Other Notable Features</h3>
<h4 id="enumerableincludesandarrayincludes"><code>Enumerable#includes</code> and <code>Array#includes</code></h4>
<p>In an effort to remain in line with ES standards, the methods <code>Enumerable#contains</code>
and <code>Array#contains</code> have been deprecated in favor of the new methods <code>Enumerable#includes</code>
and <code>Array#includes</code>.</p>
<p>Addon authors should use <a href="https://github.com/rwjblue/ember-runtime-enumerable-includes-polyfill">ember-runtime-enumerable-includes-polyfill</a>
to fix the deprecation in a backwards-compatible way.</p>
<p>Thanks to <a href="https://github.com/alexspeller">@alexspeller</a> for the <a href="https://github.com/emberjs/rfcs/blob/master/text/0136-contains-to-includes.md">RFC</a>
that proposed this change.</p>
<p>Thanks as well to <a href="https://github.com/bmeurant">@bmeurant</a> for the <a href="https://github.com/emberjs/ember.js/pull/13553">PR</a>
that implemented the change.</p>
<h4 id="emberstringishtmlsafe"><code>Ember.String.isHTMLSafe</code></h4>
<p>The new method <code>Ember.String.isHTMLSafe</code> detects if a string was decorated
using <code>Ember.String.htmlSafe</code>.</p>
<p>For example:</p>
<pre><code class="javascript language-javascript">var plainString = 'plain string',
    safeString = Ember.String.htmlSafe('&lt;div&gt;someValue&lt;/div&gt;');

Ember.String.isHTMLSafe(plainString); // false
Ember.String.isHTMLSafe(safeString);  // true
</code></pre>
<p>Thanks to <a href="https://github.com/workmanw">@workmanw</a> for the <a href="https://github.com/emberjs/rfcs/pull/139">RFC</a>
that proposed this new API, as well as the <a href="https://github.com/emberjs/ember.js/pull/13666">PR</a>
that implemented it.</p>
<p>On a related note, please create safe strings with <code>Ember.String.htmlSafe</code>
instead of the using the deprecated <code>Ember.Handlebars.SafeString</code>. See the
<a href="http://emberjs.com/deprecations/v2.x/#toc_use-ember-string-htmlsafe-over-ember-handlebars-safestring">deprecation guide</a>
for details.</p>
<h4 id="embertestcheckwaiters"><code>Ember.Test.checkWaiters</code></h4>
<!-- alex ignore simple -->
<p>The new method <code>Ember.Test.checkWaiters</code> provides a simple mechanism for test
tooling to determine whether all async test waiters have settled. This replaces
the intimate API <code>Ember.Test.waiters</code>, which has been removed in Ember.js 2.8.</p>
<p>Thanks to <a href="https://github.com/rwjblue">@rwjblue</a> and <a href="https://github.com/krisselden">@krisselden</a>
for implementing this method.</p>
<hr />
<p>For more details on the changes landing in Ember.js 2.8, review the <a href="https://github.com/emberjs/ember.js/blob/v2.8.0/CHANGELOG.md">Ember.js 2.8.0 CHANGELOG</a>.</p>
<h2 id="emberjs29beta">Ember.js 2.9 beta</h2>
<p>Ember.js 2.9 beta is also being released today. Per our usual <a href="http://emberjs.com/builds/#/beta">release cadence</a>,
it will be released to the stable channel in six weeks.</p>
<p>This release will not introduce any new features or deprecations. Instead, this
release will be focused around integrating the Glimmer 2 rendering engine into
Ember.</p>
<h3 id="glimmer2">Glimmer 2</h3>
<p>In this year's <a href="https://www.youtube.com/watch?v=OInJBwS8VDQ&list=PL4eq2DPpyBblc8aQAd516-jGMdAhEeUiW">EmberConf keynote</a>,
Yehuda mentioned that we are working on a highly optimized rendering engine for
Ember called Glimmer 2. A few weeks ago, we announced the <a href="http://emberjs.com/blog/2016/07/29/announcing-the-glimmer-2-alpha.html">Glimmer 2 alpha</a>
to invite our community to help test the new engine. Today, we are very excited
to announce that the Glimmer 2 engine will be included in the 2.9 beta release.</p>
<h4 id="compatibilityfirst">Compatibility First</h4>
<p>As mentioned above, the initial Glimmer 2 integration does not expose any new
user-facing features. The primary goal of this release is maximal compatibility
– <strong>we expect the final release to be a drop-in, completely backwards
compatible upgrade for virtually all Ember users</strong>.</p>
<p>During the alpha testing period, the Ember core team and our community were
laser-focused and worked really hard to achieve this goal. Thanks to all the
alpha testers, addon authors and contributors who reported issues or chimed in
with patches, we are able to meet our compatibility target and feel confident
about including Glimmer 2 with the 2.9 release.</p>
<p>That being said, despite our <a href="https://github.com/emberjs/ember.js/issues/13127">best efforts</a>
and the extensive alpha testing, we still might have gotten a few details
wrong, hence the beta releases. We would really appreciate it if you could
start testing your applications and report any regressions, if you have not
already done so. You may refer to the <a href="https://github.com/emberjs/ember.js/issues/13949">GitHub issue</a>
for a list of known issues.</p>
<p>It's also worth noting that the 2.8-LTS release (when available) will be the
final <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">LTS release</a>
to include the current-generation rendering engine, which will be supported
with critical bugfixes until at least May 2017 and security patches until at
least October 2017.</p>
<h4 id="newtemplateserializationformat">New Template Serialization Format</h4>
<p>Glimmer 2 adopted a new serialization format for the precompiled templates. The
new serialization format offers a few benefits – among them are reduced byte
size (hence download time) and parse time.</p>
<p>Take this template, for example:</p>
<pre><code class="handlebars language-handlebars">Hello {{name}}! {{#if isFriday}}Happy Friday!!!{{/if}}
</code></pre>
<p>In Ember.js 2.8, this template compiles into a JavaScript function with 2273
bytes, or 472 bytes minified and gzipped. At the time of writing, Ember.js 2.9
beta compiles the same template into a JSON string with 374 bytes, or 213 bytes
minified and gzipped. You can explore the difference in <a href="https://gist.github.com/chancancode/6ddef7c343873e5c9c5ea99106cdc238">this gist</a>.</p>
<p>There are a few caveats with the previous paragraph. First of all, the details
of the templates serialization is a private API that is subject to change
anytime and should not be relied on. Second, the reduction varies between
templates, depending on various factors such as the number of blocks used in
the template. Third, minification and gzip are usually applied to the entire
application bundle and they work a bit differently in those environments.</p>
<p>Nevertheless, these numbers offer a good ballpark estimates on what you could
expect. From our experience, the reduction generally scales well and holds up
in real-world scenarios.</p>
<p>Besides the byte size savings, the JSON serialization format also reduces parse
time and allows us to defer the work till the template is actually used.</p>
<p>This is an area that is still being actively worked on, and we expect the
serialization format to go through some more changes before the Ember.js 2.9
stable release.</p>
<h4 id="performance">Performance</h4>
<p>One of the overarching goals of the Glimmer 2 project is to improve performance
in Ember. While compatibility is the immediate priority for this release,
performance remains an important secondary consideration.</p>
<p>Our conservative goal for this first release is to avoid introducing any
accidental performance regressions. Based on our testing, we have cleared that
goal with ample headroom.</p>
<p>As the benefits of Glimmer 2 begin to trickle in, we have already seen
noticeable improvements to rendering performance (both initial render and
re-rendering). Among other things, the <code>{{link-to}}</code> helper and <code>{{#each}}</code>
loops with big lists appear to be significantly faster. Component instantiation
has also seen some modest improvement.</p>
<p>However, we have also noticed a performance regression in the pre-render phase.
Specifically, we have seen a small increase in the <code>vendor.js</code> byte size and an
increased delay before the application gets to render anything. This regression
eats into the rendering improvements. We are actively working on these issues
and we expect them to be addressed before the final release in Ember 2.9.</p>
<p>Despite the caveats, our data suggest the savings from template byte size and
improved rendering performance more than offset the current issues. Therefore,
we expect most applications to see an overall improvement in performance upon
upgrading to the beta release.</p>
<p>It is worth noting that these observations are recorded from complex production
applications maintained by members of the core team (as opposed to isolated
synthetic benchmarks). Given the current state of affairs, we are hesitant to
circulate premature numbers that are specific to a handful of applications. We
plan to perform some thorough analysis as we get closer to the final release.</p>
<p>In the meantime, we encourage you to test the beta release against your own
applications. If you notice that certain common patterns have become slower,
please report them as bugs. As always – when running performance benchmarks,
<strong>please make sure you are using the minified production build</strong>
(<code>ember.min.js</code>). The debug builds contain a lot of helpful development aids
that impact performance negatively.</p>
<h4 id="futurework">Future Work</h4>
<p>While this release serves as an important milestone and proving ground for the
Glimmer 2 project, we are barely scratching the surface here. One of the
informal mandates of the Ember project is "we will keep on shipping", and this
is no exception.</p>
<p>The Glimmer 2 engine unlocks a whole new arena of performance optimizations.
Once the dust settles, we are committed to keep iterating on performance
improvements. Ultimately, our goal is to make the overhead of breaking up an
app into small, composable components negligible over time. We are optimistic
that there will still be ample headroom for further improvements in this area.</p>
<p>Besides performance, Glimmer 2 has laid a solid foundation for us to build on.</p>
<p>The project originally started when Tom, Yehuda and I spiked on implementing
"angle bracket components" in the HTMLBars ("Glimmer 1") engine over a year
ago. This exercise highlighted some fundamental misalignments between the
current rendering stack and the direction Ember is headed.</p>
<p>While HTMLBars handled basic templating, it left the implementation of many of
Ember's view layer features (notably components) up to Ember itself. Not only
did it make new features more difficult to implement, it made it hard to
implement them <em>efficiently</em> out of the gate.</p>
<p>As Ember has moved towards components and "data-down, actions-up", we wanted to
do many optimizations that weren't a good fit for the HTMLBars
architecture. The lessons we learned from the spike ultimately leading us down
the journey that is now known as the Glimmer 2 architecture. The underlying
technologies are very interesting, but I will save those details for another
time.</p>
<p><strong>As an Ember user, you can expect the new engine to unlock some long-awaited
features</strong>, such as FastBoot rehydration, incremental rendering and a refreshed
approach to components once the initial integration is complete.</p>
<h4 id="thankyou">Thank You!</h4>
<p>Since <a href="https://github.com/tildeio/glimmer/compare/rip-htmlbars…master">forking HTMLBars</a>,
the Glimmer repo has clocked over 850 commits, not to mention the <a href="https://github.com/emberjs/ember.js/issues?q=label:Glimmer2+is:closed">integration effort</a>
that happened on the Ember side and also in the wider ecosystem. All of these
would not be possible without the help from our community.</p>
<p>Thank you to every one who helped us get here – from the <a href="http://emberjs.com/sponsors/">companies</a>
who donated employees' time to the individual contributors who made personal
sacrifices to make this happen.</p>
<hr />
<p>For more details on the changes landing in Ember.js 2.9 beta, review the <a href="https://github.com/emberjs/ember.js/blob/v2.9.0-beta.1/CHANGELOG.md">Ember.js 2.9.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-2-8-and-2-9-beta-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-8-and-2-9-beta-released</guid><pubDate>Thu, 08 Sep 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js 2.8-LTS, 2.9 and 2.10 Beta Released]]></title><description><![CDATA[<p>Today, we are releasing Ember 2.8-LTS (a long-term support release), Ember 2.9.0 and Ember 2.10 beta.</p>
<h2 id="emberjs28lts">Ember.js 2.8-LTS</h2>
<p>Ember 2.8-LTS is our second long-term support release. You can install it by running <code>bower install --save ember#lts-2-8</code> in your projects.</p>
<p>The LTS channel is designed for Ember users who would like to upgrade less frequently, while still getting support from the project and the wider ecosystem. At the same time, it allows addon authors to know which versions of Ember to focus their effort on.</p>
<p>Per our <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">usual policy</a>, Ember 2.8-LTS is released six weeks after the <a href="http://emberjs.com/blog/2016/09/08/ember-2-8-and-2-9-beta-released.html#toc_ember-js-2-8">2.8.0 stable release</a>. This allows ample time to fix any reported regressions and ensures a rock solid LTS release. It will continue to receive critical bugfixes for six release cycles (roughly June 2017), and security patches for ten release cycles (roughly February 2018).</p>
<p>Meanwhile, Ember 2.4-LTS will continue to receive critical bugfixes for another two release cycles (roughly January 2017), and security patches for six release cycles (roughly June 2017). Users of Ember 2.4-LTS should make use of this overlapping period to transition over to Ember 2.8-LTS.</p>
<p>Most notably, as we have mentioned in the <a href="http://emberjs.com/blog/2016/04/11/ember-2-5-released.html#toc_notable-deprecations-in-ember-2-4-lts">Ember 2.4-LTS announcement</a>, applications who are using the legacy views and controllers addons will need to migrate away from these addons before they can upgrade.</p>
<hr />
<p>For more details on the changes landing in Ember.js 2.8-LTS, please review the <a href="https://github.com/emberjs/ember.js/blob/v2.8.2/CHANGELOG.md">Ember.js 2.8.2 CHANGELOG</a>.</p>
<h2 id="emberjs29">Ember.js 2.9</h2>
<p>In the <a href="http://emberjs.com/blog/2016/09/08/ember-2-8-and-2-9-beta-released.html#toc_ember-js-2-9-beta">Ember 2.9 beta blog post</a>, we announced our intention to include the new Glimmer 2 rendering engine in the 2.9 release. However, after careful consideration, we have decided to temporarily hold off on the integration.</p>
<p><strong>This means that 2.9 will ship with the same rendering engine as 2.8 and does not include any new features, notable changes or deprecations.</strong></p>
<p>When we moved ahead with Glimmer in the 2.9 beta channel in September, all of Ember's tests were passing, we had no known blockers and it was already working fine for a number of apps we tested (including some core team member's production apps). Due to the magnitude of the internal changes, we fully expected to find bugs not already covered by our initial testing, so we called for the community to beta test the release.</p>
<p>We got a lot of positive results during the beta period, and some of our community sites (such as <a href="https://emberobserver.com/">Ember Observer</a> and <a href="https://www.emberaddons.com/">Ember Addons</a>) have already migrated to using the beta in production. However, as more apps tested the beta, we began to see a few critical edge cases reported during the mid-to-late part of the beta cycle. We were able to fix a number of them, but at this point, there are still a <a href="https://github.com/emberjs/ember.js/milestone/29">handful of open issues</a>.</p>
<p>As we said in the <a href="http://emberjs.com/blog/2016/09/08/ember-2-8-and-2-9-beta-released.html#toc_compatibility-first">Ember 2.9 beta announcement</a>, the "primary goal of this release is maximal compatibility – <strong>we expect the final release to be a drop-in, completely backwards compatible upgrade for virtually all Ember users</strong>". Therefore, we decided to err on the side of caution and take another six weeks to ensure the smoothest possible experience for our users.</p>
<p>While it is quite rare for a feature to be backed out from the beta channel, we consider the ability to do so a strength of our <a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html#toc_the-beta-branch">release process</a>, and we would like to thank everyone who took the time to test their application against the beta channel.</p>
<hr />
<p>For more details on the changes landing in Ember.js 2.9, please review the <a href="https://github.com/emberjs/ember.js/blob/v2.9.0/CHANGELOG.md">Ember.js 2.9.0 CHANGELOG</a>.</p>
<h2 id="emberjs210beta">Ember.js 2.10 beta</h2>
<p>As mentioned above, we will continue the Glimmer 2 integration work in Ember 2.10 beta, with a focus on resolving the <a href="https://github.com/emberjs/ember.js/milestone/29">remaining compatibility issues</a>. You can <a href="http://emberjs.com/blog/2016/09/08/ember-2-8-and-2-9-beta-released.html#toc_ember-js-2-9-beta">read about the integration</a> in the original announcement.</p>
<p>If you haven't already, we highly encourage you to test your application against 2.10 beta as soon as possible and report any issues you encounter. Given that it already went through a complete beta cycle and we were quite close to releasing it, we expect this to go smoothly for most apps.</p>
<hr />
<p>For more details on changes landing in 2.10 beta, review the <a href="https://github.com/emberjs/ember.js/blob/v2.10.0-beta.1/CHANGELOG.md">Ember.js 2.10.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-2-9-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2-9-released</guid><pubDate>Mon, 17 Oct 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember's 2018 Roadmap: A Call for Blog Posts]]></title><description><![CDATA[<p>Ember has been humming along for years, with direction set by the core team, based on their instincts, experiences, and community interactions. And it's worked well!</p>
<p>As our community grows though, the sheer volume of good ideas makes it hard to rely on our core team and primary influencers to collect <em>all</em> the great ideas out there. So we're updating the process to help give voice to all those of you who want it.</p>
<p>The Ember team would like <em>you</em> to write a blog post to propose goals and direction for Ember in the remainder of 2018. The content of these posts will help us to draft our first Roadmap RFC.</p>
<h2 id="whatsaroadmaprfc">What's a Roadmap RFC?</h2>
<p>The Roadmap will outline the community's priorities for the remainder of the year. It will be presented as an RFC and follow <a href="https://github.com/emberjs/rfcs">the normal RFC process</a>. The RFC will be written based on community input--the blog posts we've requested and other community discussion--and curation from the core team and subteams.</p>
<p><strong>We recognize the need to have shared, clear, and published project-wide goals.</strong> This is the first step.</p>
<h2 id="35emberjs2018">&#35;EmberJS2018</h2>
<p>To contribute a post: Tweet a link to the post with the hashtag <a href="https://twitter.com/hashtag/emberjs2018">#EmberJS2018</a> or, if you're not on Twitter, email a link to <code>roadmap@emberjs.com</code>. These posts will be collected and categorized, and each one will be read by those working to draft the Roadmap RFC.</p>
<h3 id="format">Format</h3>
<p>Your post can be on any online writing platform, but we suggest:</p>
<ul>
<li>A post on your personal or company blog</li>
<li>A <a href="https://medium.com/">Medium</a> post</li>
<li>A <a href="https://gist.github.com/">GitHub gist</a></li>
</ul>
<h3 id="topicideas">Topic Ideas</h3>
<p>We'd like to hear about any aspect of Ember you have hopes for in 2018--not only about the Ember.js framework. Please include your desires for Ember Data, Ember CLI, tooling, the community, addons, and anything else Ember-related.</p>
<p>Here are some broad ideas that might help you get started:</p>
<ul>
<li>Ideas for community programs</li>
<li>Framework features</li>
<li>Documentation improvements</li>
<li>Ecosystem needs</li>
<li>Tooling enhancements</li>
</ul>
<p>To kickoff the process, we've collected some early posts:</p>
<ul>
<li><a href="https://gist.github.com/jenweber/a9fbea98478fc3841fb8b24f7dc961c8">Be loud and be ready - my hopes for Ember.js in 2018</a> by Jen Weber</li>
<li><a href="https://embermap.com/notes/107-our-wish-for-ember-in-2018-overcommunication">Our wish for Ember in 2018: Overcommunication</a> by Ryan Toronto and Sam Selikoff</li>
<li><a href="https://blog.201-created.com/blog-post-for-an-ambitious-framework-d7e9248893fa">Blog Post for an Ambitious Framework</a> by Matthew Beale and the <a href="https://www.201-created.com/">201 Created</a> team</li>
<li><a href="https://medium.com/@melaniesumner/wishing-on-a-star-722a4fe590a7">Wishing on a Star</a> by Melanie Sumner</li>
</ul>
<h3 id="preliminarytimeline">Preliminary Timeline</h3>
<p>Dates may change, but this is a general overview of the upcoming process:</p>
<p><strong>May 2</strong>: call for posts!</p>
<p><strong>Throughout May</strong>: read posts, draft Roadmap RFC</p>
<p><strong>May 30</strong>: cutoff for posts--you can still write them (please do!), but we cannot guarantee they'll be read before Roadmap creation</p>
<p><strong>Mid June</strong>: post Roadmap RFC on GitHub</p>
<p><strong>Early July</strong>: assuming we’ve reached consensus, and following the normal RFC process, accept final Roadmap</p>
<p>We adapted this process from the Rust community: they have had success with an annual Roadmap via RFC over the last <a href="https://github.com/rust-lang/rfcs/pull/1774">two</a> <a href="https://github.com/rust-lang/rfcs/pull/2314">years</a>, and this year had a <a href="https://blog.rust-lang.org/2018/01/03/new-years-rust-a-call-for-community-blogposts.html">call-for-blogposts</a> prior to the drafting of the RFC. The resultant posts are collected <a href="https://readrust.net/rust-2018/">here</a>; they may offer inspiration.</p>
<h2 id="thanks">Thanks</h2>
<p>This post is modeled on <a href="https://blog.rust-lang.org/2018/01/03/new-years-rust-a-call-for-community-blogposts.html">New Year's Rust: A Call for Community Blogposts</a>, many thanks to Ashley Williams.</p>
<p>Many thanks also to the Rust Core team and the Rust community, from whom we are, once again, learning and adapting process.</p>]]></description><link>https://blog.emberjs.com/ember-2018-roadmap-call-for-posts</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2018-roadmap-call-for-posts</guid><pubDate>Wed, 02 May 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember's 2019 Roadmap: Call for Blog Posts]]></title><description><![CDATA[<p>Ember in 2018 (and 2019) has been more exciting than ever! We've been working diligently to advance the project based on our <a href="https://github.com/emberjs/rfcs/blob/master/text/0364-roadmap-2018.md">2018 Roadmap</a>, but while we work to finish that, it is time to think about the future.</p>
<p>The Ember team would like you to write a blog post to propose goals and direction for Ember for the next year. The content of these posts will help us to draft our next Roadmap RFC.</p>
<h2 id="whatsaroadmaprfc">What's a Roadmap RFC?</h2>
<p>The Roadmap will outline the community's priorities for the next year. It will be presented as an RFC and follow <a href="https://github.com/emberjs/rfcs">the normal RFC process</a>. The RFC will be written based on community input--the blog posts we've requested and other community discussion--and curation from the core teams.</p>
<p>This is will be our second annual Roadmap RFC. To see the results of the process, see <a href="https://github.com/emberjs/rfcs/blob/master/text/0364-roadmap-2018.md">the 2018 Roadmap RFC</a>.</p>
<p>The 2018 Roadmap led to the <a href="https://emberjs.com/editions/octane/">"Octane Edition" of Ember, currently in preview</a>. Octane <a href="https://github.com/emberjs/ember.js/issues/17234">includes many features</a>, most of which have already landed in a stable release. As the edition nears completion, we want the community to think beyond Octane to the next steps for Ember. The resulting Roadmap for 2019 will not necessarily include an edition but will outline what we will be working toward.</p>
<p><strong>The Roadmap process is part of our on-going effort to have shared, clear, and published project-wide goals.</strong></p>
<h2 id="emberjs2019">#EmberJS2019</h2>
<p>To contribute a post: Tweet a link to the post with the hashtag #EmberJS2019 or email a link to roadmap@emberjs.com. These posts will be collected and categorized, and each one will be read by those working to draft the Roadmap RFC.</p>
<h3 id="_format_"><em>Format</em></h3>
<p>Your post can be on any online writing platform, but we suggest:</p>
<ul>
<li>A post on your personal or company blog</li>
<li>A <a href="https://gist.github.com/">GitHub gist</a></li>
</ul>
<h3 id="_topicideas_"><em>Topic ideas</em></h3>
<p>We'd like to hear about any aspect of Ember you have hopes for in 2019--not only about the Ember.js framework. Please include your desires for Ember Data, Ember CLI, learning, tooling, the community, addons, and anything else Ember-related.</p>
<p>Here are some broad ideas that might help you get started:</p>
<ul>
<li>Ideas for community programs</li>
<li>Framework features</li>
<li>Documentation improvements</li>
<li>Ecosystem needs</li>
<li>Tooling enhancements</li>
</ul>
<p>We strongly encourage posts replying to or building off of others' posts. Please try to keep the discussion in the form of blog posts.</p>
<p>To kickoff the process, we've collected some early posts:</p>
<ul>
<li><a href="http://www.melsumner.com/blog/ember/the-road-goes-data-way/">Melanie Sumner</a></li>
<li><a href="https://yehudakatz.com/2019/05/20/ember-2019">Yehuda Katz</a></li>
<li><a href="https://nullvoxpopuli.com/2019-05-14-ember-2019-roadmap">Preston Sego</a></li>
</ul>
<h3 id="preliminarytimeline">Preliminary Timeline</h3>
<p>Dates may change, but this is a general overview of the upcoming process:</p>
<p><strong>May 20</strong>: call for posts!</p>
<p><strong>Throughout May and early June</strong>: read posts, draft Roadmap RFC</p>
<p><strong>June 17</strong>: cutoff for posts--you can still write them (please do!), but we cannot guarantee they'll be read before the Roadmap creation</p>
<p><strong>Late June</strong>: Post the Roadmap RFC on GitHub</p>
<p><strong>Mid July</strong>: assuming we've reached consensus, and following the normal RFC process, accept final Roadmap</p>
<p>This is our second call for blog posts. For inspiration, or to better understand the process, you may want to look at the 2018 blog posts, <a href="https://github.com/zinyando/emberjs2018-posts">as collected by community member Lennex Zinyando</a> or directly on <a href="https://twitter.com/search?q=%23emberjs2018">twitter</a>, and the <a href="https://github.com/emberjs/rfcs/blob/master/text/0364-roadmap-2018.md">2018 Roadmap RFC</a>.</p>
<h2 id="thanks">Thanks</h2>
<p>Many thanks also to the Rust Core team and the Rust community, from whom we are still learning and adapting process.</p>]]></description><link>https://blog.emberjs.com/ember-2019-roadmap-call-for-posts</link><guid isPermaLink="true">https://blog.emberjs.com/ember-2019-roadmap-call-for-posts</guid><pubDate>Mon, 20 May 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.0 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.0.0 of Ember.js, Ember Data, and
Ember CLI. Ember 3.0 doesn't introduce any new functionality, instead it focuses
the framework by removing long-deprecated APIs and support for legacy platforms.
Our plans for Ember 3.0 were announced in October 2017 in <a href="https://www.emberjs.com/blog/2017/10/03/the-road-to-ember-3-0.html">The Road to Ember
3.0</a>.</p>
<p>We're committed to giving every Ember codebase a path into the 3.x series.  With
this goal in mind, we froze API deprecations targeting Ember 3.0 back in July
2017 (Ember 2.14). We've provided a detailed <a href="https://www.emberjs.com/deprecations/v2.x/">deprecation
guide</a> for all APIs removals, and
additionally extracted most of the features removed in 3.0 into an addon.</p>
<p>This blog post will help you understand what is being removed in 3.0 and what
migration strategies are available. If you're interested in trying Ember for the
first time today, get started by running:</p>
<pre><code class="bash language-bash">yarn global add ember-cli # Or npm install -g ember-cli
ember new my-project
cd my-project
ember serve # Then visit http://localhost:4200
</code></pre>
<p>Additionally, today the 3.1 beta cycle begins for these same projects. We've
split out the beta release details into a separate <a href="/blog/2018/02/16/ember-3-1-beta-released.html">Ember 3.1-beta blog
post</a> to keep this
one focused on app migration steps and guidance.</p>
<p>Finally, today we're also promoting Ember 2.18 to LTS (<a href="/blog/2018/01/01/ember-2-18-released.html">2.18 release
post</a>). This is the last release of
Ember with support for IE9, IE10, PhantomJS, and for use via Bower. Per our LTS
policy, it will be supported with bug fixes for the next 5 release cycles
(September 2018) and security patches for the next 9 cycles (February 2019).</p>
<h3 id="browsersupportin30">Browser Support in 3.0</h3>
<p>Ember 3.0 (including Ember.js, Ember Data, and Ember CLI) drops support for
Internet Explorer 9, IE 10, and PhantomJS. If you still require support for
these browsers, Ember 2.18-LTS will be supported with bug fixes until September
2018 and security fixes until February 2019 in alignment with our <a href="/blog/2016/02/25/announcing-embers-first-lts.html#toc_the-lts-release-process">LTS
policy</a>.</p>
<p>If your application requires support for these browsers and you would like to
eventually adopt Ember 3.x, we encourage you to use the LTS window to plan a
transition for your users in the coming months.</p>
<p>The first LTS of Ember 3.x will be Ember 3.4. Any migration steps we describe
for moving between Ember 2.18 and 3.0 will also apply to 2.18-LTS and 3.4-LTS.</p>
<p>For further details about this decision see <a href="https://github.com/emberjs/rfcs/blob/master/text/0252-browser-support-changes.md">RFC #252</a>
and <a href="https://www.emberjs.com/blog/2017/10/03/the-road-to-ember-3-0.html#toc_browser-support-in-3-0">The Road to Ember 3.0: Browser Support in
3.0</a>.</p>
<h3 id="globalbuildandbowersupportin30">Global Build and Bower Support in 3.0</h3>
<p>Ember 3.0 completes a re-orientation of the project away from script tag driven
development. This follows a general trend in JavaScript, where frameworks and
applications have embraced ahead of time (AOT) compilation to improve
performance and development experience (DX).</p>
<p>Nearly all Ember applications already use Ember CLI for development, and most
also use Ember CLI addons to bring in libraries and build-time features. As of
their 3.0 releases, both Ember.js and Ember Data are only available as Ember CLI
addons. This makes the codebases easier to maintain, and allows improvements we
make to Ember's packaging to apply to 3rd party addons.</p>
<p>The legacy, script tag driven use of Ember via a "globals" build is removed in
3.0.</p>
<p>Builds of Ember.js and Ember Data for use with a <code>&lt;script&gt;</code> tag are no longer
published as of 3.0. This includes:</p>
<ul>
<li>Builds published to Bower as <code>components/ember</code> and <code>components/ember-data</code>.</li>
<li>Builds published to S3, for example at
<code>http://builds.emberjs.com/release/shas/1f05c15cfc6d9df5882f9ff7cc985f50fe68f98f/ember.min.js</code></li>
<li>Builds published to CDNs, for example at
<code>https://cdnjs.cloudflare.com/ajax/libs/ember.js/2.16.2/ember.debug.js</code></li>
</ul>
<p>Instead applications should make Ember a dependency via NPM or Yarn:</p>
<ul>
<li><code>ember-source</code> is the Ember NPM package.</li>
<li><code>ember-data</code> is the Ember Data NPM package.</li>
</ul>
<p>Most applications should already be using these packages. An exception is that
many addons (and some applications) use ember-try to test against multiple
versions of Ember, and may reference the Bower builds for testing beta and canary
releases.</p>
<p>We've started published tarballs containing the NPM package for each commit to
Ember.js and Ember Data. This allows you to migrate an addon's ember-try
configuration away from Bower. The
<a href="https://github.com/ember-cli/ember-source-channel-url">ember-source-channel-url</a>
addon provides an API for fetching the appropriate URL for a given channel.
The latest version of Ember CLI's addon blueprint uses this API out of the box,
so most addons only need to upgrade to Ember CLI 3.0 to complete their move
away from Bower.</p>
<h2 id="changesinemberjs30">Changes in Ember.js 3.0</h2>
<hr />
<p>Ember.js is the core of the Ember framework. It provides routing, rendering, and
dependency injection features.</p>
<p>Ember.js 3.0 introduces no new public API or deprecations. Instead, it is
comprised of bug fixes and the removal of previously deprecated public API from
the 2.x cycle. This release drops support for IE9, IE10, PhantomJS, and Bower.</p>
<h3 id="updatestothetestingdefaults">Updates to the Testing Defaults</h3>
<p>In Ember 3.0 we've changed the default blueprint for generated tests to use the
new testing API specified in <a href="https://github.com/emberjs/rfcs/blob/master/text/0232-simplify-qunit-testing-api.md">RFC #232</a>
and <a href="https://github.com/emberjs/rfcs/blob/master/text/0268-acceptance-testing-refactor.md">RFC #268</a>.</p>
<p>You can find the final documentation for these test helpers at:</p>
<ul>
<li><a href="https://github.com/emberjs/ember-test-helpers/blob/master/API.md">ember-test-helpers API documentation</a></li>
</ul>
<p>And additionally the <a href="https://guides.emberjs.com/v3.0.0/testing/">Ember.js Testing
Guides</a> have been updated.</p>
<p>The testing API available in previous Ember releases remains supported and
un-deprecated in 3.0. If you would like to migrate tests using the old APIs
to the new API, upgrade Ember CLI and Ember then run the
<a href="https://github.com/rwjblue/ember-qunit-codemod">ember-qunit-codemod</a> script to
automate most of the change.</p>
<h3 id="computedpropertygetterassertion">Computed Property Getter Assertion</h3>
<p>Ember's computed property system requires the use of the <code>.get(</code> method to read
the value of a computed property. For example:</p>
<pre><code class="javascript language-javascript">emberObject.get('someComputedProperty'); // returns the value
</code></pre>
<p>In some cases, application code may have
incorrectly been relying on the presence of a value for the property itself,
for example:</p>
<pre><code class="javascript language-javascript">emberObject.someComputedProperty; // an instance of ComputedPropertyDescriptor
</code></pre>
<p>The return value in this case is not the computed property's value, but an
instance of an internal Ember class.</p>
<p>In Ember 3.0 reading a computed property without using <code>get</code> will cause an
assertion failure in development. This addition of this assertion will help
applications correct their currently incorrect usage, and in later 3.x releases
allow us to remove the requirement to use <code>get</code> to read a computed property's
value.</p>
<h3 id="apisremovedin30">APIs Removed in 3.0</h3>
<p>Below we've listed some of the most significant API removals in Ember.js 3.0.
For a more in-depth summary see <a href="/blog/2017/10/03/the-road-to-ember-3-0.html#toc_apis-removed-in-ember-js-3-0">The Road to Ember 3.0: APIs Removed in Ember.js
3.0</a>,
and for an exhaustive list of removals, see the <a href="/deprecations/v2.x/">Ember.js 2.x deprecation
guide</a>.</p>
<ul>
<li>The <code>{{render}}</code> helper has been removed. Any remaining usage should be
<a href="/deprecations/v2.x/#toc_code-render-code-helper">migrated to components</a>.</li>
<li><code>didInitAttrs</code> is removed and can be <a href="/deprecations/v2.x/#toc_ember-component-didinitattrs">replaced with <code>init</code></a></li>
<li>Declaring an observer with dependent keys after the callback is removed. Dependent keys should be passed before the callback as described in the <a href="/api/ember/2.17/classes/@ember%2Fobject/methods/observer?anchor=observer">API docs</a>.</li>
<li><code>Enumerable#contains</code> and <code>Array#contains</code> methods are removed. Instead usage should be <a href="/deprecations/v2.x/#toc_enumerable-contains">replaced with <code>includes</code></a>.</li>
<li><code>{{link-to}}</code> unwrapped the <code>model</code> property from passed controllers. This
behavior has been removed.</li>
<li>Specifying <code>defaultLayout</code> on a component rather than <a href="/deprecations/v2.x/#toc_ember-component-defaultlayout"><code>layout</code></a> has been removed.</li>
<li><code>Ember.Handlebars.SafeString</code> has been removed. Instead, use <a href="/deprecations/v2.x/#toc_use-ember-string-htmlsafe-over-ember-handlebars-safestring"><code>Ember.String.htmlSafe</code></a> or the <code>import { htmlSafe } from '@ember/string'</code>.</li>
<li><code>Ember.K</code> has been removed. Usage should be replaced with <a href="/deprecations/v2.x/#toc_deprecations-added-in-2-12">inline functions</a>.</li>
<li>Support for legacy initializers with two arguments (container, application)
has been removed in favor of
<a href="/deprecations/v2.x/#toc_initializer-arity">a single argument of <code>application</code></a>.</li>
<li>Ember's legacy binding system, including <code>Ember.Binding</code> and the <code>fooBinding</code>
micro-syntax. See the <a href="/deprecations/v2.x/#toc_ember-binding">migration guide</a> for details.</li>
<li>Ember's <code>Map</code>, <code>MapWithDefault</code>, and <code>OrderedSet</code> classes. These should be
replaced with native features or with implementations from other libraries.</li>
</ul>
<p>For more details on the changes in Ember.js 3.0, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v3.0.0">Ember.js 3.0.0 release page</a>.</p>
<h2 id="changesinemberdata30">Changes in Ember Data 3.0</h2>
<hr />
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<p>Ember Data 3.0 contains small bug fixes and updated test generators for the new
testing APIs. Additionally this release removes previously deprecated APIs.</p>
<p>Below we've listed some of the most significant API removals in Ember Data 3.0.
For a more in-depth summary see <a href="/blog/2017/10/03/the-road-to-ember-3-0.html#toc_apis-removed-in-ember-data-3-0">The Road to Ember 3.0: APIs Removed in Ember
Data
3.0</a>,
and for an exhaustive list of removals, see the <a href="/deprecations/ember-data/v2.x/">Ember Data 2.x deprecation
guide</a>.</p>
<ul>
<li>Using Ember-Data via <code>window.DS</code> is no longer supported, use <code>import DS from
'ember-data'</code> and the modules API for Ember Data. For more details see the deprecation guide <a href="/deprecations/ember-data/v2.x/#toc_global-version-of-ds">Global version of <code>DS</code></a>.</li>
<li>The opt-in flag for a <code>Date.parse</code> polyfill is a noop in Ember Data 3.0, and
the <code>Ember.Date.parse</code> API is removed. For more details see the deprecation guides <a href="/deprecations/ember-data/v2.x/#toc_ember-date-parse"><code>Ember.Date.parse</code></a> and <a href="/deprecations/ember-data/v2.x/#toc_date-prototype-extension">Date prototype extension</a>.</li>
<li>Several APIs have effectively been relocated since Ember 2.0, and their old
implementationed have been removed. See the deprecation guides for <a href="/deprecations/ember-data/v2.x/#toc_recordisloaded"><code>store.hasRecordForId</code></a>, <a href="/deprecations/ember-data/v2.x/#toc_lookupadapter"><code>store.adapterFor</code></a>, <a href="/deprecations/ember-data/v2.x/#toc_lookupserializer"><code>store.serializerFor</code></a> and <a href="/deprecations/ember-data/v2.x/#toc_store-serialize"><code>model.serialize</code></a>.</li>
<li>Several initializers which Ember Data no longer uses have been removed. See
the deprecation guide for <a href="/deprecations/ember-data/v2.x/#toc_unused-initializers">Unused Initializers</a>.</li>
</ul>
<p>For more details on the changes in Ember Data 3.0, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.0.0">Ember Data 3.0.0 release page</a>.</p>
<h2 id="changesinembercli30">Changes in Ember CLI 3.0</h2>
<hr />
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<p>Ember CLI 3.0 makes it easier to use <code>async</code> and <code>await</code> by including the addon
<a href="https://github.com/machty/ember-maybe-import-regenerator">ember-maybe-import-regenerator</a>
in the default app blueprint.</p>
<p>Below we've listed some of the most significant API removals in Ember CLI 3.0.
For a more in-depth summary see <a href="/blog/2017/10/03/the-road-to-ember-3-0.html#toc_apis-removed-in-ember-cli-3-0">The Road to Ember 3.0: APIs Removed in Ember
CLI
3.0</a>,
and for an exhaustive list of removals, see the <a href="/deprecations/ember-cli/v2.x/">Ember CLI 2.x deprecation
guide</a>.</p>
<ul>
<li>Support for base URL configuration is removed. For more
details on how to migrate away from <code>baseURL</code>, see the deprecation guide <a href="/deprecations/ember-cli/v2.x/#toc_base-url">Base
URL</a>.</li>
<li>Support for <code>Brocfile.js</code> is be removed. For more details see the deprecation
guide <a href="/deprecations/ember-cli/v2.x/#toc_migrate-from-brocfile-js-to-ember-cli-build-js">Migrate from <code>Brocfile.js</code> to <code>ember-cli-build.js</code></a>.</li>
</ul>
<p>For more details on the changes in Ember CLI 3.0 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.0.0">Ember CLI 3.0.0 release page</a>.</p>
<h2 id="migratingtoember30">Migrating to Ember 3.0</h2>
<hr />
<p>To ensure as many applications as possible make the transition from 2.x to
3.x, all public APIs removed in Ember.js 3.0 have been extracted into the
<a href="https://github.com/emberjs/ember-2-legacy">ember-2-legacy</a> addon. This addon
will be supported through Ember.js 3.4, the first LTS of the 3.x series.</p>
<p>The addon maintains support for all APIs in the <a href="https://www.emberjs.com/deprecations/v2.x/">Ember.js 2.x deprecations
guide</a>. Please note that these are
only APIs from Ember.js itself, and there is no extended support addon for
features removed from Ember Data or Ember CLI.</p>
<p>Applications that need to upgrade through several versions may want to consider
the
<a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a>
addon to isolate individual deprecations.</p>
<h3 id="thankyou">Thank You!</h3>
<p>This summer the Ember project will mark five years since Ember 1.0 was
released. Every six weeks since 1.0 (well, <em>nearly</em> every six weeks) we've
had a new set of incremental improvements to announce. That is some impressive
stuff! Thank you for your
continued contribution to this project, and for your participation in creating
a great set of tools for building on the web.</p>]]></description><link>https://blog.emberjs.com/ember-3-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-0-released</guid><pubDate>Wed, 14 Feb 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.1 Beta Released]]></title><description><![CDATA[<p>Today we're releasing Ember 3.1-beta.1, including releases of Ember.js, Ember
Data, and Ember CLI.</p>
<p>Traditionally beta releases share a blog post with the
corresponding stable release, however to keep our messaging clear during the
transition we've split them up today. See the <a href="/blog/2018/02/14/ember-3-0-released.html">Ember 3.0
Release Post</a> for more details on Ember 3.0.</p>
<h2 id="emberjs">Ember.js</h2>
<hr />
<p>Ember.js is the core of the Ember framework. It provides routing, rendering, and
dependency injection features.</p>
<h3 id="changesinemberjs31beta1">Changes in Ember.js 3.1-beta.1</h3>
<p>Ember 3.1-beta is an minor release containing several new features and bug
fixes. It includes a bump of Glimmer VM, Ember's rendering implementation,
to version 0.30.5. Per our release cycle, these features will be released as
3.1 stable in six weeks.</p>
<h4 id="es5gettersforcomputedproperties">ES5 Getters for Computed Properties</h4>
<p>Ember's object system has long used <code>set</code> and <code>get</code> to access properties.
These APIs came from the codebase's origins in SproutCore, and predated ES5's
<code>defineProperty</code>. In recent years native JavaScript setter and getter
implementations have become fast and mature.</p>
<p>Starting in Ember 3.1 (and described in <a href="https://github.com/emberjs/rfcs/blob/master/text/0281-es5-getters.md">RFC
281</a>) you
are now able to read the value of a computed property using a native ES5 getter.
For example, this component which uses computed properties:</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';
import { computed } from '@ember/object';

export default Component.extend({

  name: computed('firstName', 'lastName', function() {
    return `${this.get('firstName')} ${this.get('lastName')}`;
  }),

  message: computed('name', function() {
    return `Hello ${this.get('name')}!`;
  });

});
</code></pre>
<p>Can be re-written using ES5 getters:</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';
import { computed } from '@ember/object';

export default Component.extend({

  name: computed('firstName', 'lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  }),

  message: computed('name', function() {
    return `Hello ${this.name}!`;
  })

});
</code></pre>
<p>Legacy <code>get</code> features are not deprecated or removed in 3.1. In fact there are
several cases where you must still use <code>get</code>:</p>
<ul>
<li>If you are calling <code>get</code> with a chained path. For example in <code>this.get('a.b.c')</code>
if <code>b</code> is <code>undefined</code> the return value is <code>undefined</code>. Converting this
to <code>this.a.b.c</code> when <code>b</code> is <code>undefined</code> would instead raise an exception.</li>
<li>If your object is using <code>unknownProperty</code> you must continue to use <code>get</code>.
Using an ES5 getter on an object with <code>unknownProperty</code> will cause an
assertion failure in development.</li>
<li>Ember Data returns promise proxy objects when you read an async relationship
and from other API. Ember proxy objects, including promise proxies, still
require that you call <code>get</code> to read values.</li>
</ul>
<p>With these caveats in mind, how should you know if you can convert a <code>get</code>
call to a native getter? If you have code where <code>get</code> is called on <code>this</code> you
likely can convert it. If you have a <code>get</code> on another object,
<code>anything.get('foo')</code>, you should exercise caution when converting to a native
getter.</p>
<p>The community-provided
<a href="https://github.com/rondale-sc/es5-getter-ember-codemod">es5-getter-ember-codemod</a>
is a great way to convert your existing codebase to ES5 getters. It follows
the conservative guidelines and only converts <code>this.get</code>. Note that it cannot
make all possible conversions to the new API, nor can it ensure 100% of the
conversions it makes are correct. If your app has poor test coverage or you
lack any confidence in your ability to make regression checks, a manual
and gradual conversion process may be more appropriate.</p>
<p>Thanks to <a href="https://twitter.com/pzuraq">Chris Garrett</a> for pushing forward
work on ES5 getters with support from <a href="https://twitter.com/chancancode">Godfrey
Chan</a>,
<a href="https://twitter.com/rwjblue/">Robert Jackson</a>, and <a href="https://twitter.com/krisselden">Kris
Selden</a>). Thanks to <a href="https://twitter.com/rondale_sc/">Jonathan
Jackson</a> for his work on the codemod.</p>
<h4 id="introducingoptionalfeatures">Introducing Optional Features</h4>
<p>Because major releases of Ember are not supposed to make breaking changes
without prior deprecation, the project has been extremely conservative about
changing behaviors that don't have a clear deprecation path. As a result, we've
had several quirks of the framework linger into the 3.x series.</p>
<p>To give the project a path forward when a breaking change is mandatory, we've
released the
<a href="https://github.com/emberjs/ember-optional-features"><code>@ember/optional-features</code></a>
addon. Today this addon is opt-in via installation as an NPM dependency. In a
future release of Ember it will become part of the default application
blueprint.</p>
<p>This addon does nothing by default, but provides a command-line interface to
enable and disable breaking changes in Ember. Two optional features are being
introduced in Ember 3.1.</p>
<p>To install ember-optional-features:</p>
<pre><code class="bash language-bash">ember install @ember/optional-features
</code></pre>
<p>Thanks to <a href="https://twitter.com/chancancode">Godfrey Chan</a> and <a href="https://twitter.com/rwjblue/">Robert
Jackson</a> for their work on the optional features
system.</p>
<h4 id="newoptionalfeatureapplicationtemplatewrapper">New Optional Feature: Application Template Wrapper</h4>
<p>Ember applications have long created a wrapping <code>div</code> around their rendered
content: <code>&lt;div class="ember-view"&gt;</code>. With ember-optional-features, this
functionality can now be turned off:</p>
<pre><code class="bash language-bash">ember feature:disable application-template-wrapper
</code></pre>
<p>Disabling this feature will stop Ember from creating a <code>div</code> around the
application. This change may require alterations to your application's CSS, or
to any other code that depends upon the presence of the <code>div</code>.</p>
<p>Additionally, enabling this feature will prompt you to optionally run a codemod
to add the application <code>div</code> to the <code>application.hbs</code> of your application.</p>
<p>Although disabling this feature will eventually be the default for Ember,
leaving the feature enabled is not deprecated in this release. You can read more
details about this optional feature and the motivations for introducing it in
<a href="https://github.com/emberjs/rfcs/blob/master/text/0280-remove-application-wrapper.md">RFC #280</a>.</p>
<h4 id="newoptionalfeaturetemplateonlyglimmercomponents">New Optional Feature: Template-only Glimmer Components</h4>
<p>Ember components implicitly create an element in the DOM where they are
invoked, and the contents of their templates are then treated as "innerHTML"
inside that DOM element. For example, this component template:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/components/hello-world.hbs --}}
Hello World!
</code></pre>
<p>When invoked as:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/index.hbs --}}
&lt;section&gt;
  {{hello-world}}
&lt;/section&gt;
</code></pre>
<p>Would render with an implicit <code>div</code>:</p>
<pre><code class="html language-html">&lt;section&gt;
  &lt;div class="ember-view"&gt;
    Hello World!
  &lt;/div&gt;
&lt;/section&gt;
</code></pre>
<p>The treatment of templates as "innerHTML" in Ember makes several parts of the
framework's API harder to learn. For example, setting a class on an element in
a template is straight forward, and any developer comfortable with HTML should
be comfortable doing so. However adding a class to the implicit component <code>div</code>
is more difficult, requiring the developer to create a JavaScript file for the
component and use the <code>classNames</code> property.</p>
<p>To resolve this tension, Glimmer components shift templates to be treated as
"outerHTML". There is no implicit <code>div</code>. All the DOM elements created by the
renderer are in a template.</p>
<p>The "Template-only Glimmer Component" feature provides a first practical step
in this direction. You can enable this feature by running:</p>
<pre><code class="bash language-bash">ember feature:enable template-only-glimmer-components
</code></pre>
<p>Once enabled, any component template file without a corresponding JavaScript
file will behave like "outerHTML". For example the component file:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/components/hello-world.hbs --}}
Hello World!
</code></pre>
<p>Without any corresponding JavaScript file, and invoked as:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/index.hbs --}}
&lt;section&gt;
  {{hello-world}}
&lt;/section&gt;
</code></pre>
<p>Would render without an implicit div, as follows:</p>
<pre><code class="html language-html">&lt;section&gt;
  Hello World!
&lt;/section&gt;
</code></pre>
<p>Enabling this feature may require changes to your application's CSS, or to any
other code dependent upon the presence of <code>div</code>s for JavaScript-free components.
In practice, most applications and nearly all addons use the Ember CLI generators
for new components, which include a JavaScript file. If your application
has template-only components which rely on a backing <code>EmberComponent</code> class, for
example, if they have an injected-by-type service, note that they would also lose access
to that backing class.</p>
<p>However, enabling this feature will prompt you to optionally run a codemod
which creates backing classes for all template-only components, meaning
both the implicit <code>div</code> and backing class are retained.</p>
<!-- alex ignore invalid -->
<p>Although enabling this feature will eventually be the default for Ember, leaving the feature disabled is not deprecated in this release. You can read more
details about this optional feature and the motivations for introducing it in
<a href="https://github.com/emberjs/rfcs/blob/master/text/0278-template-only-components.md">RFC #278</a>.</p>
<h4 id="positionalparamsbugfix">Positional Params Bug Fix</h4>
<p>Ember introduced contextual components in Ember 2.3. Contextual components
close over arguments and are intended to do so in a manner consistent with
closures in JavaScript.</p>
<p>As the implementation of contextual components has been refined in the Glimmer
VM, a notable discrepancy has been noticed in how they handle positional
params. Given the following template:</p>
<pre><code class="handlebars language-handlebars">{{#with (component 'x-foo' 1 2 3) as |comp|}}
  {{component comp 4 5 6}}
{{/with}}
</code></pre>
<p>The params of <code>4, 5, 6</code> would <em>override</em> those of <code>1, 2, 3</code>. Normal closure
implementations would instead have appended the arguments to result in a
positional argument list of <code>1, 2, 3, 4, 5, 6</code>.</p>
<p>In Ember 3.1 we've corrected the implementation to act like a proper closure.
In researching the impact of this breaking bug fix we found no known public
addons or applications which would be impacted.</p>
<p>For more information about this change see
<a href="https://github.com/emberjs/ember.js/pull/15287">emberjs/ember.js#15287</a>.</p>
<p>For more details on the changes in Ember.js 3.1-beta.1, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v3.1.0-beta.1">Ember.js 3.1.0-beta.1 release page</a>.</p>
<h2 id="emberdata">Ember Data</h2>
<hr />
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata31beta1">Changes in Ember Data 3.1-beta.1</h3>
<p>Ember Data 3.1-beta.1 contains minor bug fixes and improvements. For more
details on the changes in Ember Data 3.1-beta.1, please review the <a href="https://github.com/emberjs/data/releases/tag/v3.1.0-beta.1">Ember Data
3.1.0-beta.1 release page</a>.</p>
<h2 id="embercli">Ember CLI</h2>
<hr />
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<h3 id="changesinembercli310beta1">Changes in Ember CLI 3.1.0-beta.1</h3>
<p>Ember CLI contains minor bug fixes and improvements.</p>
<p>Additionally, it changes the default addon blueprint to align <code>npm test</code> with
the behavior of the app blueprint, which is running <code>ember test</code>.
Previously <code>npm test</code> in an addon would run <code>ember try:each</code>, which is now
available as <code>npm run test:all</code> (or <code>yarn test:all</code> for those running yarn).</p>
<p>For more details on the changes in Ember CLI 3.1.0-beta.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.1.0-beta.1">Ember CLI 3.1.0-beta.1 release page</a>.</p>
<h3 id="thankyou">Thank You!</h3>
<p>As a community-driven open-source project with an ambitious scope, each of
these releases is a reminder that the Ember project would not have been
possible without your continued support. We are extremely grateful to our
contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-1-beta-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-1-beta-released</guid><pubDate>Fri, 16 Feb 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.1 and 3.2 Beta Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.1.0 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 3.2 beta cycle for all sub-projects. We encourage our
community (especially addon authors) to help test these beta builds and report
any bugs before they are published as a final release in six weeks' time. The
<a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to
continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs31">Changes in Ember.js 3.1</h3>
<p>Ember 3.1 is a minor release containing several new features and bug fixes. It includes a bump of Glimmer VM, Ember's rendering implementation, to version 0.30.5.</p>
<h4 id="namedarguments1of4">Named Arguments (1 of 4)</h4>
<p>Named arguments are here! This allows you to reference component arguments as <code>{{@name}}</code> when passed in as <code>{{user-profile name="Zoey"}}</code>.</p>
<p>From <a href="https://github.com/emberjs/rfcs/blob/master/text/0276-named-args.md">RFC 276</a>: Until now, the way to access named arguments passed in from the caller was to reference <code>{{name}}</code>. The (first) problem with this approach is that the <code>{{name}}</code> syntax is highly ambigious, as it could be referring to a local variable (block param), a helper or a named argument from the caller (which actually works by accessing auto-reflected <code>{{this.name}}</code>) or a property on the component class (such as a computed property).</p>
<p>Since the <code>{{foo}}</code> syntax still works on <code>Component</code> (which is the only kind of components available today) via the auto-reflection mechanism, we are not really in a rush to migrate the community (and the guides, etc) to using the new syntax. In the meantime, this could be viewed as a tool to improve clarity in templates.</p>
<p>While we think writing <code>{{@foo}}</code> would be a best practice for new code going forward, the community can migrate at its own pace one component at a time.</p>
<h4 id="es5gettersforcomputedproperties2of4">ES5 Getters for Computed Properties (2 of 4)</h4>
<p>Ember's object system has long used <code>set</code> and <code>get</code> to access properties. These APIs came from the codebase's origins in SproutCore, and predated ES5's <code>defineProperty</code>. In recent years, native JavaScript setter and getter implementations have become fast and mature.</p>
<p>Starting in Ember 3.1 (and described in <a href="https://github.com/emberjs/rfcs/blob/master/text/0281-es5-getters.md">RFC281</a>) you are now able to read the value of a computed property using a native ES5 getter. For example, this component which uses computed properties:</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';
import { computed } from '@ember/object';

export default Component.extend({

  name: computed('firstName', 'lastName', function() {
    return `${this.get('firstName')} ${this.get('lastName')}`;
  }),

  message: computed('name', function() {
    return `Hello ${this.get('name')}!`;
  });

});
</code></pre>
<p>Can be re-written using ES5 getters:</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';
import { computed } from '@ember/object';

export default Component.extend({

  name: computed('firstName', 'lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  }),

  message: computed('name', function() {
    return `Hello ${this.name}!`;
  })

});
</code></pre>
<p>Legacy <code>get</code> features are not deprecated or removed in 3.1. In fact there are
several cases where you must still use <code>get</code>:</p>
<ul>
<li>If you are calling <code>get</code> with a chained path. For example in <code>this.get('a.b.c')</code> if <code>b</code> is <code>undefined</code> the return value is <code>undefined</code>. Converting this
to <code>this.a.b.c</code> when <code>b</code> is <code>undefined</code> would instead raise an exception.</li>
<li>If your object is using <code>unknownProperty</code> you must continue to use <code>get</code>. Using an ES5 getter on an object with <code>unknownProperty</code> will cause an assertion failure in development.</li>
<li>Ember Data returns promise proxy objects when you read an async relationship and from other API. Ember proxy objects, including promise proxies, still require that you call <code>get</code> to read values.</li>
</ul>
<p>With these caveats in mind, how should you know if you can convert a <code>get</code> call to a native getter? If you have code where <code>get</code> is called on <code>this</code>, you likely can convert it. If you have a <code>get</code> on another object, <code>anything.get('foo')</code>, you should exercise caution when converting to a native getter.</p>
<p>The community-provided <a href="https://github.com/rondale-sc/es5-getter-ember-codemod">es5-getter-ember-codemod</a> is a great way to convert your existing codebase to ES5 getters. It follows the conservative guidelines and only converts <code>this.get</code>. Note that it cannot make all possible conversions to the new API, nor can it ensure 100% of the conversions it makes are correct. If your app has poor test coverage or you lack any confidence in your ability to make regression checks, a manual and gradual conversion process may be more appropriate.</p>
<p>Thanks to <a href="https://twitter.com/pzuraq">Chris Garrett</a> for pushing forward work on ES5 getters with support from <a href="https://twitter.com/chancancode">Godfrey Chan</a>, <a href="https://twitter.com/rwjblue/">Robert Jackson</a>, and <a href="https://twitter.com/krisselden">Kris Selden</a>). Thanks to <a href="https://twitter.com/rondale_sc/">Jonathan Jackson</a> for his work on the codemod.</p>
<h4 id="introducingoptionalfeatures3of4">Introducing Optional Features (3 of 4)</h4>
<p>Because major releases of Ember are not supposed to make breaking changes without prior deprecation, the project has been extremely conservative about changing behaviors that don't have a clear deprecation path. As a result, we've had several quirks of the framework linger into the 3.x series.</p>
<p>To give the project a path forward when a breaking change is mandatory, we've released the <a href="https://github.com/emberjs/ember-optional-features"><code>@ember/optional-features</code></a> addon. Today this addon is opt-in via installation as an NPM dependency. In a future release of Ember it will become part of the default application blueprint.</p>
<p>This addon does nothing by default, but provides a command-line interface to enable and disable breaking changes in Ember. Two optional features are being introduced in Ember 3.1.</p>
<p>To install ember-optional-features:</p>
<pre><code class="bash language-bash">ember install @ember/optional-features
</code></pre>
<p>Thanks to <a href="https://twitter.com/chancancode">Godfrey Chan</a> and <a href="https://twitter.com/rwjblue/">Robert Jackson</a> for their work on the optional features system.</p>
<h5 id="newoptionalfeatureapplicationtemplatewrapper">New Optional Feature: Application Template Wrapper</h5>
<p>Ember applications have long created a wrapping <code>div</code> around their rendered content: <code>&lt;div class="ember-view"&gt;</code>. With ember-optional-features, this functionality can now be turned off:</p>
<pre><code class="bash language-bash">ember feature:disable application-template-wrapper
</code></pre>
<p>Disabling this feature will stop Ember from creating a <code>div</code> around the application. This change may require alterations to your application's CSS, or to any other code that depends upon the presence of the <code>div</code>.</p>
<p>Additionally, enabling this feature will prompt you to optionally run a codemod to add the application <code>div</code> to the <code>application.hbs</code> of your application.</p>
<p>Although disabling this feature will eventually be the default for Ember, leaving the feature enabled is not deprecated in this release. You can read more details about this optional feature and the motivations for introducing it in <a href="https://github.com/emberjs/rfcs/blob/master/text/0280-remove-application-wrapper.md">RFC #280</a>.</p>
<h5 id="newoptionalfeaturetemplateonlyglimmercomponents">New Optional Feature: Template-only Glimmer Components</h5>
<p>Ember components implicitly create an element in the DOM where they are invoked, and the contents of their templates are then treated as "innerHTML" inside that DOM element. For example, this component template:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/components/hello-world.hbs --}}
Hello World!
</code></pre>
<p>When invoked as:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/index.hbs --}}
&lt;section&gt;
  {{hello-world}}
&lt;/section&gt;
</code></pre>
<p>Would render with an implicit <code>div</code>:</p>
<pre><code class="html language-html">&lt;section&gt;
  &lt;div class="ember-view"&gt;
    Hello World!
  &lt;/div&gt;
&lt;/section&gt;
</code></pre>
<p>The treatment of templates as "innerHTML" in Ember makes several parts of the framework's API harder to learn. For example, setting a class on an element in a template is straight forward, and any developer comfortable with HTML should be comfortable doing so. However adding a class to the implicit component <code>div</code> is more difficult, requiring the developer to create a JavaScript file for the component and use the <code>classNames</code> property.</p>
<p>To resolve this tension, Glimmer components shift templates to be treated as "outerHTML". There is no implicit <code>div</code>. All the DOM elements created by the renderer are in a template.</p>
<p>The "Template-only Glimmer Component" feature provides a first practical step in this direction. You can enable this feature by running:</p>
<pre><code class="bash language-bash">ember feature:enable template-only-glimmer-components
</code></pre>
<p>Once enabled, any component template file without a corresponding JavaScript file will behave like "outerHTML". For example the component file:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/components/hello-world.hbs --}}
Hello World!
</code></pre>
<p>Without any corresponding JavaScript file, and invoked as:</p>
<pre><code class="handlebars language-handlebars">{{!-- app/templates/index.hbs --}}
&lt;section&gt;
  {{hello-world}}
&lt;/section&gt;
</code></pre>
<p>Would render without an implicit div, as follows:</p>
<pre><code class="html language-html">&lt;section&gt;
  Hello World!
&lt;/section&gt;
</code></pre>
<p>Enabling this feature may require changes to your application's CSS, or to any other code dependent upon the presence of <code>div</code>s for JavaScript-free components. In practice, most applications and nearly all addons use the Ember CLI generators for new components, which include a JavaScript file. If your application has template-only components which rely on a backing <code>EmberComponent</code> class, for example, if they have an injected-by-type service, note that they would also lose access to that backing class.</p>
<p>However, enabling this feature will prompt you to optionally run a codemod which creates backing classes for all template-only components, meaning both the implicit <code>div</code> and backing class are retained.</p>
<!-- alex ignore invalid -->
<p>Although enabling this feature will eventually be the default for Ember, leaving the feature disabled is not deprecated in this release. You can read more details about this optional feature and the motivations for introducing it in <a href="https://github.com/emberjs/rfcs/blob/master/text/0278-template-only-components.md">RFC #278</a>.</p>
<h4 id="positionalparamsbugfix4of4">Positional Params Bug Fix (4 of 4)</h4>
<p>Ember introduced contextual components in Ember 2.3. Contextual components close over arguments and are intended to do so in a manner consistent with closures in JavaScript.</p>
<p>As the implementation of contextual components has been refined in the Glimmer VM, a notable discrepancy has been noticed in how they handle positional params. Given the following template:</p>
<pre><code class="handlebars language-handlebars">{{#with (component 'x-foo' 1 2 3) as |comp|}}
  {{component comp 4 5 6}}
{{/with}}
</code></pre>
<p>The params of <code>4, 5, 6</code> would <em>override</em> those of <code>1, 2, 3</code>. Normal closure implementations would instead have appended the arguments to result in a positional argument list of <code>1, 2, 3, 4, 5, 6</code>.</p>
<p>In Ember 3.1 we've corrected the implementation to act like a proper closure. In researching the impact of this breaking bug fix we found no known public addons or applications which would be impacted.</p>
<p>For more information about this change see
<a href="https://github.com/emberjs/ember.js/pull/15287">emberjs/ember.js#15287</a>.</p>
<h3 id="deprecationsinember31">Deprecations in Ember 3.1</h3>
<p>Deprecations are added to Ember.js when an API will be removed at a later date.</p>
<p>Each deprecation has an entry in the deprecation guide describing the migration
path to more stable API. Deprecated public APIs are not removed until a major
release of the framework.</p>
<p>Consider using the
<a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a>
addon if you would like to upgrade your application without immediately addressing
deprecations.</p>
<p><strong>Two</strong> new deprecations are introduced in Ember.js 3.1:</p>
<ol>
<li>Calling <code>array.get('@each')</code> is deprecated. <code>@each</code> may only be used as dependency key.</li>
<li>The private APIs <code>propertyWillChange</code> and <code>propertyDidChange</code> will be removed after the first LTS of the 3.x cycle. You should remove any calls to <code>propertyWillChange</code> and replace any calls to <code>propertyDidChange</code> with <code>notifyPropertyChange</code>. This applies to both the Ember global version and the EmberObject method version.</li>
</ol>
<p>For example, the following:</p>
<pre><code class="javascript language-javascript">Ember.propertyWillChange(object, 'someProperty');
doStuff(object);
Ember.propertyDidChange(object, 'someProperty');

object.propertyWillChange('someProperty');
doStuff(object);
object.propertyDidChange('someProperty');
</code></pre>
<p>Should be changed to:</p>
<pre><code class="javascript language-javascript">doStuff(object);
Ember.notifyPropertyChange(object, 'someProperty');

doStuff(object);
object.notifyPropertyChange('someProperty');
</code></pre>
<p>If you are an addon author and need to support both Ember applications greater than 3.1 <em>and</em> less than 3.1 you can use the polyfill <a href="https://github.com/rondale-sc/ember-notify-property-change-polyfill">ember-notify-property-change-polyfill</a>.</p>
<p>For more details on changes in Ember.js 3.1, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v3.1.0">Ember.js 3.1.0 release page</a>.</p>
<h3 id="upcomingchangesinemberjs32">Upcoming Changes in Ember.js 3.2</h3>
<h4 id="newfeatures1">New Features (1)</h4>
<h5 id="lettemplatehelper">let template helper</h5>
<p>Ember.js 3.2 introduces a new feature, the block <code>let</code> template helper.
This helper enables you to introduce bindings in your templates, without having to make them properties of the respective controller or component.</p>
<p>For example, imagine you want to pass the same hash of options to two different different components, you can now do the following:</p>
<pre><code class="handlebars language-handlebars">{{#let (hash theme="fairyfloss" indentation=4) as |options|}}
  {{code-editor options=options}}
  {{code-preview options=options}}
{{/let}}
</code></pre>
<p>You can read more about it in <a href="https://github.com/emberjs/rfcs/blob/master/text/0286-block-let-template-helper.md">RFC #286 - Block <code>let</code> template helper</a>.</p>
<h4 id="deprecations3">Deprecations (3)</h4>
<p><strong>Three</strong> new deprecations are introduced in Ember.js 3.2:</p>
<h5 id="emberlogger">Ember.Logger</h5>
<p>Use of <code>Ember.Logger</code> is deprecated. You should replace any calls to <code>Ember.Logger</code> with calls to <code>console</code>. Read more about this deprecation on the <a href="https://emberjs.com/deprecations/v3.x#toc_ember-console-deprecate-logger">deprecation page.</a></p>
<h5 id="routerroute">Router#route</h5>
<p>The <code>Router#route</code> private API has been renamed to <code>Router#_route</code> to avoid collisions with user-defined properties or methods. Read more about this deprecation on the <a href="https://emberjs.com/deprecations/v3.x#toc_ember-routing-route-router">deprecation page.</a></p>
<h5 id="defineproperty">defineProperty</h5>
<p>This next one typically won't affect most apps, but it might affect some addons. You'll need to replace directly assigned computed properties, and use <code>defineProperty</code> to define computed properties instead. Read more about this deprecation on the <a href="https://emberjs.com/deprecations/v3.x#toc_ember-meta-descriptor-on-object">deprecation page.</a></p>
<p>For more details on the upcoming changes in Ember.js 3.2, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v3.2.0-beta.1">Ember.js 3.2.0-beta.1 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<p>Ember Data 3.1 contains bug fixes and build improvements for Ember Data.</p>
<h3 id="changesinemberdata31">Changes in Ember Data 3.1</h3>
<h4 id="newfeatures1-1">New Features (1)</h4>
<p><a href="https://github.com/emberjs/data/pull/5273">#5273</a> client-side-delete semantics <code>unloadRecord</code></p>
<h4 id="deprecations2">Deprecations (2)</h4>
<p><strong>Two</strong> new deprecations are introduced in Ember Data 3.1.</p>
<ul>
<li><code>Ember.Map</code> was a private API provided by Ember (for quite some time). Unfortunately, Ember Data made <code>Ember.Map</code> part of its public API surface via documentation blocks. <code>Ember.Map</code> is [scheduled for deprecation](scheduled for deprecation), after we make sure that Ember Data will continue working after this feature is deprecated and removed.<code>Ember.Map</code> differs from native <code>Map</code> in a few ways:<ul>
<li><code>Ember.Map</code> has custom <code>copy</code> and <code>isEmpty</code> methods which are not present in native <code>Map</code></li>
<li><code>Ember.Map</code> adds a static <code>create</code> method (which instantiates itself with <code>new Ember.Map()</code>)</li>
<li><code>Ember.Map</code> does not accept constructor arguments</li>
<li><code>Ember.Map</code> does not have:<ul>
<li><code>@@species</code></li>
<li><code>@@iterator</code></li>
<li><code>entries</code></li>
<li><code>values</code> This implementation adds a deprecated backwards compatibility for:<ul>
<li><code>copy</code></li>
<li><code>isEmpty</code></li></ul></li></ul></li></ul></li>
</ul>
<p>This is needed because <code>Map</code> requires instantiation with <code>new</code>, and by default Babel transpilation will do <code>superConstructor.apply(this, arguments)</code> which throws an error with native <code>Map</code>. The desired code (if we lived in an "only native class" world) would be:</p>
<pre><code class="javascript language-javascript">  export default class MapWithDeprecations extends Map {
    constructor(options) {
      super();
      this.defaultValue = options.defaultValue;
    }
    get(key) {
      let hasValue = this.has(key);
      if (hasValue) {
        return super.get(key);
      } else {
        let defaultValue = this.defaultValue(key);
        this.set(key, defaultValue);
        return defaultValue;
      }
    }
  }
</code></pre>
<p>For more details on changes in Ember Data 3.1, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.1.0">Ember Data 3.1.0 release page</a>.</p>
<h3 id="upcomingchangesinemberdata32">Upcoming changes in Ember Data 3.2</h3>
<h4 id="lazyrelationshippayloads1of4">Lazy Relationship Payloads (1 of 4)</h4>
<p>Due to <a href="https://github.com/emberjs/data/pull/5230">implementation details</a> in the parsing of lazy relationships, polymorphic relationships were not supported, causing newly encountered polymorphic types to dereference previous payloads.
This issue is now addressed.</p>
<h4 id="emberdatafeatureflagremoval2of4">Ember Data Feature Flag Removal (2 of 4)</h4>
<p>Ember Data 3.2 removes <a href="https://github.com/emberjs/data/pull/5384">all current feature flags</a> for Ember Data. These feature flags have gone stale and Ember Data is going to
attempt to go a different direction with some of the planned changes for 2018. Many of these feature flags have been around for a long time. If your app depends on enabling these feature flag to run, please reach out to the Ember Data team by opening a github issue on the <a href="https://github.com/emberjs/data/issues">Ember Data repo</a> and the Ember Data team will try to assist with the transition.</p>
<h4 id="featureflagdsimprovedajax3of4">Feature Flag <code>ds-improved-ajax</code> (3 of 4)</h4>
<p>During the Ember Data 3.2 beta cycle, the Ember Data team is planning on releasing an addon that will support the <code>ds-improved-ajax</code> API.</p>
<h4 id="featureflagdspushpayloadreturn4of4">Feature Flag <code>ds-pushpayload-return</code> (4 of 4)</h4>
<p>If you rely on the <code>ds-pushpayload-return</code> feature flag, you can use the following pattern to manually serialize the API response and push the record into the store.</p>
<pre><code class="javascript language-javascript">export function pushPayload(store, modelName, rawPayload) {
   let ModelClass = store.modelFor(modelName);
   let serializer = store.serializerFor(modelName);

   let jsonApiPayload = serializer.normalizeResponse(store, ModelClass, rawPayload, null, 'query');

  return store.push(jsonApiPayload);
}
</code></pre>
<pre><code class="javascript language-javascript">// Before
this.get('store').pushPayload(modelName, rawPayload);

// After
import { pushPayload } from '&lt;app-name&gt;/utils/push-payload';

pushPayload(this.get('store'), modelName, rawPayload);
</code></pre>
<h3 id="deprecationsinemberdata32">Deprecations in Ember Data 3.2</h3>
<p>There are no new deprecations planned for Ember Data 3.2.</p>
<p>For more details on the upcoming changes in Ember Data 3.2, please review the <a href="https://github.com/emberjs/data/releases/tag/v3.2.0-beta.1">Ember Data 3.2.0-beta.1 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! You can do this either with yarn or npm.</p>
<p>To upgrade your projects using <code>yarn</code>, run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code>, run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the upgrade command, run <code>ember init</code> inside of the project directory to apply the blueprint changes.</p>
<p>You can preview those changes for <a href="https://github.com/ember-cli/ember-new-output/compare/v3.0.0…v3.1.0">applications</a> and <a href="https://github.com/ember-cli/ember-addon-output/compare/v3.0.0…v3.1.0">addons</a>.</p>
<h3 id="changesinembercli31">Changes in Ember CLI 3.1</h3>
<h4 id="newfeatures2">New Features (2)</h4>
<h5 id="embertestall"><code>ember test:all</code></h5>
<p>Previously, <code>npm test</code> would run all configured scenarios of <code>ember-try</code>. This was confusing due to <code>npm test</code> and <code>ember test</code> having different behaviors, as well as <code>npm test</code> doing different things depending on whether it was being run by an app or an addon. The fact that the command would also run several hard to cancel processes for the <code>ember-try</code> scenarios also worsened the developer experience.</p>
<p>To address this, <code>npm test</code> was changed to run <code>ember test</code>, and a new <code>npm test:all</code> was introduced with the old behavior of running <code>ember-try</code> scenarios.</p>
<h5 id="yarnlockfiledetection">Yarn lock file detection</h5>
<p>Ember CLI will now correctly detect if the project is part of a Yarn workspace root, and adequately use Yarn instead of npm.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>No new deprecations are introduced in Ember CLI 3.1.</p>
<p>For more details on the changes in Ember CLI 3.1 and detailed upgrade instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.1.0">Ember CLI  3.1.0 release page</a>.</p>
<h3 id="upcomingchangesinembercli32">Upcoming Changes in Ember CLI 3.2</h3>
<h4 id="newfeatures3">New Features (3)</h4>
<p><strong>Qunit Dom</strong> - In order to make DOM assertions more readable, the <code>qunit-dom</code> dependency will be added <strong>by default</strong> to all apps and addons. Opt out by removing it from your package.json file. See <a href="https://github.com/simplabs/qunit-dom-codemod">https://github.com/simplabs/qunit-dom-codemod</a> to ease migration <a href="https://github.com/ember-cli/ember-cli/pull/7605">(#7605)</a>.</p>
<p>This is, in our opinion, totally awesome. It means that this code:</p>
<pre><code class="javascript language-javascript">assert.equal(this.element.querySelector('.title').textContent.trim(), 'Hello World!');
</code></pre>
<p>becomes this:</p>
<pre><code class="javascript language-javascript">assert.dom('.title').hasText('Hello World!');
</code></pre>
<p>See what I mean? Totally awesome. &lt;3</p>
<p><strong>Experiments with more efficient transpilation</strong> - Until now, addons were responsible for compiling their own JS/HBS/CSS and returning AMD/CSS. Now they return the raw code, and the app uses its own processors (babel, htmlbars) to compile it. This is required to do proper tree-shaking and code-splitting. Delayed transpilation <a href="https://github.com/ember-cli/ember-cli/pull/7501">(#7501)</a> and all-at-once addon optimization after compilation <a href="https://github.com/ember-cli/ember-cli/pull/7650">(#7650)</a> have been added. Additionally, more comprehensive methods to detect if ember-cli is being run within CI or not have also been added <a href="https://github.com/ember-cli/ember-cli/pull/7637">(#7637)</a> - see <a href="https://github.com/watson/ci-info/">https://github.com/watson/ci-info/</a>.</p>
<!-- alex ignore dummy -->
<p><strong>Module Unification (new file layout) Continues</strong> - You can now generate an addon using the Module Unification layout <a href="https://github.com/ember-cli/ember-cli/pull/7490">(#7490)</a>! Use the command <code>MODULE_UNIFICATION=true ember addon my-addon</code> to try it out <a href="https://github.com/ember-cli/ember-cli/pull/7658">(#7658)</a>. We also improved the logic to support addons that use Module Unification <a href="https://github.com/ember-cli/ember-cli/pull/7660">(#7660)</a>, added the blueprint for a dummy app to addons that use Module Unification <a href="https://github.com/ember-cli/ember-cli/pull/7667">(#7667)</a>, and updated the version of Ember used in Module Unification <a href="https://github.com/ember-cli/ember-cli/pull/7678">(#7678)</a>.</p>
<h4 id="deprecations1">Deprecations (1)</h4>
<h4 id="emberclibabel5">ember-cli-babel 5</h4>
<p>This release of Ember CLI <a href="https://github.com/ember-cli/ember-cli/pull/7676">deprecates <code>ember-cli-babel</code> 5.x</a>. Babel 6 support has been out for a long time now and works quite well. Babel 5 support is deprecated and is expected to be dropped soon.</p>
<p>For more details on the changes in Ember CLI 3.2.0-beta.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.2.0-beta.1">Ember CLI 3.2.0-beta.1 release page</a>.</p>
<p>Thank you to <a href="https://github.com/GavinJoyce">@GavinJoyce</a>, <a href="https://github.com/Turbo87">@Turbo87</a>, <a href="https://github.com/cibernox">@cibernox</a>, <a href="https://github.com/iezer">@iezer</a>, <a href="https://github.com/kellyselden">@kellyselden</a>, <a href="https://github.com/raytiley">@raytiley</a>, <a href="https://github.com/t-sauer">@t-sauer</a>, and <a href="https://github.com/thetimothyp">@thetimothyp</a>
for your incredible work on ember-cli!</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your  continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-1-released</guid><pubDate>Fri, 13 Apr 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.10 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.10 of Ember.js, Ember Data, and Ember CLI. This release kicks off the 3.11 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs310">Changes in Ember.js 3.10</h3>
<p>Ember.js 3.10 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There are four (4) new features, one (1) deprecations, and seventeen (17) bugfixes in this version.</p>
<h4 id="newfeatures4">New Features (4)</h4>
<h5 id="anglebracketinvocationfornestedcomponents1of4">Angle Bracket Invocation for Nested Components (1 of 4)</h5>
<p>From Ember 3.10 onwards you can use <strong>angle bracket invocation syntax</strong> for <strong>nested</strong> components. Nested components are components which are defined in a nested directory structure of your application.</p>
<p>For example, if you had a component nested in your <code>app/</code> directory as follows:</p>
<pre><code class="bash language-bash">-- app/
  |-- components/
     |-- blog/
        |-- post-item.js
  |-- templates/
     |-- components/
        |-- blog/
           |-- post-item.hbs
</code></pre>
<p>you had to invoke the component in your template using the classic curly invocation syntax up until Ember 3.9. You can do so as follows:</p>
<pre><code class="handlebars language-handlebars">{{! simple invocation }}
{{blog/post-item}}

{{! invocation with block }}
{{#blog/post-item}}
  &lt;span&gt;block example&lt;/span&gt;
{{/blog/post-item}}
</code></pre>
<p>With Ember 3.10 you can alternatively invoke the same, nested component in your template with angle bracket invocation syntax:</p>
<pre><code class="handlebars language-handlebars">{{! simple invocation }}
&lt;Blog::PostItem /&gt;

{{! invocation with block }}
&lt;Blog::PostItem&gt;
  &lt;span&gt;block example&lt;/span&gt;
&lt;/Blog::PostItem&gt;
</code></pre>
<p>Use the <code>::</code> separator in the component's tag name to separate directory names and component title as seen in the example above.</p>
<p>This feature has no impact on the way components are looked up on the container of your application. If e.g. you want to lookup the factory of a component using the <a href="https://api.emberjs.com/ember/release/functions/@ember%2Fapplication/getOwner">owner API</a>, you can continue using the traditional syntax (<code>component:blog/post-item</code>).</p>
<p>You can read more about this feature in the <a href="https://emberjs.github.io/rfcs/0457-nested-lookups.html">original Request for Comments (RFC)</a>.</p>
<h5 id="anglebracketinvocationforbuiltincomponents2of4">Angle Bracket Invocation for Built-In Components (2 of 4)</h5>
<p>With Ember 3.10+ you can use <strong>angle bracket invocation syntax</strong> for the <strong>three built-in components</strong> that Ember itself provides to your application automatically: <code>input</code>, <code>link-to</code> and <code>textarea</code>. This version of Ember aligns the API of these built-ins with the requirements of the angle bracket invocation syntax.</p>
<p>Previously, you were only able to invoke built-ins in your template using the classic, curly braces syntax:</p>
<pre><code class="handlebars language-handlebars">{{input type="text" value="Katie Gengler"}}

{{link-to "Edit Photo" "photos.edit" photo}}

{{textarea value=postComment cols="20" rows="6"}}
</code></pre>
<p>With Ember 3.10 and higher, you may alternatively use the angle bracket invocation syntax as follows:</p>
<pre><code class="handlebars language-handlebars">&lt;Input @type="text" @value="Katie Gengler" /&gt;

{{! link-to with a single model }}
&lt;LinkTo @route="photos.edit" @model={{photo}}&gt;
  Edit Photo
&lt;/LinkTo&gt;

{{! link-to with several models }}
&lt;LinkTo @route="photos.edit" @models={{array photo anotherPhoto}} /&gt;

&lt;Textarea @value={{this.postComment}} @cols="20" @rows="6" /&gt;
</code></pre>
<p>You can read more about the API of built-in components when used with angle bracket invocation syntax in <a href="https://emberjs.github.io/rfcs/0459-angle-bracket-built-in-components.html">the original RFC</a>.</p>
<h5 id="routeinfometadata3of4">RouteInfo Metadata (3 of 4)</h5>
<p>An Ember application provides information about routes via the <code>RouteInfo</code> object. For example, the <a href="https://api.emberjs.com/ember/release/classes/Transition"><code>Transition</code></a> object that is provided to <a href="https://api.emberjs.com/ember/release/classes/RouterService/events/routeDidChange">event listeners for route changes</a> provides a <code>from</code> and <code>to</code> property representing a <code>RouteInfo</code> object. These provide information about the former and the entry route.</p>
<!--alex ignore savage-->
<p>With the new <code>RouteInfo</code> Metadata feature released in Ember 3.10 you can bind <strong>application-specific information</strong> to <code>RouteInfo</code> objects. Despite being a low-level primitive, this new API is not only useful for addon authors, but also for Ember application developers in general.</p>
<p>The <code>RouteInfo</code> Metadata feature adds a <code>buildRouteInfoMetadata</code> method to the <a href="https://api.emberjs.com/ember/release/classes/Route">Route API</a> whose return value will be added to the respective <code>RouteInfo</code> object as a <code>metadata</code> property.</p>
<p>If, for example, you wanted to track a user's details together with a tracking event for visiting the profile page, you could leverage the <code>RouteInfo</code>'s metadata as follows:</p>
<pre><code class="javascript language-javascript">// app/route/profile.js
import Route from '@ember/routing/route';
import { inject } from '@ember/service';

export default Route.extend({
  user: inject('user'),
  buildRouteInfoMetadata() {
    return {
      trackingKey: 'page_profile',
      user: {
        id: this.user.id,
        type: this.user.type
      }
    }
  }
  // ...
});
</code></pre>
<pre><code class="javascript language-javascript">// app/services/analytics.js
import Service, { inject } from '@ember/service';

export default Service.extend({
  router: inject('router'),
  init() {
    this._super(...arguments);
    this.router.on('routeDidUpdate', (transition) =&gt; {
      let { to, from } = transition;
      let fromMeta = from.metadata;
      let toMeta = to.metadata;
      ga.sendEvent('pageView', {
        from: fromMeta,
        to: toMeta,
        timestamp: Date.now(),
      })
    })
  },
  // ...
});
</code></pre>
<p>We encourage you to give <a href="https://emberjs.github.io/rfcs/0398-RouteInfo-Metadata.html">the original RFC a read</a> for more details about the API and other interesting use cases for <code>RouteInfo</code> metadata in your application.</p>
<h5 id="nativedecoratorsupport4of4">Native Decorator Support (4 of 4)</h5>
<p>With Ember.js 3.10 you get the possibility to use native decorators in your application. To learn how to get started using native decorators, have a look at the <a href="https://emberjs.github.io/rfcs/0440-decorator-support.html">original RFC</a>.</p>
<h4 id="deprecations1">Deprecations (1)</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.10, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.10.0">Ember.js 3.10.0 release page</a>.</p>
<h5 id="applicationcontrollerrouterproperties1of1">Application Controller Router Properties (1 of 1)</h5>
<p><code>ApplicationController#currentPath</code> and <code>ApplicationController#currentRouteName</code> are deprecated in Ember.js 3.10. They are no longer needed since the <code>RouterService</code> now has <code>RouterService#currentPath</code> and <code>RouterService#currentRouteName</code>.</p>
<p>If you still rely on these deprecated APIs then please have a look at the <a href="https://deprecations.emberjs.com/v3.x#toc_application-controller-router-properties">deprecation app</a> to see how you can get the same functionality from the <code>Router</code> service.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<p>There are no changes in 3.10. It is a re-release of
<a href="https://github.com/emberjs/data/releases/tag/v3.9.3">3.9.3</a>
to allow for an extended stabilization period for the
<a href="https://emberjs.github.io/rfcs/0395-ember-data-packages.html">Packages RFC</a>.
You can follow along with the remaining packages work
<a href="https://github.com/emberjs/data/labels/TRACK-packages">here</a>.</p>
<p>This information is also available on the
<a href="https://github.com/emberjs/data/releases/tag/v3.10.0">Ember Data 3.10.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.
3.10.0 had a small bug with blueprints that caused CI trouble for some platforms, which is fixed by a patch in version 3.10.1.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the github README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli310">Changes in Ember CLI 3.10</h3>
<h4 id="newfeatures2">New Features (2)</h4>
<h5 id="nativedecoratorsupport1of2">Native Decorator Support (1 of 2)</h5>
<p>As with Ember.js, Ember CLI now supports native decorators.</p>
<h5 id="dropnode6support2of2">Drop Node 6 support (2 of 2)</h5>
<p>Ember CLI 3.10 officially drops support for Node 6. Ember.js still supports it until all the blueprints are updated.
Maintainers of addons are encouraged to make a <em>major version</em> release of their addons when upgrading to 3.10, since dropping Node 6 support may be a breaking change for some of their library's users.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>There are no deprecations in Ember CLI 3.10.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.10 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.10.0">Ember CLI  3.10.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-10-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-10-released</guid><pubDate>Tue, 21 May 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.11 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.11 of Ember.js, Ember Data, and Ember CLI. This release kicks off the 3.12 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs311">Changes in Ember.js 3.11</h3>
<p>Ember.js 3.11 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There are four (4) new features, one (1) deprecation, and several bugfixes in this version.</p>
<h4 id="newfeatures4">New Features (4)</h4>
<h5 id="forwardingelementmodifierswithattributes1of4">Forwarding Element Modifiers with <code>...attributes</code> (1 of 4)</h5>
<p>Angle bracket component invocation was introduced in Ember.js 3.4. Aside from the syntatic differences, the angle bracket invocation syntax enabled passing HTML attributes to components, which can then be applied the underlying HTML element(s) in the component's layout using the <code>...attributes</code> syntax. This is also known informally as the "splattributes" feature.</p>
<p>This features clarifies how the "splattributes" feature interact with element modifiers.</p>
<p>For more information please refer to <a href="https://github.com/emberjs/rfcs/blob/master/text/0435-modifier-splattributes.md">the RFC</a>.</p>
<h5 id="thefnhelper2of4">The <code>{{fn}}</code> helper (2 of 4)</h5>
<p>The <a href="http://api.emberjs.com/ember/3.11/classes/Ember.Templates.helpers/methods/fn?anchor=fn"><code>{{fn}}</code></a> helper provides a way to pass arguments to actions.</p>
<p>The <code>action</code> method creates an action from a function so that it can be passed to event handlers in templates. It ensures that the <code>this</code> value in the <code>countUp</code> action will always be the component instance, which allows it to be freely passed to other components. Where this falls short is when we need to pass arguments to these actions.</p>
<pre><code class="javascript language-javascript">import Component from "@ember/component";
import { action } from '@ember/object';

export default Component.extend({
  count: 0,

  countUp: action(function() {
    this.incrementProperty("count");
  })
}
</code></pre>
<pre><code class="handlebars language-handlebars">Current count: {{this.count}}

&lt;MyButton @click={{this.countUp}}&gt;Add One&lt;/MyButton&gt;
</code></pre>
<p>The <code>{{fn}}</code> helper provides a way to pass arguments into actions and "bundle" them up, so that they can be passed around to other components and still retain the provided arguments when called:</p>
<pre><code class="handlebars language-handlebars">Current count: {{this.count}}

{{!-- when not passing arguments, these are equivalent --}}
&lt;MyButton @click={{this.countUp}}&gt;Add One&lt;/MyButton&gt;
&lt;MyButton @click={{fn this.countUp}}&gt;Add One&lt;/MyButton&gt;

{{!-- calls this.countUp(10) when clicked --}}
&lt;MyButton @click={{fn this.countUp 10}}&gt;Add Ten&lt;/MyButton&gt;
</code></pre>
<p>In addition to the basic use case shown here, the <code>{{fn}}</code> helper supports other advanced use cases, such as adding more arguments to an existing function.</p>
<pre><code class="handlebars language-handlebars">{{#let (fn this.log "hello") as |hello|}}
  {{!-- calls this.log("hello", "world") --}}
  &lt;MyButton @click={{fn hello "world"}}&gt;
    Hello World
  &lt;/MyButton&gt;

  {{!-- calls this.log("hello", "Tomster", "Zoey") --}}
  &lt;MyButton @click={{fn hello "Tomster" "Zoey"}}&gt;
    Hello Tomster and Zoey
  &lt;/MyButton&gt;
{{/let}}
</code></pre>
<p>It should also be noted that the <code>{{action}}</code> helper can previously be used to accomplish similar functionalities, but due to some historical decisions, it may produce surprising results in some cases. Therefore, Ember users are encouraged to migrate to the <code>{{fn}}</code> helper along with the <code>action</code> method where possible and appropriate. Refer to <a href="https://github.com/emberjs/rfcs/blob/master/text/0470-fn-helper.md#detailed-design">the RFC</a> for more details and examples.</p>
<h5 id="theonmodifier3of4">The <code>{{on}}</code> modifier (3 of 4)</h5>
<p>The <a href="http://api.emberjs.com/ember/3.11/classes/Ember.Templates.helpers/methods/fn?anchor=on"><code>{{on}}</code></a> modifier provides a straightforward way to listen to DOM events on arbitrary elements.</p>
<pre><code class="javascript language-javascript">import Component from "@ember/component";
import { action } from '@ember/object';

export default Component.extend({
  count: 0,

  countUp: action(function() {
    this.incrementProperty("count");
  })
}
</code></pre>
<pre><code class="handlebars language-handlebars">Current count: {{this.count}}

&lt;button {{on "click" this.countUp passive=true}}&gt;Add One&lt;/button&gt;
</code></pre>
<p>The <code>{{on}}</code> modifier in this example attaches a passive "click" event listener on the button, such that when the button is clicked, the <code>countUp</code> action will be called. Like before, wrapping our function in an <code>action</code> call ensures the <code>countUp</code> action will have the right <code>this</code> value at runtime.</p>
<p>By default, the action passed to the <code>{{on}}</code> modifier will receive the DOM event as an argument. The <code>fn</code> helper can be used in conjunction with the <code>{{on}}</code> modifier to alter this behavior. Along with the "Splattributes" feature mentioned above, the <code>{{on}}</code> modifier can also be applied to component elements as well.</p>
<p>Finally, it should be noted that the <code>{{action}}</code> modifier, and in some cases, DOM properties like <code>onclick=</code> could previously be used to accomplish similar functionalities. However, both of these approaches have their own drawbacks. Therefore, Ember users are encouraged to migrate to the <code>{{on}}</code> modifier along with the <code>action</code> method where possible and appropriate. See <a href="https://github.com/emberjs/rfcs/blob/master/text/0471-on-modifier.md">the RFC</a> for more details and examples.</p>
<h5 id="injectparameternormalization4of4">Inject Parameter Normalization (4 of 4)</h5>
<p>Inject Parameter Normalization normalizes this contract for all Ember base classes - that is, framework classes that are provided by Ember:</p>
<ul>
<li><code>GlimmerComponent</code></li>
<li><code>EmberComponent</code></li>
<li><code>Service</code></li>
<li><code>Route</code></li>
<li><code>Controller</code></li>
<li><code>Helper</code></li>
</ul>
<p>Along with framework clases provided by Ember Data:</p>
<ul>
<li><code>Model</code></li>
<li><code>Adapter</code></li>
<li><code>Serializer</code></li>
<li><code>Transform</code></li>
</ul>
<p>For more info please refer to <a href="https://github.com/emberjs/rfcs/blob/master/text/0451-injection-parameter-normalization.md">the RFC</a>.</p>
<h4 id="deprecations1">Deprecations (1)</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.11, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.11.0">Ember.js 3.11.0 release page</a>.</p>
<h5 id="deprecatefunctionprototypeobserves1of1">Deprecate Function.prototype.observes (1 of 1)</h5>
<p>Historically, Ember has extended the <code>Function.prototype</code> with a few functions (<code>on</code>, <code>observes</code>, <code>property</code>), over time we have moved away from using these prototype extended functions in favor of using the official ES modules based API.</p>
<p>Please refer to <a href="https://deprecations.emberjs.com/v3.x/#toc_function-prototype-extensions-observes">the deprecation guides</a> for information on how to migrate away from <code>Function.prototype</code>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="importantnoteaboutemberdata311">Important note about Ember Data 3.11</h3>
<p>There is a <strong>known bug in 3.11.0</strong> which means <code>ember generate model something</code> doesn't work. We are currently working a patch for this.
Likewise there is a known bug for displaying the 3.11 API documentation on <a href="https://api.emberjs.com">api.emberjs.com</a>, which will also be fixed in a patch.
This blog post will be updated once these issues are resolved.</p>
<h3 id="changesinemberdata311">Changes in Ember Data 3.11</h3>
<h4 id="newfeatures1">New Features (1)</h4>
<h5 id="packagesfeature1of1">Packages feature (1 of 1)</h5>
<p>In addition to several bug fixes and small documentation fixes, this release is the first release that ships ember-data as a collection of smaller packages. <a href="https://github.com/emberjs/data/issues/6166">Over time, some of these packages will become optional</a>.</p>
<p>The packages feature also introduces a new import syntax.</p>
<p>Previously:</p>
<pre><code class="javascript language-javascript">import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { belongsTo, hasMany } from 'ember-data/relationships';
</code></pre>
<p>or:</p>
<pre><code class="javascript language-javascript">import DS from 'ember-data';

const { Model, attr, belongsTo, hasMany } = DS;
</code></pre>
<p>Can now be achieved like this:</p>
<pre><code class="javascript language-javascript">import Model, { attr, belongsTo, hasMany } from '@ember-data/model';
</code></pre>
<p>With the landing of this feature, the previous import styles will become deprecated in an upcoming release. Lint rules and a codemod will be available before that time to ensure a seamless transition to the new syntax.</p>
<p>You can read more about the new package syntax <a href="https://emberjs.github.io/rfcs/0395-ember-data-packages.html">in the RFC</a></p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember Data 3.11.</p>
<p>For more details on changes in Ember Data 3.11, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.11.0">Ember Data 3.11.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the github README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli311">Changes in Ember CLI 3.11</h3>
<p>Ember CLI 3.11 contains several bug fixes. Have a look at the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.11.0">complete changelog</a> for an overview.</p>
<h4 id="newfeatures0">New Features (0)</h4>
<p>No new features in Ember CLI 3.11.</p>
<h4 id="deprecations0-1">Deprecations (0)</h4>
<p>No new deprecations in Ember CLI 3.11.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.11 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.11.0">Ember CLI 3.11.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-11-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-11-released</guid><pubDate>Mon, 15 Jul 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.12 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.12 of Ember.js, Ember Data, and Ember CLI. This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule. To learn about the next wave of features coming in future releases, see the <a href="https://blog.emberjs.com/2019/08/15/octane-release-plan.html">Octane release plan</a> post.</p>
<p>This release kicks off the 3.13 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs312">Changes in Ember.js 3.12</h3>
<p>The 3.12.0 release is an Ember.js Long-Term Support candidate. In six weeks, the 3.12.x series will become the latest LTS release and six weeks after that the 3.4 LTS branch will no longer receive bugfix patches. LTS versions allow teams to upgrade less frequently while still getting support from the Ember project and the wider ecosystem.</p>
<p>For more information about Ember's LTS policies, see the <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">announcement blog post</a> and <a href="http://emberjs.com/builds/">builds page</a>.</p>
<p>Ember.js 3.12 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There is zero (0) new features, zero (0) deprecations, and several bugfixes in this version.</p>
<h4 id="newfeatures0">New Features (0)</h4>
<p>There are no new features in Ember.js 3.12.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>There are no deprecations added in Ember.js 3.12</p>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.12, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.12.0">Ember.js 3.12 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata312">Changes in Ember Data 3.12</h3>
<h4 id="newfeatures0-1">New Features (0)</h4>
<p>No new features introduced in Ember Data 3.12.</p>
<h4 id="deprecations2">Deprecations (2)</h4>
<h5 id="eventedapiusage1of2">Evented Api Usage (1 of 2)</h5>
<p>With Ember Data 3.12 the <code>Ember.Evented</code> functionality on <code>DS.Model</code>, <code>DS.ManyArray</code>, <code>DS.Errors</code>, <code>DS.RecordArray</code>, and <code>DS.PromiseManyArray</code> is deprecated. Please refer to the <a href="https://deprecations.emberjs.com/ember-data/v3.x#toc_evented-api-usage">deprecations guide</a> for more info.</p>
<h5 id="recordlifecycleeventmethods2of2">Record Lifecycle Event Methods (2 of 2)</h5>
<p>Lifecycle event methods on <code>DS.Model</code> such as <code>becameError</code>, <code>becameInvalid</code>, <code>didCreate</code>, <code>didDelete</code>, <code>didLoad</code>, <code>didUpdate</code>, <code>ready</code>, <code>rolledBack</code> are deprecated as of Ember Data 3.12. For a guide to replacing these event methods with computed properties please refer to the <a href="https://deprecations.emberjs.com/ember-data/v3.x#toc_record-lifecycle-event-methods">deprecations guide</a></p>
<p>For more details on changes in Ember Data 3.12, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.12.0">Ember Data 3.12.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the github README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli312">Changes in Ember CLI 3.12</h3>
<h4 id="newfeatures0-2">New Features (0)</h4>
<p>There are no new features in Ember CLI 3.12.</p>
<h4 id="deprecations0-1">Deprecations (0)</h4>
<p>There are no new deprecations in Ember CLI 3.12.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.12 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.12.0">Ember CLI  3.12.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-12-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-12-released</guid><pubDate>Fri, 16 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.13 Released (Octane Preview)]]></title><description><![CDATA[<p>Today, the Ember project is releasing version 3.13 of Ember.js, Ember Data, and Ember CLI.</p>
<p>Ember 3.13 is the final release of Ember before Octane. Ember 3.13 is also the Octane preview. The preview allows adventurous community members to start using its stable features and help put the final round of polish on supporting tools and documentation before Octane becomes official in 3.14. You can learn more about what to expect from Octane and how to prepare your apps in a <a href="https://blog.emberjs.com/2019/08/15/octane-release-plan.html">previous blog post</a>.</p>
<p>Additionally, version 3.12 of Ember is now promoted to LTS (Long Term Support). An LTS version of Ember continues to receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks). LTS releases typically occur every four minor versions. The previous LTS version of Ember was 3.8.</p>
<h2 id="theoctanepreview">The Octane Preview</h2>
<p>The Octane features in 3.13 are stable public APIs with our normal SemVer guarantees. If you build an app using APIs in the Octane preview, it will continue to work in future versions.</p>
<p>So why is this a preview and not the final Octane release?</p>
<p>A big part of Octane is about delivering an excellent developer experience, whether you are a beginner or a power user. While these APIs are stable, not all Octane features are compatible with popular addons yet. We are also still updating documentation, and important tools like the Ember Inspector do not yet work with some Octane features. Octane is not complete until these supporting pieces are in place.</p>
<p>Then, when Ember 3.14 arrives, Octane will be the recommended way to use Ember and new apps will have Octane's optional features enabled by default. The guides and tutorials will show Octane examples, and codemods will be available to help users migrate to Octane. Visit the <a href="https://emberjs.com/editions/octane">Octane landing page</a> for links to the learning resources, which are deployed to a temporary URL.</p>
<p>The Ember tutorial has already been completely rewritten for Octane, and the easiest way to understand the big picture of Octane, especially if you're already an experienced Ember developer, is to work through the new tutorial, which you can find through the <a href="https://emberjs.com/editions/octane">Octane landing page</a>.</p>
<hr />
<p>You can try out the Octane preview by performing a few steps:</p>
<p>Add the following packages if they aren't already present at this version:</p>
<pre><code class="javascript language-javascript">npm install --save-dev @ember/edition-utils@^1.1.1
npm install --save-dev @glimmer/component@^0.14.0-alpha.13
</code></pre>
<p>Disable legacy behavior by setting the following feature flags:</p>
<pre><code class="bash language-bash">ember feature:disable jquery-integration
ember feature:enable template-only-glimmer-components
ember feature:disable application-template-wrapper
</code></pre>
<p>Specify the Octane edition in <code>.ember-cli.js</code> by adding the following lines to the beginning of the file:</p>
<pre><code class="javascript language-javascript">// .ember-cli.js
const { setEdition } = require('@ember/edition-utils');

setEdition('octane');
</code></pre>
<p>If you have an <code>.ember-cli</code> file instead of an <code>.ember-cli.js</code> file, you can convert it by renaming it to <code>.ember-cli.js</code>, then taking the existing JSON object and assigning it to <code>module.exports</code>. For example, if you have an <code>.ember-cli</code> file with:</p>
<pre><code class="javascript language-javascript">// .ember-cli
{
  "disableAnalytics": false
}
</code></pre>
<p>The equivalent <code>.ember-cli.js</code> file would be:</p>
<pre><code class="javascript language-javascript">// .ember-cli.js
module.exports = {
  "disableAnalytics": false
}
</code></pre>
<p>If you need more information on how to migrate away from these legacy features, check out the <a href="https://blog.emberjs.com/2019/08/15/octane-release-plan.html">Octane release plan</a> blog post.</p>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs313">Changes in Ember.js 3.13</h3>
<p>Ember.js 3.13 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There are five (5) new features, one (1) deprecation, and several bugfixes in this version.</p>
<h4 id="newfeatures5">New Features (5)</h4>
<h5 id="trackedpropertiesandtrackedpropertyupdates1of5">Tracked Properties and Tracked Property Updates (1 of 5)</h5>
<p>Tracked properties introduce a simpler and more ergonomic system for tracking state change in Ember applications. Tracked properties allow Ember to reduce its API surface area while producing code that is both more intuitive and less error-prone.</p>
<p>Have a look at the [guides] to learn more about tracked properties. For design details, check out <a href="https://github.com/emberjs/rfcs/blob/master/text/0410-tracked-properties.md">RFC 410</a> and <a href="https://github.com/emberjs/rfcs/blob/master/text/0478-tracked-properties-updates.md">RFC 478</a>.</p>
<h5 id="componenttemplatescolocationpartone2of5">Component Templates Co-location: Part One (2 of 5)</h5>
<p>Component co-location is available in Ember 3.13. This feature allows you to group a component's template and JavaScript files together in the file system. For example, a component named <code>user-profile</code> would be made up of the following files:</p>
<pre><code class="bash language-bash">app
└── components
    ├── user-profile.hbs
    └── user-profile.js
</code></pre>
<p><span style="font-style: italic;">Note: Previously, in 3.13, this feature was not available unless you enabled the Octane preview. That changed once a <a href="https://github.com/ember-cli/ember-cli-htmlbars/issues/290">performance issue</a> was addressed.</span></p>
<p><a href="https://github.com/emberjs/rfcs/blob/master/text/0481-component-templates-co-location.md">The RFC</a> contains a detailed explanation of the design of this feature.</p>
<h5 id="componentclassgenerator3of5"><code>component-class</code> generator (3 of 5)</h5>
<p>With the Octane preview enabled, a component generated using <code>ember generate component &lt;component name&gt;</code> will no longer include a component class by default.</p>
<p>In cases where you need a component class file, you can either pass the <code>--with-component-class</code> flag to the <code>component</code> generator, or add one after the fact with the new <code>ember generate component-class &lt;component name&gt;</code> generator.</p>
<h5 id="detecttheeditionthatisinuse4of5">Detect the edition that is in use (4 of 5)</h5>
<p>For addon authors, it is now possible to detect which edition is in use at build-time with <code>@ember/edition-utils</code>.</p>
<pre><code class="javascript language-javascript">import { has } from '@ember/edition-utils';

let isOctane = has('octane');
</code></pre>
<h5 id="addupdatehookcomponentmanagercapability5of5">Add <code>updateHook</code> component-manager capability (5 of 5)</h5>
<p>There is a new capability for component managers which allows you to opt-in or opt-out of whether to have an <code>updateComponent</code> hook on your component manager.</p>
<p>If you're not an addon author or maintain a component manager, then you are unlikely to need use this new feature.</p>
<h4 id="deprecations1">Deprecations (1)</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.13, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.13.0">Ember.js 3.13.0 release page</a>.</p>
<h5 id="deprecatesupportformouseenterleavemoveemberevents1of1">Deprecate support for mouseEnter/Leave/Move Ember events (1 of 1)</h5>
<p>Ember.js 3.13 deprecates support for <code>mouseEnter</code>, <code>mouseLeave</code> and <code>mouseMove</code> Ember events. <a href="https://deprecations.emberjs.com/v3.x#toc_action-mouseenter-leave-move">The deprecation guide</a> contains guidance on how to migrate away from these events.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata313">Changes in Ember Data 3.13</h3>
<h4 id="newfeatures0">New Features (0)</h4>
<p>No new features introduced in Ember Data 3.13.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember Data 3.13.</p>
<p>For more details on changes in Ember Data 3.13, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.13.0">Ember Data 3.13.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<!--alex ignore easy-->
<p>You may upgrade Ember CLI easily using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the github README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli313">Changes in Ember CLI 3.13</h3>
<p>No new features in Ember CLI 3.13.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.13 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.13.0">Ember CLI  3.13.0 release page</a>.</p>
<h2 id="ember312isanltsrelease">Ember 3.12 is an LTS Release</h2>
<p>If you are upgrading from the previous LTS version (3.8) to 3.12 then you are getting access to these features:</p>
<ul>
<li><code>router</code> service</li>
<li>Support for native classes</li>
<li>The <code>array</code> helper</li>
<li>Element Modifier Manager (and modifiers in general)</li>
<li>Nested angle bracket component invocation</li>
<li>Angle bracket invocation for built-in components</li>
<li>Support for native decorators</li>
<li>The <code>{{fn}}</code> and <code>{{on}}</code> modifiers</li>
</ul>
<h2 id="314beta">3.14 Beta</h2>
<p>This release kicks off the 3.14 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>Among other things, the <a href="https://github.com/emberjs/rfcs/blob/master/text/0523-model-argument-for-route-templates.md"><code>@model</code> named argument</a> will be available to route templates. While not officially an "Octane feature", this feature will available for the first time in the 3.14 release, which coincides with the Octane release. Since the Octane guides and documentation are targeting the same version, you will see them using this feature, but please note that the feature is not available in the 3.13 Octane preview.</p>
<p>This beta release also included a new <a href="https://github.com/emberjs/ember.js/pull/18372">debug render tree API</a>, which will be integrated into the Ember Inspector sometime during the beta cycle to give it full Octane support.
You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without the continued efforts of everyone in the community. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-13-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-13-released</guid><pubDate>Wed, 25 Sep 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.14 Released (Octane Preview Cont.)]]></title><description><![CDATA[<p>The Ember project has recently released version 3.14 of Ember.js, Ember Data, and Ember CLI. This kicks off the 3.15 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="theoctanepreviewcontinued">The Octane Preview, Continued</h2>
<p>As described in the <a href="/2019/10/31/octane-release-update.html">Octane Release Update</a>, Octane will continue to be opt-in in Ember 3.14. By continuing the Octane preview period in 3.14, we are allowing more time for Octane to be polished before it becomes the default Ember experience.</p>
<p>Although Octane is still opt-in in 3.14, all Octane features are stable public APIs with our normal SemVer guarantees. If you build an app using APIs in the Octane preview, it will continue to work in future versions.</p>
<hr />
<p>With the exception of an updated release of <code>@glimmer/component</code>, the steps to try out the Octane preview remain the same in 3.14 as they were in 3.13:</p>
<p>Add the following packages if they aren't already present at this version:</p>
<pre><code class="javascript language-javascript">npm install --save-dev @ember/edition-utils@^1.1.1
npm install --save-dev @glimmer/component@^1.0.0-beta.1
</code></pre>
<p>Disable legacy behavior by setting the following feature flags:</p>
<pre><code class="bash language-bash">ember feature:enable template-only-glimmer-components
ember feature:disable application-template-wrapper
</code></pre>
<p>Specify the Octane edition in <code>.ember-cli.js</code> by adding the following lines to the beginning of the file:</p>
<pre><code class="javascript language-javascript">// .ember-cli.js
const { setEdition } = require("@ember/edition-utils");

setEdition("octane");
</code></pre>
<p>If you have an <code>.ember-cli</code> file instead of an <code>.ember-cli.js</code> file, you can convert it by renaming it to <code>.ember-cli.js</code>, then taking the existing JSON object and assigning it to <code>module.exports</code>. For example, if you have an <code>.ember-cli</code> file with:</p>
<pre><code class="javascript language-javascript">// .ember-cli
{
  "disableAnalytics": false
}
</code></pre>
<p>The equivalent <code>.ember-cli.js</code> file would be:</p>
<pre><code class="javascript language-javascript">// .ember-cli.js
module.exports = {
  disableAnalytics: false
};
</code></pre>
<p>If you need more information on how to migrate away from these legacy features, check out the <a href="/2019/08/15/octane-release-plan.html">Octane release plan</a> blog post.</p>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs314">Changes in Ember.js 3.14</h3>
<p>Ember.js 3.14 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There is one new feature, no deprecations, and several bugfixes in this version.</p>
<h4 id="newfeatures1">New Features (1)</h4>
<h5 id="modelinroutetemplates1of1"><code>@model</code> in Route Templates (1 of 1)</h5>
<p>Route templates can now access the route's model with <code>@model</code> in addition to <code>this.model</code>. By treating <code>@model</code> as an argument, route templates better parallel component templates. Furthermore, the concept of teaching a <code>this</code> context for templates can be delayed.</p>
<p>These motivations as well as the detailed design of this feature are described in <a href="https://github.com/emberjs/rfcs/blob/master/text/0523-model-argument-for-route-templates.md">RFC 523</a>.</p>
<p>A template such as the following can now be refactored from using <code>this.model</code>:</p>
<pre><code class="handlebars language-handlebars">{{!-- The model for this route is the current user --}}

&lt;div&gt;
  Hi &lt;img src="{{this.model.profileImage}}" alt="{{this.model.name}}'s profile picture"&gt; {{this.model.name}},
  this is a valid Ember template!
&lt;/div&gt;

{{#if this.model.isAdmin}}
  &lt;div&gt;Remember, with great power comes great responsibility!&lt;/div&gt;
{{/if}}
</code></pre>
<p>To use <code>@model</code>:</p>
<pre><code class="handlebars language-handlebars">{{!-- The model for this route is the current user --}}

&lt;div&gt;
  Hi &lt;img src="{{@model.profileImage}}" alt="{{@model.name}}'s profile picture"&gt; {{@model.name}},
  this is a valid Ember template!
&lt;/div&gt;

{{#if @model.isAdmin}}
  &lt;div&gt;Remember, with great power comes great responsibility!&lt;/div&gt;
{{/if}}
</code></pre>
<p>The guides will soon be updated to teach the <code>@model</code> form first-and-foremost.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>There are no new deprecations in Ember.js 3.14.</p>
<p>For more details on changes in Ember.js 3.14, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.14.0">Ember.js 3.14.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata314">Changes in Ember Data 3.14</h3>
<p>Ember Data 3.14 contains a number of bugfixes, as well as some documentation
cleanup, performance improvements, and deprecations. Notable changes are
described below.</p>
<h4 id="relationshipfetchingperformance">Relationship Fetching Performance</h4>
<p>Releases of Ember Data since 3.4 contain significant performance regressions for
fetching relationship via <code>links</code>. Ember Data 3.14 addresses many of those
regressions, with performance improvements of roughly 3.5X in some cases as
compared with v3.13.</p>
<h4 id="deprecations1">Deprecations (1)</h4>
<h5 id="defaultadaptersandserializers1of1">Default Adapters and Serializers (1 of 1)</h5>
<p>Ember Data 3.14 introduces deprecations for the default adapters and
serializers. The motivation for these deprecations is described in <a href="https://github.com/emberjs/rfcs/pull/522">RFC
522</a>:</p>
<blockquote>
  <p>The adapter and serializer packages provide reference implementations and base
  classes that are not required for applications that implement their own
  following the required interfaces for adapters and serializers as defined in
  their respective base classes.  Deprecating them allows us to simplify the
  lookup pattern and remove automatic injection and registration of potentially
  unused classes.</p>
  <p>In addition to removing use of initializer injection, this takes a significant
  step toward simplifying the conceptual model for how to determine what
  adapter/serializer is in use. Removing the defaults forces app developers to
  be more cognizant about the type of application level concerns vs
  model-specific concerns; they will now need to explicitly define and use
  specific adapters/serializers.</p>
</blockquote>
<p>For more details on changes in Ember Data 3.14, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.14.0">Ember Data 3.14.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI with ease by using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the github README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli314">Changes in Ember CLI 3.14</h3>
<p>Ember CLI 3.14 contain some bugfixes, updates to blueprints, and one new deprecation.</p>
<h4 id="classierblueprints">"Classier" Blueprints</h4>
<p>The blueprints for <code>ember new</code> and <code>ember addon</code> have been modernized to define an application's <code>Application</code> and <code>Router</code> as native ES classes (i.e. <code>class App extends Application { ... }</code> instead of <code>const App = Application.extend({ ... })</code>). Although both approaches are still valid and <code>EmberObject</code> is far from deprecated, this change improves the consistency and approachability of modern Ember applications.</p>
<h4 id="deprecations1-1">Deprecations (1)</h4>
<p><strong><code>MODULE_UNIFICATION</code> flag (1 of 1)</strong></p>
<p>Ember CLI 3.14 contains a new deprecation for projects that use the <code>MODULE_UNIFICATION</code> flag. This flag has always required using canary versions of Ember and Ember CLI. Now that <code>ember-source</code> has turned off the feature completely, apps can no longer enable the feature at all.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.14 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.14.0">Ember CLI 3.14.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-14-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-14-released</guid><pubDate>Mon, 18 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.15 "Octane" Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.15 of Ember.js, Ember Data, and
Ember CLI. In addition to brining new features and bug fixes, Ember 3.15 also marks the official release of the <a href="https://blog.emberjs.com/2019/12/20/octane-is-here.html">Octane edition</a>, which is Ember's first <a href="https://emberjs.com/editions/">edition release</a>.</p>
<!--alex ignore just-->
<p>Ember developers using the Octane edition can exercise modern features like native ES
classes, decorators, the new Glimmer component API, and a new approach to state
management called tracked properties. Combined, these innovative changes to
Ember are more than just new tools and APIs. Octane's features, together,
sum up to a paradigm shift in how Ember applications are built.</p>
<!-- READMORE -->
<!--alex ignore nuts-->
<p><strong>Read more about how Octane makes web application development fun and
productive in
<a href="https://blog.emberjs.com/2019/12/20/octane-is-here.html">Octane is Here</a>, a blog post from Yehuda.</strong></p>
<p>…and then explore our completely updated and refreshed guide and API
documentation:</p>
<ul>
<li>Check out the completely rewritten <a href="https://guides.emberjs.com/release/components/">core concepts section</a> in the guides.</li>
<li>Read the <a href="https://guides.emberjs.com/release/tutorial/">completely updated Super Rentals tutorial</a>.</li>
<li>Already using Ember and want to adopt Octane? See the <a href="https://guides.emberjs.com/release/upgrading/current-edition/">Octane Upgrade
Guide</a> for the most complete
documentation.</li>
</ul>
<p>In addition to the Octane release, today you can also find version 3.16-beta.1
released for Ember.js, Ember Data, and Ember CLI. As always we encourage our
community (especially addon authors) to help test these beta builds and report
any bugs before they are published as a final release in six weeks' time.</p>
<p>You can read more about Ember's general release process at the <a href="http://emberjs.com/builds/">Release Dashboard</a>.</p>
<hr />
<h2 id="otherchangesinemberjs315">Other Changes in Ember.js 3.15</h2>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>There were three deprecations in Ember.js v3.15.0.</p>
<h3 id="deprecatecomponentisvisible1of3">Deprecate <code>Component#isVisible</code> (1 of 3)</h3>
<p>Classic Ember components support using the <code>isVisible</code> property to toggle the
visibility of a component's root element. This API was very common in early
Ember 1.x applications but is rare today. In practice use of template bindings
has supplanted use of the <code>isVisible</code> API.</p>
<p><code>isVisible</code> is deprecated as of Ember 3.15.</p>
<p>To transition away from this, we recommend using conditionals in a template:</p>
<pre><code class="handlebars language-handlebars">{{#if this.showComponent}}
  &lt;MyComponent /&gt;
{{/if}}

{{! or }}
&lt;div hidden={{this.isHidden}}&gt;&lt;/div&gt;
</code></pre>
<p>See the <a href="https://deprecations.emberjs.com/v3.x#toc_ember-component-is-visible">deprecation guide for
<code>isVisible</code></a>
for more information.</p>
<h3 id="deprecatepartial2of3">Deprecate <code>{{partial}}</code> (2 of 3)</h3>
<p>As of the introduction of <a href="https://api.emberjs.com/ember/3.15/classes/Component">template-only
components</a>
and <a href="https://api.emberjs.com/ember/3.15/modules/@glimmer%2Fcomponent">Glimmer
components</a>,
as well as of the
<a href="https://guides.emberjs.com/release/configuring-ember/optional-features/#toc_template-only-glimmer-components"><code>template-only-glimmer-components</code></a>
optional feature the <code>{{partial}}</code> API in Ember no longer provides any unique
benefits. Instead it has several downsides including difficult to teach scoping
rules and poor performance.</p>
<p>See the <a href="https://deprecations.emberjs.com/v3.x#toc_ember-partial">deprecation guide for
<code>{{partial}}</code></a> for
an example of how to migration existing use to component APIs.</p>
<h3 id="deprecateintimatewindowenvapi3of3">Deprecate intimate <code>window.ENV</code> API (3 of 3)</h3>
<p>Ember applications long ago shifted to using <code>window.EmberENV</code> as the home of
various configuration options. As of 3.15.0 application code which uses <code>window.ENV</code>
for Ember configuration values will cause a deprecation warning to be issued.
Support for this intimate API will be removed in 3.17.0.</p>
<p>See <a href="https://github.com/emberjs/ember.js/pull/18441">emberjs/ember.js#18441</a>
for more details about this deprecation.</p>
<p>For more details on changes in Ember.js 3.15, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.15.0">Ember.js 3.15.0 release page</a>.</p>
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<p>There were two new features and no deprecations for EmberData v.3.15.0.</p>
<h3 id="identifiers1of2">Identifiers (1 of 2)</h3>
<p>Identifiers provides infrastructure for handling identity within ember-data to satisfy
requirements around improved caching, serializability, replication, and handling of
remote data.</p>
<p>For more information read <a href="https://github.com/emberjs/rfcs/blob/master/text/0403-ember-data-identifiers.md">RFC-403 Identifiers</a>.</p>
<h3 id="inspectorsupportisnowoptionalinproduction2of2">Inspector Support is now optional in production (2 of 2)</h3>
<p>EmberData ships with a <code>DataAdapter</code> which provides the necessary support for
the data panel in the <a href="https://github.com/emberjs/ember-inspector">Ember Inspector</a>.</p>
<p>This package adds roughly .6 KB when minified and compressed to your application
in production; however, you can now opt out of shipping this addon in production
via options in <code>ember-cli-build.js</code></p>
<pre><code class="javascript language-javascript">let app = new EmberApp(defaults, {
  emberData: {
    includeDataAdapterInProduction: false
  }
});
</code></pre>
<p>When using <code>ember-data</code> as a dependency of your app, the default is to ship the
inspector support to production.</p>
<p>When not using <code>ember-data</code> as a dependency but instead using EmberData via
declaring specific <code>@ember-data/&lt;package&gt;</code> dependencies the default is to not
ship to production.</p>
<p>For additional details on changes in Ember Data 3.15.0, please review the full
<a href="https://github.com/emberjs/data/blob/release/CHANGELOG.md#release-3150-december-18-2019">Ember Data 3.15.0 change log</a>.</p>
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<p>There were some noteworthy changes in <code>ember-cli</code> to support the release of the Octane edition of Ember. The <code>@glimmer/component@1.0.0</code> package was added as a dev dependency for both apps and addons, Octane-related optional features were enabled, <code>ember-template-lint</code> was updated to use the <code>octane</code> edition preset, and all packages were updated to their latest version in the application blueprint!</p>
<p>The new addon blueprint also dropped the Ember 3.4 ember-try scenario, but dropping support for existing addons should be considered a breaking change. Existing addons should either keep the scenario, or do a major version bump if they drop support for older Ember versions.</p>
<p>For additional details on the changes in Ember CLI 3.15.0 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.15.0">Ember CLI 3.15.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-15-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-15-released</guid><pubDate>Fri, 20 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.16 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.16 of Ember.js, Ember Data, and Ember CLI. This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule.</p>
<p>This release kicks off the 3.17 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs316">Changes in Ember.js 3.16</h3>
<p>The 3.16.0 release is an Ember.js Long-Term Support candidate. In six weeks, the 3.16.x series will become the latest LTS release and six weeks after that the 3.12 LTS branch will no longer receive bugfix patches. LTS versions allow teams to upgrade less frequently while still getting support from the Ember project and the wider ecosystem.</p>
<p>For more information about Ember's LTS policies, see the <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">announcement blog post</a> and <a href="http://emberjs.com/builds/">builds page</a>.</p>
<p>Ember.js 3.16 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There are zero (0) new features, one (1) deprecation, and several bugfixes in this version.</p>
<h4 id="newfeatures0">New Features (0)</h4>
<p>There are no new features in Ember.js 3.16.</p>
<h4 id="deprecations1">Deprecations (1)</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.16, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.16.0">Ember.js 3.16.0 release page</a>.</p>
<h5 id="deprecateglobalresolver1of1">Deprecate Global Resolver (1 of 1)</h5>
<p>Over the past years we have transitioned to using Ember-CLI as the main way to compile Ember apps. The globals resolver is a holdover and primarily facilitates use of Ember without Ember-CLI.</p>
<p>For more information please refer to the <a href="https://deprecations.emberjs.com/v3.x#toc_ember-deprecate-globals-resolver">deprecations guide</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata316">Changes in Ember Data 3.16</h3>
<h4 id="newfeatures0-1">New Features (0)</h4>
<p>No new features introduced in Ember Data 3.16.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember Data 3.16.</p>
<p>For more details on changes in Ember Data 3.16, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.16.0">Ember Data 3.16.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the github README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli316">Changes in Ember CLI 3.16</h3>
<h4 id="newfeatures2">New Features (2)</h4>
<h5 id="dropnode8support1of2">Drop Node 8 support (1 of 2)</h5>
<p>Ember CLI 3.16 officially drops support for Node 8. Ember.js still supports it until all the blueprints are updated.
Maintainers of addons are encouraged to make a <em>major version</em> release of their addons when upgrading to 3.16, since dropping Node 8 support may be a breaking change for some of their library's users.</p>
<h5 id="dropember38fromembertrytestscenariosinaddonblueprints2of2">Drop Ember 3.8 from <code>ember-try</code> test scenarios in addon blueprints (2 of 2)</h5>
<p>For addons that are upgrading to version 3.16 of Ember CLI, note that the <code>ember-try.js</code> scenarios
in the blueprints no longer include 3.8. Addon maintainers who decide to also drop Ember 3.8 from
their own test scenarios are encouraged to make a <em>major version</em> release of their addons.</p>
<h4 id="deprecations0-1">Deprecations (0)</h4>
<p>There are no new deprecations in Ember CLI 3.16.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.16 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.16.0">Ember CLI 3.16.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-16-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-16-released</guid><pubDate>Wed, 12 Feb 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.17 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.17 of Ember.js, Ember Data, and Ember CLI.</p>
<p>Version 3.16 of Ember is now promoted to LTS (Long Term Support). An LTS version of Ember continues to receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks). LTS releases typically occur every four minor versions. The previous LTS version of Ember was 3.12.</p>
<p>This release also kicks off the 3.18 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs317">Changes in Ember.js 3.17</h3>
<p>Ember.js 3.17 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There are no new features, zero (0) deprecations, and several bugfixes in this version.</p>
<h4 id="newfeatures0">New Features (0)</h4>
<p>No new features in Ember.js 3.17, but it is worth noting that the Glimmer rendering engine has been updated significantly.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>No new deprecations are added in Ember.js 3.17.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata317">Changes in Ember Data 3.17</h3>
<h4 id="newfeatures0-1">New Features (0)</h4>
<p>No new features introduced in Ember Data 3.17.</p>
<h4 id="deprecations0-1">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember Data 3.17.</p>
<p>For more details on changes in Ember Data 3.17, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.17.0">Ember Data 3.17.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<!--alex ignore easy-->
<p>You may upgrade Ember CLI easily using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the github README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli317">Changes in Ember CLI 3.17</h3>
<h4 id="newfeatures0-2">New Features (0)</h4>
<p>There are no new features in Ember CLI 3.17. However, there are some other changes worth celebrating:</p>
<ul>
<li>The internal usage of <code>RSVP</code> has been removed and migrated to use native promises`</li>
<li>Drop <code>ember-cli-eslint/ember-cli-template-lint</code> in favor of using <code>eslint</code> and <code>ember-template-lint</code> directly</li>
<li>Ensure <code>npm test</code> / <code>yarn test</code> fail when <code>lint:js</code> or <code>lint:hbs fail</code></li>
<li>Ensure <code>npm test</code> / <code>yarn test</code> in an addon fails if ember-try scenarios fail</li>
<li>Remove a number of older experiments (module unification and delayed transpilation)</li>
</ul>
<h4 id="deprecations0-2">Deprecations (0)</h4>
<p>There are no new deprecations in Ember CLI 3.17.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.17 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.17.0">Ember CLI 3.17.0 release page</a>.</p>
<h2 id="ember316isanltsrelease">Ember 3.16 is an LTS Release</h2>
<p>If you are upgrading from the previous LTS version (3.12) to 3.16 then you are getting access to these features:</p>
<ul>
<li>Tracked properties (3.13)</li>
<li>Component templates co-location (3.13)</li>
<li><code>component-class</code> generator (3.13)</li>
<li><code>@model</code> in route templates (3.14)</li>
<li>Improved performance in fetching relationship (3.14)</li>
<li>"Classier" blueprints (3.14)</li>
<li>Octane preset for <code>ember-template-lint</code> (3.15)</li>
</ul>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-17-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-17-released</guid><pubDate>Mon, 16 Mar 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.18 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.18 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release also kicks off the 3.19 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs318">Changes in Ember.js 3.18</h3>
<p>Ember.js 3.18 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There are no new features, zero (0) deprecations, and several bugfixes in this version.</p>
<h4 id="newfeatures0">New Features (0)</h4>
<p>No new features in Ember.js 3.18, but it is worth noting support for Node 8 has been dropped for Ember.js as specified in <a href="https://blog.emberjs.com/2016/09/07/ember-node-lts-support.html">Ember Node LTS Support</a>.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>No new deprecations are added in Ember.js 3.18.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata318">Changes in Ember Data 3.18</h3>
<h4 id="newfeatures0-1">New Features (0)</h4>
<p>No new features introduced in Ember Data 3.18.</p>
<h4 id="deprecations0-1">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember Data 3.18.</p>
<p>For more details on changes in Ember Data 3.18, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.18.0">Ember Data 3.18.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<!--alex ignore easy-->
<p>You may upgrade Ember CLI easily using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli318">Changes in Ember CLI 3.18</h3>
<h4 id="newfeatures0-2">New Features (0)</h4>
<p>There are no new features in Ember CLI 3.18. However, there are some other changes worth celebrating:</p>
<ul>
<li>Ensure errors during build are properly reported to the console.</li>
<li>Ensure processed addon styles are not doubly-included in <code>vendor.css</code>.</li>
</ul>
<h4 id="deprecations0-2">Deprecations (0)</h4>
<p>There are no new deprecations in Ember CLI 3.18.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.18 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.18.0">Ember CLI 3.18.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-18-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-18-released</guid><pubDate>Tue, 05 May 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.19 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.19 of Ember.js, Ember Data, and Ember CLI. This release kicks off the 3.20 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs319">Changes in Ember.js 3.19</h3>
<p>Ember.js 3.19 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There is zero (0) new feature, zero (0) deprecations, and several bugfixes in this version.</p>
<h4 id="newfeatures0">New Features (0)</h4>
<p>There are no new features introduced in Ember.js 3.19.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>There are no new deprecations introduced in Ember.js 3.19.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata319">Changes in Ember Data 3.19</h3>
<h4 id="newfeatures0-1">New Features (0)</h4>
<p>There are no new features introduced in Ember Data 3.19.</p>
<h4 id="deprecations0-1">Deprecations (0)</h4>
<p>There are no new deprecations introduced in Ember Data 3.19.</p>
<p>For more details on changes in Ember Data 3.19, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.19.0">Ember Data 3.19.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<!--alex ignore easy-->
<p>You may upgrade Ember CLI easily using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the github README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli319">Changes in Ember CLI 3.19</h3>
<h4 id="newfeatures0-2">New Features (0)</h4>
<p>There are no new features introduced in Ember CLI 3.19.</p>
<h4 id="deprecations0-2">Deprecations (0)</h4>
<p>There are no new deprecations introduced in Ember CLI 3.19.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.19 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.19.0">Ember CLI 3.19.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-19-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-19-released</guid><pubDate>Fri, 26 Jun 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.2 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.2.0 of Ember.js, Ember Data, and Ember CLI- a little later than planned, for sure! Thank you for your support and patience.</p>
<p>This release kicks off the 3.3 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report
any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to
continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<p>Note that we didn't include 3.3 beta features in this blog post, mostly because we were so focused on getting 3.2 out the door, and had to prioritize. Thank you for understanding!</p>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs32">Changes in Ember.js 3.2</h3>
<p>Ember.js 3.2 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There is one (1) new feature and three (3) deprecations in this version.</p>
<h4 id="newfeatures1">New Features (1)</h4>
<h5 id="blocklettemplatehelper1of1">Block let template helper (1 of 1)</h5>
<p>The new <code>let</code> template helper makes it possible to create new bindings in templates. It is like <code>with</code> but without the conditional rendering of the block depending on values passed to the block.</p>
<p>Let's say we need to capitalize the first name and last name in our template. We could do something like this:</p>
<pre><code class="handlebars language-handlebars">Welcome back {{concat (capitalize person.firstName) ' ' (capitalize person.lastName)}}

Account Details:
First Name: {{capitalize person.firstName}}
Last Name: {{capitalize person.lastName}}
</code></pre>
<p>This could result in an error since we have to keep track of this throughout the template. Thankfully, this is now easier with the <code>let</code> helper:</p>
<pre><code class="handlebars language-handlebars">{{#let (capitalize person.firstName) (capitalize person.lastName)
  as |firstName lastName|
}}
  Welcome back {{concat firstName ' ' lastName}}

  Account Details:
  First Name: {{firstName}}
  Last Name: {{lastName}}
{{/let}}
</code></pre>
<p>Now you can use <code>firstName</code> and <code>lastName</code> inside the <code>let</code> block with the comfort of knowing that the logic is in a single place. This is a neat way of introducing bindings in your templates without making them properties on the controller or component.</p>
<p>What is important to know about the <code>let</code> helper is that it only works as a block helper. This means that you cannot do something like this:</p>
<pre><code class="handlebars language-handlebars">{{let
  firstName=(capitalize person.firstName)
  lastName=(capitalize person.lastName)
}}
</code></pre>
<h4 id="deprecations3">Deprecations (3)</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<h5 id="useofemberlogger1of3">Use of Ember.Logger (1 of 3)</h5>
<p>Use of <code>Ember.Logger</code> is deprecated. You should replace any calls to <code>Ember.Logger</code> with calls to <code>console</code>.</p>
<p>In Microsoft Edge and IE11, uses of console beyond calling its methods may require more subtle changes than only substituting console wherever <code>Logger</code> appears. In these browsers, they will behave as they do in other browsers when the development tools are open.</p>
<!-- alex ignore invalid -->
<p>But, when run normally, calls to its methods must not be bound to anything other than  the console object. If not, you will receive an Invalid calling object exception. This is a known inconsistency with these browsers.</p>
<p>To avoid this, transform this:</p>
<pre><code class="javascript language-javascript">var print = Logger.log; // assigning method to variable
</code></pre>
<p>into this:</p>
<pre><code class="javascript language-javascript">// assigning method bound to console to variable
var print = console.log.bind(console);
</code></pre>
<p>Also, transform any of the following:</p>
<pre><code class="javascript language-javascript">Logger.info.apply(undefined, arguments); // or
Logger.info.apply(null, arguments); // or
Logger.info.apply(this, arguments); // or
</code></pre>
<p>into this:</p>
<pre><code class="javascript language-javascript">console.info.apply(console, arguments);
</code></pre>
<p>Finally, because node versions before version 9 don't support console.debug, you may want to transform the following:</p>
<pre><code class="javascript language-javascript">Logger.debug(message);
</code></pre>
<p>into this:</p>
<pre><code class="javascript language-javascript">if (console.debug) {
  console.debug(message);
} else {
  console.log(message);
}
</code></pre>
<p><strong>Note for Add-on Authors</strong> - If your add-on needs to support both Ember 2.x and Ember 3.x clients, you will need to test for the existence of console before calling its methods. If you do much logging, you may find it convenient to define your own wrapper. Writing the wrapper as a service will provide for dependency injection by tests and perhaps even clients.</p>
<h5 id="privateapirouterrouterrenamed2of3">Private API Router#router renamed (2 of 3)</h5>
<p>In order to avoid collisions with user-defined properties or methods, the <code>Router#router</code> private API has been renamed to <code>Router#_router</code>. If you want access to the router, you should inject the router service into the route like this:</p>
<pre><code class="javascript language-javascript">import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';

export default Route.extend({
  router: service()
});
</code></pre>
<h5 id="definecomputedpropertieswithdefineproperty3of3">Define computed properties with defineProperty (3 of 3)</h5>
<p>Use <code>defineProperty</code> (via <code>import { defineProperty } from '@ember/object';</code>) to define computed properties. Although uncommon, it is possible to assign computed properties directly to objects. This way they are implicitly computed from things like <code>Ember.get</code>. Assigning computed properties directly is deprecated to support ES5 getter computed properties, and you should replace these assignments with calls to <code>defineProperty</code>.</p>
<p>For example, the following:</p>
<pre><code class="javascript language-javascript">import { computed, get } from '@ember/object';
let object = {};
object.key = computed(() =&gt; 'value');
get(object, 'key') === 'value';
</code></pre>
<p>Should be changed to this:</p>
<pre><code class="javascript language-javascript">import { computed, defineProperty, get } from '@ember/object';
let object = {};
defineProperty(object, 'key', computed(() =&gt; 'value'));
get(object, 'key') === 'value';
</code></pre>
<p>For more details on changes in Ember.js 3.2, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.2.0">Ember.js 3.2.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata32">Changes in Ember Data 3.2</h3>
<p>There are four (4) new features and zero (0) deprecations in the Ember Data 3.2 release.</p>
<h4 id="newfeatures4">New Features (4)</h4>
<h5 id="lazyrelationshippayloads1of4">Lazy Relationship Payloads (1 of 4)</h5>
<p>In Ember Data 2.14 lazy-relationship parsing was introduced. Because this parsing used left-side/right-side keying, this meant it was not compatible with polymorphic relationships.</p>
<p>With Ember Data 3.2 this is <a href="https://github.com/emberjs/data/pull/5230">now fixed</a>.</p>
<h5 id="emberdatafeatureflagremoval2of4">Ember Data Feature Flag Removal (2 of 4)</h5>
<p>The current feature flags for Ember Data have gone stale, therefore they are all <a href="https://github.com/emberjs/data/pull/5384">removed in Ember Data 3.2</a>. Ember Data is going to attempt to go in a different direction with some of the planned changes for 2018.</p>
<p>If your app depends on enabling these feature flags to run, please reach out to the Ember Data team by opening a github issue on the <a href="https://github.com/emberjs/data/issues">Ember Data repo</a> and the Ember Data team will try to assist with the transition.</p>
<h5 id="featureflagdsimprovedajax3of4">Feature Flag <code>ds-improved-ajax</code> (3 of 4)</h5>
<p>The Ember Data team has released an addon that will support the <code>ds-improved-ajax</code> API.</p>
<h5 id="featureflagdspushpayloadreturn4of4">Feature Flag <code>ds-pushpayload-return</code> (4 of 4)</h5>
<p>If you rely on the <code>ds-pushpayload-return</code> feature flag, you can use the following pattern to manually serialize the API response and push the record into the store.</p>
<pre><code class="javascript language-javascript">export function pushPayload(store, modelName, rawPayload) {
   let ModelClass = store.modelFor(modelName);
   let serializer = store.serializerFor(modelName);

   let jsonApiPayload = serializer.normalizeResponse(store, ModelClass, rawPayload, null, 'query');

  return store.push(jsonApiPayload);
}
</code></pre>
<pre><code class="javascript language-javascript">// Before
this.get('store').pushPayload(modelName, rawPayload);

// After
import { pushPayload } from '&lt;app-name&gt;/utils/push-payload';

pushPayload(this.get('store'), modelName, rawPayload);
</code></pre>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>There are no deprecations introduced in Ember Data 3.2.</p>
<p>For more details on changes in Ember Data 3.2, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.2.0">Ember Data 3.2.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! To upgrade your projects using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the upgrade command run <code>ember init</code> inside of the project directory to apply the blueprint changes. You can preview those changes for <a href="https://github.com/ember-cli/ember-new-output/compare/v3.1.0…v3.2.0">applications</a> and <a href="https://github.com/ember-cli/ember-addon-output/compare/v3.1.0…v3.2.0">addons</a>.</p>
<h3 id="changesinembercli32">Changes in Ember CLI 3.2</h3>
<p>There are two (2) new features and one (1) deprecation in the Ember CLI 3.2 release.</p>
<h4 id="newfeaturesandupdates2">New Features and Updates (2)</h4>
<h5 id="qunitdom1of2">qunit-dom (1 of 2)</h5>
<p>In order to make DOM assertions more readable, the <a href="https://github.com/simplabs/qunit-dom/">qunit-dom</a> dependency will be added <strong>by default</strong> to all apps and addons. Opt out by removing it from your package.json file. See <a href="https://github.com/simplabs/qunit-dom-codemod">https://github.com/simplabs/qunit-dom-codemod</a> to ease migration.</p>
<p>This code:</p>
<pre><code class="javascript language-javascript">assert.equal(this.element.querySelector('.title').textContent.trim(), 'Hello World!');
</code></pre>
<p>becomes this:</p>
<pre><code class="javascript language-javascript">assert.dom('.title').hasText('Hello World!');
</code></pre>
<h5 id="updateembercliqunitdependency2of2">Update <code>ember-cli-qunit</code> dependency (2 of 2)</h5>
<p>When upgrading an Ember 2.18 app to Ember 3.0, the version of <code>ember-cli-qunit</code> was not updated from ^4.1.1. If there was already a package lockfile, then the version of it wouldn't be updated, making the <code>find()</code> helper unavailable in the Ember 3.0 style of testing. This has now been updated in the blueprint package.json to ^4.3.2, to ensure that <code>find()</code> will be available in upgraded projects. It should be noted that this problem doesn't occur for newly-created projects or for projects that don't have an NPM or Yarn package lockfile, because the version constraint ^4.1.1 will pull down 4.3.2 or newer.</p>
<h4 id="deprecations1">Deprecations (1)</h4>
<h5 id="emberclibabel51of1">ember-cli-babel 5 (1 of 1)</h5>
<p>This release of Ember CLI <a href="https://github.com/ember-cli/ember-cli/pull/7676">deprecates <code>ember-cli-babel</code> 5.x</a>. Babel 6 support has been out for a long time now and works quite well. Babel 5 support is deprecated and is expected to be dropped soon.</p>
<hr />
<p>There were some other bug fixes in this version release that were not included in this blog post. For more details on the changes in Ember CLI 3.2.0 and detailed upgrade instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.2.0">Ember CLI 3.2.0 release page</a>.</p>
<p>Thank you to <a href="https://github.com/rwjblue">@rwjblue</a>, <a href="https://github.com/Turbo87">@Turbo87</a>, <a href="https://github.com/ef4">@ef4</a>, <a href="https://github.com/CodingItWrong">@CodingItWrong</a>, <a href="https://github.com/kellyselden">@kellyselden</a>, <a href="https://github.com/stefanpenner">@stefanpenner</a>, <a href="https://github.com/dnachev">@dnachev</a>, and <a href="https://github.com/twokul">@twokul</a>
for your incredible work on ember-cli!</p>
<p>For more details on the changes in Ember CLI 3.2 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.2.0">Ember CLI  3.2.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-2-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-2-released</guid><pubDate>Mon, 02 Jul 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.20 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.20 of Ember.js, Ember Data, and Ember CLI. This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule.</p>
<p>This release kicks off the 3.21 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs320">Changes in Ember.js 3.20</h3>
<p>Ember.js 3.20 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations.</p>
<p>Developers who upgrade their Ember apps to <code>v3.20</code> should also update <code>@glimmer/component</code> to <code>v1.0.1</code> to avoid a deprecation warning that comes from the <code>@glimmer/component</code> package's use of a private API.</p>
<h4 id="newfeatures1">New Features (1)</h4>
<h5 id="inelement"><code>{{in-element}}</code></h5>
<p>Have you ever wished you could render a component somewhere outside of the usual HTML flow? To help with this, Ember.js now provides the <code>{{in-element}}</code> helper as public API. If you have used community addons like <a href="https://github.com/yapplabs/ember-wormhole">ember-wormhole</a> or <a href="https://github.com/ef4/ember-elsewhere">ember-elsewhere</a>, you are probably familiar with the challenge that <code>{{in-element}}</code> aims to solve.</p>
<p>To use the helper, pass in a DOM element to target (<code>this.myDestinationElement</code> in the example below) and a block to render:</p>
<pre><code class="handlebars language-handlebars">{{#in-element this.myDestinationElement}}
  &lt;div&gt;Some content&lt;/div&gt;
{{/in-element}}
</code></pre>
<p>This new public API behaves a little differently from the private API:</p>
<ul>
<li>For the public API <code>{{in-element}}</code>, by default, the rendered content will replace all the content of the destination, effectively becoming its <code>innerHTML</code>. If you want it to be appended instead of replacing the content, you can pass in <code>insertBefore=null</code>.</li>
<li>In the private API <code>{{-in-element}}</code>, the rendered content was appended to any existing content in the destination.</li>
</ul>
<p>Developers should use the public API, <code>{{in-element}}</code>, and discontinue using <code>{{-in-element}}</code>.</p>
<p>See <a href="https://emberjs.github.io/rfcs/0287-promote-in-element-to-public-api.html">RFC 287</a> for more information about the motivation for this new feature.</p>
<h4 id="deprecations1">Deprecations (1)</h4>
<h5 id="metaprototypesetsourcedestroyedandmetaprototypesetsourcedestroying"><code>Meta.prototype.setSourceDestroyed</code> and <code>Meta.prototype.setSourceDestroying</code></h5>
<p>Previous versions of the <code>@glimmer/component</code> package relied on this intimate API, which is now deprecated.
To resolve deprecation warnings in your own apps and addons, update your version of <code>@glimmer/component</code> to at least <a href="https://github.com/glimmerjs/glimmer.js/releases/tag/v1.0.1"><code>v1.0.1</code></a>.</p>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each public API deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.20, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.20.0">Ember.js 3.20.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata320">Changes in Ember Data 3.20</h3>
<p>In addition to a new feature, this release also includes some performance optimizations for visiting relating records and updating has-many relationships.</p>
<h4 id="newfeatures1-1">New Features (1)</h4>
<h5 id="isembeddedrecordsmixincompatible"><code>isEmbeddedRecordsMixinCompatible</code></h5>
<p>Previously, if you used the <code>EmbeddedRecordsMixin</code> and <code>JSONAPISerializer</code> together, the app would show a warning that this combination did not work.
However, some developers may have APIs that would have theoretically been compatible.
For those use cases, you can now set <code>this.isEmbeddedRecordsMixinCompatible = true</code> in the serializer, and you will no longer see the warning.</p>
<p>For apps that mistakenly use the <code>EmbeddedRecordsMixin</code> and <code>JSONAPISerializer</code> together, without setting the boolean, the app will now assert instead of warn.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember Data 3.20.</p>
<p>For more details on changes in Ember Data 3.20, please review the
<a href="https://github.com/emberjs/data/blob/v3.20.0/CHANGELOG.md#release-3200-july-16-2020">Ember Data 3.20.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<!--alex ignore easy-->
<p>You may upgrade Ember CLI easily using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli320">Changes in Ember CLI 3.20</h3>
<h4 id="newfeatures1-2">New Features (1)</h4>
<h5 id="syncingblueprints">Syncing Blueprints</h5>
<p>Apps and addons can update the <code>ember-cli</code> version in their app without impacting future <a href="https://github.com/ember-cli/ember-cli-update"><code>ember-cli-update</code></a> runs.</p>
<p>Before this new feature, <code>ember-cli-update</code> used the current version of <code>ember-cli</code> in the <code>package.json</code> to determine which version to attempt to update from. Unfortunately, that meant that if you were to update your <code>ember-cli</code> version without also running the full blueprint update, you would have a much harder time updating your general project structure in the future.</p>
<p>See the <a href="https://emberjs.github.io/rfcs/0477-blueprints-update.html">Syncing Blueprints RFC</a> to learn more about the motivation and design of this feature!</p>
<h4 id="deprecations2">Deprecations (2)</h4>
<ul>
<li>Usage on Node 13 will now issue a warning</li>
<li>Usage of the <code>PACKAGER</code> experiment is deprecated. This only affects apps that opted into setting the <code>EMBER_CLI_PACKAGER</code> environment variable.</li>
</ul>
<hr />
<p>For more details on the changes in Ember CLI 3.20 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.20.0">Ember CLI 3.20.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-20-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-20-released</guid><pubDate>Wed, 29 Jul 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.21 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.21 of Ember.js, Ember Data, and Ember CLI.</p>
<p>Version 3.20 of Ember is now promoted to LTS (Long Term Support). An LTS version of Ember continues to receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks). LTS releases typically occur every four minor versions. The previous LTS version of Ember was 3.16.</p>
<p>This release kicks off the 3.22 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs321">Changes in Ember.js 3.21</h3>
<p>Ember.js 3.21 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations.</p>
<h4 id="newfeatures">New Features</h4>
<p>Ember.js 3.21 introduced no new features.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 3.21 introduced 1 deprecation.</p>
<ol>
<li><code>getWithDefault</code> (both the function and class method) has been <a href="https://github.com/emberjs/ember.js/pull/18993">deprecated</a> per <a href="https://github.com/emberjs/rfcs/blob/master/text/0554-deprecate-getwithdefault.md">RFC #554</a>.</li>
</ol>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.21, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.21.0">Ember.js 3.21.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata321">Changes in Ember Data 3.21</h3>
<p>Ember Data 3.21 release saw a few improvements to documentation and continuous integration.</p>
<h4 id="newfeatures-1">New Features</h4>
<p>Ember Data 3.21 introduced no new features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 3.21 introduced no deprecations.</p>
<p>For more details on changes in Ember Data 3.21, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.21.0">Ember Data 3.21.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<!--alex ignore easy-->
<p>You may upgrade Ember CLI easily using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli321">Changes in Ember CLI 3.21</h3>
<h4 id="newfeatures-2">New Features</h4>
<p>Ember CLI 3.21 introduced 2 new features.</p>
<ol>
<li><p><code>ember new --lang</code> support has <a href="https://github.com/ember-cli/ember-cli/pull/9259">landed</a> per <a href="https://github.com/emberjs/rfcs/blob/master/text/0635-ember-new-lang.md">RFC #635</a>.</p></li>
<li><p><a href="https://github.com/ember-cli/ember-try">ember-try</a> configuration for addons has been updated. <a href="https://github.com/ember-cli/ember-cli/pull/9310"><code>ember-lts-3.12</code> has been dropped</a> from the default testing matrix. (Existing addons should consider this as a breaking change.) In addition, <a href="https://github.com/ember-cli/ember-cli/pull/9308"><code>ember-lts-3.20</code> has been added</a> to the default testing matrix.</p></li>
</ol>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 3.21 introduced no deprecations.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.21 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.21.0">Ember CLI 3.21.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-21-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-21-released</guid><pubDate>Wed, 02 Sep 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.22 Released]]></title><description><![CDATA[<!-- alex disable retext-equality -->
<p>Today the Ember project is releasing version 3.22 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 3.23 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs322">Changes in Ember.js 3.22</h3>
<p>Ember.js 3.22 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations.</p>
<p>Ember.js 3.22 introduced several bug fixes, including:</p>
<ul>
<li><code>RouterService#isActive</code> updates correctly when the route changes. (<a href="https://github.com/emberjs/ember.js/pull/19094">#19094</a>)</li>
<li>A custom modifier manager only consumes arguments that it actually uses. (Previously, the manager would eagerly consume all arguments.) In order for specific modifiers to take advantage of this change, they need to call <code>modifierCapabilities('3.22')</code> (instead of <code>'3.13'</code>). (<a href="https://github.com/emberjs/ember.js/pull/19163">#19163</a>)</li>
<li>Modifier manager accepts the resolved value of <code>owner.factoryFor</code> directly. This approach aligns with how helpers and component managers work. (<a href="https://github.com/emberjs/ember.js/pull/19170">#19170</a>)</li>
<li>Changes made to <code>protocolForUrl</code> (in <code>3.22.0-beta.2+</code>) work in <code>fastboot@3.1.0</code> environment by leveraging the native JavaScript <code>URL</code> global. (<a href="https://github.com/emberjs/ember.js/pull/19124">#19124</a>)</li>
</ul>
<h4 id="newfeatures">New Features</h4>
<p>Ember.js 3.22 introduced 3 features.</p>
<ol>
<li>Enabled <code>@ember/destroyable</code> API, which allows you to create and manage your own destroyables. For more information, please see the <a href="https://emberjs.github.io/rfcs/0580-destroyables.html">Destroyables RFC</a>.</li>
<li>Enabled Cache API, a low-level primitive for memoizing the result of a function based on autotracking. (You can install a <a href="https://github.com/ember-polyfills/ember-cache-primitive-polyfill">polyfill</a> for apps between versions 3.13 and 3.21.) For more information, please check the <a href="https://guides.emberjs.com/release/in-depth-topics/autotracking-in-depth/#toc_caching-of-tracked-properties">Ember Guides</a> and <a href="https://emberjs.github.io/rfcs/0615-autotracking-memoization.html">Autotracking Memoization RFC</a>.</li>
<li>Allowed passing the <code>transition</code> object to 2 route hooks, <code>activate</code> and <code>deactivate</code>.</li>
</ol>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 3.22 introduced 0 deprecations.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata322">Changes in Ember Data 3.22</h3>
<p>Ember Data 3.22 included several bug fixes of note, including:</p>
<ul>
<li>several fixes ensuring that the <code>Errors.errorsFor</code> array and subarray are properly updated and that autotracking works <a href="https://github.com/emberjs/data/pull/7273">#7273</a>, <a href="https://github.com/emberjs/data/pull/7330">#7330</a>, and <a href="https://github.com/emberjs/data/pull/7331">#7331</a>;</li>
<li><a href="https://github.com/emberjs/data/pull/7322">#7322</a> disables the esm cache to solve build time errors some applications were experiencing; and</li>
<li><a href="https://github.com/emberjs/data/pull/7126">#7126</a> addresses relationship state when sideposting with <code>lid</code>.</li>
</ul>
<h4 id="newfeatures-1">New Features</h4>
<p>Ember Data 3.22 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 3.22 introduced 1 deprecation.</p>
<ol>
<li>Use of <code>najax</code> has been <a href="https://github.com/emberjs/data/pull/7230">deprecated</a> in favor of <code>ember-fetch</code> when FastBoot is installed. To learn how to migrate your app, please see the <a href="https://deprecations.emberjs.com/ember-data/v3.x/#toc_ember-data-najax-fallback">Deprecations Guide</a>.</li>
</ol>
<p>For more details on changes in Ember Data 3.22, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.22.0">Ember Data 3.22.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<!--alex ignore easy-->
<p>You may upgrade Ember CLI easily using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli322">Changes in Ember CLI 3.22</h3>
<p>Ember CLI 3.22 includes only internal changes. However, please note that <a href="https://github.com/ember-cli/eslint-plugin-ember">eslint-plugin-ember</a> released a new major version, <code>v9.x</code>. The new version introduces 6 recommended rules and removes support of Node <code>v13</code>.</p>
<p>New Ember apps will install <code>v9</code> or higher of <code>eslint-plugin-ember</code>, which may limit the version of Node that you use. To learn more, please <a href="https://github.com/ember-cli/eslint-plugin-ember/releases/tag/v9.0.0">check out the changelog for <code>eslint-plugin-ember</code></a>.</p>
<h4 id="newfeatures-2">New Features</h4>
<p>Ember CLI 3.22 introduced 0 features.</p>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 3.22 introduced 0 deprecations.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.22 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.22.0">Ember CLI 3.22.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-22-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-22-released</guid><pubDate>Tue, 20 Oct 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.23 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.23 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 3.24 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs323">Changes in Ember.js 3.23</h3>
<p>Ember.js 3.23 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations.</p>
<p>Ember.js 3.23 introduced several bug fixes, including:</p>
<ul>
<li>Updated Glimmer (rendering engine) to improve developer experience with debugging (<a href="https://github.com/emberjs/ember.js/pull/19213">#19213</a>)</li>
<li>Ensured that <code>(fn (mut ...))</code> works with falsy values (<a href="https://github.com/emberjs/ember.js/pull/19221">#19221</a>)</li>
<li>Fixed bugs in query parameters with intermediate transitions (<a href="https://github.com/emberjs/ember.js/pull/19249">#19249</a>)</li>
<li>Prevented multiple serialization of query parameters on <code>activeTransition</code> (<a href="https://github.com/emberjs/ember.js/pull/19236">#19236</a>)</li>
<li>Prevented dynamic invocation of string value when referenced directly in angle brackets (<a href="https://github.com/emberjs/ember.js/pull/19122">#19122</a>)</li>
<li>Issued a deprecation for tracked mutation in <code>constructor</code> during rendering (<a href="https://github.com/emberjs/ember.js/pull/19282">#19282</a>) ⚠️</li>
</ul>
<h4 id="newfeatures">New Features</h4>
<p>Ember.js 3.23 introduced 2 features.</p>
<ol>
<li>Implemented and enabled <code>invokeHelper</code> from <a href="https://github.com/emberjs/rfcs/blob/master/text/0626-invoke-helper.md">JavaScript Helper Invocation API RFC</a>. The <code>invokeHelper</code> can be used to create and call an instance of the helper in a component. (<a href="https://github.com/emberjs/ember.js/pull/19171">#19171</a>, <a href="https://github.com/emberjs/ember.js/pull/19182">#19182</a>)</li>
<li>Implemented and enabled helper manager from <a href="https://github.com/emberjs/rfcs/blob/master/text/0625-helper-managers.md">Helper Managers RFC</a>. It provides a low-level primitive for defining helpers. (<a href="https://github.com/emberjs/ember.js/pull/19160">#19160</a>, <a href="https://github.com/emberjs/ember.js/pull/19182">#19182</a>)</li>
</ol>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 3.23 introduced 0 deprecations.</p>
<p>For more details on changes in Ember.js 3.23, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.23.0">Ember.js 3.23.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata323">Changes in Ember Data 3.23</h3>
<p>This release included several bug fixes and improvements, such as:</p>
<ul>
<li>Improved debug message (<a href="https://github.com/emberjs/data/pull/7337">#7337</a>).</li>
<li>Polymorphic relation type changes on first load (<a href="https://github.com/emberjs/data/pull/7363/files">#7363</a>).</li>
</ul>
<h4 id="deprecations1">Deprecations (1)</h4>
<h5 id="najaxwhenemberfetchisalsoadependency">najax when ember-fetch is also a dependency</h5>
<p>Building on the deprecation of the previous minor version, <a href="https://github.com/emberjs/data/pull/7230">#7230</a> also triggers a deprecation warning when <code>ember-fetch</code> is installed to better guide users on how to update their app.
You can consult the <a href="https://deprecations.emberjs.com/ember-data/v3.x/#toc_ember-data-najax-fallback">Deprecate <code>najax</code> request</a> deprecation guide for more information.</p>
<p>For more details on changes in Ember Data 3.23, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.23.0">Ember Data 3.23.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<!--alex ignore easy-->
<p>You may upgrade Ember CLI easily using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli323">Changes in Ember CLI 3.23</h3>
<p>No significant changes were introduced in this version of Ember CLI.
Upcoming changes to how the blueprint for new applications sets up testing were delayed to next minor version due to regressions.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.23 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.23.0">Ember CLI 3.23.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-23-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-23-released</guid><pubDate>Mon, 14 Dec 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.24 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.24 of Ember.js, Ember Data, and Ember CLI. This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule.</p>
<p>This release kicks off the 3.25 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs324">Changes in Ember.js 3.24</h3>
<p>Ember.js 3.24 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 3.24 introduced 4 bug fixes.</p>
<ol>
<li>When the <code>router</code> service is injected (e.g. into a component), the <code>router</code> service can automatically work in non-application tests. In other words, we no longer need to call <code>this.owner.setupRouter()</code>. (<a href="https://github.com/emberjs/ember.js/pull/19080">#19080</a>)</li>
<li>When there is no template associated with a component class, the low-level API <code>getComponentTemplate()</code> now returns <code>undefined</code> instead of <code>null</code>. The return value of <code>undefined</code> is what had been specified in the <a href="https://github.com/emberjs/rfcs/blob/master/text/0481-component-templates-co-location.md#low-level-primitives">Component Templates Colocation RFC</a>. (<a href="https://github.com/emberjs/ember.js/pull/19253">#19253</a>)</li>
<li>In an Ember Engines app, the <code>&lt;LinkTo&gt;</code> component once again supports <a href="https://ember-engines.netlify.app/docs/links#linking-within-an-engine">linking within an engine</a>. Please note, a fix was made possible through a breaking change in the private implementation of <code>&lt;LinkTo&gt;</code>. When you upgrade your app to v3.24 or above, you will want to upgrade Ember Engines to at least <code>ember-engines@0.8.9</code> (see <a href="https://github.com/ember-engines/ember-engines/releases/tag/v0.8.9">release notes here</a> for details). (<a href="https://github.com/emberjs/ember.js/pull/19223">#19223</a>) ⚠️</li>
<li>When a computed property has a dependent key that includes <code>@each</code>, followed by an aliased property, the computed property recomputes when the aliased property's value changes. (<a href="https://github.com/emberjs/ember.js/pull/19280">#19280</a>)</li>
</ol>
<h4 id="features">Features</h4>
<p>Ember.js 3.24 introduced 3 features.</p>
<ol>
<li>When <code>ember-page-title</code> is installed, the blueprint for a route template creates a <code>{{page-title}}</code> helper invocation in addition to <code>{{outlet}}</code>. For more information, please see <a href="https://github.com/emberjs/rfcs/blob/master/text/0645-add-ember-page-title-addon.md">RFC #645</a> and <a href="https://ember-cli.github.io/ember-page-title/"><code>ember-page-title</code> documentation</a>. (<a href="https://github.com/emberjs/ember.js/pull/19224">#19224</a>)</li>
<li>The interface of <code>DeprecationOptions</code>, which can be passed to the <code>deprecate()</code> function, requires the keys <code>for</code> and <code>since</code> to exist. For more information, please see the <a href="https://github.com/emberjs/rfcs/blob/master/text/0649-deprecation-staging.md#deprecate">Deprecation Staging RFC</a>. (<a href="https://github.com/emberjs/ember.js/pull/19133">#19133</a>)</li>
<li>Glimmer VM, the rendering engine, has been upgraded to version 0.65.0. The upgrade includes a bug fix and a few upstreams. (<a href="https://github.com/emberjs/ember.js/pull/19258">#19258</a>, <a href="https://github.com/emberjs/ember.js/pull/19261">#19261</a>, <a href="https://github.com/emberjs/ember.js/pull/19267">#19267</a>)</li>
</ol>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 3.24 introduced 4 deprecations.</p>
<ol>
<li><p>Going back to the interface of <code>DeprecationOptions</code> (see Features above), forgetting to pass <code>for</code> or <code>since</code> will trigger a deprecation message. (<a href="https://github.com/emberjs/ember.js/pull/19133">#19133</a>)</p></li>
<li><p><code>Ember.String.loc</code> function, <code>@ember/string#loc</code> function, and <code>{{loc}}</code> helper have been deprecated in favor of a dedicated localization solution like <a href="https://github.com/ember-intl/ember-intl">ember-intl</a>. For more information, please see the <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-string-loc">Deprecations Guide</a>. (<a href="https://github.com/emberjs/ember.js/pull/19211">#19211</a>)</p></li>
<li><p>Calling <code>camelize</code>, <code>capitalize</code>, <code>classify</code>, <code>dasherize</code>, <code>decamelize</code>, <code>underscore</code>, or <code>w</code>—these are <a href="https://api.emberjs.com/ember/3.23/classes/String"><code>Ember.String</code> methods</a>—on a string is deprecated. Instead of calling the method on the string, you can import the function from <code>@ember/string</code>:</p>
<pre><code class="javascript language-javascript">// Before
let mascot = 'Empress Zoey';

console.log(mascot.camelize());  // empressZoey

// After
import { camelize } from '@ember/string';

let mascot = 'Empress Zoey';

console.log(camelize(mascot));  // empressZoey
</code></pre>
<p>For more information, please see the <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-string-prototype-extensions">Deprecations Guide</a>. (<a href="https://github.com/emberjs/ember.js/pull/19234">#19234</a>)</p></li>
<li><p><code>tryInvoke</code> from <code>@ember/utils</code> module has been deprecated in favor of JavaScript's optional chaining <code>?.</code>.</p>
<pre><code class="javascript language-javascript">// Before
import { tryInvoke } from '@ember/utils';

let today = new Date('01/07/2021');

tryInvoke(today, 'getTime');              // 1609974000000
tryInvoke(today, 'setFullYear', [2014]);  // 1389049200000
tryInvoke(today, 'noSuchMethod', [2014]); // undefined

// After
let today = new Date('01/07/2021');

today.getTime?.();          // 1609974000000
today.setFullYear?.(2014);  // 1389049200000
today.noSuchMethod?.(2014); // undefined

/*
  Note, `today` is used in the context of `tryInvoke`.
  As a result, we can assume that `today` is an object
  and write `today.getTime` instead of `today?.getTime`.

  The examples exist only to illustrate how to refactor
  `tryInvoke`. Please don't write `today.getTime?.()`
  in practice. :)
*/
</code></pre>
<p>For more information, please see the <a href="https://deprecations.emberjs.com/v3.x#toc_ember-utils-try-invoke">Deprecations Guide</a>.</p></li>
</ol>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>Last but not least, Ember.js 3.24 removed a few feature flags and an experimental API called <code>expandLocalLookup</code>. For more details on changes in Ember.js 3.24, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.24.0">Ember.js 3.24.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata324">Changes in Ember Data 3.24</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember Data 3.24 introduced 1 bug fix.</p>
<ol>
<li>In a production environment, an attempt to set something on a deleted record no longer shows the value in the error message. This was done to prevent leaking sensitive data. (<a href="https://github.com/emberjs/data/pull/7370">#7370</a>)</li>
</ol>
<h4 id="features-1">Features</h4>
<p>Ember Data 3.24 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 3.24 introduced 0 deprecations.</p>
<p>For more details on changes in Ember Data 3.24, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.24.0">Ember Data 3.24.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli324">Changes in Ember CLI 3.24</h3>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 3.24 introduced 1 bug fix.</p>
<ol>
<li>When Embroider v2 addons are present, prevent forming a cycle in the build process. (<a href="https://github.com/ember-cli/ember-cli/pull/9402">#9402</a>)</li>
</ol>
<h4 id="features-2">Features</h4>
<p>Ember CLI 3.24 upgraded the packages that are present in the <code>package.json</code> blueprint to their latest version. There are 4 notable changes to the <code>package.json</code> blueprint:</p>
<ol>
<li><code>ember-page-title</code> has been added to the blueprint. For more information, please see <a href="https://github.com/emberjs/rfcs/blob/master/text/0645-add-ember-page-title-addon.md">RFC #645</a> and <a href="https://ember-cli.github.io/ember-page-title/"><code>ember-page-title</code> documentation</a>. (<a href="https://github.com/ember-cli/ember-cli/pull/9372">#9372</a>, <a href="https://github.com/ember-cli/ember-cli/pull/9382">#9382</a>)</li>
<li><code>ember-qunit</code> has been upgraded to <a href="https://github.com/emberjs/ember-qunit/releases/tag/v5.0.0">v5</a> (a major version change). Following the <a href="https://github.com/emberjs/ember-qunit/blob/master/docs/migration.md">migration guide</a>, the <code>package.json</code> blueprint includes <code>@ember/test-helpers</code> and <code>qunit</code>. The blueprints for <code>tests/index.html</code> and <code>tests/test-helper.js</code> have been updated as well. (<a href="https://github.com/ember-cli/ember-cli/pull/9340">#9340</a>, <a href="https://github.com/ember-cli/ember-cli/pull/9371">#9371</a>)</li>
<li><code>eslint-plugin-ember</code> has been upgraded to <a href="https://github.com/ember-cli/eslint-plugin-ember/releases/tag/v10.0.0">v10</a> (a major version change), which promoted <code>octane</code> rules to <code>recommended</code> and enabled several additional rules as <code>recommended</code>. To learn more about these linting rules, please check the <a href="https://github.com/ember-cli/eslint-plugin-ember/tree/v10.0.0#-rules"><code>eslint-plugin-ember</code> documentation</a>. (<a href="https://github.com/ember-cli/ember-cli/pull/9403">#9403</a>)</li>
<li><code>prettier</code> (along with <code>eslint-config-prettier</code> and <code>eslint-plugin-prettier</code>) has been added to the blueprint. To learn more, please see <a href="https://github.com/emberjs/rfcs/blob/master/text/0628-prettier.md">RFC #628</a> and <a href="https://prettier.io/docs/en/index.html">Prettier documentation</a>. (<a href="https://github.com/ember-cli/ember-cli/pull/9391">#9391</a>, <a href="https://github.com/ember-cli/ember-cli/pull/9407">#9407</a>, <a href="https://github.com/ember-cli/ember-cli/pull/9410">#9410</a>)</li>
</ol>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 3.24 introduced 0 deprecations.</p>
<p>For more details on the changes in Ember CLI 3.24 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.24.0">Ember CLI 3.24.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-24-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-24-released</guid><pubDate>Thu, 07 Jan 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.25 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.25 of Ember.js, Ember Data, and Ember CLI. <!-- Block start: Uncomment if an LTS candidate --><!--This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule.--><!-- Block end --></p>
<p>This release kicks off the 3.26 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs325">Changes in Ember.js 3.25</h3>
<p>Ember.js 3.25 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 3.25 contains several bug fixes, including:</p>
<ul>
<li>Empty <code>htmlSafe</code> strings are now considered false. (<a href="https://github.com/emberjs/ember.js/pull/18148">#18148</a>)</li>
<li>Template locals no longer clobber component invocations of the same name. (<a href="https://github.com/emberjs/ember.js/pull/19351">#19351</a>)</li>
<li>Improved error message when invoking nested components, e.g. <code>&lt;Foo:Bar /&gt;</code>. (<a href="https://github.com/emberjs/ember.js/pull/19336">#19336</a>)</li>
<li>Improved error messages and stack traces for <code>&lt;LinkTo /&gt;</code>. (<a href="https://github.com/emberjs/ember.js/pull/19342">#19342</a>)</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 3.25 introduced 2 features.</p>
<ol>
<li>Template strict mode (<a href="https://github.com/emberjs/ember.js/pull/19302">#19302</a>, <a href="https://github.com/emberjs/ember.js/pull/19306">#19306</a>, <a href="https://github.com/emberjs/ember.js/pull/19319">#19319</a>)</li>
</ol>
<p>While this feature won't have an impact for Ember developers quite yet, it is an important step towards allowing more experimental work in templates, like template imports and single-file components.</p>
<p>If these topics interest you, keep an eye on our <a href="https://github.com/emberjs/rfcs">RFCs</a> repository for activity and a chance to participate!</p>
<ol>
<li>Named blocks (<a href="https://github.com/emberjs/ember.js/pull/19318">#19318</a>)</li>
</ol>
<p>This feature enables developers to yield distinct blocks from a component, unlocking powerful composition patterns for components.</p>
<p>This feature is useful when you want to render different things depending on passed-in data.
Let us implement a shopping cart that lists the items in it, or shows a message that says it is empty.
We will be using <code>{{gt}}</code> from <a href="https://emberobserver.com/addons/ember-truth-helpers"><code>ember-truth-helpers</code></a> to help implement this.</p>
<p>First we write the component template:</p>
<pre><code class="handlebars language-handlebars">// app/components/cart.hbs
{{#if (gt @list.length 0)}}
  &lt;ul&gt;
    {{#each @list as |item|}}
      &lt;li&gt;{{yield item}}&lt;/li&gt;
    {{/each}}
  &lt;/ul&gt;
{{else}}
  {{yield to="empty"}}
{{/if}}
</code></pre>
<p>Which can be used like so:</p>
<pre><code class="handlebars language-handlebars">&lt;Cart @list={{this.shoppingList}}&gt;
  &lt;:default as |listItem|&gt;
    &lt;p&gt;You have a {{listItem}}.&lt;/p&gt;
  &lt;/:default&gt;
  &lt;:empty&gt;
    &lt;p&gt;Your cart is empty.&lt;/p&gt;
  &lt;/:empty&gt;
&lt;/Cart&gt;
</code></pre>
<p>Then when <code>shoppingList</code> contains multiple elements, like <code>[ "apple", "pear", "banana" ]</code>, it renders the following:</p>
<pre><code class="handlebars language-handlebars">&lt;ul&gt;
  &lt;li&gt;&lt;p&gt;You have a apple.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;You have a pear.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;You have a banana.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</code></pre>
<p>But if <code>shoppingList</code> is empty, it renders the following instead:</p>
<pre><code class="handlebars language-handlebars">&lt;p&gt;Your cart is empty.&lt;/p&gt;
</code></pre>
<p>Named blocks are also useful if you want to ensure a certain structure to your HTML, but want to enable customization of the content.
An example of this would be an <code>&lt;Article&gt;</code> component, as shown in the yieldable named blocks RFC (<a href="https://emberjs.github.io/rfcs/0460-yieldable-named-blocks.html#detailed-design">#460</a>).</p>
<p>You can find more information in the <a href="https://api.emberjs.com/ember/3.25/modules/@glimmer%2Fcomponent">Component API documentation</a>.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 3.25 introduced 0 deprecations.</p>
<p>For more details on changes in Ember.js 3.25, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.25.0">Ember.js 3.25.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata325">Changes in Ember Data 3.25</h3>
<p>Apart from documentation fixes and internal cleanup of feature flags, there were no changes.</p>
<p>For more details on changes in Ember Data 3.25, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.25.0">Ember Data 3.25.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli325">Changes in Ember CLI 3.25</h3>
<p>Apart from updated dependencies in the app and addon blueprints, there were no changes.</p>
<p>For more details on the changes in Ember CLI 3.25 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.25.0">Ember CLI 3.25.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-25-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-25-released</guid><pubDate>Thu, 25 Feb 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.26 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.26 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 3.27 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs326">Changes in Ember.js 3.26</h3>
<p>Ember.js 3.26 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 3.26 introduced 5 bug fixes. Here are a few notable ones:</p>
<ol>
<li>The Ember router and the <code>router</code> service have been updated so that an infinite recursion does not occur when the <code>router</code> service is injected into <code>app/router.js</code>. (<a href="https://github.com/emberjs/ember.js/pull/19405">#19405</a>)</li>
<li>You can pass to an observer a dependent key whose name includes a colon. (<a href="https://github.com/emberjs/ember.js/issues/19343">#19343</a>)</li>
<li>The Glimmer VM has been updated to prevent eagerly consuming arguments during modifier destruction. (<a href="https://github.com/emberjs/ember.js/pull/19469">#19469</a>)</li>
</ol>
<h4 id="features">Features</h4>
<p>Ember.js 3.26 introduced 0 features.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 3.26 introduced several deprecations in preparation for v4.0 release. To learn more how to update your code, please check the provided link to the Deprecations Guide.</p>
<ol>
<li><p>Transition methods of controllers and routes have been deprecated. Inject the <code>router</code> service and use the service's methods instead. (<a href="https://deprecations.emberjs.com/v3.x#toc_routing-transition-methods">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19255">#19255</a>)</p></li>
<li><p>Invoking the <code>&lt;LinkTo&gt;</code> component with positional arguments has been deprecated. Please provide named arguments such as <code>@route</code>, <code>@model</code>, <code>@models</code>, and <code>@query</code>. (<a href="https://deprecations.emberjs.com/v3.x#toc_ember-glimmer-link-to-positional-arguments">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19345">#19345</a>)</p></li>
<li><p>The <code>{{with}}</code> helper has been deprecated, in favor of using <code>{{let}}</code>. (<a href="https://deprecations.emberjs.com/v3.x#toc_ember-glimmer-with-syntax">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19346">#19346</a>)</p></li>
<li><p>Implicit injection has been deprecated. In particular, the <code>store</code> service from Ember Data must be explicitly injected into controllers and routes if they refer to <code>this.store</code>. (<a href="https://deprecations.emberjs.com/v3.x#toc_implicit-injections">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19358">#19358</a>)</p></li>
<li><p>Browser support of Internet Explorer 11 has been deprecated. (<a href="https://deprecations.emberjs.com/v3.x#toc_3-0-browser-support-policy">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19359">#19359</a>)</p></li>
<li><p>Property fallback for implicit <code>this</code> has been deprecated. Please review the templates in your app and write <code>this.</code> when it is appropriate, e.g. change <code>{{localProperty}}</code> to <code>{{this.localProperty}}</code>. (<a href="https://deprecations.emberjs.com/v3.x#toc_this-property-fallback">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19371">#19371</a>)</p></li>
<li><p><strong>Ember Classic has been deprecated.</strong> (<a href="https://deprecations.emberjs.com/v3.x#toc_editions-classic">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19372">#19372</a>)</p>
<p>In preparation for v4.0 release, developers are encouraged to update their app to Ember Octane by following these steps:</p>
<ul>
<li><p>In <code>config/optional-features.json</code>, update the feature flags for Octane.</p>
<pre><code class="json language-json">{
  "application-template-wrapper": false,
  "jquery-integration": false,
  "template-only-glimmer-components": true
}
</code></pre></li>
<li><p>Specify the Octane edition in <code>package.json</code>.</p>
<pre><code class="json language-json">{
  "ember": {
    "edition": "octane"
  }
}
</code></pre></li>
<li><p>Check the <a href="https://guides.emberjs.com/release/upgrading/current-edition/">official upgrade guide</a> and seek help in the <code>#help</code> channel on <a href="https://discord.gg/emberjs">Ember Discord</a>.</p></li></ul></li>
<li><p>Component managers that use the <code>v3.4</code> capabilities should update to the most recent component capabilities available, which is currently <code>v3.13</code>. (<a href="https://deprecations.emberjs.com/v3.x#toc_manager-capabilities-components-3-4">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19373">#19373</a>)</p></li>
<li><p>Modifier managers that use the <code>v3.13</code> capabilities should update to the most recent modifier capabilities available, which is currently <code>v3.22</code>. (<a href="https://deprecations.emberjs.com/v3.x#toc_manager-capabilities-modifiers-3-13">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19373">#19373</a>)</p></li>
<li><p>The <code>{{hasBlock}}</code> and <code>{{hasBlockParams}}</code> properties have been deprecated. Use <code>{{has-block}}</code> and <code>{{has-block-params}}</code> helpers instead. (<a href="https://deprecations.emberjs.com/v3.x#toc_has-block-and-has-block-params">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19374">#19374</a>)</p></li>
<li><p>Passing <code>classBinding</code> and <code>classNameBindings</code> as arguments has been deprecated. (<a href="https://deprecations.emberjs.com/v3.x#toc_class-binding-and-class-name-bindings-in-templates">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19375">#19375</a>)</p></li>
<li><p>Accessing named arguments via <code>{{attrs}}</code> has been deprecated. (<a href="https://deprecations.emberjs.com/v3.x#toc_attrs-arg-access">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19375">#19375</a>)</p></li>
<li><p>Array observers have been deprecated. (<a href="https://deprecations.emberjs.com/v3.x#toc_array-observers">Deprecations Guide</a>, <a href="https://github.com/emberjs/ember.js/pull/19381">#19381</a>)</p></li>
</ol>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.26, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.26.0">Ember.js 3.26.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata326">Changes in Ember Data 3.26</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember Data 3.26 introduced 0 bug fixes.</p>
<h4 id="features-1">Features</h4>
<p>Ember Data 3.26 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 3.26 introduced 0 deprecations.</p>
<p>For more details on changes in Ember Data 3.26, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.26.0">Ember Data 3.26.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli326">Changes in Ember CLI 3.26</h3>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 3.26 introduced 2 bug fixes.</p>
<ol>
<li>Issue a better error message for add-on's missing an entry point. (<a href="https://github.com/ember-cli/ember-cli/pull/9473">#9473</a>); and</li>
<li>Add Prettier files to <code>.npmignore</code> file in addon blueprint (<a href="https://github.com/ember-cli/ember-cli/pull/9437">#9437</a>).</li>
</ol>
<h4 id="features-2">Features</h4>
<p>Ember CLI 3.26 introduced 1 feature.</p>
<ol>
<li><code>ember-try</code> test scenarios for <code>embroider-safe</code> and <code>embroider-optimized</code> for addons are now enabled using <a href="https://github.com/embroider-build/embroider/tree/master/packages/test-setup">@embroider/test-setup</a> allowing Embroider compatibility testing for addons test matrix (<a href="https://github.com/ember-cli/ember-cli/pull/9436">#9436</a>).</li>
</ol>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 3.26 introduced 0 deprecations.</p>
<p>For more details on the changes in Ember CLI 3.26 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.26.0">Ember CLI 3.26.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-26-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-26-released</guid><pubDate>Mon, 12 Apr 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.27 Released]]></title><description><![CDATA[<p>Today the Ember project is announcing release 3.27 of Ember.js, Ember Data, and Ember CLI. This is a minor version, stable release.</p>
<p>We're also announcing the start of the 3.28 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test beta builds and report any bugs before they are published as a stable release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>Ember.js 3.28 (again, starting <strong>beta</strong> today) is the final planned version of the 3.x release cycle, and will
become an LTS release. As of the 3.28-beta being released, the main development
branch of all Ember projects will become 4.0. Look for more information on Ember
4.0 here on the blog this coming week.</p>
<!-- READMORE -->
<p>You can read more about our general release process with these resources:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs327">Changes in Ember.js 3.27</h3>
<p>Ember.js 3.27 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and deprecations.
For a full set of changes see <a href="https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md#v3275-june-10-2021"><code>CHANGELOG.md</code></a>.</p>
<h3 id="notablebugfixes">Notable Bug Fixes</h3>
<ul>
<li>Prior to 3.27 <code>&lt;:inverse&gt;</code> would not always alias else blocks. This is
corrected in <a href="https://github.com/glimmerjs/glimmer-vm/pull/1296">glimmerjs/glimmer-vm#1296</a>.</li>
<li>Ember.js 3.27.0 was released in early May and included several regressions.
These were largely related to the changes in the glimmer VM and and the
implementation of several deprecations, and have been corrected in patch
releases leading up to 3.27.5.</li>
</ul>
<h3 id="featureadditions">Feature Additions</h3>
<h4 id="contextualhelpersmodifiers">Contextual Helpers &amp; Modifiers</h4>
<p>For several years Ember has provided a mechanism called "contextual components".
This API allows a developer to yield a component, optionally with arguments
to apply, into a block.</p>
<p>In <a href="https://github.com/emberjs/rfcs/blob/master/text/0432-contextual-helpers.md">RFC #432</a>
additional APIs were proposed which allow helpers and modifiers to be used in
the same way.</p>
<p>For example the layout for a <code>SuperForm</code> component might be implemented as:</p>
<pre><code class="handlebars language-handlebars">// app/components/super-form.hbs
&lt;form&gt;
  {{yield (hash

    Input=(component "super-input" form=this model=this.model)
    Textarea=(component "super-textarea" form=this model=this.model)
    Submit=(component "super-submit" form=this model=this.model)

    is-valid=(helper "super-is-valid" form=this model=this.model)
    error-for=(helper "super-error-for" form=this model=this.model)

    auto-resize=(modifier "super-auto-resize")

  )}}
&lt;/form&gt;
</code></pre>
<p>And be used as:</p>
<pre><code class="handlebars language-handlebars">// app/templates/index.hbs
&lt;SuperForm @model={{this.post}} as |f|&gt;

  {{! Invoke a contextual component }}
  &lt;f.Input @name="title" /&gt;

  {{! Invoke contextual helpers }}
  {{#unless (f.is-valid "title")}}
    &lt;div class="error"&gt;This field {{f.error-for "title"}}&lt;/div&gt;
  {{/unless}}

  {{! Invoke a contextual modifier on a contextual component invocation }}
  &lt;f.Textarea @name="body" {{f.auto-resize maxHeight="500"}} /&gt;

  &lt;f.Submit /&gt;
&lt;/SuperForm&gt;
</code></pre>
<p>These APIs open the doors for the creation of new, more powerful UI abstractions.</p>
<h3 id="deprecations">Deprecations</h3>
<p>Ember 3.27 introduces the final set of deprecations targeting Ember 4.0. The
newly introduced deprecations primarily impact uncommonly used APIs. As always,
deprecated APIs are documented with a transition path in the <a href="https://deprecations.emberjs.com/v3.x">deprecation
guides</a>.</p>
<p>Several notable deprecations added in 3.27 are:</p>
<h4 id="invokinghelperswithoutargumentsandparenthesesinnamedargumentpositions">Invoking Helpers Without Arguments and Parentheses in Named Argument Positions</h4>
<p>In some templates, a helper passed as an argument can be treated as an
invocation instead of passing the uninvoked helper as a value. For example:</p>
<pre><code class="handlebars language-handlebars">{{! is someHelper invoked, or passed as a reference? }}
&lt;SomeComponent @arg={{someHelper}} /&gt;
</code></pre>
<p>To better align helpers with how component and modifiers behave in the same
setting, parenthesis are now required to cause an invocation:</p>
<pre><code class="handlebars language-handlebars">{{! (someHelper) is clearly an invocation with no arguments }}
&lt;SomeComponent @arg={{(someHelper)}} /&gt;
</code></pre>
<p>The non-param version of helper passing will pass a reference to the helper
in Ember 4.0. See the <a href="https://deprecations.emberjs.com/v3.x#toc_argument-less-helper-paren-less-invocation">deprecation guide
entry</a>
for more details.</p>
<h4 id="importinglegacybuiltincomponents">Importing Legacy Built-in Components</h4>
<p>Historically, Ember applications have been able to import the base classes which
define <code>&lt;Input&gt;</code>, <code>&lt;Textarea&gt;</code>, and <code>&lt;LinkTo&gt;</code> for reopening or subclassing. In
Ember 4.0, we intend to improve the internal implementation of those built-ins.
To allow this, we've been steadily deprecating parts of the built-in APIs
throughout the 3.x release series.</p>
<p>In 3.27, importing a the base classes of Ember built-ins is deprecated. In Ember
4.0 these modules will be unavailable. The specific deprecated imports are:</p>
<pre><code class="js language-js">import Checkbox from '@ember/component/checkbox';
import Textarea from '@ember/component/text-area';
import TextField from '@ember/component/text-field';
import LinkToComponent from '@ember/routing/link-component';
</code></pre>
<p>Accessing these classes through other paths, like the owner interface, is also
deprecated.</p>
<p>See the <a href="https://deprecations.emberjs.com/v3.x#toc_ember-built-in-components-import">deprecation guide
entry</a>
for more details and guidance on migrating away from these APIs.</p>
<p>Additionally, reopening these classes (for example to change the <code>tagName</code> on a
<code>&lt;LinkTo&gt;</code>) has been deprecated and will be unsupported in 4.0. See <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-built-in-components-reopen">the
deprecation guide for migration strategies</a>.</p>
<h4 id="deprecatelegacyargumentstobuiltins">Deprecate Legacy Arguments to Built-ins</h4>
<p>Ember's built-in components had a public interface largely defined by their
implementation as classic Ember components. In order to refactor these built-ins
to more modern implementations and improve their interfaces, large parts of
their API is deprecated in 3.27.</p>
<p>These deprecations break down into two sections. First, there are arguments
which are essentially setting HTML attributes or dealing with events. See <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-built-in-components-legacy-attribute-arguments">this
guide entry on legacy attribute
arguments</a>
for a detailed list of deprecated arguments and migration paths.</p>
<p>Second, there is a set of arguments which were effectively leaks of the private
implementation, or which no longer have a clear meaning (or usefulness) in modern
application development. See <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-built-in-components-legacy-arguments">this guide entry on legacy arguments</a> for a detailed list and migration paths.</p>
<h4 id="deprecatetheemberglobal">Deprecate the Ember Global</h4>
<p>Ember has long set a property on the <code>window</code> or <code>globalThis</code> global so that
it can be accessed via <code>window.Ember</code>, for example. This approach to using Ember
is incompatible with static analysis tools that can result in more optimized
application payloads.</p>
<p>In Ember 3.27, accessing the <code>Ember</code> object via a non-module-import is
deprecated. Support for using Ember this way will be removed in Ember 4.0.</p>
<p>Instead, applications should adopt the Ember module API. This means importing
either the <code>Ember</code> object or a specific API from the module API:</p>
<pre><code class="js language-js">// Bad, deprecated
export default Ember.Component.extend({});
</code></pre>
<pre><code class="js language-js">// Better
import Ember from 'ember';
export default Ember.Component.extend({});
</code></pre>
<pre><code class="js language-js">// Best
import Component from '@ember/component';
export default Component.extend({});
</code></pre>
<p>See <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-global">the deprecation
guide</a> and <a href="https://github.com/emberjs/rfcs/blob/master/text/0706-deprecate-ember-global.md">RFC 706</a>
for more details and transition paths for other use cases.</p>
<h4 id="deprecaterunloopandcomputeddotaccess">Deprecate run loop and computed dot access</h4>
<p>Using <code>.</code> to access computed or run loop functions has been deprecated, such as <code>computed.filter</code>.
Instead, import the value directly from the module:</p>
<pre><code class="js language-js">// Bad, deprecated
import EmberObject, { computed } from '@ember/object';

const Tomster = EmberObject.extend({
  readyForCamp: computed.and('hasTent', 'hasBackpack'),
  readyForHike: computed.and('hasWalkingStick', 'hasBackpack')
})
</code></pre>
<pre><code class="js language-js">// Good
import EmberObject from '@ember/object';
import { and } from '@ember/object/computed';

class Tomster extends EmberObject {
  @and('hasTent', 'hasBackpack') readyForCamp;
  @and('hasWalkingStick', 'hasBackpack') readyForHike;
}
</code></pre>
<p>Support for <code>.</code> to access computed or run loop functions will be removed in Ember 4.0.</p>
<p>See <a href="https://deprecations.emberjs.com/v3.x/#toc_deprecated-run-loop-and-computed-dot-access">the deprecation guide</a>.</p>
<h3 id="furtherinformationonupgradetimelines">Further Information On Upgrade Timelines</h3>
<p>For application maintainers who want to upgrade apps to Ember.js 4.0 on its release date, the list of
deprecations in this release means their challenge is now well defined.
Application maintainers should consider using the
<a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a>
addon to address deprecations incrementally after upgrading to 3.27.
ember-cli-deprecation-workflow 2.0 was released <em>today</em> in preperation for
applications addressing Ember 3.x deprecations. Give us feedback in the issues
on that repo.</p>
<p>For app maintainers who are in less of a hurry, <strong>please note that the upcoming
release of Ember.js 3.28
will contain no new deprecations targeting Ember.js 4.0</strong>. Additionally, Ember.js
3.28 will be promoted to LTS on the same day Ember.js 4.0 is released.</p>
<p>We recommend that applications using LTS releases wait for the first LTS of
Ember.js 4.x to upgrade, which will be Ember.js 4.4. Ember's 6 week release
cycle means we expect there is about 44 weeks (from today) for apps upgrading from LTS-to-LTS
to address 4.0-targeted deprecations before Ember.js 4.4-LTS is made available.</p>
<p>For more details on changes in Ember.js 3.27, please review the <a href="https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md#v3275-june-10-2021">Ember.js 3.27.5 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.
Ember Data's 3.27 release largely consists of compatability work with Ember.js.</p>
<p>For more details on changes in Ember Data 3.27, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.27.0">Ember Data 3.27.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli327">Changes in Ember CLI 3.27</h3>
<p>Ember CLI 3.27 introduces a flag for enabling Embroider (Ember CLI's new build
pipeline) for new applications and addons. For example:</p>
<pre><code class="bash language-bash">ember new my-app --embroider
</code></pre>
<p>Learn more about what Embroider offers and how to best configure it on the
<a href="https://github.com/embroider-build/embroider">embroider-build/embroider</a> repo.</p>
<p>For more details on changes and bugfixes in Ember CLI 3.27, see the <a href="https://github.com/ember-cli/ember-cli/blob/v3.27.0/CHANGELOG.md#v3270">Ember 3.27.0
changelog</a>
and <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.27.0">Ember CLI 3.27.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-27-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-27-released</guid><pubDate>Sat, 03 Jul 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.28 and 4.0 Beta Released]]></title><description><![CDATA[<p>After 3.5 years and 28 minor releases, Ember 3.28 marks the end of the project's 3.x series.
To ensure a smooth upgrade path going into the 4.x series, 3.28 has been declared an LTS (Long Term Support) candidate. In six weeks,
the latest patch version of 3.28 will be promoted to be the latest LTS release
and replace 3.24-LTS.</p>
<p><strong>We're also announcing the start of the Ember 4.0 beta cycle for all sub-projects.</strong> Following the process set in previous major versions, Ember 4.0's beta introduces no new features. Instead, it removes support for deprecated public APIs. We encourage our community (especially addon authors) to help test beta builds and report any bugs before they are published as a stable release in six weeks' time. We also encourage everyone to help maintainers resolve deprecations in their favorite addons. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>Developers who want to prepare for the upcoming 4.0 version of Ember should work to resolve all deprecation warnings in their apps and addons while using Ember 3.28.
An app or addon with no deprecation warnings on Ember 3.28 should be able to upgrade from Ember 4.0 without making significant changes outside of the
dependency versions.</p>
<p>You can read more about Ember's plans for 4.0 in <a href="https://blog.emberjs.com/the-road-to-ember-4-0/">The Road to Ember 4.0</a>.</p>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs328">Changes in Ember.js 3.28</h3>
<p>Ember.js 3.28 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and a minor deprecation fix. 3.28 introduces no new features, helping to ensure the final release of the 3.x cycle is stable and battle-tested.</p>
<p>For the full set of changes (including 7 bug fixes), see the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.28.0">Ember.js 3.28.0 release page</a> on GitHub.</p>
<p>In Ember 3.24, various string methods added to the <code>String.prototype</code> were deprecated for removal in Ember 4.0. <code>htmlSafe</code> (the version available via string prototype) was supposed to be included in those deprecations, however it was overlooked. This omission is corrected in 3.28.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications. The changes introduced in Ember Data 3.28 focus on bug fixes and refactors in preparation for 4.0.</p>
<h3 id="changesinemberdata328">Changes in Ember Data 3.28</h3>
<h4 id="improvementstorelationshipmaterializationunloadingperformance">Improvements to relationship materialization &amp; unloading performance</h4>
<p>A number of performance improvements were shipped in Ember Data 3.28, including
significant improvements to relationship materialization and unloading performance
via <a href="https://github.com/emberjs/data/pull/7491">emberjs/data#7491</a> and
<a href="https://github.com/emberjs/data/pull/7493">emberjs/data#7493</a>. In particular,
the performance improvements should be notable when loading large sets of data.</p>
<p>See the PRs linked above and <a href="https://github.com/emberjs/data/blob/v3.28.3/CHANGELOG.md#release-3280-aug-20-2021">changelog</a> for further notes on performance improvements.</p>
<h4 id="unloadrecordsfromthestorewhencallingdestroyrecord">Unload records from the store when calling <code>destroyRecord</code></h4>
<p><code>destroyRecord</code> would previously leave the deleted record in the store. This
could cause issues if IDs were re-used, or could require extra filtering to
confirm that destroyed content was not in an array of models.</p>
<p>3.28 will unload records from the store when <code>destroyRecord</code> is called. For more
details, see <a href="https://github.com/emberjs/data/pull/7258">emberjs/data#7258</a> and
the GitHub issues mentioned in the PR.</p>
<h4 id="custommodelclasses">Custom Model Classes</h4>
<p>Used conventionally, Ember Data blends the definition of a model's schema and
record API into a single JavaScript class. For example:</p>
<pre><code class="js language-js">import Model from '@ember-data/model';

export default class PersonModel extends Model {
  /*
   * Define a schema
   */
  @attr('string') firstName;
  @attr('string') lastName;

  /*
   * Define an API on the record instance
   */
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}
</code></pre>
<p>Ember Data 3.28 introduces the ability to separate model schema and record instance
class definitions. This is a low-level capability that we expect addon authors
to use when they experiment in these areas (possibly others):</p>
<p>First, forcing the definition (statically or at runtime) of a distinct class for
every model can cause performance issues. Large applications may have hundreds
of models. If most or all of these models do not require unique classes, we're
generating more memory load and asking more of the JIT's type system than
they may be necessary. In the extreme case, it may be possible for all record
instances in an application to share a single root class.</p>
<p>Second, the current Ember Data schema definition API forces definitions to be authored in
JavaScript. Removing that limitation allows us to experiment with more optimal
or powerful ways to encode schema (such as JSON). These alternatives may perform
better (in payload size, or in parse/eval), may better support generation and
synchronization with API typing systems, and better support static analysis
(for example, with TypeScript).</p>
<p>For further details on these new capabilities, refer to:</p>
<ul>
<li><a href="https://github.com/emberjs/rfcs/blob/master/text/0487-custom-model-classes.md">RFC #487: Custom Model Class</a></li>
<li><a href="https://github.com/emberjs/rfcs/blob/master/text/0466-request-state-service.md">RFC #466: Request State Service</a></li>
<li><a href="https://github.com/emberjs/rfcs/blob/master/text/0463-record-data-state.md">RFC #463: Record State on RecordData</a></li>
<li><a href="https://github.com/emberjs/rfcs/blob/master/text/0465-record-data-errors.md">RFC #463: RecordData Errors</a></li>
</ul>
<p>Much of this API surface is already used by the
<a href="https://github.com/hjdivad/ember-m3">ember-m3</a> project, which provides an
alternative model class for Ember Data.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember Data 3.28 introduced 12 bug fixes and some internal refactors. For the full set of changes, see the <a href="https://github.com/emberjs/data/blob/v3.28.3/CHANGELOG.md#release-3280-aug-20-2021">CHANGELOG.md</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="changesinembercli328">Changes in Ember CLI 3.28</h3>
<h4 id="dropnode10support">Drop Node 10 support</h4>
<p>Ember CLI 3.28 drops support for Node 10. Node 10 became end of life (it no longer receives security updates) in April 2021.</p>
<h4 id="introducingemberaddonprojectroot">Introducing <code>ember-addon.projectRoot</code></h4>
<p>This new configuration option allows you to run <code>ember serve</code> from outside of a project's root directory. For example, if you're using yarn workspace or a monorepo and want to support running <code>ember serve</code> from the root of the repo, update the top-level <code>package.json</code> to include the following config:</p>
<pre><code class="json language-json">{
  "ember-addon": {
    "projectRoot": "./packages/path-to-ember-project"
  }
}
</code></pre>
<p>For more details on the changes in Ember CLI 3.28 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.28.0">Ember CLI 3.28.0 release page</a>.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-28-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-28-released</guid><pubDate>Tue, 07 Sep 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.3 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.3 of Ember.js, Ember Data, and Ember CLI. While ember-data and ember-cli only released recently, Ember.js released 3.2 over six weeks ago. Releasing 3.3 ensures that Ember.js does not have an excessively long time between releases.</p>
<p>This release kicks off the 3.4 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs33">Changes in Ember.js 3.3</h3>
<p>Ember.js 3.3 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There is zero (0) new feature, three (3) deprecations, and eight (8) bugfixes in this version.</p>
<h4 id="newfeatures0">New Features (0)</h4>
<p>There are no new features in Ember.js 3.3.</p>
<h4 id="deprecations3">Deprecations (3)</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p><strong>Operation "make jQuery optional" continues (1 of 3)</strong>
We implemented a deprecation that removes access from <code>jQuery.Event#originalEvent</code>
Read the full RFC: <a href="https://github.com/emberjs/rfcs/blob/master/text/0294-optional-jquery.md">emberjs/rfcs#294</a>.</p>
<p><strong>deprecation of three private, unused classes (2 of 3)</strong>
Implemented deprecation of <code>Ember.Map</code>, <code>Ember.MapWithDefault</code>, and <code>Ember.OrderedSet</code> because not only were they private classes, they had also remained unused in Ember for some time now. Read the full (rendered) RFC: <a href="https://github.com/emberjs/rfcs/blob/master/text/0237-deprecation-ember-map.md">emberjs/rfc#237</a></p>
<p><strong>deprecation of copy/copyable (3 of 3)</strong>
We've implemented deprecation of <code>Ember.copy</code> and <code>Ember.Copyable</code> - the <code>copy</code> function and <code>Copyable</code> mixin of <code>@ember/object/internals</code>. Ember isn't using it internally- it's leftover from SproutCore(!), and we're at the point where we realized we could clean this one up.</p>
<p>Shallow copies of the form <code>copy(x)</code> or <code>copy(x, false)</code> can be replaced mechanically with <code>Object.assign({}, x)</code>.</p>
<p>If you're using it in your addon, you might want to read the entire text of the RFC for advice on how to replace this in your addon: <a href="https://github.com/emberjs/rfcs/blob/master/text/0322-deprecate-copy-copyable.md">emberjs/rfcs#322</a>.</p>
<p>For more details on changes in Ember.js 3.3, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.3.0">Ember.js 3.3.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata33">Changes in Ember Data 3.3</h3>
<p>Since Ember Data 3.2 was released two weeks ago we did not feel confident that the changes in the beta branch had received enough
testing. As a result, we have decided to re-release Ember Data 3.2 as Ember Data 3.3 to maintain the release train cadence. Ember Data
3.3.0-beta.1 will be released again as 3.4.0-beta.1 so it can continue to be evaluated for a full beta cycle.</p>
<h4 id="newfeatures0-1">New Features (0)</h4>
<p>There are no new features in Ember Data 3.3.0.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>There are no deprecations introduced in Ember Data 3.3.</p>
<p>For more details on changes in Ember Data 3.3, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.3.0">Ember Data 3.3.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! To upgrade your projects using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the upgrade command, make sure to install (if you haven't already) ember-cli-update globally:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own.</p>
<h3 id="changesinembercli33">Changes in Ember CLI 3.3</h3>
<p>There are no new features and no deprecations in the Ember CLI 3.3 release.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.3 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.3.0">Ember CLI  3.3.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-3-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-3-released</guid><pubDate>Mon, 16 Jul 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.4 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.4 of Ember.js, Ember Data, and Ember CLI. This release kicks off the 3.5 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p><strong>NOTE:</strong> Due to some bugs found once people started using the release version of Ember-CLI 3.4, we delayed this blog post while we ironed out issues. At this point, things are pretty stable and upgrading should be fine.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs34">Changes in Ember.js 3.4</h3>
<p>The 3.4.0 release is an Ember.js Long-Term Support candidate. In six weeks, the 3.4.x series will become the latest LTS release and six weeks after that the 2.18 LTS branch will no longer receive bugfix patches.</p>
<p>For more information about Ember's LTS policies, see the <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">announcement blog post</a> and <a href="http://emberjs.com/builds/">builds page</a>.</p>
<p>Ember.js 3.4 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There are three (3) new features, two (2) deprecations, and eight (8) bugfixes in this version.</p>
<h4 id="newfeatures3">New Features (3)</h4>
<h5 id="implementoptionaljqueryintegration1of3">Implement optional jQuery Integration (1 of 3)</h5>
<p>See <a href="https://github.com/emberjs/rfcs/blob/master/text/0294-optional-jquery.md">emberjs/rfcs#294</a> to get more prose</p>
<h5 id="anglebracketinvocation2of3">Angle Bracket Invocation (2 of 3)</h5>
<p>In Ember 3.4 it is now possible to use angle bracket invocation. This means that you're now able to replace the classic invocation syntax:</p>
<pre><code class="handlebars language-handlebars">{{site-header user=this.user class=(if this.user.isAdmin "admin")}}

{{#super-select selected=this.user.country as |option|}}
  {{#each this.availableCountries as |country|}}
    {{#s.option value=country}}{{country.name}}{{/s.option}}
  {{/each}}
{{/super-select}}
</code></pre>
<p>with the angle bracket invocation syntax:</p>
<pre><code class="handlebars language-handlebars">&lt;SiteHeader @user={{this.user}} class={{if this.user.isAdmin "admin"}} /&gt;

&lt;SuperSelect @selected={{this.user.country}} as |Option|&gt;
  {{#each this.availableCountries as |country|}}
    &lt;Option @value={{country}}&gt;{{country.name}}&lt;/Option&gt;
  {{/each}}
&lt;/SuperSelect&gt;
</code></pre>
<p><strong>It's important to note that the classic invocation syntax is not deprecated in favour of this new invocation.</strong> You're still free to use the classic invocation syntax; but users should be aware that angle bracket invocation does have a few advantages.</p>
<p>The main advantage of the angle bracket invocation syntax is clarity. Because component invocation is often encapsulating important pieces of UI, a dedicated syntax would help visually distinguish them from other handlebars constructs, such as control flow and dynamic values. This can be seen in the example shown above. The angle bracket syntax helps you see the component invocations and the <code>{{#each}}</code> loop, especially with syntax highlight.</p>
<p>Guides will be updated to reflect the new syntax in the coming weeks.</p>
<h5 id="customcomponentmanager3of3">Custom Component Manager (3 of 3)</h5>
<p>Ember 3.4 ships with the new Custom Component Manager feature enabled by default. This feature gives addon authors access to a low-level API for creating component base classes which addon users can re-use and extend components from. Addon authors gain finer-grained control over the semantics of the components exported from their addons by the means of the component manager API.</p>
<p>A component manager can be registered in two different ways - declaratively or imperatively. For an implicit registration you may create a new file in the <code>app/component-managers</code> directory:</p>
<pre><code class="javascript language-javascript">// ember-basic-component/app/component-managers/basic.js

import EmberObject from '@ember/object';

export default EmberObject.extend({
  // ...
});
</code></pre>
<p>When developing an addon and exporting a component manager itself, please follow the respective directory structure conventions by defining the manager in the <code>addon/component-managers</code> directory and re-exporting it from <code>app/component-managers</code> (for a similar example, please review the <a href="https://ember-cli.com/extending/#addon-components">conventions for defining and exporting addon components</a>).</p>
<p>For an imperative registration of a component manager, you can create a new initializer as follows:</p>
<pre><code class="javascript language-javascript">// ember-basic-component/app/initializers/register-basic-component-manager.js

const MANAGER = {
 // ...
};

export function initialize(application) {
 // We want to use a POJO here, so we are opt-ing out of instantiation
 application.register('component-manager:basic', MANAGER, { instantiate: false });
}

export default {
 name: 'register-basic-component-manager',
 initialize
};
</code></pre>
<p>Next, you can create a new component class depending on this component manager using the <code>setComponentManager</code> util as follows:</p>
<pre><code class="javascript language-javascript">// ember-basic-component/app/components/foo-bar.js

import EmberObject from '@ember/object';
import { setComponentManager } from '@ember/component';

export default setComponentManager('basic', EmberObject.extend({
  // ...
}));
</code></pre>
<p>Finally, users of the <code>ember-basic-component</code> addon in this example, will be able to reuse and extend that component like any other classic component:</p>
<pre><code class="javascript language-javascript">// an-addon-users-app/app/components/foo-bar-custom.js

import FooBar from 'ember-basic-component/components/foo-bar';

export default FooBar.extend({
  // addon user's configuration of the custom FooBar component
});
</code></pre>
<p>For more details on the lifecycle methods and optional settings for the Custom Component Manager API, please review the <a href="https://github.com/emberjs/rfcs/blob/master/text/0213-custom-components.md#component-lifecycle">original RFC</a>.</p>
<h4 id="deprecations2">Deprecations (2)</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.4, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.4.0">Ember.js 3.4.0 release page</a>.</p>
<h5 id="useclosureactionsinsteadofsendaction1of2">Use closure actions instead of <code>sendAction</code> (1 of 2)</h5>
<p>In Ember 1.13 closure actions were introduced as a recommended replacement for <code>sendAction</code>. With <code>sendAction</code> the developer passes the name of an action, and when <code>sendAction</code> is called Ember.js would look up that action in the parent context and invoke it if present. This had a handful of caveats:</p>
<ul>
<li>Since the action is not looked up until it's about to be invoked, it's easier for a typo in the action's name to go undetected.</li>
<li>Using <code>sendAction</code> you cannot receive the return value of the invoked action.</li>
</ul>
<p>Closure actions solve those problems and are also more intuitive to use.</p>
<p>To read more about this deprecation and how to refactor your existing code have a look at <a href="https://emberjs.com/deprecations/v3.x#toc_ember-component-send-action">the deprecations page</a>.</p>
<h5 id="ember2legacy2of2">Ember 2 Legacy (2 of 2)</h5>
<p>Version 3.4 is the last version of Ember that will work with the polyfill addon for features that were deprecated in 2.x. If you have been using <a href="https://github.com/emberjs/ember-2-legacy">ember-2-legacy</a>, it's time to move forward.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata34">Changes in Ember Data 3.4</h3>
<p>Ember Data 3.4 is the first Ember Data LTS release. As a result the
Ember Data team has focused on stability for this release. We've
released a ton of bug fixes (and backported many of these fixes to
older 3.x releases) to address many known issues that have been
reported over the last several months.</p>
<h4 id="newfeatures0">New Features (0)</h4>
<p>No new features introduced in Ember Data 3.4.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember Data 3.4.</p>
<p>For more details on changes in Ember Data 3.4, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.4.0">Ember Data 3.4.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! To upgrade your projects using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the upgrade command, make sure to install (if you haven't already) ember-cli-update globally:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own.</p>
<h3 id="changesinembercli34">Changes in Ember CLI 3.4</h3>
<p>Ember CLI 3.4 is an <a href="https://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">LTS release candidate</a>. This means that this release version will receive critical bugfixes for the upcoming 6 release cycles (36 weeks), as well as security patches for the next 10 release cycles (60 weeks).</p>
<p>Ember CLI 3.4.0 is also effectively fast-forwarded to 3.4.1 due to an essential patch release. Read more about it in the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.4.1">changelog</a>.</p>
<h4 id="newfeatures2">New Features (2)</h4>
<h5 id="addedsupportfornode101of2">Added Support for Node 10 (1 of 2)</h5>
<p>Ember CLI 3.4 now supports Node 10. Simultaneously, Node 4 has been dropped from Ember CLI's support matrix. When upgrading to Ember CLI 3.4, please make sure to use it together with Node 6 and above.</p>
<h5 id="templatelinting2of2">Template Linting (2 of 2)</h5>
<p>Ember CLI 3.4 adds automatic template linting to your application via <em>ember-template-lint</em> according to the <a href="https://github.com/ember-template-lint/ember-template-lint/blob/master/lib/config/recommended.js">recommmended list of rules</a>. Ember CLI will generate a <code>TemplateLint</code> test file for each of your templates to your test suite automatically to be run via <code>ember test</code>.</p>
<p>You can also use the new command <code>npm run lint:hbs</code> or <code>yarn run lint:hbs</code> respectively to run the linter.</p>
<h4 id="deprecations0-1">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember CLI 3.4.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.4 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.4.1">Ember CLI  3.4.1 release page</a>.</p>
<h2 id="latestpatchreleases">Latest Patch Releases</h2>
<p>Several patch versions of Ember.js, Ember Data, and Ember CLI have been published since the release of version 3.4. Please upgrade to the following, latest patch releases to benefit from important bug fixes:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/releases/tag/v3.4.4">Ember 3.4.4</a></li>
<li><a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.4.3">Ember CLI 3.4.3</a></li>
<li><a href="https://github.com/emberjs/data/releases/tag/v3.4.2">Ember Data 3.4.2</a></li>
</ul>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-4-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-4-released</guid><pubDate>Sun, 07 Oct 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.5 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.5 of Ember.js, Ember Data, and Ember CLI.
Notable features include Ember CLI build performance improvements of up to 32% and new Ember Data powers for addon developers.</p>
<p>Additionally, versions 3.4 of Ember, Ember CLI, and Ember Data are now promoted to LTS, which stands for Long
Term Support. An LTS version of Ember continues to receive security updates
for 9 release cycles (54 weeks)
and bugfixes for 6 cycles (36 weeks).
LTS releases typically occur every four minor versions.
The previous LTS version for Ember was 2.18. 3.4 is the first LTS for
Ember CLI and Ember Data.</p>
<p>This release kicks off the 3.6 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs35">Changes in Ember.js 3.5</h3>
<p>Ember.js 3.5 is an incremental, backwards compatible release of Ember with bugfixes.
It is common for minor releases to provide bugfixes that pave the way for
release of new features in future releases.
There are zero (0) new features, zero (0) deprecations, and two (2) small
bugfixes in this version.
Contributors to the Ember.js codebase itself should note that it now uses
Typescript 3.0 internally.</p>
<h4 id="bugfixes2">Bugfixes (2).</h4>
<p>For more details on changes in Ember.js 3.5, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.5.0">Ember.js 3.5.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata35">Changes in Ember Data 3.5</h3>
<p>This release cycle marks two major milestones for <code>ember-data</code>,
an LTS release and the <code>RecordData</code> interfaces.</p>
<h4 id="lts">LTS</h4>
<p>The first milestone is the release of <code>3.4 LTS</code>, our very first <code>LTS</code> release! From here out, <code>ember-data</code> will follow the same LTS cycle and process as <code>Ember</code>.</p>
<h4 id="newfeatures1">New Features (1)</h4>
<h5 id="recorddata">RecordData</h5>
<p>The second milestone is the release of <code>3.5</code> which marks the first release containing the new <a href="https://github.com/emberjs/rfcs/pull/293">RecordData</a> interfaces.
<code>RecordData</code> gives addon developers much-needed API access with more confidence and stability. Many commonly requested features (improved dirty-tracking, fragments, alternative Models) are now possible or easier to implement in addons.</p>
<p>Landing <code>RecordData</code> required significant refactoring of the internals of <code>ember-data</code>, and is intended to allow us to deprecate and remove use of the private but intimate <code>InternalModel</code> API.
Due to the nature of this change, we expect some applications may encounter regressions. This was the primary motivation for waiting to land this until after our first <code>LTS</code>. If you encounter issues upgrading from pre <code>3.5</code> versions to <code>3.5</code> or later, we recommend reporting them and making use of <code>LTS</code> until fixes are available.</p>
<p>We are tracking issues introduced by <code>RecordData</code> with the label <a href="https://github.com/emberjs/data/labels/record-data">record-data</a></p>
<p>We will also continue to target bugfixes for <code>LTS</code>, tracked by the label <a href="https://github.com/emberjs/data/labels/lts-target">lts-target</a>.</p>
<h5 id="recorddatausewithmodelfragments">RecordData use with ModelFragments</h5>
<p>While most community addons have been found to work with <code>RecordData</code> versions of <code>ember-data</code>, <a href="https://github.com/lytics/ember-data-model-fragments">ember-data-model-fragments</a> does not currently. If you use this addon, it is likely you will want to stay on <code>ember-data</code> <code>3.4 LTS</code> until the community has released a version compatible with <code>RecordData</code>.</p>
<p>If you use <code>ember-data-model-fragments</code>, helping to refactor it to make use of <code>RecordData</code> (or supply bugfixes to <code>ember-data</code> if required) would be greatly appreciated.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember Data 3.5.</p>
<p>For more details on Ember Data 3.5, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.5.0">Ember Data 3.5.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! To upgrade your projects using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn upgrade ember-cli
</code></pre>
<p>To upgrade your projects using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install --save-dev ember-cli
</code></pre>
<p>After running the upgrade command, make sure to install (if you haven't already) ember-cli-update globally:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own.</p>
<h3 id="changesinembercli35">Changes in Ember CLI 3.5</h3>
<p>This release cycle marks a major milestone for <code>ember-cli</code>, an LTS release.</p>
<h4 id="lts-1">LTS</h4>
<p>The milestone is the release of <code>3.4 LTS</code>, our very first <code>LTS</code> release! From here out, <code>ember-cli</code> will follow the same LTS cycle and process as <code>Ember</code>.</p>
<h4 id="newfeatures3">New Features (3)</h4>
<h5 id="upgradedtobroccoliv2001of3">Upgraded to Broccoli v2.0.0! (1 of 3)</h5>
<p>Broccoli is an asset pipeline used by Ember. For quite a long time, tools in the Ember
Ecosystem relied on a fork of Broccoli. However, as of this release, Ember CLI now uses
<a href="https://github.com/broccolijs/broccoli">Broccoli 2.0</a> directly!
See <a href="https://discuss.emberjs.com/t/readers-questions-why-does-ember-use-broccoli-and-how-is-it-different-from-webpack-rollup-parcel/15384">this Ember.js Times Reader's question</a>
to learn more about what makes Broccoli awesome and why it is used instead of Parcel or Webpack.
Many thanks to contributors and maintainers of Broccoli who helped with the migration.</p>
<h5 id="buildspeedimprovementsupto322of3">Build speed improvements up to 32% (2 of 3)</h5>
<p>Thanks to migrating to Broccoli 2, Ember devs should see some speed improvements in their
builds. Broccoli 2 allows Ember CLI to use the default system <code>temp</code> directory
rather than a <code>./tmp</code> directory local to a project folder. Depending on computer hardware,
users may see up to 32% improvements in build time. The system <code>temp</code> directory
on your computer has some optimizations in place that your apps now benefit from.</p>
<h5 id="migrationtoemberqunit3of3">Migration to ember-qunit (3 of 3)</h5>
<p><code>ember-cli-qunit</code> was a very thin shim over <code>ember-qunit</code>.
Ember CLI now uses <code>ember-qunit</code> directly as a dependency.</p>
<h4 id="deprecations0-1">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember CLI 3.5.</p>
<p>For more details on the changes in Ember CLI 3.5 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.5.0">Ember CLI  3.5.0 release page</a>.</p>
<hr />
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-5-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-5-released</guid><pubDate>Mon, 15 Oct 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.6 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.6 of Ember.js, Ember Data, and Ember CLI. Highlights include public API support for ES6 classes and two new RouterService methods.</p>
<p>This release kicks off the 3.7 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs36">Changes in Ember.js 3.6</h3>
<p>Ember.js 3.6 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There are 2 new features, 6 deprecations, and 13 bugfixes in this version.</p>
<h4 id="newfeatures2">New Features (2)</h4>
<h5 id="nativeclasses1of2">Native Classes (1 of 2)</h5>
<p>The <a href="https://emberjs.github.io/rfcs/0240-es-classes.html">ES Class</a> and <a href="https://emberjs.github.io/rfcs/0337-native-class-constructor-update.html">Native Class Constructor Update</a> RFCs officially ship in 3.6! This feature means that usage of native classes has stabilized, and they are considered public API whose behavior will not change.</p>
<h6 id="greatsoicanuseclasssyntaxnow">Great, so I can use <code>class</code> syntax now?!</h6>
<!-- alex ignore simple -->
<p>Hold your horses! It's not <em>quite</em> that simple.</p>
<p>The behavior of native classes is stable, but currently Ember does not support or recommend the usage of class fields or decorators, which are both still undergoing the TC39 process. TC39 (Technical Committee number 39) is a part of ECMA, the institution which standardizes the JavaScript language under the “ECMAScript” specification. Subsequent RFCs will have to be made to make these officially part of Ember.</p>
<!--alex ignore hook-->
<p>Without decorators or class fields, the benefits of class syntax are generally not worth the costs. Easy-to-use behaviors and features that we rely on day-to-day in Ember, such as service injections, computed properties, and actions, all require decorators. Even if you don't need any of these values, without class fields any class properties must be assigned in the <code>init</code> hook instead, and this would make it even <em>more</em> difficult to update later on when class fields and decorators have shipped.</p>
<p>With this in mind, the official Ember recommendation is to continue using the standard <code>EmberObject.extend()</code> syntax for defining your factories if you are not risk tolerant. The guides will continue to use this syntax for the time being as well.</p>
<h6 id="sowhatsthepointthen">So what's the point then?</h6>
<p>Stabilizing the behavior of classes gives early adopters an API to build on. For users who are more risk tolerant and want to be early adopters, community projects such as <a href="https://github.com/typed-ember/ember-cli-typescript">ember-cli-typescript</a> and <a href="https://github.com/ember-decorators/ember-decorators">ember-decorators</a> are providing the transforms and decorators necessary to use class syntax today, and are dedicated to remaining stable and providing an update path through any changes that occur in TC39 as the proposals are finalized.</p>
<p>Early adopters have been helping tremendously to sort out the details here and make sure that the day the proposals advance, we are ready to land official support for them in Ember directly. Early adoption <em>does</em> come with risks, so if you are considering it, be prepared to have to make changes in the future.</p>
<p>For users who aren't ready to adopt, that's OK - the EmberObject model will continue to be supported for some time to come. In addition, work is progressing on a <a href="https://github.com/ember-codemods/ember-es6-class-codemod">codemod</a> which will transform the old class model to the new one seamlessly, helping with the migration from day one.</p>
<h6 id="usagenotes">Usage Notes</h6>
<p>There are a few notable changes and features for native classes:</p>
<ul>
<li><code>new</code> syntax is not currently supported with classes that extend from <code>EmberObject</code>. You must continue to use the <code>create</code> method when making new instances of classes, even if they are defined using native class syntax. If you want to use <code>new</code> syntax, consider creating classes which do <em>not</em> extend from <code>EmberObject</code>. Ember features, such as computed properties and decorators, will still work with base-less classes.</li>
<li>Instead of using <code>this._super()</code>, you must use standard <code>super</code> syntax. See the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Super_class_calls_with_super">MDN docs on classes</a> for more details.</li>
<li>Native classes support using <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Constructor">constructors</a> to set up newly-created instances. Ember uses these to, among other things, support features that need to retrieve other entities by name, like Service injection and <code>getOwner</code>. To ensure your custom instance setup logic takes place after this important work is done, avoid using the <code>constructor</code> in favor of <code>init</code>.</li>
<li>Using native classes, and switching back to the old Ember Object model is fully supported.</li>
<li>For early adopters who are used to argument values and values passed to <code>create</code> being overriden, this is no longer the case! Class field values will be the default, and any value passed to a class on creation will override that value.</li>
</ul>
<h6 id="compatibilityandpolyfill">Compatibility and Polyfill</h6>
<p>A polyfill for this behavior has been built which backports this behavior to both Ember 3.4 and 3.5. You can see it <a href="https://github.com/pzuraq/ember-native-class-polyfill">here</a>, or install it using ember-cli:</p>
<pre><code class="bash language-bash">ember install ember-native-class-polyfill
</code></pre>
<p>We would like to add support for prior LTS versions (2.18 and 2.16) as well, so if you would like to contribute, ping us in the #st-native-classes channel on Discord or in the <a href="https://github.com/emberjs/ember.js/issues/16927">Native Class Quest issue</a> on Github!</p>
<h5 id="finalstageoftherouterservicerfc2of2">Final stage of the router service RFC (2 of 2)</h5>
<!--alex ignore rejects -->
<p>Ember 3.6 introduces the final stages of the router service RFC. The release includes two new methods: <a href="https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md#new-method-url-recognition"><code>recognize(url)</code></a> that can return a <code>RouteInfo</code> based on the URL you pass and <a href="https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md#new-method-recognize-and-load-models"><code>recognizeAndLoad(url)</code></a> that takes a string URL and returns a promise that resolves to a <code>RouteInfoWithAttributes</code> for the leaf-most route represented by the URL. The promise rejects if the URL is not recognized or an unhandled exception is encountered.</p>
<p>This final stage also introduces the new observable property <code>currentRoute</code>. It is guaranteed to change whenever a route transition happens (even when that transition only changes parameters and doesn't change the active route). You should consider its value deeply immutable -- we will replace the whole structure whenever it changes. The value of <code>currentRoute</code> is a <code>RouteInfo</code> representing the current leaf route.</p>
<p>Wrapping up this final stage we introduce two new events to the router service: <code>routeWillChange</code> and <code>routeDidChange</code>. They both receive a single <code>transition</code> argument which has been expanded to now include <code>to</code> and <code>from</code> properties. This allows you to understand where the transition is and where it is going. To see some examples of this be sure to read the <a href="https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md#new-events-routewillchange--routedidchange">events section</a> of the RFC.
Be sure to have a look at the <a href="https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md">RFC itself</a> for more info in the router service.</p>
<h4 id="deprecations6">Deprecations (6)</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.6, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.6.0">Ember.js 3.6 release page</a>.</p>
<h5 id="newemberobject1of6">new EmberObject (1 of 6)</h5>
<p>We are deprecating usage of <code>new EmberObject()</code> to construct instances of <code>EmberObject</code> and its subclasses. This affects all classes that extend from <code>EmberObject</code> as well, including user defined classes and Ember classes such as:</p>
<ul>
<li><code>Component</code></li>
<li><code>Controller</code></li>
<li><code>Service</code></li>
<li><code>Route</code></li>
<li><code>Model</code></li>
</ul>
<p>Instead, you should use <code>EmberObject.create()</code> to create new instances of classes that extend from <code>EmberObject</code>. If you are using native class syntax instead of <code>EmberObject.extend()</code> to define your classes, you can also refactor to <em>not</em> extend from <code>EmberObject</code>, and continue to use <code>new</code> syntax.</p>
<p>To read more about this deprecation and how to refactor your existing code have a look at <a href="https://www.emberjs.com/deprecations/v3.x/#toc_object-new-constructor">the deprecations page</a>.</p>
<h5 id="removealllistenersobservers2of6">Remove All Listeners/Observers (2 of 6)</h5>
<p>When using both the <code>removeListener</code> and <code>removeObserver</code> methods, users can omit the final string or method argument to trigger an undocumented codepath that will remove <em>all</em> event listeners/observers for the given key. This functionality will be removed since it is uncommonly used, undocumented, and adds a fair amount of complexity to a critical path.</p>
<p>To read more about this deprecation and how to refactor your existing code have a look at <a href="https://www.emberjs.com/deprecations/v3.x/#toc_events-remove-all-listeners">the deprecations page</a>.</p>
<h5 id="deprecateembermerge3of6">Deprecate Ember.merge (3 of 6)</h5>
<p>Ever since <code>Ember.assign</code> was released, <code>Ember.merge</code> became mostly unnecessary. To cut down on duplication, we are now recommending using <code>Ember.assign</code> instead of <code>Ember.merge</code>.</p>
<p>If you need to support Ember &lt;=2.4 you can use <a href="https://github.com/shipshapecode/ember-assign-polyfill">ember-assign-polyfill</a> to make <code>Ember.assign</code> available to you.</p>
<p>To see a code example of switching from <code>Ember.merge</code> to <code>Ember.assign</code> please refer to the <a href="https://deprecations.emberjs.com/v3.x#toc_ember-polyfills-deprecate-merge">deprecation app</a>.</p>
<h5 id="handlerinfosremoval4of6">HandlerInfos Removal (4 of 6)</h5>
<p>Due to the <a href="https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md">router service RFC</a> it is necessary to rename the private API <code>HandlerInfo</code> to <code>RouteInfo</code>.</p>
<p>If you need to access information about the routes you are most likely better served by injecting the router service as it exposes a publicly supported version of the <code>RouteInfo</code>s.
For help on how to do this please refer to the <a href="https://deprecations.emberjs.com/v3.x#toc_remove-handler-infos">deprecation app</a>.</p>
<h5 id="deprecaterouterevents5of6">Deprecate Router Events (5 of 6)</h5>
<p>Currently, application-wide transition monitoring is spread out throughout the <code>Route</code> classes. This does not really belong here but in the <code>Router</code> service instead.</p>
<!--alex ignore hooks-->
<p>That is the reason for the existing <code>willTransition</code> and <code>didTransition</code> hooks/events on the Router. But they are not sufficient to capture all the detail people need.</p>
<p>In addition, they receive <code>handlerInfos</code> in their arguments, which are an undocumented internal implementation detail of router.js that doesn't belong in Ember's public API. Everything you can do with handlerInfos can be done with the <code>RouteInfo</code>.</p>
<p>For examples on how to transition both the <code>Route</code> and <code>Router</code> usages of <code>willTransition</code> and <code>didTransition</code>, please refer to the <a href="https://deprecations.emberjs.com/v3.x#toc_deprecate-router-events">deprecation app</a>.</p>
<h5 id="transitionstateremoval6of6">Transition State Removal (6 of 6)</h5>
<p>The <code>Transition</code> object is a public interface that actually exposed internal state used by router.js to perform routing.</p>
<p>Accessing <code>state</code>, <code>queryParams</code> or <code>params</code> on the <code>Transition</code> has been removed. If you need access to information about the routes, you are probably better served injecting the router service as it exposes a publically supported version of the <code>RouteInfo</code>s.</p>
<p>For information on how to do this please refer to the <a href="https://deprecations.emberjs.com/v3.x#toc_transition-state">deprecation app</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata36">Changes in Ember Data 3.6</h3>
<h4 id="newfeatures0">New Features (0)</h4>
<p>No new features introduced in Ember Data 3.6.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember Data 3.6.</p>
<p>For more details on changes in Ember Data 3.6, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.6.0">Ember Data 3.6 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI separately from Ember.js and Ember Data! To upgrade your global Ember CLI using <code>yarn</code> run:</p>
<pre><code class="bash language-bash">yarn global upgrade ember-cli
</code></pre>
<p>To upgrade your global Ember CLI using <code>npm</code> run:</p>
<pre><code class="bash language-bash">npm install -g ember-cli
</code></pre>
<p>To update your project you need to run the following steps:</p>
<ol>
<li><code>rm -rf node_modules dist tmp</code> -- Delete temporary development folders.</li>
<li><code>npm install -g ember-cli-update</code> -- Install Ember CLI update tool globally.</li>
<li>Run <code>ember-cli-update</code> -- This will update your app or addon to the latest ember-cli release. You will probably encounter merge conflicts that you should resolve in your normal git workflow.</li>
<li>Run <code>ember-cli-update --run-codemods</code> -- This will let you pick codemods to run against your project, to ensure you are using the latest patterns and platform features.</li>
</ol>
<h3 id="changesinembercli36">Changes in Ember CLI 3.6</h3>
<h4 id="newfeatures1">New Features (1)</h4>
<p><strong>Prevent double builds in CI (1 of 1)</strong>
Until version 3.6 the addon author (unless the addon was in an org) would always end up with two CI builds for every PR. One for the branch push and one for the PR update. This is now fixed in Ember CLI 3.6 (for TravisCI users).</p>
<h4 id="deprecations0-1">Deprecations (0)</h4>
<p>There's no deprecations in this version.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.6 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.6.0">Ember CLI 3.6.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-6-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-6-released</guid><pubDate>Thu, 13 Dec 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.7 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.7 of Ember.js, Ember Data, and Ember CLI. This release kicks off the 3.8 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs37">Changes in Ember.js 3.7</h3>
<p>Ember.js 3.7 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There is zero (0) new feature, zero (0) deprecations, and three (3) bugfixes in this 3.7 version.</p>
<p>Note that in Ember.js 3.7 support for Node 4 has been explicitly dropped. Node 4 is no longer supported by the Node.js team either, and that Ember CLI had already dropped support in early 2018. This means that if you are on Node 4 and want to upgrade you will need to upgrade your version of Node first.</p>
<p>Node 6 support is planned to end in the next few months. Keep an eye on the release posts for more information on this.</p>
<h4 id="newfeatures0">New Features (0)</h4>
<p>There are no new features in Ember.js 3.7.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.7, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.7.0">Ember.js 3.7.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata37">Changes in Ember Data 3.7</h3>
<p>No changes in Ember Data 3.7</p>
<h4 id="newfeatures0-1">New Features (0)</h4>
<p>No new features introduced in Ember Data 3.7.</p>
<h4 id="deprecations0-1">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember Data 3.7.</p>
<p>For more details on changes in Ember Data 3.7, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.7.0">Ember Data 3.7.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the github README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to undo the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli37">Changes in Ember CLI 3.7</h3>
<h4 id="newfeatures2">New Features (2)</h4>
<h5 id="compatibilitysectioninaddonreadme1of2">Compatibility section in addon README (1 of 2)</h5>
<p>Whenever you generate a new addon using Ember CLI it will automatically generate a README file for your addon. With Ember CLI 3.7 this README will now include a compatibility section that will allow you to better communicate to users of the addon what is needed to use the addon.</p>
<h5 id="removelastusageofbabel62of2">Remove last usage of Babel 6 (2 of 2)</h5>
<p>Ember CLI 3.7 has removed the last usage of Babel 6 which was used for supporting compiling templates in <code>addon/</code> and supporting <code>addon-test-support/</code> in addons that themselves do not have any <code>.js</code> processors (e.g. no dependency on <code>ember-cli-babel</code>).</p>
<p>This change is not a breaking change since the module compilation between Babel 6 and Babel 7 is compatible.</p>
<h4 id="deprecations0-2">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember CLI 3.7.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.7 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.7.0">Ember CLI  3.7.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-7</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-7</guid><pubDate>Mon, 07 Jan 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.8 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.8 of Ember.js, Ember Data, and Ember CLI. This release kicks off the 3.9 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs38">Changes in Ember.js 3.8</h3>
<p>The 3.8.0 release is an Ember.js Long-Term Support candidate. In six weeks, the 3.8.x series will become the latest LTS release and six weeks after that the 3.4 LTS branch will no longer receive bugfix patches.</p>
<p>For more information about Ember's LTS policies, see the <a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">announcement blog post</a> and <a href="http://emberjs.com/builds/">builds page</a>.</p>
<p>Ember.js 3.8 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There are two (2) new features, one (1) deprecation, and six (6) bugfixes in this version.</p>
<h4 id="newfeatures2">New Features (2)</h4>
<h5 id="elementmodifiermanager1of2">Element Modifier Manager (1 of 2)</h5>
<!-- alex ignore special -->
<p>A modifier manager is an object that is responsible for coordinating the lifecycle events that occurs when invoking, installing and updating an element modifier. This new feature is introduced as a  very low-level API. Most likely you will never - as an Ember app developer - need to use this but it might come in handy for some add-on developers. In this way, the Ember app developers will benefit from this feature by subclassing these special modifiers provided by addons.</p>
<p>If you're interested in learning more about how to use this new feature, then please refer to the <a href="https://github.com/emberjs/rfcs/blob/master/text/0373-Element-Modifier-Managers.md">RFC</a>.</p>
<h5 id="arrayhelper2of2">Array helper (2 of 2)</h5>
<p>Ember 3.8 introduces the <code>{{array}}</code> helper to create an array in a template. This helper works in similar fashion to the already existing <code>{{hash}}</code> helper.</p>
<p>The helper would be invoked as <code>{{array arg1 ... argN}}</code> and return the value <code>[arg1, ..., argN]</code>. For example, <code>{{array 'a' 'b' 'c'}}</code> would return the value <code>['a', 'b', 'c']</code>.</p>
<p>Read the <a href="https://github.com/emberjs/rfcs/blob/master/text/0318-array-helper.md">original RFC</a> for more information.</p>
<h4 id="deprecations1">Deprecations (1)</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.8, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.8.0">Ember.js 3.8.0 release page</a>.</p>
<h5 id="componentmanagerfactoryfunction1of1">Component Manager Factory Function (1 of 1)</h5>
<p><code>setComponentManager</code> no longer takes a string to associate the custom component class and the component manager. Instead you must pass a factory function that produces an instance of the component manager. For more information please refer to the <a href="https://emberjs.com/deprecations/v3.x#toc_component-manager-string-lookup">deprecations app</a></p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata38">Changes in Ember Data 3.8</h3>
<p>While no new features or deprecations were introduced in Ember Data 3.8, there were a few fixes that users should find helpful:</p>
<ul>
<li>documentation: updated release instructions, fixed broken links, clarified load/reload behavior, and added <code>Reference</code> and <code>AdapterError</code> documentation.</li>
<li>updated <code>_scheduleFetch</code> to use <code>_fetchRecord</code> for <code>belongsTo</code> relationship - without this, it would trigger one find-request per <code>belongsTo</code> relationship, instead of correctly coalescing them together.</li>
</ul>
<p>For more details on changes in Ember Data 3.8, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.8.0">Ember Data 3.8.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<!-- alex ignore easy -->
<p>You may upgrade Ember CLI easily using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the github README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli38">Changes in Ember CLI 3.8</h3>
<p>Here are some of the fixes in ember-cli 3.8 that community members may find useful to know about:</p>
<!-- alex ignore easy -->
<ul>
<li>documentation: more links to the contributing guide were added, so users can more easily find out how to contribute</li>
<li><code>{{content-for}}</code> was updated to allow the use of this on the same line if different types are specified (i.e., <code>{{content-for 'head'}} {{content-for 'head-footer'}}</code>)</li>
<li>gitignore was updated to ignore Yarn .pnp files</li>
<li>the <code>tests</code> directory will be ignored when tests are turned off</li>
</ul>
<p>For more details on each of these, and a full list of the changes in Ember CLI 3.8, as well as detailed upgrade
instructions, please see the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.8.0">Ember CLI 3.8.0 release page</a>.</p>
<h2 id="thankyou">Thank You</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-8-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-8-released</guid><pubDate>Wed, 27 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 3.9 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 3.9 of Ember.js, Ember Data, and Ember CLI. This release kicks off the 3.10 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/builds/">Release Dashboard</a></li>
<li><a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html">The Ember Release Cycle</a></li>
<li><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember Project</a></li>
<li><a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html">Ember LTS Releases</a></li>
</ul>
<p>Additionally, versions 3.8 of Ember and Ember Data are now promoted to LTS, which stands for Long Term Support. An LTS version of Ember continues to receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks). LTS releases typically occur every four minor versions. The previous LTS version for Ember was 3.4.</p>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs39">Changes in Ember.js 3.9</h3>
<p>Ember.js 3.9 is an incremental, backwards compatible release of Ember with bugfixes, performance improvements, and minor deprecations. There are zero (0) new features, six (6) deprecations, and eight (8) bugfixes in this version.</p>
<h4 id="newfeatures0">New Features (0)</h4>
<p>No new features introduced in Ember.js 3.9.</p>
<h4 id="deprecations6">Deprecations (6)</h4>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<p>For more details on changes in Ember.js 3.9, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v3.9.0">Ember.js 3.9.0 release page</a>.</p>
<h5 id="computedpropertyoverridability1of6">Computed Property Overridability (1 of 6)</h5>
<p>Ember's computed properties are overridable by default if no setter is defined. This behavior is bug prone and has been deprecated. <code>readOnly()</code>, the modifier that prevents this behavior, will be deprecated once overridability has been removed. Please have a look at <a href="https://emberjs.com/deprecations/v3.x#toc_computed-property-override">the deprecations app</a> for more information on this deprecation.</p>
<h5 id="computedpropertypropertymodifier2of6">Computed Property <code>.property()</code> Modifier (2 of 6)</h5>
<p><code>.property()</code> is a modifier that adds additional property dependencies to an existing computed property. To update, move the dependencies to the main computed property definition and you shouldn't see a deprecation warning any more. For more information please refer to <a href="https://emberjs.com/deprecations/v3.x#toc_computed-property-property">the deprecations app</a>.</p>
<h5 id="computedpropertyvolatility3of6">Computed Property Volatility (3 of 6)</h5>
<p><code>.volatile()</code> is a computed property modifier which makes a computed property recalculate every time it is accessed, instead of caching. It also prevents property notifications from ever occuring on the property, which is generally not the behavior that developers are after. Volatile properties are usually used to simulate the behavior of native getters, which means that they would otherwise behave like normal properties.</p>
<p>To update, consider upgrading to native class syntax and using native getters directly instead. There's guide on how to do this in the <a href="https://emberjs.com/deprecations/v3.x#toc_computed-property-volatile">deprecations app</a>.</p>
<h5 id="deprecateemberobjectaliasmethod4of6">Deprecate <code>@ember/object#aliasMethod</code> (4 of 6)</h5>
<p><code>@ember/object#aliasMethod</code> is a little known and rarely used method that allows user's to add aliases to objects defined with EmberObject. The deprecation warning can be removed by refactoring it into having one function call the other directly. To see how to do this, please refer to the <a href="https://emberjs.com/deprecations/v3.x#toc_object-alias-method">deprecations app</a></p>
<h5 id="deprecatethisdincomponents5of6">Deprecate <code>this.$()</code> in components (5 of 6)</h5>
<p>As part of the work in making Ember lean by default using <code>this.$()</code> in components is now deprecated. What is important to notice about this deprecations is that <strong>this does not mean that we discourage the use of jQuery</strong> in Ember applications. In fact, there are a lot of cases where jQuery is still very useful.</p>
<p>If you still would like to use jQuery in your application you will need to use the <code>@ember/jquery</code> package going forward.</p>
<p>Read more about this deprecation in <a href="https://github.com/emberjs/rfcs/blob/master/text/0386-remove-jquery.md">the RFC</a>.</p>
<h5 id="deprecateemberd6of6">Deprecate <code>Ember.$()</code> (6 of 6)</h5>
<p>Using <code>Ember.$()</code> will now throw a deprecation warning.</p>
<p>What is important to notice about this deprecations is that <strong>this does not mean that we discourage the use of jQuery</strong> in Ember applications. In fact, there are a lot of cases where jQuery is still very useful.</p>
<p>If you still would like to use jQuery in your application you will need to use the <code>@ember/jquery</code> package going forward.</p>
<p>Read more about this deprecation in <a href="https://github.com/emberjs/rfcs/blob/master/text/0386-remove-jquery.md">the RFC</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata39">Changes in Ember Data 3.9</h3>
<h4 id="newfeatures1">New Features (1)</h4>
<p>Replace jQuery with <code>fetch</code> (1 of 1)</p>
<p>As part of <a href="https://github.com/emberjs/rfcs/pull/0386">the RFC for removing jQuery by default</a>, Ember Data has now replaced all internal uses of jQuery and replaced it with <code>fetch</code> instead.</p>
<p>You can follow the <a href="https://github.com/emberjs/rfc-tracking/issues/3">progress of the RFC</a> on the RFC-tracking page.</p>
<h4 id="deprecations0">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember Data 3.9.</p>
<p>For more details on changes in Ember Data 3.9, please review the
<a href="https://github.com/emberjs/data/releases/tag/v3.9.0">Ember Data 3.9.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the ember-cli-update project:</p>
<pre><code class="bash language-bash">npm install -g ember-cli-update
ember-cli-update
</code></pre>
<p>This utility will help you to update your app or add-on to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the github README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli39">Changes in Ember CLI 3.9</h3>
<p>There are two (2) new features and one (1) bugfix.</p>
<h4 id="newfeatures2">New Features (2)</h4>
<h5 id="emberwelcomepageupdatedtouseanglebracketinvocationsyntax1of2"><code>ember-welcome-page</code> updated to use angle bracket invocation syntax (1 of 2)</h5>
<p>The welcome page that is generated in new Ember apps is now converted to use the angle bracket invocation syntax. This means that instead of adding <code>{{welcome-page}}</code> to <code>application.hbs</code> we now add <code>&lt;WelcomePage /&gt;</code>.</p>
<h5 id="supportfornode112of2">Support for Node 11 (2 of 2)</h5>
<p>Ember CLI is now tested against Node 11. If developers use it for their apps and addons, the CLI will not show a warning anymore.</p>
<h4 id="bugfixes1">Bugfixes (1)</h4>
<h5 id="moduleunificationblueprintupdates1of1">Module unification blueprint updates (1 of 1)</h5>
<p>The "Module Unification" blueprints have received several bugfixes and enhancements. For more details have a look at <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.9.0">the release notes</a>.</p>
<h4 id="deprecations0-1">Deprecations (0)</h4>
<p>No new deprecations introduced in Ember CLI 3.9.</p>
<hr />
<p>For more details on the changes in Ember CLI 3.9 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.9.0">Ember CLI  3.9.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serve as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-3-9-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-3-9-released</guid><pubDate>Wed, 10 Apr 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.0 released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.0 of Ember.js, Ember Data, and
Ember CLI. Ember's 4.0 release focuses
the framework by removing long-deprecated APIs and support for legacy platforms.
This blog post will help you understand how to upgrade and navigate any breaking
changes.</p>
<p>Although <a href="https://emberjs.com/editions/octane/">Ember "Octane"</a> APIs have been
the default for new applications since Ember 3.15, the framework has continued
to support "Classic" framework features in accordance with our semantic
versioning commitment. Ember 4.0 takes a step forward and drops
already-deprecated classic APIs, however the foundational <code>EmberComponent</code> and
<code>EmberObject</code>/<code>computed</code> APIs are not removed in this release.</p>
<p>Additionally, today we're promoting Ember 3.28 to become Ember's latest
Long-Term Support (LTS) release. Ember's LTS release process provides bugfix
support for about 36 weeks, and security patches for about 54 weeks. See the
<a href="https://blog.emberjs.com/ember-3-28-released">3.28 release post</a> and <a href="https://emberjs.com/releases/lts/">LTS
documentation</a> for more details.</p>
<p>For applications using LTS releases, upgrading directly to 4.0 is not
encouraged. Best practice for those applications is to upgrade to Ember 3.28 LTS
as soon as possible, then wait for the first LTS of the 4.0 series to be
released. Ember 4.4 will be the first candidate.</p>
<h2 id="majorreleasesinember">Major Releases in Ember</h2>
<p>Starting with Ember 2.0, major versions of Ember have been about removal
of deprecated APIs, and not about the introduction of new features or development styles.
Ember 4.0 follows that tradition, and will contain no new features.</p>
<p>Our plans for Ember 4.0 were originally announced in July 2021 in
<a href="https://blog.emberjs.com/the-road-to-ember-4-0/">The Road to Ember 4.0</a>.</p>
<h2 id="tryingemberforthefirsttime">Trying Ember for the first time</h2>
<p>If you're interested in trying Ember for the
first time today, get started by running:</p>
<pre><code class="bash language-bash"># Make sure you are on the latest npm version, 8.x
npm --version
npx ember-cli@latest new my-project
cd my-project
npm start
# Then visit http://localhost:4200
</code></pre>
<h2 id="howtoupgradeyourprojecttoember4">How to upgrade your project to Ember 4</h2>
<p>If your app or addon runs with no deprecations in the latest release of 3.28
you should be able to upgrade to Ember 4 with no additional changes. Depending
on how up to date your dependencies are, you may want to upgrade several of
those before the jump including <code>ember-data</code>, <code>ember-auto-import</code>, and
<code>ember-cli-htmlbars</code></p>
<p>Follow these steps in order:</p>
<ol>
<li>Upgrade your project to the latest patch version of Ember 3.28.
Many developers can do this by running
<code>npx ember-cli-update --to 3.28</code>. The
<a href="https://cli.emberjs.com/release/basic-use/upgrading/#upgradinganemberappitself">general Ember upgrade guide</a>
has more details about how to upgrade your Ember app/addon.</li>
<li>Upgrade the <code>ember-cli-htmlbars</code> dependency (if present) to the latest patch
release of 6.x. The final patch releases of the 5.x and 6.x series
include important fixes for how deprecations are presented.</li>
<li>Install <code>ember-auto-import</code>. If your app does not already have it as a
dependency, follow the <a href="https://github.com/ef4/ember-auto-import#installation"><code>ember-auto-import</code> installation
documentation</a>. The
short version is: <code>npm i --save-dev ember-auto-import webpack</code>.
If you are already using <code>ember-auto-import</code>, make sure you are using release
2.x or better.
You can follow
<a href="https://github.com/ef4/ember-auto-import/blob/main/docs/upgrade-guide-2.0.md">this upgrade guide</a>
if you are on an earlier version.</li>
<li>Make sure your app builds successfully.</li>
<li>Resolve all deprecation warnings. Deprecated APIs are removed in Ember 4.0. You
may need to upgrade some of your dependencies if they are using deprecated
APIs. See the <a href="https://deprecations.emberjs.com/">Ember Deprecation Guide</a>
for more details about specific deprecations and how to resolve them.
Applications that need to upgrade through several versions may want to
consider isolating individual deprecations by using
<a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a>.</li>
<li>Make sure your app builds successfully and your test suite passes with no
deprecations.</li>
<li>Upgrade your app to Ember 4.0. Again,
many developers can do this by running
<code>npx ember-cli-update --to 4.0</code>. Refer to the
<a href="https://cli.emberjs.com/release/basic-use/upgrading/#upgradinganemberappitself">general Ember upgrade guide</a>
for more details about how to upgrade your Ember app/addon.</li>
</ol>
<h2 id="notablechanges">Notable changes</h2>
<h3 id="browsersupportinember4">Browser Support in Ember 4</h3>
<p>Ember 4.0 supports two classes of browsers: Evergreen (those on a weeks-long, auto-upgrade release cycle) and non-evergreen. This classification system allows us to create a rolling minimum version for evergreen browsers, while using a more traditional, pinned minimum version for non-evergreen browsers.</p>
<p>Specifically, the Ember 4.x release policy includes support for Google Chrome, Mozilla Firefox, Microsoft Edge, and Apple Safari on desktop and mobile. <strong>It does not include support for any version of Internet Explorer.</strong></p>
<p>Supported browser ranges:</p>
<ul>
<li>Chrome &gt;= 92</li>
<li>Edge &gt;= 93</li>
<li>Firefox &gt;= 91</li>
<li>iOS &gt;= 12</li>
<li>Safari &gt;= 12</li>
<li>Chrome Android &gt;= 96</li>
<li>Firefox Android &gt;= 94</li>
</ul>
<p>Read more about this change in the <a href="https://deprecations.emberjs.com/v3.x/#toc_3-0-browser-support-policy">deprecation guide</a> and at Ember's <a href="https://emberjs.com/browser-support/">browser support policy page</a>.</p>
<h3 id="emberautoimportisarequireddependency">ember-auto-import is a required dependency</h3>
<p>Using Ember 4.x requires that your project depends on version 2.0+
of the <a href="https://github.com/ef4/ember-auto-import"><code>ember-auto-import</code> addon</a>.
Follow the "How to upgrade" steps above to learn how to upgrade.</p>
<p>Why is this dependency required? <code>ember-auto-import</code> implements support in
Ember CLI for something we call the
<a href="https://emberjs.github.io/rfcs/0507-embroider-v2-package-format.html">v2 addon
format</a>.
This specification describes how to publish an Ember CLI addon that has minimal
build overhead and better compatibility with modern build and analysis tooling
(ala <a href="https://webpack.js.org/">Webpack</a>). Later in Ember's 4.x release cycle,
we intend to release framework libraries as v2 addons to take advantage of those
improvements. Mandating the library is installed for 4.0 prepares Ember projects
for that eventual change.</p>
<h2 id="changesinemberjs40">Changes in Ember.js 4.0</h2>
<p>Ember.js is the core of the Ember framework. It provides routing, rendering, and
dependency injection features.</p>
<p>Ember.js 4.0 introduces no new public API. Instead, it is comprised of bug fixes
and the removal of previously deprecated public API from the 3.x cycle.</p>
<p>Ember 4.0 does <em>not</em> remove the <code>EmberComponent</code> API or the core parts of the
<code>EmberObject</code> system. These APIs are widely used, even after the release of
Octane, by existing application and addon code.</p>
<h3 id="apisremovedin40">APIs Removed in 4.0</h3>
<p>Below we've listed some of the most significant API removals in Ember.js 4.0.
For a complete list of removals, see the <a href="https://deprecations.emberjs.com/v3.x">Ember.js 3.x deprecation
guide</a>.</p>
<ul>
<li><code>Ember.Logger</code> is removed in favor of native <code>console</code> APIs. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-console-deprecate-logger">Guide here</a>.</li>
<li><code>Copyable</code> mixin is removed in favor of the <a href="https://github.com/emberjs/ember-copy">ember-copy addon</a>. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-runtime-deprecate-copy-copyable">Guide here</a>.</li>
<li><code>sendAction</code> is removed in favor of calling closure actions like any other callback. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-component-send-action">Guide here</a>.</li>
<li><code>willTransition</code> and <code>didTransition</code> are removed in favor of router service events. <a href="https://deprecations.emberjs.com/v3.x/#toc_deprecate-router-events">Guide here</a>.</li>
<li>Computed Property <code>volatile()</code> calls are removed in favor of native getters. <a href="https://deprecations.emberjs.com/v3.x/#toc_computed-property-volatile">Guide here</a>.</li>
<li><code>this.$()</code> and other jQuery APIs have been removed in favor of native browser equivalents. <a href="https://deprecations.emberjs.com/v3.x/#toc_jquery-apis">Guide here</a>. An optional feature which restored jQuery-specific features is also removed. <a href="https://deprecations.emberjs.com/v3.x/#toc_optional-feature-jquery-integration">Guide here</a>.</li>
<li><code>{{partial}}</code> is removed in favor of template-only components. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-partial">Guide here</a>.</li>
<li>Using the built-in global resolver (<code>App.FooController</code> anyone?) is deprecated in favor of using <a href="https://github.com/ember-cli/ember-resolver">ember-resolver</a>, already the default for Ember CLI generated apps. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-deprecate-globals-resolver">Guide here</a>.</li>
<li>Ambiguous references to a component's properties are removed. You must now write <code>{{this.someProp}}</code>. <a href="https://deprecations.emberjs.com/v3.x/#toc_this-property-fallback">Guide here</a>.</li>
<li><code>renderTemplate</code> is removed in favor of <code>{{in-element}}</code> or other rendering target redirection like <a href="https://github.com/yapplabs/ember-wormhole">ember-wormhole</a>. <a href="https://deprecations.emberjs.com/v3.x/#toc_route-render-template">Guide here</a>.</li>
<li>Support for the <code>Ember</code> global on <code>window</code> is removed in favor of importing the <code>Ember</code> object or using the module-based API. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-global">Guide here</a>.</li>
<li>Support for certain features of the <code>&lt;LinkTo&gt;</code>, <code>&lt;Input&gt;</code>, and <code>&lt;Textarea&gt;</code> components are removed. See guides on <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-glimmer-link-to-positional-arguments">positional arguments</a>, <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-built-in-components-legacy-arguments">legacy arguments</a>, <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-built-in-components-legacy-attribute-arguments">legacy HTML attributes</a>, and <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-built-in-components-import">importing legacy built-in components</a>.</li>
<li>The internal APIs of <code>&lt;LinkTo&gt;</code>, <code>&lt;Input&gt;</code>, <code>&lt;Checkbox&gt;</code>, and <code>&lt;Textarea&gt;</code> are now private,
and subclassing them is no longer supported.
An example of subclassing looks like this: <code>export class MyLinkComponent extends LinkTo</code>.
Apps or addons that subclass can install
the library <a href="https://github.com/emberjs/ember-legacy-built-in-components"><code>@ember/legacy-built-in-components</code></a>
as a stepping stone, following <a href="https://deprecations.emberjs.com/v3.x#toc_ember-built-in-components-import">this deprecation guide</a>.</li>
<li>…and additional uncommon deprecations found in the <a href="https://deprecations.emberjs.com/v3.x">Ember.js 3.x deprecation
guide</a></li>
</ul>
<p>Many of these removed APIs date back to Ember 1.x, and are rarely used now (or should be rarely used).</p>
<p>For more details on the changes in Ember.js 4.0, please review the
<a href="https://github.com/emberjs/ember.js/releases/tag/v4.0.0">Ember.js 4.0.0 release page</a>.</p>
<h3 id="deprecationsaddedin40">Deprecations added in 4.0</h3>
<p>The following public API, marked as deprecated in Ember 4.0, will be removed in
Ember 5.0:</p>
<ul>
<li>Use of <code>Ember.assign</code> is deprecated. You should replace any calls to <code>Ember.assign</code> with <code>Object.assign</code> or use the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax">object spread operator</a>. See the <a href="https://deprecations.emberjs.com/v4.x#toc_ember-polyfills-deprecate-assign">deprecation guide</a> for examples.</li>
</ul>
<h2 id="changesinemberdata40">Changes in Ember Data 4.0</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<p>This release removes APIs that were <a href="https://deprecations.emberjs.com/ember-data/v3.x">deprecated in the 3.x cycle</a>. Examples include:</p>
<ul>
<li>The API <code>store.defaultAdapter</code> is removed - <a href="https://deprecations.emberjs.com/ember-data/v3.x#toc_ember-data-default-adapter">deprecation guide</a></li>
<li>Support for relying on fallback behavior for adapter type is removed.
You should <a href="https://deprecations.emberjs.com/ember-data/v3.x#toc_ember-data-default-adapter">specify adapter types explicitly</a>.</li>
<li>Similarly, <code>adapter.defaultSerializer</code> and support for relying on fallback behavior for the
serializer type <a href="https://deprecations.emberjs.com/ember-data/v3.x#toc_ember-data-default-serializers">is removed</a></li>
<li>The <a href="https://deprecations.emberjs.com/ember-data/v3.x#toc_evented-api-usage">Evented API is removed</a></li>
<li>…and other APIs listed in the <a href="https://deprecations.emberjs.com/ember-data/v3.x">deprecation guide</a></li>
</ul>
<p>For more details on the changes in Ember Data 4.0, please review the
<a href="https://github.com/emberjs/data/releases/tag/v4.0.0">Ember Data 4.0.0 release page</a>.</p>
<h2 id="changesinembercli40">Changes in Ember CLI 4.0</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js
applications.</p>
<p>Some notable changes in Ember CLI 4.0 include:</p>
<ul>
<li>When generating a new Ember app (<code>ember new appname</code>) or addon
(<code>ember addon addonname</code>) the option <code>--ci-provider</code> is now available. This
can be passed <code>travis</code> or <code>github</code> to generate the appropriate CI
configuration files. See
<a href="https://github.com/ember-cli/ember-cli/pull/9579">ember-cli/ember-cli#9579</a>
for more details.</li>
<li>Additionally, the default CI provider for newly generated apps and addons
is now GitHub Actions (replacing TravisCI).</li>
<li>Ember CLI's <code>EmberApp</code> accepts an option <code>addons</code> to manually control which
installed addons will be run during the build. The properties <code>exclude</code>
and <code>include</code> on this option have been introduced to replace the properties
<code>blacklist</code> and <code>whitelist</code>. The replaced properties will continue to function
until they can undergo a full deprecation and major release cycle. This
change is in support of <a href="https://emberjs.github.io/rfcs/0639-replace-blacklist-whitelist.html">RFC
639</a>.</li>
</ul>
<p>For more details on the changes in Ember CLI 4.0 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.0.0">Ember CLI 4.0.0 release page</a>.</p>
<h2 id="needhelp">Need help?</h2>
<p>Are you stuck on something? Do you have questions?
Visit one of our <a href="https://emberjs.com/community">community chat groups</a>.</p>
<h2 id="whatnext">What next?</h2>
<p>Want to help make Ember 4 a success? Here are some things you can do!</p>
<ul>
<li>Blog about your experience.</li>
<li>If someone helps you with a question, consider posting both the question
and answer to a public place like Stack Overflow or the Ember Discourse forums,
so that others can learn from it.</li>
<li>Help your favorite addons to upgrade to Ember 4!</li>
<li>Stay tuned via the Ember Times for new features and requests for help
implementing them.</li>
</ul>
<h3 id="thankyou">Thank You!</h3>
<p>We want to offer a heart-felt <strong>"thank you"</strong> to our the amazing Ember 4.0
contributors. This
release was a wide-ranging effort with over 50 API removals in
the <code>ember-source</code> package alone, and required coordination of timelines and
execution across all Ember's core libraries and teams. Ember is a project
maintained largely by volunteers, and this release is the result of sustained
contribution across many codebases, timezones, and interests.</p>
<p>We deeply appreciate the support of our contributors and user community. Thank
you.</p>]]></description><link>https://blog.emberjs.com/ember-4-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-4-0-released</guid><pubDate>Mon, 20 Dec 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.1 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.1 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 4.2 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs41">Changes in Ember.js 4.1</h3>
<p>Ember.js 4.1 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.1 introduced 2 bug fixes.</p>
<ol>
<li>Passing an <code>ObjectProxy</code> to <code>isEmpty</code> with a property size now throws an assertion (<a href="https://github.com/emberjs/ember.js/pull/17570">#17570</a>).</li>
<li>The router has been updated so that when query params are using a nested value a <code>Route</code> can determine if that nested query param is marked as <code>refreshModel</code>. (<a href="https://github.com/emberjs/ember.js/pull/18269">#18269</a>)</li>
</ol>
<h4 id="features">Features</h4>
<p>Ember.js 4.1 introduced 3 features.</p>
<ol>
<li>There's now a <code>service</code> export available from <code>@ember/service</code> in favor of the previously used <code>inject</code>, which was previously typically aliased upon import to <code>service</code>. (<a href="https://github.com/emberjs/ember.js/pull/19776">#19776</a>)</li>
<li>A <code>refresh</code> method has been added to the <code>RouterService</code> that calls <code>refresh</code> on all currently active routes, or if a route name is provided, refreshes only that route provided and its descendants. (<a href="https://github.com/emberjs/ember.js/pull/19471">#19471</a> / <a href="https://github.com/emberjs/ember.js/pull/19834">#19834</a>)</li>
<li>A <code>@cached</code> decorator for memoizing the result of a getter based on autotracking has been added to help when a getter is expensive and used very often. (<a href="https://github.com/emberjs/ember.js/pull/19772">#19772</a> / <a href="https://github.com/emberjs/ember.js/pull/19826">#19826</a>)</li>
</ol>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.1 introduced 1 deprecation.</p>
<ol>
<li>The <code>AutoLocation</code> class, which previously served to support detection of browser support for the History Location API is now deprecated. Virtually all browsers now support the history API, so this is what 'auto' will resolve to in almost every case, rendering the <code>AutoLocation</code> class unnecessary. Instead, please set <code>locationType</code> in <code>config/environment.js</code> to 'history'. (<a href="https://github.com/emberjs/ember.js/pull/19510">#19510</a>)</li>
</ol>
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 4.1, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.1.0">Ember.js 4.1.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata41">Changes in Ember Data 4.1</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember Data 4.1 introduced 0 bug fixes.</p>
<h4 id="features-1">Features</h4>
<p>Ember Data 4.1 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 4.1 introduced 0 deprecations.</p>
<p>For more details on changes in Ember Data 4.1, please review the
<a href="https://github.com/emberjs/data/releases/tag/v4.1.0">Ember Data 4.1.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli41">Changes in Ember CLI 4.1</h3>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 4.1 introduced 0 bug fixes.</p>
<h4 id="features-2">Features</h4>
<p>Ember CLI 4.1 introduced 0 features.</p>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 4.1 introduced 0 deprecations.</p>
<p>For more details on the changes in Ember CLI 4.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.1.0">Ember CLI 4.1.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-4-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-4-1-released</guid><pubDate>Mon, 03 Jan 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.2 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.2 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 4.3 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs42">Changes in Ember.js 4.2</h3>
<p>Ember.js 4.2 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.2 introduced 1 bug fix.</p>
<p>Class-based helpers are now allowed to work in strict-mode. (<a href="https://github.com/emberjs/ember.js/pull/19878">#19878</a>)</p>
<h4 id="features">Features</h4>
<p>Ember.js 4.2 introduced 0 features.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.2 introduced 0 deprecations.</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 4.2, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.2.0">Ember.js 4.2.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata42">Changes in Ember Data 4.2</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember Data 4.2 introduced 3 bug fixes and some tests and documentation improvements.</p>
<ul>
<li>Update <code>@ember/string</code> to the latest version. The prior version used deprecated import paths that error under <code>ember-source</code> <code>v4.0</code>.</li>
<li>Bugfix for Embroider compatibility. Ensure <code>shouldCompileModules</code> is respected.</li>
<li>Resolve deprecated usage of <code>assign</code>.</li>
</ul>
<h4 id="features-1">Features</h4>
<p>Ember Data 4.2 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 4.2 introduced 0 deprecations.</p>
<p>Support for the <code>toJSON</code> method on Ember Data records has been removed. It was deprecated in <code>3.x</code> and slated for removal in <code>4.x</code>.
If your app uses this method, follow the <a href="https://deprecations.emberjs.com/ember-data/v3.x/#toc_record-toJSON">deprecation guide</a>.</p>
<p>For more details on changes in Ember Data 4.2, please review the
<a href="https://github.com/emberjs/data/compare/v4.1.0…v4.2.0">Ember Data 4.2.0 commits</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli42">Changes in Ember CLI 4.2</h3>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 4.2 introduced 3 bug fixes:</p>
<ol>
<li>Updated mentions of the Ember CLI website to the new URL. (<a href="https://github.com/ember-cli/ember-cli/pull/9681">#9681</a>)</li>
<li>Stale GitHub Actions workflows are cancelled when starting a new one. (<a href="https://github.com/ember-cli/ember-cli/pull/9726">#9726</a>)</li>
<li><code>ember-template-lint</code> dependency in default blueprints has been upgraded to v4. (<a href="https://github.com/ember-cli/ember-cli/pull/9753">#9753</a>)</li>
</ol>
<h4 id="features-2">Features</h4>
<p>Ember CLI 4.2 introduced 1 feature.</p>
<ol>
<li>Add an <code>assert</code> and a <code>deprecate</code> utility. (<a href="https://github.com/ember-cli/ember-cli/pull/9731">#9731</a>)</li>
</ol>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 4.2 introduced 0 deprecations.</p>
<p>For more details on the changes in Ember CLI 4.2 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.2.0">Ember CLI 4.2.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-4-2-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-4-2-released</guid><pubDate>Fri, 04 Mar 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.5 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.5 of Ember.js and Ember CLI.</p>
<p>Version 4.4 of Ember is now promoted to LTS (Long Term Support).
An LTS version of Ember continues to receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks).
LTS releases typically occur every four minor versions.
The previous LTS version of Ember was 3.28.</p>
<p>This release kicks off the 4.5 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs45">Changes in Ember.js 4.5</h3>
<p>Ember.js 4.5 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.5 introduced 0 bug fixes.</p>
<h4 id="features">Features</h4>
<p>Ember.js 4.5 introduced 2 new features.</p>
<ol>
<li>Plain function as helpers</li>
<li>A new <code>renderSettled</code> test helper</li>
</ol>
<h5 id="1plainfunctionsashelpers">1. Plain functions as helpers</h5>
<p>You can now use plain functions as helpers in your component templates. This helps make the relationship between Ember component templates and their JavaScript class more intuitive.</p>
<p>For example, here we create a method <code>double</code> and use it directly in a template:</p>
<pre><code class="js language-js">// my-component.js

import Component from '@glimmer/component';

export default class MyComponent extends Component {
  double = num =&gt; num * 2;
}
</code></pre>
<pre><code class="hbs language-hbs">// my-component.hbs

{{this.double 2}}

&lt;SomeComponent @foo={{this.double 2}} /&gt;
</code></pre>
<p>Previously, you could define this locally, but still had to <a href="https://guides.emberjs.com/release/components/helper-functions/#toc_writing-a-helper-function">use the <code>helper()</code></a> function to accomplish this.</p>
<p>We're working on updating the Guides to cover this pattern.
For background, check out <a href="https://rfcs.emberjs.com/id/0756-helper-default-manager">RFC 756</a>, which designed this feature.
Also, keep your eyes on this blog: we will have a dedicated blog post with a deep dive on this new capability in the next week or two!</p>
<h5 id="2anewrendersettledtesthelper">2. A new <code>renderSettled</code> test helper</h5>
<!--alex ignore waiters-waitresses-->
<p>Under the hood, Ember's tests use a "test waiters" system to allow you to control the flow of your tests in terms of the actual framework behavior.
That way that your tests match exactly what the app does at runtime.</p>
<!-- alex ignore just waiters-waitresses-->
<p>However, making this work depends on Ember providing all the necessary hooks for test helpers to use, and there was one significant missing public API.
You could wait for <em>all</em> of the test waiters to finish with <code>settled</code>, but there was no public way to wait for <em>just rendering</em> to finish.
For example, you might want to wait for rendering to finish but <em>not</em> for an Ember Data <code>save</code> operation to finish, as part of testing a loading screen.</p>
<p>Ember 4.5 introduces a new function, <code>renderSettled</code>, as a public way for test helpers to interact with the rendering phase of the application.
<code>renderSettled</code> returns returns a promise which fulfills as soon as rendering has completed.
It can be used in any rendering or application test.
(It also works in other tests where you set up the rendering hooks manually, but this is unusual!)</p>
<pre><code class="js language-js">import { renderSettled } from '@ember/renderer';
</code></pre>
<p>An recent release of <code>@ember/test-helpers</code>, <a href="https://github.com/emberjs/ember-test-helpers/blob/master/CHANGELOG.md#v280-2022-05-17">v2.8.0</a>, takes advantage of this to provide a new <code>await rerender()</code> helper.
For more details, and how this fits into improvements to Ember's testing story, see <a href="https://rfcs.emberjs.com/id/0785-remove-set-get-in-tests">RFC 785</a>.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.5 introduced 0 deprecations.</p>
<p>For more details on changes in Ember.js 4.5, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.5.0">Ember.js 4.5.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js</p>
<p>Due to low availability for the Ember Data team this cycle, Ember Data does not have a new release, so it remains at 4.4.</p>
<p>Please see the <a href="https://blog.emberjs.com/ember-released-4-4">Ember 4.4 release blog post</a> for details about <code>v4.4</code> of Ember Data.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli45">Changes in Ember CLI 4.5</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember CLI 4.5 introduced a variety of small bug fixes and documentation improvements.
You can find the full list in the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.5.0">Ember CLI 4.5.0 release page</a>.</p>
<h4 id="features-1">Features</h4>
<p>Ember CLI 4.5 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 4.5 introduced 2 deprecations.</p>
<ul>
<li>Using the terms <code>whitelist</code> and <code>blacklist</code> build options are deprecated. Please use
<code>include</code> and <code>exclude</code> instead. Only the name of the option has changed, and
the functionality is unchanged. This work to add the
new option naming was initially planned in
<a href="https://rfcs.emberjs.com/id/0639-replace-blacklist-whitelist">RFC 639</a>,
and the deprecation RFC is
<a href="https://rfcs.emberjs.com/id/0801-deprecate-blacklist-and-whitelist-build-options">RFC 801</a>.</li>
<li>Support for <a href="https://github.com/ember-cli/ember-cli/pull/9909"><code>ember-cli-jshint</code> is deprecated</a>.</li>
</ul>
<p>The <code>addonJsFiles</code> method that was previously deprecated in <code>v3.13</code> of Ember CLI <a href="https://github.com/ember-cli/ember-cli/pull/9898">has now been removed</a>.</p>
<p>For more details on the changes in Ember CLI 4.5 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.5.0">Ember CLI 4.5.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-4-5-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-4-5-released</guid><pubDate>Wed, 13 Jul 2022 21:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.6 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.6 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 4.7 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs46">Changes in Ember.js 4.6</h3>
<p>Ember.js 4.6 is an incremental, backwards compatible release of Ember with bug fixes.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.6 introduced 2 bug fixes.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20125">Replace deprecated <code>substr()</code> method</a> with <code>substring()</code> method</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20120">Adjust <code>uniqueId()</code> implementation</a> to only generate valid selectors. <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector"><code>querySelector</code></a> does not work if the first character is a number, so
now we ensure that the first character is a letter.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 4.6 introduced 0 features.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.6 introduced 0 deprecations.</p>
<p>For more details on changes in Ember.js 4.6, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.6.0">Ember.js 4.6.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata">Changes in Ember Data</h3>
<p>The Ember Data team has multiple releases to announce! We will go through them
one by one in the section below.</p>
<p>Firstly, Ember CLI's blueprints for creating new apps and upgrading existing apps
still point to v4.4 of Ember Data. If you want to take advantage of the progress
described below, update the version number in your <code>package.json</code> after completing
your upgrade.</p>
<p>Now let's cover what is in v4.5 and v4.6. These two versions are identical.
The aim is to catch up to the versioning number of Ember CLI and Ember.js.</p>
<p>Version 4.5 includes a number of new deprecations, a significant internal refactoring of the store architecture and several bug fixes described below.</p>
<h4 id="nodesupport">Node support</h4>
<p>v4.5 of Ember Data drops support for Node 12. Node 12 became end of life (it no longer receives security updates) in April 2022.</p>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember Data 4.5 introduced 9 bug fixes. Additional Details are in the <a href="https://github.com/emberjs/data/releases/tag/v4.5.0">release notes</a>.</p>
<ul>
<li><a href="https://github.com/emberjs/data/pull/8083">#8083</a> [BUGFIX] Serialize null array items as empty strings</li>
<li><a href="https://github.com/emberjs/data/pull/7901">#7901</a> <!-- alex ignore waiter --><code>waiter</code> should be always on</li>
<li><a href="https://github.com/emberjs/data/pull/8042">#8042</a> <code>RecordState</code> cleanup</li>
<li><a href="https://github.com/emberjs/data/pull/8008">#8008</a> schedule <code>watchTypeIfUnseen</code> to prevent loop</li>
<li><a href="https://github.com/emberjs/data/pull/8013">#8013</a> Fix generated import paths for test setup functions in addons</li>
<li><a href="https://github.com/emberjs/data/pull/8025">#8025</a> Fix <code>PromiseProxy</code> Deprecation for Save (<a href="https://github.com/runspired">@runspired</a>)</li>
<li><a href="https://github.com/emberjs/data/pull/7902">#7902</a> test for async hasMany does not trigger relationship fetch</li>
<li>Pass correct args to <code>keyFor&lt;Attribute|Relationship&gt;</code> when normalizing</li>
<li><a href="https://github.com/emberjs/data/pull/7945">#7945</a> fix for an issue with computed chains not updated for async hasMany loading</li>
</ul>
<h4 id="features-1">Features</h4>
<p>Ember Data 4.5 introduced improvements to build size.</p>
<p>Users of solely the core of Ember Data, namely the <code>store</code> and <code>ember-inflector</code> packages, may expect the builds of those dependencies to be 35-50% smaller. This is due to most of the legacy support for <code>@ember-data/model</code> having now found its final location at home in that package instead of within the <code>@ember-data/store package</code>. The size of <code>@ember-data/store</code> is reduced from ~16kb compressed to ~9.5kb compressed, potentially a little less depending on what deprecations are resolved and what other packages are present. We expect the core to continue to shrink as we complete the final stages of removing <code>InternalModel</code>, complete implementations for recently accepted deprecation RFCs, and introduce <code>RecordDataV2</code>.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 4.5 introduced 8 deprecations. Some private APIs have also
been deprecated or removed, and some methods deprecated during v3 of Ember are
now removed. For the full list of removed APIs, visit the <a href="https://github.com/emberjs/data/releases/tag/v4.5.0">release notes</a>.</p>
<p>The new deprecations are below, and support for the deprecated APIs will be removed
in the next major version of Ember:</p>
<ul>
<li>deprecating some internal usage of <code>RSVP.Promise</code> that applications may have become dependent on if their tests are leaky. This was
proposed in <a href="https://rfcs.emberjs.com/id/0796-ember-data-deprecate-rsvp">RFC 796</a></li>
<li>deprecating the <code>type</code> property on snapshots (which would lookup the model class).</li>
<li>deprecating <code>store.find</code>, a private method that has been maintained in case users accidentally fell into using ember's hidden autofetch behavior in routes</li>
<li>deprecating <code>store.hasRecordForId</code>, as <code>peekRecord</code> is generally more useful and provides the same information (and more).</li>
<li>deprecating <code>store.recordWasInvalid</code>, an unused internal api that <code>ember-model-validations</code> appears to be using.</li>
<li>deprecating passing strings to the schema lookup functions <code>attributesDefinitionFor</code> and <code>relationshipsDefinitionFor</code>, these APIs now expect an object with at least a <code>type</code> property representing the model name.</li>
<li>deprecating the <code>-json-api</code> fallback adapter, a hidden behavior that provided an adapter if the application failed to define one.</li>
</ul>
<p>As always, deprecated code can be eliminated from the build output by specifying the <code>compatWith</code> arg on the <a href="https://api.emberjs.com/ember-data/release/modules/@ember-data%2Fdeprecations">emberData configuration in your app</a>.</p>
<h5 id="privateapiremovals">Private API removals</h5>
<p>Users of private store APIs may find these APIs have now been deprecated or removed. Internal restructuring will be high the next 6 months as we polish off the removal of <code>InternalModel</code> and continue to simplify codepaths which that removal allows us to do. All but a few private methods have been entirely eliminated from the store.</p>
<p>For more details on changes in Ember Data 4.6, please review the
<a href="https://github.com/emberjs/data/releases/tag/v4.6.0">Ember Data 4.6.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli46">Changes in Ember CLI 4.6</h3>
<p>This version included some changes to Node support, a new deprecation,
some removals of previously deprecated code, and a
<a href="https://github.com/ember-cli/ember-cli/blob/master/CHANGELOG.md">variety of internal cleanup and refactor efforts</a>.</p>
<h4 id="nodesupport-1">Node support</h4>
<p>v4.5 of Ember CLI drops support for Node 12 and adds support for Node 18. Node 12 became end of life (it no longer receives security updates) in April 2022.</p>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 4.6 introduced 0 bug fixes.</p>
<h4 id="features-2">Features</h4>
<p>Ember CLI 4.6 introduced 0 features.</p>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 4.6 introduced 1 deprecation.</p>
<p><a href="https://github.com/ember-cli/ember-cli/pull/9903">The <code>vendor-shim</code> blueprint is deprecated</a>. Please use <code>ember-auto-import</code> instead.</p>
<p>In addition, some deprecations introduced in earlier major versions of
Ember have now been removed, including <a href="https://github.com/ember-cli/ember-cli/pull/9902">support for <code>ember-cli-inject-live-reload</code></a>, <a href="https://github.com/ember-cli/ember-cli/pull/9899"><code>silent</code> error</a>, and <a href="https://github.com/ember-cli/ember-cli/pull/9898"><code>addonJsFiles</code></a>.</p>
<p>For more details on the changes in Ember CLI 4.6 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.6.0">Ember CLI 4.6.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-4-6-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-4-6-released</guid><pubDate>Fri, 29 Jul 2022 21:00:00 GMT</pubDate></item><item><title><![CDATA[Security Releases: Ember 4.8.1, 4.4.4, 3.28.10, 3.24.7]]></title><description><![CDATA[<p><em>Updates 2026-01-30: This security fix was also backported to 2.18.3 so that legacy apps on the 2.x major series can also benefit. No CVE number was ever issued to us for this issue.</em></p>
<p>Today we are releasing Ember.js 3.24.7, 3.28.10, 4.4.4, 4.8.1, and 4.9.0-beta.3 to patch a security vulnerability.  <em>A CVE number is pending and this post will be updated to include it once it's been issued.</em></p>
<p>Apps that pass untrusted input as paths to <code>EmberObject.setProperties</code> or <code>EmberObject.set</code>, or the corresponding standalone functions <code>setProperties</code> or <code>set</code>, may get surprising results that, in combination with other application bugs, could lead to cross-site scripting vulnerabilities.</p>
<pre><code class="js language-js">import EmberObject from '@ember/object';

let o = new EmberObject();

// This can lead to prototype pollution in unpatched Ember versions
o.set(untrustedPath, untrustedValue);

// This can lead to prototype pollution in unpatched Ember versions
o.setProperties({ [untrustedPath]: untrustedValue });
</code></pre>
<p>These methods were vulnerable to <a href="https://learn.snyk.io/lessons/prototype-pollution/javascript/">Prototype Pollution</a>, meaning an attacker can set paths like <code>__proto__.__proto__.isAdmin</code> to mutate unexpected objects, including Javascript intrinsics like the global <code>Object</code>. Depending on the specifics of your application, this can be leveraged as part of an attack to steal user credentials.</p>
<p>While deep property chaining is an intended feature of these APIs, and passing untrusted input to them is ill-advised, we agree that that this behavior is surprising enough to constitute an increased security risk. So this release forbids chaining any <code>set</code> or <code>setProperties</code> through <code>__proto__</code> or <code>constructor</code>.</p>
<p>Apps on unsupported releases that cannot immediately upgrade should audit their usage of <code>setProperties</code> and <code>set</code> to ensure they are not allowing users to control the paths.</p>
<p>Thanks to <a href="https://twitter.com/kinugawamasato">Masato Kinugawa</a> for finding and reporting this issue.</p>]]></description><link>https://blog.emberjs.com/ember-4-8-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-4-8-1-released</guid><pubDate>Wed, 02 Nov 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.8 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.8 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 4.9 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs48">Changes in Ember.js 4.8</h3>
<p>Ember.js 4.8 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.8 introduced 1 bug fix.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20166">#20166</a> - fixed a bug where calling RouteInfo.find() method executes callback with undefined object since 4.3.0.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 4.8 introduced 1 feature.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20180">#20180</a> - an opt-in preview of Ember's official TypeScript types. This is the latest step in implementing <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan">RFC 0800: TypeScript Adoption Plan</a>. These types serve as a way to get early feedback, in line with Ember's normal path to stabilizing features. You can opt into the types now, but won't be opted in automatically until they're stable. Check out <a href="https://blog.emberjs.com/announcing-official-typescript-types-public-preview">the announcement blog post</a> for details on how you can try out the preview, and see the <a href="https://github.com/emberjs/ember.js/pull/2018">pull request</a> for more detail on the implementation and mechanics involved.</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.8 introduced 0 deprecations.</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 4.8, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.8.0">Ember.js 4.8.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata">Changes in Ember Data</h3>
<p>Due to low availability for the Ember Data team this cycle, Ember Data does not have a new release, so it remains at 4.7.</p>
<p>Please see the <a href="https://blog.emberjs.com/ember-released-4-7">Ember 4.7 release blog post</a> for details about v4.7 of Ember Data.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli48">Changes in Ember CLI 4.8</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember CLI 4.8 introduced 4 bug fixes.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10014">#10014</a> - a fix that makes sure newly installed addons are discovered when running ember install.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/9920">#9920</a> - a fix that makes sure a blueprint’s options object and project instance are always available for all public hooks.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/9987">#9987</a> - a fix that makes sure we handle rebuild failures without exiting.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/9988">#9988</a> - a fix for a glob matching issue when npm-run-all and Yarn 2+ are used together.</li>
</ul>
<h4 id="features-1">Features</h4>
<p>Ember CLI 4.8 introduced 2 features.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/9945">#9945</a> - Added Node v18 to engines in the app and addon blueprints (removes support for Node v17, which is a breaking change).</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/9975">#9975</a> - Updated the app and addon blueprints to use const to avoid unnecessary linting errors.</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 4.8 introduced 0 deprecations.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-4-8-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-4-8-released</guid><pubDate>Tue, 25 Oct 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.9 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.9 of Ember.js, Ember Data, and Ember CLI.</p>
<p>Version 4.8 of Ember is now promoted to LTS (Long Term Support).
An LTS version of Ember continues to receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks).
LTS releases typically occur every four minor versions.
The previous LTS version of Ember was 4.4.</p>
<p>This release kicks off the 4.10 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs49">Changes in Ember.js 4.9</h3>
<p>Ember.js 4.9 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.9 introduced 8 bug fixes.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20274">#20274</a> - Adds some missing type tests and APIs to preview types.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20256">#20256</a> - Improve types for Ember Arrays unifying internal array types with external preview types and don't override methods from native JS arrays.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20257">#20257</a> - Fix types for <code>getOwner</code> and <code>GlimmerComponent</code>.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20233/files">#20233</a> - Include package name in deprecation error message rather than hardcoding Ember.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20235">#20235</a> - Update @types/node and TypeScript to address a TypeScript 4.9 issue.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20238">#20238</a> - Update Node.js versions to match support policy as support for Node 12 was dropped in Ember 4.6.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20227">#20227</a> - Fix unsafe internal cast for <code>NativeArray</code> making casting from <code>EmberArray</code> to <code>NativeArray</code> even more explicitly unsafe and for handling a proxy getter flagging the type of <code>this</code> may not be exactly <code>CoreObject</code>.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20228">#20228</a> - Remove type export for <code>ControllerMixin</code> as the type does not exist to be imported from the location it existed at in the definitions.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 4.9 introduced 1 feature.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20203">#20203</a> - upgrades TypeScript dependency to use version 4.8.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20204">#20204</a> - introduces support for testing all supported versions of TypeScript against our types and removes type checking from lint scripts.</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.9 introduced 0 deprecations.</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 4.9, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.9.0">Ember.js 4.9.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata">Changes in Ember Data</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<ul>
<li><a href="https://github.com/emberjs/data/pull/8314">#8314</a> - Fix build module resolution issues where the tracking package declared exports while v1.</li>
<li><a href="https://github.com/emberjs/data/pull/8308">#8308</a> - Fix tracking package issue by using prepack addon tree for embroider.</li>
<li><a href="https://github.com/emberjs/data/pull/8307">#8307</a> - Fix store issue where calling <code>deleteRecord</code> and <code>destroyRecord</code> on newly created unsaved records would throw a <code>stable Identifier to subscribe to</code> error due to the use of <code>run</code>.</li>
<li><a href="https://github.com/emberjs/data/pull/8306">#8306</a> - Fix store issue where using <code>peekAll</code> after <code>destroyRecord</code> return <code>invalid length</code> and records without stable Identifier via ensuring not to skip LiveArray removal if the pending queue is not empty.</li>
</ul>
<h4 id="features-1">Features</h4>
<p>Ember Data 4.9 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 4.9 introduced 0 deprecations.</p>
<p>For more details on changes in Ember.js 4.9, please review the <a href="https://github.com/emberjs/data/releases/tag/v4.9.1">Ember Data 4.9.1 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli49">Changes in Ember CLI 4.9</h3>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 4.9 introduced 2 bug fixes.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10018">#10018</a> - Handle failures rather than resulting in a successful process exit code in Node versions below 16.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10020">#10020</a> - Fix typos in serve command test.</li>
</ul>
<h4 id="features-2">Features</h4>
<p>Ember CLI 4.9 introduced 6 features.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10024">#10024</a> - Add ember-source to peerDependencies in addon blueprint.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10025">#10025</a> - Update NPM version constraints to include more recent versions.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10026">#10026</a> - Display info message when running the lint:fix script post blueprint generation.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10053">#10053</a> - Add support for node ES Module syntax addons.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/9824">#9824</a> - Add interactive way to create new Ember apps and addons.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/9972">#9972</a> - Add support for <code>--typescript</code> flag to app and addon blueprints.</li>
</ul>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 4.9 introduced 2 deprecations.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10017">#10017</a> - Disable prototype extensions by default in app blueprint.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10021">#10021</a> - Drop support for using <code>usePods: true</code> and the <code>--pod</code> flag simultaneously.</li>
</ul>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-4-9-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-4-9-released</guid><pubDate>Thu, 08 Dec 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.0 Released]]></title><description><![CDATA[<p><img src="/images/blog/ember-5-is-here.png" alt="Ember 5 is here! Ember mascots Tomster and Zoey have their party gear." /></p>
<p>EmberJS 5.0 embodies the commitment to stability and reliability that developers have come to expect from the Ember ecosystem. The Ember team has worked hard to remove all the deprecations and make us move towards Polaris. Get up-to-date with the latest in Ember and enjoy!</p>
<p>This post will cover our release strategy, how to upgrade, what to expect, and deprecated APIs that were removed.</p>
<p>This is the first major release under the new release strategy and goals proposed in <a href="https://rfcs.emberjs.com/id/0830-evolving-embers-major-version-process">RFC 830, Evolving Ember's Major Version Process</a>.
To summarize, every 12 minor releases, Ember will ship a new major release, which removes any
deprecated code targeted for that major version.
When it comes to introducing new features, Ember generally aims to ship new features in minor releases, offering backwards compatibility for existing code at the same time as giving developers the chance to try out new capabilities.
This approach reduces the challenges that teams face for major upgrades, compared to producing big, breaking, splashy major versions with lots of new features.</p>
<!-- alex ignore retext-equality -->
<p>In Ember 4.x minor releases, we landed a bunch of features (along with various bug fixes, of course):</p>
<ul>
<li><p>In <a href="https://blog.emberjs.com/ember-4-1-released/">Ember 4.1</a>, we shipped a bunch of quality-of-life improvements:</p>
<ul>
<li>the <code>@cached</code> decorator for caching expensive getters</li>
<li>the <code>@service</code> decorator so you don't have to <code>import { inject as service }</code> anymore</li>
<li>the <code>refresh</code> method on the Ember router, making it easier to refresh the data for the whole current route tree</li></ul></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-4-4/">Ember 4.4</a>, we shipped a <code>{{unique-id}}</code> helper to make it easier to write accessible forms and made it easier to customize tests with improved blueprints for <code>setupTest</code>.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-4-5-released/">Ember 4.5</a>, we made it possible to use plain old JavaScript functions as helpers: no need to wrap them with <code>helper()</code> any more!</p>
<!-- alex ignore retext-equality -->
<p>We also shipped a new testing primitive, <code>renderSettled</code>, which lets you wait for when Ember has re-rendered but <em>other</em> promises are still in flight—handy for testing your loading spinners, for example.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-4-8-released/">Ember 4.8</a>, we shipped a preview of our native TypeScript support, starting out with hand-authored types.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-4-9-released/">Ember 4.9</a>, we did a <em>ton</em> of internal polish work on our types and started testing Ember itself against our supported range of TypeScript versions.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-4-10/">Ember 4.10</a>, we introduced a new, carefully-designed API for Ember's Dependency Injection system: <code>Owner</code> is a subset of the <code>ApplicationInstance</code> type which covers all of its APIs with less duplication and confusion about what to use.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-4-11/">Ember 4.11</a>, we published the first TypeScript types in Ember generated from Ember's own source code.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-4-12/">Ember 4.12</a>, we enabled generating TypeScript blueprints with <code>ember generate</code>.</p></li>
</ul>
<p>We also made significant strides in key parts of the ecosystem outside the core framework itself over the past 18 months:</p>
<ul>
<li><p>We committed to shipping a new component format using <code>&lt;template&gt;</code> tags to get the best parts of “single-file components” and formats like JSX, while keeping the best parts of Ember’s declarative templates.
We shipped support for <code>&lt;template&gt;</code> tags in <code>.gjs</code> and <code>.gts</code> files over the course of 2022.
For details, check out the <a href="https://github.com/ember-template-imports/ember-template-imports">ember-template-imports</a> addon, which provides support for the new format today!
That includes <a href="https://github.com/ember-cli/eslint-plugin-ember">ESLint integration</a> and <a href="https://github.com/gitKrystan/prettier-plugin-ember-template-tag">a Prettier plugin</a>, as well as <a href="https://github.com/ember-template-lint/ember-template-lint">ember-template-lint</a> support!
We expect to recommend <code>&lt;template&gt;</code> as the default authoring format during Ember 5.x.</p></li>
<li><p>We <a href="https://blog.emberjs.com/glint-1-0-released/">shipped Glint 1.0</a>, providing top-notch editor tooling for Ember's templates in both JavaScript and TypeScript code bases, powered by TypeScript under the hood.</p></li>
<li><p>EmberData <a href="https://blog.emberjs.com/ember-released-4-7/">massively improved performance</a> and <a href="https://blog.emberjs.com/ember-data-5-x-update-2023-04-15/">laid a foundation</a> for a total overhaul in the 5.x series.</p></li>
</ul>
<p>Ember 5.0 has no new features, because we did all that work in minor releases instead.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<h2 id="betacycle">Beta cycle</h2>
<p>This release kicks off the 5.1 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<h2 id="howtoupgradetoember5">How to upgrade to Ember 5</h2>
<p>The most common approach for upgrading to 5.0 is to upgrade your app to the last
version of Ember 4, which is 4.12, resolve all deprecation warnings, and then upgrade to 5.0. If your app or addon runs with no deprecations in the latest release of 4.12,
you should be able to upgrade to Ember 5 with no additional changes. Step by step directions are below.</p>
<p>If your app is at a much earlier version in the 4.x series, we
recommend upgrading in steps across the LTS versions: 4.4, 4.8, and then 4.12.</p>
<p>Follow these steps in order:</p>
<ol>
<li>Consider <a href="https://cli.emberjs.com/release/basic-use/upgrading/#upgradingaddondependencies">upgrading addons used in your app</a>
to the latest version that you can. This will reduce the uses of deprecated APIs in your dependencies.</li>
<li>Upgrade your project to the latest patch version of Ember 4.12.
Many developers can do this by running
<code>npx ember-cli-update --to 4.12</code>. The
<a href="https://cli.emberjs.com/release/basic-use/upgrading/#upgradinganemberappitself">general Ember upgrade guide</a>
has more details about how to upgrade your Ember app/addon.</li>
<li>Make sure your app builds successfully.</li>
<li>Resolve all deprecation warnings. These Deprecated APIs are removed in Ember 5.0. You may need to upgrade some of your addon dependencies if they are using deprecated APIs.
See the <a href="https://deprecations.emberjs.com/">Ember Deprecation Guide</a>
for more details about specific deprecations and how to resolve them.
Applications that need to upgrade through several versions may want to
consider isolating individual deprecations by using
<a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a>.<ul>
<li><em>Note:</em> If you see a deprecation for <code>@ember/string</code>, please review the
<a href="https://deprecations.emberjs.com/v4.x#toc_ember-string-add-package">deprecation guide for importing from @ember/string without @ember/string as a dependency</a> for instructions.
There is a known bug in the implementation of this deprecation.</li></ul></li>
<li>Make sure your app builds successfully and your test suite passes with no
deprecations.</li>
<li>Upgrade your app to Ember 5.0. Again,
many developers can do this by running
<code>npx ember-cli-update --to 5.0</code>. Refer to the
<a href="https://cli.emberjs.com/release/basic-use/upgrading/#upgradinganemberappitself">general Ember upgrade guide</a>
for more details about how to upgrade your Ember app/addon.</li>
</ol>
<p>For help or advice along the way, visit <a href="https://emberjs.com/community/">Ember's forums or chat groups</a>.</p>
<h2 id="thejourneytowardsemberpolaris">The journey towards Ember Polaris</h2>
<p>Polaris is the name of an upcoming edition of Ember, first announced at EmberConf 2021. Over the course of 5.x, new features will be added to Ember that will eventually make up the new edition.</p>
<p>Since our major versions tend to be uneventful, Editions are the moment where the Ember community comes together to learn and build in new ways.
An edition is a set of features, corresponding documentation, and tools that create a cohesive programming model.
An edition marks a shift and step forward in the framework, beyond what individual features would accomplish.
Ember Octane was the first new edition that was added to Ember.</p>
<p>Stay tuned for future blog posts with more details and calls for contributors!</p>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs50">Changes in Ember.js 5.0</h3>
<p>Ember.js 5.0 introduces no new public API. Instead, it is comprised of bug fixes and the removal of previously deprecated public API from the 4.x cycle.</p>
<p>This release drops support for Node 14. Node 14 became end of life (it no longer receives security updates) as of April 2023.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 5.0 introduced 4 bug fixes in the preview types.</p>
<h4 id="features">Features</h4>
<p>Ember.js 5.0 introduced no new features.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 5.0 introduced 0 deprecations. It removed all deprecations that were
introduced before 4.10 and slated for removal in 5.0.</p>
<p>Ember 5.0 removes five features deprecated during 4.x:</p>
<ul>
<li>Removing Ember's <code>assign</code>, a polyfill for <a href="http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign">the <code>Object.assign</code> static function</a>, since the built-in is supported by all major browsers in Ember's support matrix.</li>
<li>Removing the API for implicit injections. These were deprecated in Ember 3.26, and became no-ops in Ember 4.0; 5.0 removes them.</li>
<li>Removing the <code>AutoLocation</code> class in favor of having apps explicitly choose to use one of the built-in <code>HistoryLocation</code>, <code>HashLocation</code>, <code>NoneLocation</code> classes, or to supply their own.</li>
<li>Removing the <code>@ember/error</code> package, which for many years has only re-exported the <code>Error</code> built-in type.</li>
<li>Removing support for <code>Ember.String</code>: developers who are using its utilities should explicitly install the <code>@ember/string</code> package and use it instead of the <code>Ember.String</code> namespace. We also encourage users to use other tools than the <code>@ember/string</code> package, including <a href="http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/PluralRules/PluralRules">browser builtins like <code>Intl.PluralRules</code></a> or other libraries from the JavaScript ecosystem, but the package is still supported. Note! There is currently a <a href="https://github.com/emberjs/ember.js/issues/20377">bug</a> in the implementation of the <code>@ember/string</code> deprecation. Adding <code>@ember/string</code> to your project may not be enough to silence the deprecation. However, so long as the <code>@ember/string</code> package has been installed to your project you can upgrade to <code>5.0</code> without worrying about the deprecation. Please see the <a href="https://deprecations.emberjs.com/v4.x#toc_ember-string-add-package">deprecation guide</a> for more information.</li>
</ul>
<p>For more details on how to resolve these deprecations in your app, see <a href="https://deprecations.emberjs.com/v4.x">the deprecations guide</a>.</p>
<!-- Block start: If there were no deprecations, remove this block -->
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 5.0, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.0.0">Ember.js 5.0.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>EmberData 4.12 will remain an actively supported LTS for the entire duration of the 5.x cycle, extending until the first 6.x LTS is released. This is in addition to our regular LTS support policy, and only applies to the EmberData project.</p>
<p>This support extends beyond bug-fixes. If minor enhancements can be made to better support new presentation class implementations that support the 4.x series we will willingly accept them. Our goal is that we want no one left behind.</p>
<p>To learn about the motivation and goals for upcoming changes to EmberData in 5.x,
read the <a href="https://blog.emberjs.com/ember-data-5-x-update-2023-04-15/">blog post, EmberData 5.X Update</a>.</p>
<!-- alex ignore retext-equality -->
<p>This will help you form the mental model of what to expect across the 5.x series,
and understand deprecation removals in the context of the upcoming goals.</p>
<p>The sections below will provide a high-level summary of what has changed between
EmberData 4.12 and 5.0.</p>
<h3 id="changesinemberdata50">Changes in EmberData 5.0</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>EmberData 5.0 introduced 7 bug fixes:</p>
<ul>
<li><a href="https://github.com/emberjs/data/pull/8621">#8621</a> - <code>normalizeErrorResponse</code> will provide serialized JSON instead of <code>[object Object]</code> if an object is part of the return.</li>
<li><a href="https://github.com/emberjs/data/pull/8598">#8598</a> - api docs generation should maintain a stable relative path, fixing <code>Edit on Github</code> and <code>Defined in:</code> links.</li>
<li><a href="https://github.com/emberjs/data/pull/8566">#8566</a> - previously, an identity notification was being triggered unnecessarily every time a record was saved.</li>
<li><a href="https://github.com/emberjs/data/pull/8597">#8597</a> - this fix ensures that promise caches are not shared among different fields.</li>
<li><a href="https://github.com/emberjs/data/pull/8594">#8594</a> - regression that caused the Store class to no longer extend from EmberObject has been fixed.</li>
<li><a href="https://github.com/emberjs/data/pull/8570">#8570</a> - fixes an issue where the entire RecordArray was being cleared, even if the remaining record did not match the record that was removed.</li>
<li><a href="https://github.com/emberjs/data/pull/8555">#8555</a> - fixes polymorphic assertions when deprecated code is removed and improves polymorphic developer experience.</li>
</ul>
<h4 id="features-1">Features</h4>
<p>EmberData 5.0 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>EmberData 5.0 introduced 0 deprecations. It removed all deprecations that were
introduced before 4.12 and slated for removal in 5.0.</p>
<p>There were more than 20 deprecation removals in 5.0 so we will not detail them in this post. Instead, for an exhaustive list of removals, see the <a href="https://deprecations.emberjs.com/ember-data/v4.x">EmberData 4.x deprecation guide</a>, the corresponding Ember Data API docs <a href="https://api.emberjs.com/ember-data/4.12/classes/CurrentDeprecations/properties">CurrentDeprecations list</a> and <a href="https://github.com/emberjs/data/pull/8550">#8550</a>. You can also follow the instructions <a href="https://api.emberjs.com/ember-data/4.12/modules/@ember-data%2Fdeprecations">here</a> for learning about how to opt-in and remove code that exists to support deprecated behaviors.</p>
<p>For more details on changes in EmberData 5.0, please review the
<a href="https://github.com/emberjs/data/releases/tag/v5.0.0">EmberData 5.0.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and EmberData, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli50">Changes in Ember CLI 5.0</h3>
<h4 id="bugfixes-2">Bug Fixes</h4>
<ul>
<li><code>minifyCSS</code> behavior was extracted to an addon, <code>ember-cli-clean-css</code>, that is now included in the default blueprint. This addon version currently uses an old version of <code>clean-css</code> so as to exactly match the previous built-in behavior. If you upgrade the addon (and thus <code>clean-css</code>) be aware that your built CSS may change.</li>
</ul>
<h4 id="features-2">Features</h4>
<p>Ember CLI 5.0 introduced 0 features.</p>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 5.0 introduced 0 deprecations.
Ember CLI 5.0 removed features and APIs that were deprecated in 4.x or earlier, please see the <a href="https://deprecations.emberjs.com/ember-cli/v4.x">Deprecation guide</a> for more information:</p>
<ul>
<li>Removed the <code>blacklist</code> and <code>whitelist</code> build options, they have been renamed to <code>exclude</code> and <code>include</code>.</li>
<li>Removed various <code>bower</code> related APIs</li>
<li>Removed support for <code>ember-cli-jshint</code></li>
<li>Removed the <code>vendor-shim</code> blueprint in favor of <code>ember-auto-import</code></li>
<li>Removed support for <code>baseURL</code> environment option (<a href="https://deprecations.emberjs.com/ember-cli/v2.x#toc_base-url">deprecated way back in v2.7</a>)</li>
</ul>
<!-- alex ignore retext-equality -->
<p>A special thanks to Bert De Block for <a href="https://github.com/ember-cli/ember-cli/issues/10163">singlehandedly cleaning up <code>ember-cli</code> for v5.0</a>
For more details on the changes in Ember CLI 5.0 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.0.0">Ember CLI 5.0.0 release page</a>.</p>
<h3 id="changesfortypescript">Changes for TypeScript</h3>
<p>There are no specific changes to Ember's TypeScript support for Ember 5.0. However, Ember now ships a <a href="https://blog.emberjs.com/announcing-official-typescript-types-public-preview">preview</a> of its own types, and will be shipping a stable version early in the 5.x series. Accordingly, the Ember TypeScript team does not plan to update the <code>@types</code> packages on DefinitelyTyped for Ember 5.0. We will publish a dedicated blog post covering more details on the plan for stabilizing Ember's types in the next few weeks.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-5-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-5-0-released</guid><pubDate>Thu, 22 Jun 2023 20:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.0 Released]]></title><description><![CDATA[<p>Ember 6.0 continues the commitment to stability and reliability that developers have come to expect from the Ember ecosystem and further moves us towards the <a href="https://emberjs.com/editions/polaris/">Polaris Edition of Ember</a>.  Get up-to-date with the latest in Ember and enjoy!</p>
<p>This post will cover our release strategy, how to upgrade, what to expect, and deprecated APIs that were removed.</p>
<p>This release follows the release strategy and goals proposed in <a href="https://rfcs.emberjs.com/id/0830-evolving-embers-major-version-process">RFC 830, Evolving Ember's Major Version Process</a>.
To summarize, every 12 minor releases, Ember will ship a new major release, which removes any
deprecated code targeted for that major version.</p>
<p>When it comes to introducing new features, Ember generally aims to ship new features in minor releases, offering backwards compatibility for existing code at the same time as giving developers the chance to try out new capabilities.
This approach reduces the challenges that teams face for major upgrades, compared to producing big, breaking, splashy major versions with lots of new features.</p>
<!-- alex ignore retext-equality -->
<p>In Ember 5.x minor releases, we landed a bunch of features (along with various bug fixes, of course):</p>
<ul>
<li><p>In <a href="https://blog.emberjs.com/ember-released-5-1/">Ember 5.1</a>, we published <a href="https://blog.emberjs.com/stable-typescript-types-in-ember-5-1">stable types from Ember's own TypeScript source code</a>. We also shipped official support for <code>pnpm</code> in <code>ember-cli</code>.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-5-2/">Ember 5.2</a>, we added a public import for the <code>uniqueId</code> helper so it can be used in <code>&lt;template&gt;</code>.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-5-3/">Ember 5.3</a>, we <a href="https://deprecations.emberjs.com/v5.x#toc_deprecate-implicit-route-model">deprecated implicit record loading in Ember Routes</a>.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-5-5/">Ember 5.5</a>, we made several changes to <code>ember-cli</code> to smooth the way to <code>embroider</code> and <code>&lt;template&gt;</code>. We also deprecated built-in support for using Travis CI as a CI provider.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-5-6/">Ember 5.6</a>, <code>ember-cli</code> gained a small but helpful feature to automatically choose a port when <code>4200</code> is already in use.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-5-7/">Ember 5.7</a>, we added an optional feature to opt in to the new behavior of <a href="https://deprecations.emberjs.com/v5.x#toc_deprecate-implicit-route-model">deprecated implicit record loading in Ember Routes</a> ahead of 6.0.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-5-8/">Ember 5.8</a>, we improved the parsing of <code>.gts</code> files in blueprints in <code>ember-cli</code>.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-5-9/">Ember 5.9</a>, we made a major improvement to our major version release process. When the <code>until</code> of a deprecation for <code>ember-source</code> or <code>ember-cli</code> is less than or equal to the version of the package being used, deprecations will throw.
In this way, deprecations automatically "break" when they were intended to break and do not need to be manually cleaned up. If we leave the deprecations in place for at least the x.0 release, this has a nice side effect for users in that any missed deprecations will now throw once you upgrade, rather than vanish. This was part of <a href="https://rfcs.emberjs.com/id/0830-evolving-embers-major-version-process">RFC #0830</a>.</p>
<p>We also deprecated <code>(action)</code> and <code>{{action}}</code> in favor of <code>on</code>.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-5-10/">Ember 5.10</a>, we made internal changes to <code>ember-source</code> to build with <a href="https://vite.dev/">Vite</a>, with no AMD loader present. This ensures that Ember.js is strictly following the ES module spec.</p>
<p>We also <a href="https://deprecations.emberjs.com/v5.x#toc_component-template-resolving">deprecated non-colocated component template resolution</a> (component templates living in <code>app/templates/components</code> instead of <code>app/components</code>).</p>
<p>Another deprecation of note is the <a href="https://deprecations.emberjs.com/v5.x#toc_deprecate-array-prototype-extensions">Array Prototype extensions</a>.</p></li>
<li><p>In <a href="https://blog.emberjs.com/ember-released-5-12/">Ember 5.12</a>, there was an update to <code>glimmer-vm</code> that brought with it performance improvements.</p></li>
</ul>
<p>We also made significant strides in key parts of the ecosystem outside the core framework itself over the past 18 months:</p>
<p>In November 2023, we updated the Lockstep Versioning strategy for Ember Data. EmberData continues to support all Ember LTS releases with an LTS of their own, but the exact versions no longer match. See the <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">blog post</a> for more details.</p>
<p><a href="https://mainmatter.com/blog/2024/07/16/embroider-update/">The Embroider Initiative</a> brought a large amount of energy into our build tooling and has made it possible to build Ember apps with Vite. <a href="https://github.com/emberjs/rfcs/pull/977">The RFC to make this the default</a> for new apps is currently in Final Comment Period.</p>
<p>Ember 6.0 has no new features over Ember 5.12, because we did all that work in minor releases instead.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<h2 id="betacycle">Beta cycle</h2>
<p>This release kicks off the 6.1 beta cycle for all subprojects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>Version 5.12 of Ember.js is now promoted to LTS (Long Term Support). The current LTS version of EmberData remains at version 5.3. An LTS version of Ember continues to receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks). LTS releases typically occur every four minor versions. The previous LTS version of Ember.js was 5.8.</p>
<h2 id="howtoupgradetoember6">How to upgrade to Ember 6</h2>
<p>The most common approach for upgrading to 6.0 is to upgrade your app to the last
version of Ember 5, which is 5.12, resolve all deprecation warnings, and then upgrade to 6.0. If your app or addon runs with no deprecations in the latest release of 5.12,
you should be able to upgrade to Ember 6 with no additional changes. Step-by-step directions are below.</p>
<p>If your app is at a much earlier version in the 5.x series, we
recommend upgrading in steps across the LTS versions: 5.4, 5.8, and then 5.12.</p>
<p>Follow these steps in order:</p>
<ol>
<li>Consider <a href="https://cli.emberjs.com/release/basic-use/upgrading/#upgradingaddondependencies">upgrading addons used in your app</a>
to the latest version that you can. This will reduce the uses of deprecated APIs in your dependencies.</li>
<li>Upgrade your project to the latest patch version of Ember 5.12.
Many developers can do this by running
<code>npx ember-cli-update --to 5.12</code>. The
<a href="https://cli.emberjs.com/release/basic-use/upgrading/#upgradinganemberappitself">general Ember upgrade guide</a>
has more details about how to upgrade your Ember app/addon.</li>
<li>Make sure your app builds successfully.</li>
<li>Resolve all deprecation warnings. These Deprecated APIs are removed in Ember 6.0. You may need to upgrade some of your addon dependencies if they are using deprecated APIs.
See the <a href="https://deprecations.emberjs.com/">Ember Deprecation Guide</a>
for more details about specific deprecations and how to resolve them.
Applications that need to upgrade through several versions may want to
consider isolating individual deprecations by using
<a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a>.</li>
<li>Make sure your app builds successfully and your test suite passes with no
deprecations.</li>
<li>Upgrade your app to Ember 6.0. Again,
many developers can do this by running
<code>npx ember-cli-update --to 6.0</code>. Refer to the
<a href="https://cli.emberjs.com/release/basic-use/upgrading/#upgradinganemberappitself">general Ember upgrade guide</a>
for more details about how to upgrade your Ember app/addon.</li>
</ol>
<p>For help or advice along the way, visit <a href="https://emberjs.com/community/">Ember's forums or chat groups</a>.</p>
<h2 id="thejourneytowardsemberpolaris">The journey towards Ember Polaris</h2>
<p>Polaris is the name of an upcoming edition of Ember, first announced at EmberConf 2021. Over the course of 6.x, new features will be added to Ember that will eventually make up the new edition.</p>
<p>Since our major versions tend to be uneventful, Editions are the moment where the Ember community comes together to learn and build in new ways.
An edition is a set of features, corresponding documentation, and tools that create a cohesive programming model.
An edition marks a shift and step forward in the framework, beyond what individual features would accomplish.
Ember Octane was the first new edition that was added to Ember.</p>
<p>Stay tuned for future blog posts with more details and calls for contributors!</p>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs60">Changes in Ember.js 6.0</h3>
<p>Ember.js 6.0 introduces no new public API. Instead, it comprises bug fixes and the breakage of previously deprecated public API from the 5.x cycle.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20731">#20731</a> - Bump barrel file deprecations until 7.0.0</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 6.0 introduced no new features.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 6.0 introduced 0 deprecations. It removed all deprecations that were
introduced before 5.10 and slated for removal in 6.0.</p>
<p>Ember 6.0 removes the following features deprecated during 5.x:</p>
<ul>
<li><a href="https://deprecations.emberjs.com/id/deprecate-implicit-route-model">Removing</a> the implicit route model hook behavior where if no <code>Route#model</code> hook was specified and a <code>_id</code> parameter was present, Ember would attempt to figure out how to load that model for you. There is an optional feature that lets you opt-in to the new behavior in 5.x.</li>
<li><a href="https://deprecations.emberjs.com/id/template-action">Removing</a> the <code>(action)</code> template helper and <code>{{action}}</code> modifier now that we have native classes and the <code>{{on}}</code> modifier.</li>
<li><a href="https://deprecations.emberjs.com/id/component-template-resolving">Removing</a> the runtime resolution of component templates, so if there is an import involved, there is no runtime resolution.</li>
<li><a href="https://deprecations.emberjs.com/id/deprecate-array-prototype-extensions">Removing</a> the extension of the prototypes of native Javascript arrays to implement <code>Ember.Enumerable</code>, <code>Ember.MutableEnumerable</code>, <code>Ember.MutableArray</code>, <code>Ember.Array</code>. For convenient functions like <code>filterBy</code> or <code>compact</code>, you can directly convert to use native array methods.</li>
</ul>
<p>For more details on how to resolve these deprecations in your app, see <a href="https://deprecations.emberjs.com/v5.x">the deprecations guide</a>.</p>
<!-- Block start: If there were no deprecations, remove this block -->
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/ember-cli/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 6.0, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v6.0.0">Ember.js 6.0.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>EmberData <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">broke from Lockstep versioning in November 2023</a>. Under the new policy, EmberData 5.3 is an LTS that supports <code>ember-source</code> 5.12 and <code>ember-source</code> 6.0. More compatibility info is available in the <a href="https://github.com/emberjs/data#compatibility">README</a>.</p>
<p>EmberData is also in the process of rebranding to WarpDrive. Stay tuned for more info!</p>
<p>This support extends beyond bug-fixes. If minor enhancements can be made to better support new presentation class implementations that support the 5.x series we will willingly accept them. Our goal is that we want no one left behind.</p>
<p>To learn about the motivation and goals for upcoming changes to EmberData in 5.x,
read the <a href="https://blog.emberjs.com/ember-data-5-x-update-2023-04-15/">blog post, EmberData 5.X Update</a>.</p>
<!-- alex ignore retext-equality -->
<p>This will help you form the mental model of what to expect across the 5.x series,
and understand deprecation removals in the context of the upcoming goals.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and EmberData, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli60">Changes in Ember CLI 6.0</h3>
<h4 id="features-1">Features</h4>
<p>Ember CLI 6.0 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 6.0 introduced 0 deprecations.
Ember CLI 6.0 removed features and APIs that were deprecated in 5.x or earlier, please see the <a href="https://deprecations.emberjs.com/ember-cli/v5.x">Deprecation guide</a> for more information:</p>
<ul>
<li><code>outputPaths</code> build option was <a href="https://deprecations.emberjs.com/id/ember-cli-output-paths-build-option">deprecated in 5.3</a> and is now removed.</li>
<li>Travis CI built-in support was <a href="https://deprecations.emberjs.com/id/travis-ci-support">deprecated in 5.5</a> and is now removed, including the <code>--ci-provider=travis</code> command-line flag.</li>
</ul>
<!-- alex ignore retext-equality -->
<p>For more details on the changes in Ember CLI 6.0 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v6.0.0">Ember CLI 6.0.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-6-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-6-0-released</guid><pubDate>Wed, 20 Nov 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember accessibility and a11y tools]]></title><description><![CDATA[<p>What is it like to build an accessible Ember app? With a few lines of code, you can audit your app for problems, get customized advice on how to fix them, and see visual indications of which things on a page need work. We'll walk through an example using the <a href="https://github.com/ember-learn/super-rentals">Super Rentals</a> app from Ember's <a href="https://guides.emberjs.com/current/tutorial/ember-cli/">official tutorials</a>. We'll also cover some improvements being made to Ember itself for a better experience out of the box.</p>
<p>An <a href="https://en.wikipedia.org/wiki/Web_accessibility">accessible app</a> is one that gives all users equal access to information and functionality, including those who use Assistive Technology like screen readers. This kind of work is sometimes abbreviated as <code>a11y</code>. There are set standards called the <a href="https://www.w3.org/WAI/standards-guidelines/wcag/">Web Content Accessibility Guidelines</a>, and in many cases, <a href="https://www.w3.org/WAI/Policy/">it's the law</a>.</p>
<p><em>This article was written as of Ember.js version 3.1. The same approach applies for all 2.x apps, with some changes to test syntax. Anyone can write a guest article --- get in touch if you are interested!</em></p>
<h2 id="usingembera11ytesting">Using ember-a11y-testing</h2>
<!-- alex ignore easy -->
<p>We don't have to learn a thousand rules to start building accessible apps. There are amazing community contributors who are working hard to make it as easy as possible to follow web best practices, and they created a set of tools referred to as <a href="https://github.com/ember-a11y">ember-a11y</a>.</p>
<p><a href="https://github.com/ember-a11y/ember-a11y-testing">ember-a11y-testing</a> is an addon that reveals actionable improvements to your app's accessibility and guides us through making the changes.</p>
<p>Let's start by cloning an example app to try the tools on:</p>
<pre><code class="bash language-bash">git clone git@github.com:ember-learn/super-rentals.git
cd super-rentals
yarn # or npm install
</code></pre>
<p>Next, install ember-a11y-testing and start the app:</p>
<pre><code class="bash language-bash">ember install ember-a11y-testing
ember server
</code></pre>
<p>After installing ember-a11y-testing, it gets to work right away! Navigate to <a href="http://localhost:4200">http://localhost:4200</a> and take a look.</p>
<p><img src="/images/blog/2018-06-17-ember-accessibility-and-a11y-tools/a11y-testing-stripes.png" alt="Striped elements showing contrast problems" /></p>
<p>See these weird stripes? Those are an indication that we have some problems with the elements. Due to color choices and text size, the content might be hard for some people to read. The list of issues show up as a console error in this view too. But how do we fix them?</p>
<p><img src="/images/blog/2018-06-17-ember-accessibility-and-a11y-tools/console-errors.png" alt="Instructions for resolving the error" /></p>
<p>The link in the console error message brings us to this <a href="https://medium.com/r/?url=https%3A%2F%2Fdequeuniversity.com%2Frules%2Faxe%2F2.5%2Fcolor-contrast%3Fapplication%3DaxeAPI">color contrast checker</a>, where we can play around with font sizes, font colors, and backgrounds until the view meets the standards.</p>
<p>In this way, learning the rules and standards of accessibility can be incremental. It's like having an accessibility expert inside the app. Once you have a handle on most of the issues, you can use some configuration settings to toggle the check on and off so that your development server build times are faster.</p>
<h3 id="addaccessibilitychecksduringrenderingtests">Add accessibility checks during Rendering tests</h3>
<p><a href="https://guides.emberjs.com/v3.1.0/testing/#toc_rendering-tests">Rendering tests</a> are a way to simulate user behavior, like clicking around and filling in forms. The ember-a11y-testing helpers can be added right in with your existing test suite. This test navigates to the index of the project and checks for any issues:</p>
<pre><code class="javascript language-javascript">import a11yAudit from 'ember-a11y-testing/test-support/audit';
// ... normal test boilerplate ...
test('accessibility check', async function (assert) {
  await visit('/');
  await a11yAudit();
  assert.ok(true, 'no a11y errors found!');
});
</code></pre>
<!-- alex ignore cracks -->
<p>It's important to incorporate the check into the test suite, because in larger apps, it's nearly impossible to know how adjusting the value of a CSS color variable will affect every single UI state. It's better to have programmatic checks to prevent things from slipping through the cracks. Combined with Continuous Integration (CI) pipelines, we can make accessibility a requirement to merge, without us needing to personally implore coworkers to follow the standards.</p>
<h3 id="runthetestnbspsuite">Run the test&nbsp;suite</h3>
<p>Start up your app with <code>ember serve</code> and then navigate to <a href="http://localhost:4200/tests">http://localhost:4200/tests</a> to see the browser-based test runner. Sure enough, we see some problems! Like we saw in the console earlier, there are specific error messages and links to resources that help us to fix the problems.</p>
<p><img src="/images/blog/2018-06-17-ember-accessibility-and-a11y-tools/route-test-errors.png" alt="Errors in the tests route" /></p>
<p>This is awesome because we don't need to become an expert on form accessibility to get started down the right track.</p>
<h3 id="fixthecriticalproblemsidentifiedinthenbsptests">Fix the critical problems identified in the&nbsp;tests</h3>
<p>Since the errors have ratings, we know to start with the critical error, which is that a form has missing labels. Screen readers rely on labels, not placeholder text, to help users navigate forms. Also, it's better UX for everyone.</p>
<p>Here's what the form looks like before changes:</p>
<pre><code class="handlebars language-handlebars">{{input id="filterByCity" value=value key-up=(action 'handleFilterEntry') class="light" placeholder="Filter By City"}}
</code></pre>
<p><img src="/images/blog/2018-06-17-ember-accessibility-and-a11y-tools/form-without-labels.png" alt="A form without labels" /></p>
<p>Let's add the label. The <code>for</code> attribute should match the input id.</p>
<pre><code class="handlebars language-handlebars">&lt;label for="filterByCity" class="screen-reader"&gt;
    Filter By City
&lt;/label&gt;

{{input id="filterByCity" value=value key-up=(action 'handleFilterEntry') class="light" placeholder="Filter By City"}}
</code></pre>
<p><img src="/images/blog/2018-06-17-ember-accessibility-and-a11y-tools/form-with-labels.png" alt="A form with labels" /></p>
<p>Now the filter has a&nbsp;label, and the tests pass!</p>
<p>Fixing issues with contrast, aria labels, and DOM elements is an important step towards building an accessible app. That said, there are some tools that help reduce the amount of work that you have to do by hand, and we'll cover those next.</p>
<h2 id="usingembera11ylandmarksforroles">Using ember-a11y-landmarks for roles</h2>
<p>Here's one example of an addon that helps reduce the number of changes to make by hand. The <a href="https://github.com/ember-a11y/ember-a11y-landmarks">ember-a11y-landmarks</a> addon helps manage the roles that should go on semantic tags like <code>&lt;header&gt;</code> and <code>&lt;nav&gt;</code>, without needing to learn the intricacies of when to use them.</p>
<p>One huge thing you can do to improve an app's accessibility is to use semantic tags in the HTML. For example, always use <code>&lt;button&gt;</code> for buttons, instead of making them <code>divs</code>. However, some semantic tags still need extra attributes called roles for screen readers to work right, and they only need them some of the time based on their position in the DOM. ember-a11y-landmarks to the rescue!</p>
<p>To use this addon, wrap content in the ally-landmark block and say what kind of tag to use. Here's a template example:</p>
<pre><code class="handlebars language-handlebars">{{#a11y-landmark tagName="footer"}}
   This is a footer!
{{/a11y-landmark}}
</code></pre>
<p>And here's the html output with the correct role assigned:</p>
<pre><code class="html language-html">&lt;footer id="ember337" role="contentinfo" class="ember-view"&gt; 
  This is a footer!
&lt;/footer&gt;
</code></pre>
<p>There's also some good news! Some of the use cases for this addon are addressed by new options available <a href="#new-options-for-out-of-the-box-accessibility">in Ember itself</a>!</p>
<h2 id="structuralapplicationconcerns">Structural application concerns</h2>
<p>Now that we've covered how to fix individual app problems like color contrast, let's talk about what needs to be done to help fix issues that affect all Ember apps.</p>
<p>With the release of 3.1, Ember.js introduced some new features within the framework itself, and community addons continue to help drive progress on the remaining concerns. Historically, many new features in Ember originated as community addons.</p>
<p>There's a lot of progress being made in Ember itself, our community addons, and by our pals working in other frameworks! You can learn more in the recent JavaScript <a href="https://www.youtube.com/watch?v=aoyLG2gTFpI">State of Accessibility</a> panel hosted by <a href="https://www.thisdot.co/">ThisDot Media</a>. Jump to the Ember segment presented by Melanie Sumner <a href="https://youtu.be/aoyLG2gTFpI?t=2432">here</a>.</p>
<h3 id="newoptionsforoutoftheboxaccessibility">New options for out-of-the-box accessibility</h3>
<p>One common issue in single page application frameworks is that they wrap a developer's content in extra <code>divs</code>. However, some elements like <code>&lt;header&gt;</code> should be direct descendants of the <code>body</code> element. <a href="https://github.com/emberjs/rfcs/blob/master/text/0280-remove-application-wrapper.md">RFC 280</a> proposed an option for removing the application-level <code>div</code> wrapper (an RFC, or Request for Comments, is the main way that new features are proposed and opened for community feedback). That RFC was accepted, meaning that work could begin to add the feature into Ember, and the new option shipped in version 3.1. You can learn more about it and how to enable the feature in the <a href="https://www.emberjs.com/blog/2018/04/13/ember-3-1-released.html#toc_introducing-optional-features-3-of-4">release blog post</a>.</p>
<h3 id="usingtheembera11yaddonforfocusmanagement">Using the ember-a11y addon for focus management</h3>
<p>I learned from <a href="https://github.com/Robdel12">Robert DeLuca</a> that <a href="https://medium.com/@robdel12/single-page-apps-routers-are-broken-255daa310cf">most front end frameworks have flaws</a> that affect Assistive Technology like screen readers. One of those flaws is focus management, and there's already an addon for it.</p>
<p>While ember-a11y refers to a whole bunch of tools, there's one addon called <a href="https://github.com/ember-a11y/ember-a11y">ember-a11y</a>. The main task of this addon is to handle focus correctly so that users with Assistive Technology can navigate content as changes happen inside the <code>{{outlet}}</code> of a route.</p>
<pre><code class="bash language-bash">ember install ember-a11y
</code></pre>
<p>Install it and replace instances of <code>{{outlet}}</code> with
<code>{{focusing-outlet}}</code>.</p>
<p>So why is this necessary? If you're looking at a decently accessible website and you hit the tab key, you'll see the focus jump between different elements - things get highlighted. Front end frameworks like Ember sometimes get in the way of the DOM structure that works best for screen reader focus, since as you move between routes, only part of the page changes. The contents of <code>{{outlet}}</code> are dynamic.</p>
<p>The problem is that screen readers rely heavily on what has focus. Imagine if you had to start reading at the very top of the page whenever a route in your app changed, instead of reading the content that is new, or if you weren't able to tell that some content had changed! ember-a11y corrects for that focus problem so that Assistive Technology navigation using focus works correctly. From the README:</p>
<blockquote>
  <p>The current implementation of this addon will immediately apply focus to the most relevant piece of content based on actions users take (clicking buttons, links, etc). This allows screen readers to catch changes and read the right information, thus providing a much better experience for screen reader users.</p>
</blockquote>
<h2 id="whatnext">What next?</h2>
<p>It's our responsibility as developers to build inclusive tech, so keep learning and building! <a href="https://github.com/MelSumner">Melanie Sumner's</a> EmberConf talk <a href="https://www.youtube.com/watch?v=6ydNf7e5P00">Accessibility for All</a> is a fast, concise introduction to accessibility in Ember, and <a href="http://www.melsumner.com/blog/accessibility/a11y-accessibility-guide-ember-developers/">this article series</a> provides a deeper dive.</p>
<!-- alex ignore white -->
<p>There are already many community addons available that solve different issues. While we still have a ways to go, new advances are being made too. For example, there is a <a href="https://github.com/emberjs/rfcs/pull/327">Semantic Test Selectors RFC</a> being drafted and an <a href="https://github.com/tradegecko/ember-semantic-test-helpers">experimental addon</a> in development to go with it! These efforts followed <a href="https://github.com/jgwhite">Jamie White's</a> talk from EmberConf, <a href="https://www.youtube.com/watch?v=iAyRVPSOpy8">Say More</a>.</p>
<p>Almost all of us will have a disability at some point in our lives. Accessible web practices lead to better user experience --- things like improved keyboard navigation, text that is still readable on a dim monitor, and clear pointers on how to interact with a UI.</p>
<p>Here are some ways you can help improve accessibility in Ember and the JavaScript ecosystem:</p>
<ul>
<li>Research and try out other <a href="https://github.com/ember-a11y">ember-a11y</a> tools</li>
<li>Make your own apps accessible, and let the world know about it! You can use #emberjs and #a11y to spread the word on Twitter, for example</li>
<li>Include a11y considerations in your talks and articles</li>
<li>Contribute to addons that help solve these problems</li>
<li>Guide your coworkers and collaborators through the learning process</li>
<li>Avoid language that perpetuates the idea that accessibility is too hard. Focus
on the tools that make it easier and our responsibilities as developers.</li>
<li>Support and comment on RFCs that help make Ember more accessible out of the box</li>
</ul>
<p>Accessible apps are better for everyone.</p>
<h2 id="thanks">Thanks</h2>
<p>Our community's improvements are the result of the hard work of many people! Shared solutions take more time to develop, but we can all move forward together.</p>
<!-- alex ignore white -->
<p>Many thanks to everyone who raises the profile of accessibility in Ember, the team behind a11y addons, contributors involved in getting some features into Ember itself, and those who encourage others to adopt accessible practices. Extra thanks to <a href="https://github.com/EndangeredMassa">Sean Massa</a>, <a href="https://github.com/MelSumner">Melanie Sumner</a>, <a href="https://github.com/jgwhite">Jamie White</a>, and <a href="https://github.com/Robdel12">Robert DeLuca</a> for reviewing this post.</p>]]></description><link>https://blog.emberjs.com/ember-accessibility-and-a11y-tools</link><guid isPermaLink="true">https://blog.emberjs.com/ember-accessibility-and-a11y-tools</guid><pubDate>Sun, 17 Jun 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[2019 Ember Community Survey]]></title><description><![CDATA[<p>What an incredible time to be in the Ember Community!</p>
<ul>
<li>Ember.js completed seven backward-compatible minor version releases in the last year.</li>
<li>An amazing 200+ community members contributed to core Ember projects (that's not even counting the 4500+ ember addons!)</li>
<li>Over 3,000 community members have joined the <a href="https://discord.gg/emberjs">Ember Discord chat</a>.</li>
<li>An <a href="https://www.youtube.com/watch?v=Cvz-9ccflKQ">Ember documentary</a> was released, looking at Ember's history…and Ember's bright future.</li>
</ul>
<p>With 2019 already under way, we would like your help to learn about who is in the Ember community and how they work with the framework. To that end, we're pleased to announce the official 2019 Ember Community Survey.</p>
<p><a href="https://emberjs.com/ember-community-survey-2019" class="es-button">
  Survey Landing Page
</a></p>
<p>This is the fifth year we're learning about the community's makeup and interests, and we look forward to sharing the results at <a href="http://emberconf.com/">EmberConf 2019</a> on March 18th. Over 1300 participants took part in the survey in 2018 (<a href="https://www.emberjs.com/ember-community-survey-2018/">2018 survey results</a>) and we are aiming for even more participation this year!</p>
<p>Completing the survey should take about 15 minutes. We've added a few new questions this year, while retaining opportunities to share feedback as free-form text. All submissions are completely anonymous, and demographic data about the community is not released in the same raw data files as the free-form text and other answers.</p>
<p>Submissions will be accepted until March 12th.</p>
<p>Please help us spread the word by sharing the <a href="/ember-community-survey-2019">survey landing page</a> on your social network feeds, at meetups and around your office and other communities.</p>
<p>We look forward to your participation! If you have any immediate questions, feel free to email the survey team via <a href="mailto:survey@emberjs.com">survey@emberjs.com</a>, or ping us in #dev-ember-learning in Discord chat.</p>
<p>Thank you to <a href="http://codeallday.com/">Code All Day</a> for sponsoring
<a href="https://github.com/JosephDTemple">Joseph Temple</a> to work on this year's
survey. You can learn more about Code All Day's Ember.js development and
consulting services at their website <a href="http://codeallday.com/">codeallday.com</a>.</p>]]></description><link>https://blog.emberjs.com/ember-community-survey</link><guid isPermaLink="true">https://blog.emberjs.com/ember-community-survey</guid><pubDate>Tue, 19 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data 0.13]]></title><description><![CDATA[<p>Today, we are pleased to announce the release of Ember Data 0.13.</p>
<p>Ember Data 0.13 is the first official release of Ember Data. This should
make it easier for people to synchronize Ember.js and Ember Data
versions, and make reasoning about the upgrade process much easier.</p>
<h3 id="emberdata013">Ember Data 0.13</h3>
<p>In the past few months, Ember Data has stabilized a lot. We still consider
it alpha, and recommend it for production use only to those who like to
live on the bleeding edge and contribute back to the project. To make life
easier for those folks, though, we will be cutting regular releases like we
do with Ember.js.</p>
<p>A few of the many folks involved in the changes in this release include
Tom Dale, Yehuda Katz, Cyril Fluck, Igor Terzic, Stefan Penner, Paul Chavard,
Gordon Hempton, Peter Wagenet. Thank you to you all and everyone else who
has contributed code and others.</p>
<h4 id="apirevisionremoval">API Revision Removal</h4>
<p>Now that we are doing regular releases, the API revision check has been
removed. You no longer need to provide the API revision number when
defining your store:</p>
<pre><code class="javascript language-javascript">App.Store = DS.Store.extend({
  // Delete this!
  revision: 13
});
</code></pre>
<h3 id="emberdatafutureplans">Ember Data Future Plans</h3>
<p>Our immediate goals for Ember Data are stabilization, bug fixes, and
documentation. There are only two major areas of improvement planned
before we beging promoting builds to prerelease and RC versions:</p>
<h4 id="promises">Promises</h4>
<p>Currently, most Ember Data APIs return objects that also implement a
<code>then()</code> method, allowing them to be used interchangeably as either
models or promises.</p>
<p>While this flexibility was convenient, it unfortunately caused confusing
semantics. Specifically, because a resolved promise stays resolved,
operations like reloading became very confusing.</p>
<p>While not in this release, you should expect that future releases of
Ember Data will shift to an entirely promise-based API. This both
resolves the issues with confusing semantics as well as allows us to
implement some exciting features, like more powerful polymorphism.</p>
<p>Thanks to Stefan Penner for leading the charge on this.</p>
<h4 id="errorhandling">Error Handling</h4>
<p>We want to make error handling and dealing with client and server
conflicts rock solid. A <a href="https://github.com/emberjs/data/pull/958">pull request from Paul Chavard</a>
is currently open and looks like a solid starting point for error
handling. You should see much more development on this in the near
future.</p>]]></description><link>https://blog.emberjs.com/ember-data-0-13</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-0-13</guid><pubDate>Tue, 28 May 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v1.0.0-beta.12 Released]]></title><description><![CDATA[<h2 id="newcorecontributors">New Core Contributors</h2>
<p>Long-time contributors <a href="https://github.com/bmac">Brendan McLoughlin</a> and <a href="https://github.com/sly7-7">Sylvain Mina</a>
have been given collaborator status and will help us triage issues, merge pull
requests, and contribute bugfixes and documentation.</p>
<h2 id="newfeatures">New Features</h2>
<h3 id="storefetch">store.fetch</h3>
<p>When using Ember Data, the most common pattern in the <code>model</code> hook is to call
<code>store.find</code> for your model:</p>
<pre><code class="javascript language-javascript">export default var PostRoute = Ember.Route.extend({
  model: function(params) {
    return this.store.find('post', params.post_id);
  }
});
</code></pre>
<p><code>store.find</code> will return the instance of the <code>Post</code> record if it has already
been fetched in the store. Sometimes, this is not desirable. For example, you
may not know if you have already loaded the post in another request via
sideloading, or you want the most up to date information. You could either
check if the record existed using
<a href="http://emberjs.com/api/data/classes/DS.Store.html#method_hasRecordForId">store.hasRecordForId</a>, or always call
<a href="http://emberjs.com/api/data/classes/DS.Model.html#method_reload">reload</a> on your model in the route's <code>afterModel</code>hook.</p>
<p><code>store.fetch</code> wraps this common pattern by reloading a record if it exists in
the store, or reloads the record if it doesn't exist:</p>
<pre><code class="javascript language-javascript">model: function(params){
  return this.store.fetch('post', params.post_id);
}
</code></pre>
<p>Please give a warm thanks to <a href="https://github.com/thaume">Tom Coquereau</a> for his <a href="https://github.com/emberjs/data/pull/2478">pull
request</a> implementing this feature!</p>
<h2 id="bugfixes">Bugfixes</h2>
<h3 id="relationshipcreaterecordreturnstherecordinsteadofapromise">relationship.createRecord() returns the record instead of a promise</h3>
<p>Prior to Ember Data v1.0.0-beta.11, the following code would give you direct
access to a record:</p>
<pre><code class="javascript language-javascript">var post    = store.createRecord('post');
var comment = post.get('comments').createRecord('comment');
</code></pre>
<p>In beta.11, it returned a Promise, meaning you couldn't call things like
<code>set/get</code> on the resulting record. This regression has been fixed in beta.12
thanks to <a href="https://github.com/ZenCocoon">Sébastien Grosjean</a>.</p>
<h2 id="breakingchanges">Breaking Changes</h2>
<h3 id="internetexplorer8requiresember18">Internet Explorer 8 Requires Ember 1.8</h3>
<p>A bug in Ember 1.7's <code>Ember.create</code> method (which is a polyfill for
<code>Object.create</code>) combined with a bug in es5-shim's <code>Object.create</code> prevent us
from giving Ember Data users a good alternative to use. Internally, Ember Data
uses <code>Object.create</code> for efficient caches. Ember 1.8 ships a working
<code>Object.create</code> polyfill on <code>Ember.create</code> so if you are using Internet
Explorer 8 and Ember Data in production, you should upgrade to Ember 1.8 as
soon as you can.</p>
<p>If you are using browsers that provide <code>Object.create</code>, you do not need to do
any additional work here. This includes mobile browsers, evergreen browsers
(Chrome, Opera, Firefox), Safari, and IE9+.</p>
<h3 id="ember17supportwillbecompletelydroppedinbeta13">Ember 1.7 Support Will Be Completely Dropped in Beta.13</h3>
<p>Ember Data relies heavily on JavaScript language-level shims (such as the
<code>Object.create</code> issue mentioned above) and other useful internals that Ember
provides. Rather than creating our own detection algorithms and more polyfills
for broken code in Ember 1.7, we are deciding to drop 1.7 support in the next
release of Ember Data. We do so in order to not increase the final size of
Ember Data's build. You should upgrade to Ember 1.8 as soon as you can.</p>
<h3 id="observingdataforchangeshasbeenremoved">Observing <code>data</code> For Changes Has Been Removed</h3>
<p>Although <code>model.get('data')</code> has been private in Ember Data for a long time, we
have noticed users may subscribe to changes on <code>data</code> for any change to the
model's attributes. This means that the following code:</p>
<pre><code class="javascript language-javascript">var Post = DS.Model.extend({
  doSomethingWhenDataChanges: function(){
    // do the work
  }.property('data')
});
</code></pre>
<p><strong>no longer works</strong>. Instead, you should watch each attribute like you
would with any <code>Ember.Object</code>:</p>
<pre><code class="javascript language-javascript">var Post = DS.Model.extend({
  name: DS.attr(),
  date: DS.attr(),
  doSomethingWhenDataChanges: function(){
    // do the work
  }.property('name', 'date')
});
</code></pre>
<p>This change fixed some bugs around observers. Thanks to <a href="https://github.com/wecc">Christoffer
Persson</a> for helping to clean this up and fix some observer bugs around
this!</p>
<!-- alex ignore special -->
<h2 id="specialthanks">Special Thanks</h2>
<p>Thanks to <a href="https://github.com/wecc">Christoffer Persson</a> for helping us implement bugfixes and API
changes, as well as triaging issues.</p>
<!-- Links -->]]></description><link>https://blog.emberjs.com/ember-data-1-0-beta-12-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-0-beta-12-released</guid><pubDate>Mon, 24 Nov 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v1.0.0-beta.14.1 Released]]></title><description><![CDATA[<p>Ember Data v1.0.0-beta.14.1 is a bugfix release that adds sourcemaps
to your build pipeline in Ember CLI and Rails. Additionally support
for versions of Ember &lt;= 1.7.1 have been removed. This was mentioned
in the <a href="http://emberjs.com/blog/2014/12/25/ember-data-1-0-beta-14-released.html">beta.12 blogpost</a>, and is now enforced via an assertion
in the code and by your package manager files.</p>
<!-- Links -->]]></description><link>https://blog.emberjs.com/ember-data-1-0-beta-14-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-0-beta-14-1-released</guid><pubDate>Wed, 31 Dec 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v1.0.0-beta.14 Released]]></title><description><![CDATA[<p>Due to a hiccup during the publishing step while releasing beta.13,
we've removed beta.13 from npm and instead published beta.14. This
release is available to you whether you are using npm and ember-cli,
rubygems, or bower. Note that the builds are always available as static
files at <a href="http://emberjs.com/builds">emberjs.com/builds</a>.</p>
<h2 id="improvements">Improvements</h2>
<p><a href="https://twitter.com/terzicigor">Igor Terzic</a>, <a href="https://twitter.com/hjdivad">David Hamilton</a>, and <a href="https://twitter.com/stefanpenner">Stefan
Penner</a> put in some great strides to improve performance around
how relationships work together in Ember Data. These performance changes
have wide-reaching effects into everything you do in Ember Data:
querying records, pushing records into the store, and creating records.
Since everyone on the Ember Data team works on real apps, we tested
these changes in our applications and saw improvements averaging 50% or
higher around pushing and creating records into the store.</p>
<h2 id="breakingchanges">Breaking Changes</h2>
<h3 id="storeupdatehasbeendeprecated"><code>store.update()</code> has been deprecated</h3>
<p>Calling <code>store.update()</code> has been deprecated in favor of <code>store.push()</code>
now
handling partial payloads:</p>
<pre><code class="javascript language-javascript">var post = store.push('post', {
  id: 1,
  title: 'Ember.js is fantastic',
  author: 'Tomster'
});

post.get('title'); // =&gt; 'Ember.js is fantastic'
post.get('author'); // =&gt; 'Tomster'

store.push('post', { id: 1, author: 'Tom Dale' });

post.get('title'); // =&gt; 'Ember.js is fantastic'
post.get('author'); // =&gt; 'Tom Dale'
</code></pre>
<p>This also means that properties missing in the payload will no longer be
reset,
but stay the same.</p>
<p>If you need to reset values to null, you should have your server
explicitly
send back null values in the payload:</p>
<pre><code class="javascript language-javascript">{
  "person": {
    "firstName": null,
    "lastName": null
    "role": "Computer Science Pioneer"
  }
}
</code></pre>
<p>If you cannot change your API and you desire this behavior, you can
create a
serializer and do the logic yourself:</p>
<pre><code class="javascript language-javascript">// app/serializers/person.js
// or App.PersonSerializer if you aren't using Ember CLI
export default DS.RESTSerializer.extend({
  normalize: function(type, hash, prop) {
    hash = this._super(type, hash, prop);
    if (!hash.hasOwnProperty('firstName')){
      hash.firstName = null;
    }
    if (!hash.hasOwnProperty('lastName')){
      hash.lastName = null;
    }
    return hash;
  }
});
</code></pre>
<p>Or if you want to restore the old behavior for all of your models:</p>
<pre><code class="javascript language-javascript">// app/serializers/application.js
// or App.ApplicationSerializer
export default DS.RESTSerializer.extend({
  normalize: function(type, hash, prop) {
    hash = this._super(type, hash, prop);
    type.eachAttribute(function(key) {
      if (!hash.hasOwnProperty(key)) {
        hash[key] = null;
      }
    }, this);
    return hash;
  }
});
</code></pre>
<!-- alex ignore special -->
<h2 id="specialthanks">Special Thanks</h2>
<!-- alex ignore special -->
<p>A special thanks to <a href="http://dockyard.com">Dockyard</a> for sponsoring Igor during the
month of December!</p>
<!-- Links -->]]></description><link>https://blog.emberjs.com/ember-data-1-0-beta-14-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-0-beta-14-released</guid><pubDate>Thu, 25 Dec 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v1.0.0-beta.15 Released]]></title><description><![CDATA[<p>We are pleased to announce the release Ember Data 1.0.0-beta.15. It
includes many bug fixes as well as several new features. As always
this release can be obtained from npm (for use with ember-cli),
rubygems, or bower. The builds are also available as static files at
emberjs.com/builds</p>
<p>The 1.0.0-beta.15 release represents the effort of at least 30
contributors across over 168 commits.</p>
<h2 id="improvements">Improvements</h2>
<h3 id="snapshotapi">Snapshot API</h3>
<p>In Ember Data serializers will now be given a snapshot instance
instead of a record instance when serializing records. A snapshot
represents the frozen state of a record at a particular moment in
time. Its initial purpose is to be passed to serializers instead of
the real record. This allows the serializer to examine the current
state of that record in the moment without triggering side-effects,
like loading relationships.</p>
<p>The snapshot has a different API from a record for accessing
properties so you will know you are working with a snapshot. Using
<code>snapshot.get</code> is still supported for compatibility however it will
log a deprecated warning to encourage you to use the new apis.</p>
<p>To access attributes you should now use the <code>attr</code> function.</p>
<pre><code class="javascript language-javascript">// Ember Data 1.0.0-beta.14.1
post.get('title');
// Ember Data 1.0.0-beta.15
postSnapshot.attr('title');
</code></pre>
<p>To access a belongsTo relationship you should use <code>.belongsTo()</code> method.</p>
<pre><code class="javascript language-javascript">// Ember Data 1.0.0-beta.14.1
post.get('author');
// Ember Data 1.0.0-beta.15
postSnapshot.belongsTo('author');
</code></pre>
<p>To access a hasMany relationship you should use <code>.hasMany()</code> method.</p>
<pre><code class="javascript language-javascript">// Ember Data 1.0.0-beta.14.1
post.get('comments');
// Ember Data 1.0.0-beta.15
postSnapshot.hasMany('comments');
</code></pre>
<p>Please give a warm thanks to <a href="https://github.com/wecc">Christoffer Persson</a> for all his
work implementing this feature!</p>
<h3 id="errorsonarbitraryproperties">Errors on arbitrary properties</h3>
<p>Previously, Ember Data would only attach errors to a record's error
object if they matched a property that was already on the record. Now
thanks to <a href="https://github.com/alexspeller">Alex Speller</a>'s
<a href="https://github.com/emberjs/data/pull/1984">work</a> any error returned
by the backend can be attached to the error object.</p>
<p>Please note that if your backend is returning an error property that
is not an attribute on the record you will need to manually clear it
before the record can transition out of the error state.</p>
<h3 id="sortqueryparamsinajaxcalls">Sort query params in ajax calls.</h3>
<p>When developing APIs, it is common to use a caching mechanism, like
Varnish, to cache requests to public API endpoints, and those tools
use the URL string to determine if they have a cached response.</p>
<p>As an example, if one user requests <code>/posts?sort=price&amp;category=pets</code>
and another requests <code>/posts?category=pets&amp;sort=price</code>, the cached
request won't be used in the second call.</p>
<p>Ember Data's <code>RESTAdapter</code> will now sort the query parameters by their
field name when making an ajax request.</p>
<p>It is possible to disable this behavior, by setting <code>sortQueryParams</code>
to be false on your adapter.</p>
<pre><code class="javascript language-javascript">App.ApplicationAdapter = DS.RESTAdapter.extend({
  namespace: 'api/v1',
  sortQueryParams: false
});
</code></pre>
<p>Thanks to <a href="https://github.com/cibernox">Miguel Camba</a> for implementing this feature.</p>
<!-- Links -->]]></description><link>https://blog.emberjs.com/ember-data-1-0-beta-15-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-0-beta-15-released</guid><pubDate>Sat, 14 Feb 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v1.0.0-beta.16.1 Released]]></title><description><![CDATA[<p>Ember Data v1.0.0-beta.16.1 is a bugfix release that fixes 2
regressions reported with Ember Data v1.0.0-beta.16. As always
this release can be obtained from npm (for use with ember-cli),
rubygems, or bower. The builds are also available as static files at
<a href="http://emberjs.com/builds">http://emberjs.com/builds</a>.</p>
<h4 id="storeadapterforapplicationthrowingexceptions">store.adapterFor('application') Throwing Exceptions</h4>
<p><a href="https://github.com/kamal">Kamal Fariz Mahyuddin</a> reported issue
<a href="https://github.com/emberjs/data/issues/2925">#2925</a> where code that
attempted to use the store's <a href="http://emberjs.com/api/data/classes/DS.Store.html#method_adapterFor">adapterFor</a> method to access
the <code>application</code> adapter was throwing an error with Ember Data
<code>v1.0.0-beta.16</code>. This has been fixed in Ember Data
<code>v1.0.0-beta.16.1</code>.</p>
<h4 id="incompatibilitywithember1100beta4">Incompatibility with Ember 1.10.0-beta.4</h4>
<p><a href="https://github.com/danielspaniel">Daniel Sudol</a>
<a href="https://github.com/emberjs/data/issues/2927">reported</a> that
<code>v1.0.0-beta.16</code> was throwing an error when it was loaded alongside
Ember <code>1.10.0-beta.4</code> due to Ember Data calling the wrong
registerHelper method on HTMLBars. This was tracked down to an issue
in <a href="https://github.com/stefanpenner/ember-inflector">ember-inflector</a> which comes bundled with Ember
Data. The issue has been fixed in <code>v1.5.0</code> of ember-inflector and
Ember Data <code>v1.0.0-beta.16.1</code> now includes the updated version.</p>
<h4 id="testingissueswith100beta16">Testing issues with 1.0.0-beta.16</h4>
<p><a href="https://github.com/pmdarrow">Peter Darrow</a> called
<a href="https://github.com/emberjs/data/issues/2924">out some testing problems</a>
with Ember Data <code>v1.0.0-beta.16</code>. This was concluded to be an issue
with <code>ember-qunit</code> not properly cleaning up Ember Data's store after
tests. <a href="https://github.com/rwjblue">Robert Jackson</a> quickly fixed the issue and
recommends you update to <code>v0.3.0</code> of <code>ember-qunit</code> if you experience
this issue.</p>
<h2 id="changelog">Changelog</h2>
<ul>
<li><a href="https://github.com/emberjs/data/blob/v1.0.0-beta.16.1/CHANGELOG.md">Ember Data 1.0.0-beta.16.1 CHANGELOG</a></li>
</ul>
<!-- Links -->]]></description><link>https://blog.emberjs.com/ember-data-1-0-beta-16-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-0-beta-16-1-released</guid><pubDate>Tue, 24 Mar 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v1.0.0-beta.16 Released]]></title><description><![CDATA[<p>We are pleased to announce the release Ember Data 1.0.0-beta.16. It
includes many bug fixes as well as several new features. As always
this release can be obtained from npm (for use with ember-cli),
rubygems, or bower. The builds are also available as static files at
emberjs.com/builds</p>
<p>The 1.0.0-beta.16 release represents the effort of at least 31
contributors across over 112 commits.</p>
<h2 id="newcorecontributor">New Core Contributor</h2>
<p>Contributor <a href="https://github.com/wecc">Christoffer Persson</a> has been given collaborator
status and will help us triage issues, merge pull requests, and
contribute bug fixes and documentation. Christoffer has been extremely
active in triaging issues and contributing features and bug fixes to
the Ember Data project.</p>
<h2 id="breakingchanges">Breaking Changes</h2>
<h3 id="thestorenowpassessnapshotsinsteadofrecordstoadaptermethods">The store now passes snapshots instead of records to adapter methods</h3>
<!-- alex ignore easy -->
<p>In 1.0.0-beta.15 Ember Data introduce the Snapshot API and began
passing snapshot instances into all serializers to prevent
side-effects from occurring when inspecting relationships for
serialization. This introduces some pain points in 3rd party adapters
and serializers since they could not easily create snapshot instances
without using private APIs. In Ember Data 1.0.0-beta.16 the
store will now pass snapshot instances into adapters methods instead
of record instances.</p>
<p>The following adapter methods now receive snapshots instead of records:</p>
<ul>
<li><code>find(store, type, id, snapshot)</code></li>
<li><code>findMany(store, type, ids, snapshots)</code></li>
<li><code>findHasMany(store, snapshot, url, relationship)</code></li>
<li><code>findBelongsTo(store, snapshot, url, relationship)</code></li>
<li><code>createRecord(store, type, snapshot)</code></li>
<li><code>updateRecord(store, type, snapshot)</code></li>
<li><code>deleteRecord(store, type, snapshot)</code></li>
</ul>
<p>The signature of <code>buildURL(type, id, snapshot)</code> has also been updated to receive
snapshots instead of records.</p>
<p>This change removes the need for adapters to create snapshots manually using the
private API <code>record._createSnapshot()</code> to be able to pass snapshots to
serializers.</p>
<p>Snapshots are backwards-compatible with records (with deprecation warnings) and
it should be pretty straight forward to update current code to the public
Snapshot API:</p>
<pre><code class="javascript language-javascript">post.get('id')           =&gt; postSnapshot.id
post.get('title')        =&gt; postSnapshot.attr('title')
post.get('author')       =&gt; postSnapshot.belongsTo('author')
post.get('comments')     =&gt; postSnapshot.hasMany('comments')
post.constructor         =&gt; postSnapshot.type;
post.constructor.typeKey =&gt; postSnapshot.typeKey
</code></pre>
<p>If you need to access the underlying record of a snapshot you can do so by
accessing <code>snapshot.record</code>.</p>
<p>The full API reference of <code>DS.Snapshot</code> can be found <a href="http://emberjs.com/api/data/classes/DS.Snapshot.html">here</a>.</p>
<h2 id="improvements">Improvements</h2>
<h3 id="storeasaservice">Store as a Service</h3>
<p>The store has now been registered as a service. So when you are using
Ember Data 1.0.0-beta.16 with Ember 1.10+ you can now inject the store
into any Ember object managed by the container.</p>
<pre><code class="javascript language-javascript">App.TweetComposerComponent = Ember.Component.extend({
  store: Ember.inject.service(),
  newTweet: function() {
    return this.get('store').createRecord('tweet', {});
  }
});
</code></pre>
<p>Please give a warm thanks to <a href="https://github.com/martndemus">martndemus</a> for his
work implementing this feature!</p>
<h3 id="mixinsinpolymorphicrelationships">Mixins in Polymorphic Relationships</h3>
<p><a href="https://github.com/igorT">Igor Terzic</a> Added support for using mixins in polymorphic
relationships. This allows Ember Data to reference Mixins instead of
Model classes as the type argument for relationships.</p>
<pre><code class="javascript language-javascript">App.Comment = DS.Model.extend({
  owner: belongsTo('commentable', { polymorphic: true })
});

App.CommentableMixin = Ember.Mixin.create({
  comments: hasMany('comment')
});
</code></pre>
<h3 id="bettersupportforusingmultiplestores">Better Support for using multiple stores</h3>
<p><a href="https://github.com/jmurphyau">James Murphy</a> landed an
<a href="https://github.com/emberjs/data/pull/2617">awesome PR</a> that makes it
easier to use multiple stores in your Ember Application.</p>
<h2 id="changelog">Changelog</h2>
<p>In addition to the major changes mentioned above this release also
includes many bug fixes and documentation updates. Be sure to check
out the change log for the full list of updates.</p>
<ul>
<li><a href="https://github.com/emberjs/data/blob/v1.0.0-beta.16/CHANGELOG.md">Ember Data 1.0.0-beta.16 CHANGELOG</a></li>
</ul>
<!-- Links -->]]></description><link>https://blog.emberjs.com/ember-data-1-0-beta-16-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-0-beta-16-released</guid><pubDate>Mon, 23 Mar 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v1.0.0-beta.17/18 Released]]></title><description><![CDATA[<p>Beta.17 and Beta.18 contained many bugfixes from the community! Please check
them out in the <a href="https://github.com/emberjs/data/blob/master/CHANGELOG.md">CHANGELOG</a>. Thank you to everyone who submitted
patches!</p>
<p>While many bugs were stomped, some important changes are worth calling out:</p>
<h2 id="possiblybreakingdeprecations">(Possibly) Breaking Deprecations</h2>
<h3 id="recordconstructortypekeyisnowrecordconstructormodelname">record.constructor.typeKey is now record.constructor.modelName</h3>
<p>In Ember Data, when you ask for a model, Ember Data looks its class up using
Ember's <a href="http://guides.emberjs.com/v1.10.0/understanding-ember/dependency-injection-and-service-lookup/">Dependency Injection</a> API.  When the model class is looked
up, Ember Data stores the type on the model class.</p>
<p>For example, when the following code runs in your application:</p>
<pre><code class="javascript language-javascript">var post = this.store.getById('post', 1);
</code></pre>
<p>and Ember Data will store the string "post" on the model class:</p>
<pre><code class="javascript language-javascript">console.log(post.constructor.typeKey); // 'post'
</code></pre>
<p>Ember Data uses this <code>typeKey</code> property internally when creating and extracting
payloads in Serializers, and when locating models in Adapters. The <code>typeKey</code> is
also currently available on Snapshots, which are passed to adapter and
serializer methods. <code>typeKey</code> was previously always normalized to be a
camelCased string.</p>
<p>In Ember Data 1.0.0-beta.18, this property is now called <code>modelName</code>. In
addition, the <code>modelName</code> is a dasherized string. For example, if you had a
model called <code>TacoShop</code>, it would be stored on the model's constructor's
<code>modelName</code> property as <code>taco-shop</code>, whereas previously it would be stored as
<code>tacoShop</code>.</p>
<p>Accessing the <code>typeKey</code> property should still work, but will trigger
deprecation warnings.</p>
<p>If you don't have any custom serializers or adapters, you are good to go;
outgoing payloads and URLs shouldn't change. If you've overridden a method in
your subclass, remember to call <code>this._super</code>, or to normalize modelName in
your code. If you need to transform this string, you can use Ember.String's
<a href="http://emberjs.com/api/classes/Ember.String.html#method_camelize">camelize</a> and <a href="http://emberjs.com/api/classes/Ember.String.html#method_underscore">underscore</a> functions. Keep in mind you
can't change <code>modelName</code> on the model's constructor; it is <strong>read-only</strong> and
will trigger an assertion error if you try to override it.</p>
<p>We changed <code>typeKey</code> to <code>modelName</code> to allow us to align to dasherized strings
as Ember and Ember CLI also align with dasherized strings. Changing the name
allows us to make this change with a deprecation phase.</p>
<h3 id="dsrestserializertypeforrootisnowdsrestserializermodelnamefrompayloadkey">DS.RESTSerializer.typeForRoot is now DS.RESTSerializer.modelNameFromPayloadKey</h3>
<p>To gain more consistency in the naming change of  <code>typeKey</code> to <code>modelName</code>,
<code>typeForRoot</code> has been renamed to <code>modelNameFromPayloadKey</code>. The function
serves the same purpose, so this should be a quick refactor you can achieve via
search and replace in your project. While <em>calling</em> typeForRoot will trigger a
deprecation warning, overriding in a subclass won't.</p>
<h2 id="newfeatures">New Features</h2>
<h3 id="dsrestserializerpayloadkeyfrommodelname">DS.RESTSerializer.payloadKeyFromModelName</h3>
<p>While <code>modelNameFromPayloadKey</code> returns a <em>model</em> for a JSON payload key,
<code>payloadKeyFromModelName</code> can be used to override the serialization of a model
<em>to the server.</em> For instance, you may have a Post model, but your server
expects a <code>message</code> as the root. You can override it like so:</p>
<pre><code class="javascript language-javascript">// app/serializers/application.js
export default DS.RESTSerializer.extend({
  payloadKeyFromModelName: (modelName) {
    if (modelName === 'post') {
      return 'message';
    }
    return this._super(modelName);
  }
});
</code></pre>
<p>This would produce the following payload:</p>
<pre><code class="javascript language-javascript">{
  "message": {
    "id": "1",
    "title": "Action Cable comes with 3 Months of Free HBO"
  }
}
</code></pre>
<p>Another example is that ActiveModelSerializer uses this hook to convert a
dasherized <code>modelName</code> to an <code>under_scored</code> string.</p>
<p>While this was possible previously in Ember Data, we noticed that users used
several different hooks to achieve this goal, so it made sense to make one
unifying place for this kind of serialization.</p>
<h3 id="storeunloadallcannowunloadallmodelswhennotpassedamodelname">store.unloadAll() can now unload all models when not passed a modelName</h3>
<p>Previously, <code>store.unloadAll</code> required a <code>modelName</code> argument to unload records
of a type.  Now, you can unload all records without calling <code>store.destroy</code>.
Thanks to <a href="https://github.com/emberjs/data/pull/2999">svox1</a> for this pull
request!</p>
<h3 id="dsrestadapterbuildurlrefactoredintodifferenthooks">DS.RESTAdapter.buildURL refactored into different hooks</h3>
<p><code>buildURL</code> has been refactored into several hooks like <code>urlForFindQuery</code>. This
makes overriding methods like <code>buildURL</code> easier to reason about and easier to
change without breaking other request types. Thanks to
<a href="https://github.com/emberjs/data/pull/2966">thejameskyle</a> for taking on this
refactor!</p>
<p>While beta.17 did introduce a regression, this has been fixed in beta.18.</p>
<!-- Links -->]]></description><link>https://blog.emberjs.com/ember-data-1-0-beta-18-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-0-beta-18-released</guid><pubDate>Thu, 21 May 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v1.0.0-beta.19.1 Released]]></title><description><![CDATA[<p>Ember Data 19.1 contains fixes for a few regressions. Thanks to everyone
who reported issues. Thanks to @bmac and @wecc for fixing!</p>
<ul>
<li>Fix a regression where a <code>DS.Model</code>'s <code>InternalModel</code> would not be set
on init - @bmac <a href="https://github.com/emberjs/data/pull/3262">Pull Request</a></li>
<li>Pass store to inverseFor in removeEmbeddedForeignKey #3270 - @wecc
<a href="https://github.com/emberjs/data/pull/3270">Pull Request</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-data-1-0-beta-19-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-0-beta-19-1-released</guid><pubDate>Tue, 09 Jun 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v1.0.0-beta.19 Released]]></title><description><![CDATA[<p>Ember Data 1.0.0-beta.19 contains a lot of bugfixes from the comunity!
Thank you for helping us push toward a stable release of Ember Data!</p>
<h2 id="newfeatures">New Features</h2>
<h3 id="snapshotshavechangedattributes">Snapshots have changedAttributes</h3>
<p><code>changedAttributes</code>, which represents the changes that have happened
since the model was last synced with the server, are now available on
the snapshot in your adapters and serializers, instead of on
<code>DS.Model</code> instances.</p>
<h2 id="breakingchanges">Breaking Changes</h2>
<h3 id="passingclassestostoremethods">Passing Classes to Store Methods</h3>
<p>Previously, you were allowed to pass a classes directly to store methods
like <code>store.push</code>:</p>
<pre><code class="javascript language-javascript">var record = store.push(App.Post, {id: 1});
</code></pre>
<p>While this isn't a very popular way and generally not recommended in the
documentation, it did remain the preferred way to do things in Ember
Data's tests for a long time. As we move toward to using Ember's
Dependency Injection framework for consistency, passing these classes
directly to store methods has been removed. Instead, you should pass a
dasherized string:</p>
<pre><code class="javascript language-javascript">var record = store.push('post', {id: 1});
</code></pre>
<p>To help you upgrade through this change, we've written an <a href="https://github.com/abuiles/ember-watson#ember-watsonconvert-ember-data-model-lookups">Ember
Watson command</a>.
You can use this command-line tool in both Ember-CLI projects and
"globals mode" style projects.</p>
<h3 id="servicesdependingonthestore">Services depending on the store</h3>
<p>In order to fix deprecations warning induced by Ember 1.12, the store service is now injected as an
<a href="http://emberjs.com/blog/2015/05/13/ember-1-12-released.html#toc_instance-initializers">instanceInitializer</a>.
As a consequence, if you had initializers depending on the store, you should move<br />
them to an instance initializer as well, and mark it as <code>after: 'ember-data'</code>.</p>
<h2 id="importantdeprecations">Important Deprecations</h2>
<h3 id="fixtureadapterremoved">Fixture Adapter Removed</h3>
<p>Support for the Fixture Adapter has been deprecated. After some thought,
the Ember Data team decided it was not the right approach for
integration-style tests. We recommend using an AJAX/data transport
stubbing strategy like <a href="https://github.com/trek/pretender">Pretender</a> or
<a href="http://sinonjs.org/">sinon</a>.</p>
<p>We'll be including docs on integration test strategies using Pretender in the
final release.</p>
<p>The Fixture Adapter now lives as an <a href="https://github.com/emberjs/ember-data-fixture-adapter">addon</a>.</p>
<h2 id="internetexplorer8">Internet Explorer 8</h2>
<p><s>This will be the last release to support Internet
Explorer 8. Future versions of Ember Data will not support Internet
Explorer 8</s></p>
<p>Update:
<a href="/blog/2015/06/18/ember-data-1-13-released.html">Ember Data 1.13</a> has
been released with support for IE8. Ember Data 1.13 is the last
version of Ember Data that supports IE8. Ember Data 2.0 supports IE9+.</p>]]></description><link>https://blog.emberjs.com/ember-data-1-0-beta-19-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-0-beta-19-released</guid><pubDate>Fri, 05 Jun 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data 1.0.0 Beta 2 Released]]></title><description><![CDATA[<p><a href="/builds/#/beta/latest">Ember Data 1.0.0-beta.2</a> has been released.</p>
<p>The release fixes a number of bugs, and adds several new features:</p>
<ul>
<li>Fix a number of issues where the code still expected class names
(<code>App.Post</code>) instead of module-friendly shorthand (<code>post</code>).</li>
<li>Add <code>host</code> and <code>namespace</code> in the <code>RESTAdapter</code></li>
<li>Add <code>record.rollback()</code></li>
<li>Add support for <code>since</code> token from find all fetches</li>
<li>Add <code>store.update(type, hash)</code> to update some, but not all attributes</li>
<li>Improve subclassability of <code>RESTSerializer</code> and <code>RESTAdapter</code></li>
</ul>
<p>Thanks to Paul Chavard, Toran Billups, Bradley Priest, Kasper Tidemann, Yann Mainier,
Dali Zheng, Jeremy Green, Robert Jackson, Joe Bartels, Alexandre de Oliveria,
Floren Jaby, Gordon Hempton, Ivan Vanderbyl, Johannel Würbach, Márcio Júnior,
Nick Ragaz, Ricardo Mendes, Ryunosuke SATO, Sylvain Mina, and ssured</p>
<p>Thanks to everyone who has been porting adapters to Ember Data 1.0!</p>]]></description><link>https://blog.emberjs.com/ember-data-1-0-beta-2-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-0-beta-2-released</guid><pubDate>Wed, 04 Sep 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v1.0.0-beta.9 Released]]></title><description><![CDATA[<p>Since Ember Data v1.0.0-beta.8, a lot has changed. Since we didn't write a blog
post for beta.8, this blog post will contain features in both beta.8 and beta.9.</p>
<h2 id="newreleaseschedule">New Release Schedule</h2>
<p>Since the first beta release for Ember Data 1.0, Ember Data has typically been
released when we felt like critical features or bugfixes were merged. Due to the
ever changing nature of Ember Data, we'd like to reward Ember Data users for
keeping up with changes by providing more frequent releases until a release
candidate emerges. Beginning Monday, August 18th 2014, Ember Data will release a
new beta version <strong>every 3 weeks</strong>. The builds will be available on the <a href="http://emberjs.com/builds/#/beta">builds
page</a>, Bower, Rubygems, and soon, NPM.</p>
<h2 id="breakingchanges">Breaking Changes</h2>
<h3 id="objectcreateshimrequired">Object.create shim required</h3>
<p>Ember Data now requires an <code>Object.create</code> polyfill for environments without
<code>Object.create</code> or incorrect <code>Object.create</code> implementations such as <strong>Internet
Explorer 8</strong>. Ember.js will be shipping with an Object.create polyfill in 1.8.0.
If you are using stable builds of Ember, we recommend using
<a href="https://github.com/es-shims/es5-shim">ES5Shim</a>'s  <a href="https://github.com/es-shims/es5-shim/blob/master/es5-sham.js">es5-sham.js</a> file available on NPM and Bower.
You can refer to <a href="http://kangax.github.io/compat-table/es5/#Object.create">Kangax's Compatibility Tables</a> to
see if you need the shim.</p>
<p>Ember Data uses <code>Object.create</code> under the hood for faster and collision-free
caches.</p>
<h3 id="datesserializedwithiso8601bydefault">Dates Serialized with ISO8601 by Default</h3>
<p>Due to the <a href="http://xkcd.com/1179/">various ways</a> dates can be serialized across the wire,
Ember Data has decided to use the well-known, well-supported, and accurate
<a href="http://en.wikipedia.org/wiki/ISO_8601">ISO8601</a> format. Although the JavaScript programming language has had
support for ISO8601 strings since <a href="http://es5.github.io/#x15.9.5.43">ECMAScript5</a>, environment such as
Internet Explorer 8 do not support <code>Date.prototype.toISOstring</code>. However, Ember
Data does include a shim so you need no further work here except to make sure
your backend is supporting ISO8601.</p>
<h3 id="restadapterprototypefindmanychangedbehaviorandmethodsignature">RESTAdapter.prototype.findMany changed behavior and method signature</h3>
<p>You should see the <a href="http://emberjs.com/api/data/classes/DS.RESTAdapter.html#method_findMany">findMany</a> documentation if you have overridden
the <code>findMany</code> method in your adapter.</p>
<h3 id="hasmanycoalescingnowoptin">HasMany Coalescing Now Opt-In</h3>
<p>See the section below on "Coalescing Find Requests" for more information.
Previously, if you did not sideload data for a hasMany relationship, but
did provide IDs, Ember Data would attempt to get all the records in one request.</p>
<p>For example:</p>
<pre><code class="javascript language-javascript">// Given this payload:
{
  "author": {
    "id": "1",
    "name": "Lon Ingram",
    "post_ids": ["1", "2", "3"]
  }
}

this.store.getById('author', '1').get('posts');

// $.ajax GET /posts?ids[]=1&amp;ids[]=2&amp;ids[]=3
</code></pre>
<p>Unless you opt in, Ember Data will instead fire 3 requests:</p>
<pre><code class="javascript language-javascript">this.store.getById('author', '1').get('posts');

// $.ajax GET /posts/1
// $.ajax GET /posts/2
// $.ajax GET /posts/3
</code></pre>
<p>See the section below on "Coalescing Find Requests" for more information.</p>
<h2 id="newfeaturesandimprovements">New Features and Improvements</h2>
<h3 id="embeddedrecordsmixin">Embedded Records Mixin</h3>
<h4 id="deserializingrelationships">Deserializing Relationships</h4>
<!-- alex ignore easy -->
<p>Thanks to Igor Terzic, Brendan Mcloughlin, and Bill Heaton, the <code>DS.EmbeddedRecordsMixin</code> was extracted out of <code>DS.ActiveModelSerializer</code> in Ember Data v1.0.0-beta.8 so that users of <code>JSONSerializer</code>, <code>RESTSerializer</code>, and <code>ActiveModelSerializer</code> could easily serialize and deserialize relationships. To use the code in your app, you can include the <code>EmbeddedRecordsMixin</code> into your serializer:</p>
<pre><code class="javascript language-javascript">App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin);
</code></pre>
<p>This means that your <code>PostSerializer</code> will now correctly bring in data for
relationships if they are embedded in the response, rather than sideloaded.</p>
<p>For example, here is the previous JSON data response Ember Data expected for the
RESTAdapter:</p>
<pre><code class="javascript language-javascript">// GET /posts/1
{
  "post": {
    "id": "1",
    "name": "The Mother We Share Lyrics",
    "authorId": "1"
  },
  "authors": [
    {
      "id": "1",
      "name": "CHVRCHES"
    }
  ]
}

this.store.find('post', '1').then(function(post){
  console.log(post.get('author.name')); // =&gt; CHVRCHES
});
</code></pre>
<p>Now, if you mixin the EmbeddedRecordsMixin, Ember Data will understand the
following payload:</p>
<pre><code class="javascript language-javascript">// GET /posts/1
{
  "post": {
    "id": "1",
    "name": "The Mother We Share Lyrics",
    "author": {
      "id": "1",
      "name": "CHVRCHES"
    }
  }
}

this.store.find('post', '1').then(function(post) {
  console.log(post.get('author.name')); // =&gt; CHVRCHES
});
</code></pre>
<p>These settings are configurable. See the section below on "Serializing
Relationships."</p>
<h4 id="serializingrelationships">Serializing Relationships</h4>
<p>The EmbeddedRecordsMixin also has support for sending information about
relationships to the server. To override the defaults, you can configure the
EmbeddedRecordsMixin by defining an <code>attrs</code> object on your serializer
definition. For example, to serialize the complete record when serializing to
the server:</p>
<pre><code class="javascript language-javascript">App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    author: {
      serialize: 'records'
    }
  }
});

var post = this.store.getById('post', '1');
post.set('name', 'Recover Lyrics');
post.save();

// POST /posts/1
{
  "post": {
    "name": "Recover Lyrics",
    "author": {
      "id": "1",
      "name": "CHVRCHES"
    }
  }
}
</code></pre>
<p>To see even more ways to customize serializing and deserializing behavior, check
out the <a href="http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html">documentation</a> for the <code>EmbeddedRecordsMixin</code>.</p>
<h3 id="coalescingfindrequests">Coalescing Find Requests</h3>
<p>One feature we're particularly excited about is the ability to coalesce find
requests for the same record type.</p>
<p>To introduce this feature, I'll explain the basic concept behind Ember.js's "Run
Loop". Typically in JavaScript code that re-renders whenever the data changes,
changing the data multiple times within the same turn of the JavaScript event
loop would cause multiple re-renders. Ember uses a microlibrary called
<a href="https://github.com/ebryn/backburner.js/">Backburner</a> to reduce the number of writes by only rendering once
per "run loop". For more information, you can view the README on the Backburner
on the repository and view the Ember.js <a href="http://emberjs.com/guides/understanding-ember/run-loop/">Run Loop Guide</a>.</p>
<p>Without "Coalescing Find Requests" turned on, the previous code would result in
multiple network requests:</p>
<pre><code class="javascript language-javascript">this.store.find('post', '1');
this.store.find('post', '2');
this.store.find('post', '3');

// $.ajax GET /posts/1
// $.ajax GET /posts/2
// $.ajax GET /posts/3
</code></pre>
<p>On the server-side, this is frequently referred to as an <a href="https://secure.phabricator.com/book/phabcontrib/article/n_plus_one/">N+1
query</a>.</p>
<p>By coalescing (also known as batching) these requests, Ember Data will observe
that you requested several records of the same type and only send one request
instead of 3.</p>
<pre><code class="javascript language-javascript">this.store.find('post', '1');
this.store.find('post', '2');
this.store.find('post', '3');

// $.ajax GET /posts?ids[]=1&amp;ids[]=2&amp;ids[]=3
</code></pre>
<p><strong>Coalescing find requests is currently turned off by default</strong>. To turn it on,
you can use the following code:</p>
<pre><code class="javascript language-javascript">DS.RESTAdapter.reopen({
  coalesceFindRequests: true
});
</code></pre>
<p>To override how the records are requested, you may override the <code>findMany</code> and
<code>findHasMany</code> methods on your adapter.</p>
<h3 id="emberinflectorisnowastandalonepackage">Ember Inflector is Now a Standalone Package</h3>
<p>Ember Inflector is Ember's approach for a Rails-compatible API for inflecting
strings. This provides methods such as <code>Ember.String.pluralize</code> and
<code>Ember.String.singularize</code>, and hooks for defining your own inflections.
Previously, the Ember Inflector package was contained in Ember Data's repository
and released alongside Ember Data. It has been pulled out to a <a href="https://github.com/stefanpenner/ember-inflector">separate
repository</a>. Although Ember Inflector is still included in the
Ember Data release, you may now use it in projects that do not use Ember Data.
Ember Inflector is currently released as a 1.0 semver package.</p>
<h3 id="emberinflectorstringcaching">Ember Inflector String Caching</h3>
<p>Ember Inflector now caches lookups of strings by default. This means that you
should only pay the cost of transforming a string (via <code>pluralize</code> and
<code>singularize</code>) once as the values are now stored using an in-memory cache. If
you have memory concerns, you may want to monitor lookups and disable the cache
by calling <code>Ember.Inflector.inflector.disableCache()</code> at the beginning of your
app code.</p>
<h3 id="improveduncountableirregulardefinitionsforsingularize">Improved Uncountable / Irregular Definitions for Singularize</h3>
<p>We would like to express our deep appreciation to <a href="https://github.com/ofbriggs">Olivia Briggs</a>
for adding better support for uncountable/irregular singular words in
Ember-Inflector. You should now not need definitions for <code>dasherized</code> and
<code>underscore</code> versions of your inflections.</p>
<h3 id="handlebarshelpersforinflections">Handlebars Helpers for Inflections</h3>
<p>You can now use <code>pluralize</code> and <code>singularize</code> in your Handlebars templates:</p>
<pre><code class="handlebars language-handlebars">{{pluralize "octopus"}}
{{singularize "oxen"}}
</code></pre>
<p>The Handlebars helpers are bound, so they will stay up to date if you bind to a
property:</p>
<pre><code class="handlebars language-handlebars">{{pluralize type}}
</code></pre>
<h3 id="performanceimprovements">Performance Improvements</h3>
<p>Thanks to <a href="https://twitter.com/stefanpenner">Stefan Penner</a> from the Ember.js core team, your apps should be
faster when used with Ember Data. We'd also like you to try out Ember 1.8
beta in your apps with Ember Data 1.0.0-beta.9 for additional performance
improvements.</p>
<p>We have more performance improvements around the corner! Keep an eye out for
Stef landing some commits on improving <code>pushPayload</code> calls and a <a href="https://github.com/ebryn/backburner.js/pull/97">commit
to Backburner</a> improving many hot code paths in Ember Data.</p>
<h3 id="bettersupportfornestedrecords">Better Support for Nested Records.</h3>
<p><code>buildURL</code> now takes a record, on which you can look up the relationship if you
need to build a nested URL. For example:</p>
<pre><code class="javascript language-javascript">App.CommentAdapter = DS.RestAdapter.extend({
  buildURL: function(type, id, record) {
    return '/posts/' + record.get('post.id') + '/comments/' + id;
  }
})
</code></pre>
<h3 id="addedsupportforpreloadingrecords">Added support for preloading records</h3>
<p>For more information, go to <a href="https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/store.js#L356">Store documentation</a>.</p>
<!-- alex ignore special -->
<h2 id="specialthanks">Special Thanks</h2>
<p>We'd like to thank the following members of the Ember.js community for their
continued contributions to Ember Data:</p>
<ul>
<li>Igor Terzic as the project's main contributor (@terzicigor)</li>
<li>Brendan McLoughlin (@BezoMaxo) for responding to and triaging issues, and
contributing documentation, bug fixes, and improvements.</li>
<li>Ilya Radchenko (@knownasilya)</li>
<li>Bradley Priest (@bradleypriest)</li>
<li>Bill Heaton (@pixelhandler)</li>
<li>Paul Chavard (@tchak)</li>
<li>Sylvain Mina (GH @sly7-7)</li>
<li>Ryunosuke Sato (@tricknotes)</li>
<li>Alexandre de Oliveira (@kurko) for his awesome work on the
<a href="https://github.com/kurko/ember-localstorage-adapter">ember-localstorage-adapter</a> and
<a href="https://github.com/kurko/ember-indexeddb-adapter">ember-indexeddb-adapter</a>.</li>
<li>Jonathan Collins (Github @jcollins1991)</li>
<li>Stefan Penner (@stefanpenner)</li>
<li>Tom Dale (@tomdale)</li>
<li>Yehuda Katz (@wycats)</li>
</ul>
<p>We’d also like to thank Instructure and PrecisionNutrition for sponsoring
some of Igor’s development on Ember Data.</p>
<h2 id="tools">Tools</h2>
<ul>
<li><a href="http://andycrum.github.io/ember-data-model-maker/">Ember Data Model Maker</a></li>
</ul>
<!-- Links -->]]></description><link>https://blog.emberjs.com/ember-data-1-0-beta-9-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-0-beta-9-released</guid><pubDate>Mon, 18 Aug 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v1.13 Released]]></title><description><![CDATA[<p>We are proud to announce the release of Ember Data 1.13. This
represents the first stable release of Ember Data since its creation
over 3 years ago.</p>
<p>As we explained in the <a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">The Ember 2.x Project</a>
blog post, going forward Ember Data will be syncing up its releases and version numbers with Ember.js releases.</p>
<p><strong>Ember Data 1.13 is the first release of Ember Data that syncs its
  version with a version of Ember.js.</strong> It will be followed by Ember Data 2.0, which will be released alongside Ember.js 2.0. <strong>Ember Data 1.13 is fully backwards compatible with Ember Data beta.19, allowing for a smooth upgrade path.</strong></p>
<h2 id="emberdata113overview">Ember Data 1.13 Overview</h2>
<p>Ember Data 1.13 is a massive release we are very proud of.
The highlight of the Ember Data 1.13 release is a total overhaul of Ember Data's internal format and Serializer API to follow JSON API.</p>
<p>Two years ago Tom Dale and Yehuda Katz <a href="http://emberjs.com/blog/2013/05/03/ember-data-progress-update.html">published</a> a vision for how Ember Data should look in the future and articulated the need for a single, ubiquitous JSON API standard.</p>
<p>We are very happy to see the vision for that JSON API standard come to life in the form of the <a href="http://jsonapi.org">JSON API 1.0 release</a>.</p>
<p>JSON API and Ember Data have been intertwined since JSON API's inception.
<a href="https://github.com/dgeb">@dgeb</a> gives the origins of JSON API in his <a href="http://www.cerebris.com/blog/2015/06/04/jsonapi-1-0/">1.0 announcement</a>:</p>
<blockquote>
  <p>Yehuda Katz wrote the first draft of the JSON API specification in May 2013 after hammering out the details in a long discussion with Steve Klabnik at RailsConf. JSON API began as a codification of the shared expectations of a single server library for Rails, ActiveModel::Serializers, and a single JavaScript client library, Ember Data.</p>
</blockquote>
<p>Ember Data has long supported JSON API through a community <a href="https://github.com/kurko/ember-json-api">adapter</a> started by <a href="https://twitter.com/0x8890">@0x8890</a> and maintained by <a href="https://github.com/kurko">@kurko</a>. However, now that JSON API has reached 1.0, it's time for Ember Data to uphold its part of the bargain and make using JSON API a first-class experience.</p>
<p>We have done exactly that, and Ember Data 1.13 adds support throughout the Ember Data stack for JSON API:</p>
<ul>
<li><strong>Ember Data 1.13 ships with a fully supported JSON API Adapter and Serializer.</strong> In 2.0, these will become the default Adapter and Serializer.</li>
<li><strong><code>JSONSerializer</code> and <code>RESTSerializer</code> have been refactored and streamlined to return JSON API payloads.</strong></li>
<li><strong><code>store.push</code> now accepts JSON API compliant payload.</strong></li>
<li>Ember Data <code>InvalidError</code> objects now accept JSON API error objects</li>
</ul>
<p>Switching to the JSON API format unlocks many new features which will be added in the 2.0 cycle, including first-class pagination, filtering and metadata support.</p>
<p>While <strong>using JSONSerializer, RESTSerializer and ActiveModelSerializer is not deprecated</strong>, we consider JSON API to be the happiest of the happy paths for using Ember Data, and if you are creating a new app today and have control over the API you should be using JSON API, because it is a well designed and comprehensive solution for JSON serialization. <strong>If your app is using the vanilla JSONSerializer or RESTSerializer, you will not have to make any changes, and your app will continue to work.</strong> The existing serializers have been updated in a backwards compatible way to return JSON API data to the store.</p>
<p>Other major changes in Ember Data 1.13 include:</p>
<ul>
<li><a href="http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html#toc_simplified-find-methods">Refactored and simplified find methods</a></li>
<li><a href="http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html#toc_new-adapter-hooks-for-better-caching">Adapter level control for identity map caching</a></li>
<li><a href="http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html#toc_new-serializer-api-for-custom-serializer-authors">Refactored and simplified Serializer APIs</a></li>
<li><a href="http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html#toc_internal-format-change-to-json-api">Switch to using JSON API as the internal data storage format</a></li>
<li><a href="http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html#toc_json-api-support">Native JSON API Serializer</a></li>
<li><a href="http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html#toc_new-errors-api">Better error handling</a></li>
</ul>
<h2 id="upgradeguide">Upgrade Guide</h2>
<p>Ember Data 1.13 is backwards-compatible with previous beta versions, and there are no
breaking changes between Ember Data 1.13 and Ember Data beta.19. Ember Data follows Ember.js's lead in not removing any features in this release. The upgrade path should be familiar to Ember.js users: upgrade, remove deprecations, upgrade again.</p>
<p><strong>You should update your codebase to Ember Data 1.13, remove all the deprecations
and then move to Ember Data 2.0. It is critically important to do this process step by step</strong> so that you won't miss deprecation warnings.
Otherwise, your app might fail in hard-to-debug ways.</p>
<p>If you have customized your serializer, you should upgrade to Ember Data 1.13,
check the upgrade guide to see if you need to make any changes, and then set a
temporary flag on your Serializer: <code>isNewSerializerAPI</code>. This will opt you into
the new serializer API. Once you are on the Ember Data 2.0 train, new Serializer API
is the default one, and there is no need for a flag.</p>
<p>We will be publishing a detailed step by step upgrade guide along with Ember.js
deprecations guides and <a href="https://github.com/abuiles/ember-watson">ember-watson</a> helpers that will automatically upgrade some
of the deprecations for you.</p>
<h2 id="releaselogistics">Release Logistics</h2>
<p><strong>Ember Data 1.13 is the last release of Ember Data that supports IE8
  and the 1.x series of Ember.js. Ember Data 2.0-beta.1 will be released shortly, and it will follow the Ember.js release train.</strong> Ember Data 2.0 will not work with the Ember.js 1.x series.</p>
<!-- alex ignore special -->
<p>We would like to extend a special thanks to the many contributors who
have helped out with this release. We would also like to recognize the
following contributors who helped with multiple issues leading up to
this release. If you would like to help, please join #dev-ember-data in the
<a href="https://ember-community-slackin.herokuapp.com/">Ember Community</a> on Slack.</p>
<ul>
<li><a href="https://github.com/turbo87">@turbo87</a></li>
<li><a href="https://github.com/HeroicEric">@HeroicEric</a></li>
<li><a href="https://github.com/pangratz">@pangratz</a></li>
<li><a href="https://github.com/sly7-7">@sly7-7</a></li>
<li><a href="https://github.com/yratanov">@yratanov</a></li>
<li><a href="https://github.com/tchak">@tchak</a></li>
<li><a href="https://github.com/thaume">@thaume</a></li>
<li><a href="https://github.com/mikehollis">@mikehollis</a></li>
<li><a href="https://github.com/tricknotes">@tricknotes</a></li>
</ul>
<p>We would also like to thank the companies which generously sponsored some of the work
that has gone into Ember Data:</p>
<ul>
<li><a href="https://dockyard.com/">DockYard</a></li>
<li><a href="http://www.precisionnutrition.com/">Precision Nutrition</a></li>
<li><a href="http://bookingsync.com">BookingSync</a></li>
</ul>
<p>As always this release can be obtained from npm (for
use with ember-cli), rubygems, or bower. The builds are also available
as static files at <a href="http://emberjs.com/builds">http://emberjs.com/builds</a>.</p>
<h2 id="newfeatures">New Features</h2>
<h3 id="simplifiedfindmethods">Simplified Find Methods</h3>
<p>Ember Data methods on the store have grown organically over the life
of the project. Originally, Ember Data started with <code>store.find(type)</code>
to request all records for a type and <code>store.find(type, id)</code> to
request a specific record. Later Ember Data added ways to issue a
query to the server via <code>store.find(type, {query})</code> or always reload a
record from the backend using <code>store.fetchById(type, id)</code> and
<code>store.fetchAll(type)</code>.</p>
<p>We realized the overloaded <code>store.find</code> method and inconsistent naming
of other methods is confusing for both new and existing developers. As a result, we have renamed many of the existing
store methods to make them more consistent and approachable for all
developers.</p>
<p>In particular, <code>store.find</code>, <code>store.all</code>, <code>store.getById</code> have been
deprecated and are replaced with consistently named methods. New methods follow a convention: If they are async and potentially go to the server, they start with <code>find</code>, and if they only get store local data without side-effects they start with <code>peek</code>.
If they return a single record they end in <code>Record</code> and if they return all the records they end in <code>All</code> .</p>
<h3 id="reorganizedfindmethods">Reorganized Find Methods</h3>
<table>
  <thead>
    <tr>
      <th></th>
      <th>Async from server/store</th>
      <th>Sync from store</th>
      <th>Query server</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><b>Single Record</b></td>
      <td><code>findRecord(type,id)</code></td>
      <td><code>peekRecord(type, id)</code></td>
      <td><code>queryRecord(type, {query})</code></td>
    </tr>
    <tr>
      <td><b>All Records</b></td>
      <td><code>findAll(type)</code></td>
      <td><code>peekAll(type)</code></td>
      <td><code>query(type, {query})*</code></td>
    </tr>
  </tbody>
</table>
<p>* A query usually does not return all the records of a type, so doesn't end in <code>All</code>.</p>
<h3 id="queryandqueryrecord">query and queryRecord</h3>
<p>The final use case for the old <code>store.find</code> method was issuing queries
to the server. This usage of <code>store.find(type, { query })</code> has been
deprecated and replaced by a new <code>query</code> method
on the store.</p>
<pre><code class="javascript language-javascript">store.query(type, { query });
</code></pre>
<p>In addition to <code>store.query</code> we have also added a <code>queryRecord</code> for
issuing arbitrary queries to the backend where the expected response
is a single record.</p>
<pre><code class="javascript language-javascript">store.queryRecord(type, { query });
</code></pre>
<p>Thanks to <a href="http://github.com/thaume">@thaume</a> for his work implementing this feature.</p>
<h2 id="bettercachingdefaultsforfindallandfindrecord">Better Caching Defaults for <code>findAll</code> and <code>findRecord</code></h2>
<p>In Ember Data beta.19 calling <code>store.find(type, id)</code> would fetch the
fresh data from the server the first time find was called, and then every time after that
return cached data. If the user always needed fresh data, they had to
know to call <code>store.fetchRecord</code>, and if they needed to background update
they would have to make multiple calls and be careful about what they return from
a route's <code>model:</code> hook.</p>
<p>Calling <code>store.find(type)</code> had the exact opposite behavior, where it would
always go to the server, and the user had to know to use <code>store.all(type)</code>
to only use local data. Mimicking the caching behavior of <code>find(type, id)</code>
when using <code>find(type)</code> was not at all straightforward for new developers to write.</p>
<p>Having observed many Ember apps in the wild, we have realized that neither
of these two behaviors are the most common use case and deserving of being the default. The most commonly desired behavior we have seen in Ember apps is:</p>
<ul>
<li>First time <code>store.find</code> is called, fetch new data</li>
<li>Next time return cached data</li>
<li>Fetch new data in the background and update</li>
</ul>
<p>This is the behavior of the new <code>findRecord</code> and <code>findAll</code> methods.</p>
<p>The first time you call <code>findRecord</code> and <code>findAll</code> they behave the same as
the old <code>find</code> method:</p>
<pre><code class="javascript language-javascript">//visiting /users/1 for the first time
model: function() {
  //We do not already have the user, so
  //store.findRecord returns a promise that resolves
  //after it has fetched the user from the server
  return this.store.findRecord('user', 1);
}
</code></pre>
<p>However if you already have the data cached locally, they resolve immediately
while fetching new data in the background:</p>
<pre><code class="javascript language-javascript">//visiting /users/1 for the second time
model: function() {
  //We already have the user, so store.findRecord
  //will resolve immediately with cached data, but will
  //send off a request in the background to update the user record
  //and once the user is updated your template will show the new changes
  return this.store.findRecord('user', 1);
}
</code></pre>
<p>While this is a great default data retrieval strategy, there are certain cases
where you want to ensure you have the freshest data (the old <code>store.fetch</code> behavior).</p>
<p>Because of that, <code>findRecord</code> and <code>findAll</code> accept <code>reload: true</code> an option in order to modify their default behavior.</p>
<p>If, for example you want to charge user for a purchase, and want to make sure you
get their latest account balance, you can pass a <code>reload: true</code> option that will
ensure we get the freshest data before continuing:</p>
<pre><code class="javascript language-javascript">//visiting /users/1/confirm-payment
model: function() {
  return this.store.findRecord('user', 1, { reload: true });
}
</code></pre>
<p>All of these behaviors are also shared by <code>findAll</code>:</p>
<pre><code class="javascript language-javascript">store.findAll('user');  //goes to the server the first time
store.findAll('user');  //after that returns from cache, but updates in background
store.findAll('user', { reload: true });  //enforces getting fresh data
</code></pre>
<h3 id="fetchbyidandfetchallreplacedbyfindrecordandfindall"><code>fetchById</code> and <code>fetchAll</code> Replaced by <code>findRecord</code> and <code>findAll</code></h3>
<p>Having these two methods, with customizable flags allows us to get rid of:
<code>store.fetchById</code> and <code>store.fetchAll</code>.</p>
<pre><code class="javascript language-javascript">store.fetchById(type, id) -&gt; store.findRecord(type, id, { reload: true });
store.fetchAll(type, id) -&gt; store.findAll(type, { reload: true });
</code></pre>
<h3 id="newadapterhooksforbettercaching">New Adapter Hooks for Better Caching</h3>
<!-- alex ignore easy -->
<p>While <code>store.findRecord</code> and <code>store.findAll</code> now have sensible caching defaults
and are easy to override in specific places in the app, oftentimes your app and
adapter layer have specific knowledge related to caching. For example, your backend
might have given you an <code>expires</code> header, or you may not want to try fetching background updates if the network is down. To support these use cases, we have added new adapter
hooks to customize caching app wide beyond passing options to <code>findRecord</code> and <code>findAll</code>.</p>
<p>Now, whenever you call <code>findRecord</code> or <code>findAll</code>, and the record is already cached in the store, the store will ask the adapter whether it needs to immediately reload it, or if it needs to update it in the background.</p>
<p>For example, if you are building an events ticketing system, in which users can only reserve tickets for 20 minutes at a time, and want to ensure that in each route you have data that is no more than 20 minutes old you could write:</p>
<pre><code class="javascript language-javascript">shouldReloadRecord: function(store, ticketSnapshot) {
  let timeDiff = moment().diff(ticketSnapshot.attr('lastAccessedAt')).minutes();
  if (timeDiff &gt; 20) {
    return true;
  } else {
    return false;
  }
},
</code></pre>
<p>This method would ensure that whenever you do <code>findRecord('ticket')</code> you will
always get a ticket that is no more than 20 minutes old. In case the cached
version is more than 20 minutes old, <code>findRecord</code> will not resolve until you fetched
the latest version. By default this hook returns false, as most UIs should not block
user interactions while waiting on data update.</p>
<p>You can also customize whether you should try and do a background update. For example, if you do not want to fetch complex data over a mobile connection, or
if the network is down, you can implement <code>shouldBackgroundReloadRecord</code></p>
<pre><code class="javascript language-javascript">shouldBackgroundReloadRecord: function(store, snapshot) {
  if (window.navigator.connection === 'cellular' ||
    window.navigator.connection === 'none') {
    return false;
  } else {
    return true;
  }
}
</code></pre>
<p><code>Adapter#shouldBackgroundReloadRecord</code> is called by the store when the
store is resolving the <code>findRecord</code> promise with a cached record. If
this method returns <code>true</code> the store will attempt to reload the record
from the adapter in the background. The default implementation for
this method in Ember Data 1.13 is to always return <code>false</code>, in order
to ease the upgrade path. However in
Ember Data 2.0 this will be changed to always return <code>true</code>.</p>
<p>Symmetric methods have also been added for <code>store.findAll</code>.</p>
<pre><code class="javascript language-javascript">shouldReloadAll: function(store, snapshotRecordArray)
shouldBackgroundReloadAll: function(store, snapshotRecordArray)
</code></pre>
<p><a href="https://github.com/eccegordo">@eccegordo</a> put together this table
listing all the new store apis and the methods they replace.</p>
<table>
  <thead>
    <tr>
      <th>Ember beta.19</th>
      <th>Ember 1.13</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code>store.getById(type, id)</code></td>
      <td><code>store.peekRecord(type, id)</code></td>
    </tr>
    <tr>
      <td><code>store.all(type)</code></td>
      <td><code>store.peekAll(type)</code></td>
    </tr>
    <tr>
      <td><code>store.find(type, id)</code></td>
      <td><code>store.findRecord(type, id, options)</code></td>
    </tr>
    <tr>
      <td><code>store.find(type)</code></td>
      <td><code>store.findAll(type, options)</code></td>
    </tr>
    <tr>
      <td>N/A</td>
      <td><code>store.queryRecord(type, query)</code></td>
    </tr>
    <tr>
      <td><code>store.find(type, { query })</code></td>
      <td><code>store.query(type, query)</code></td>
    </tr>
    <tr>
      <td><code>store.fetch(type, id)</code></td>
      <td><code>store.findRecord(type, id, {reload: true})</code></td>
    </tr>
  </tbody>
</table>
<h2 id="jsonapisupport">JSON API Support</h2>
<h3 id="jsonapiadapterandserializer">JSON API Adapter and Serializer</h3>
<p>Ember Data 1.13 comes with support for <a href="http://jsonapi.org/">JSON API</a>
1.0. There is a new <code>DS.JSONAPIAdapter</code> and <code>DS.JSONAPISerializer</code>
that support working with JSON API backends. In Ember Data 2.0 the
JSON API Adapter will be the default loaded by Ember Data.</p>
<h3 id="internalformatchangetojsonapi">Internal Format Change to JSON API</h3>
<p>In Ember Data beta.19, you communicated updates to the store by calling
<code>store.push(type, id)</code>. We have now changed <code>store.push</code> so it receives a
JSON API object, <code>store.push({JSON API compound document})</code></p>
<p>For example</p>
<pre><code class="javascript language-javascript">store.push('user', { id: 1, name: 'Pangratz' });
</code></pre>
<p>becomes</p>
<pre><code class="javascript language-javascript">store.push({
  data: {
    id: '1', 
    type: 'user', 
    attributes: { 
      name: 'Pangratz' 
    }
  }
});
</code></pre>
<p>This allows for much better and fine grained meta handling, and ensures we do
not have to support, maintain and document a completely custom JSON format
as we had to until now, but can reference the <a href="http://jsonapi.org/">JSON API specification</a>.</p>
<p>We will be publishing an <a href="https://github.com/abuiles/ember-watson">ember-watson</a> helper that will be rewriting all the uses
of <code>store.push</code> inside your tests to the new format, as well as addon with helpers
that convert the old <code>store.push</code> format into the new format.</p>
<h3 id="newserializerapiforcustomserializerauthors">New Serializer API for custom Serializer authors</h3>
<p>If you made a <code>store.findRecord('user', 1)</code> request in Ember Data beta.19
and your server payload looked like:</p>
<pre><code class="javascript language-javascript">{
  user: { id: 1, name: 'wecc', accounts: [1, 2] },
  accounts: [
    { id: 1, email: 'wecc@sweden.se' },
    { id: 2, email: 'wecc@greece.gr' }
  ]
}
</code></pre>
<p>Your serializer would get the payload passed in an <code>extract</code> hook and its job was to:</p>
<ul>
<li>normalize and <code>store.push</code> everything that is not the <code>primary record</code>, in this case the array of sideloaded accounts</li>
<li>normalize and return the primary data, in this case the <code>user</code> data</li>
</ul>
<p>Having these two ways of pushing data to the store, with both returning primary record data
from <code>extract</code> hooks but also doing <code>store.push</code> with other data was both confusing,
hard to debug and optimize and also prevented us from implementing proper metadata support, especially for sideloaded arrays and records.</p>
<p>In Ember Data 1.13 this process has been greatly simplified. <strong>In 1.13 Serializers
should make the whole payload conform to the JSON API spec, and return the whole payload</strong>. They should no longer <code>store.push</code> themselves.</p>
<p>In order to be backwards compatible, we created a new hook <code>normalizeResponse</code> which
Serializers should now implement and return JSON API from that hook.</p>
<p>For example a Serializer responsible for normalizing the above sample payload would transform the payload to:</p>
<pre><code class="javascript language-javascript">{
  data: { 
    id: '1', 
    type: 'user', 
    attributes: {
      name: 'wecc'
    }, 
    relationships: {
      accounts: {
        data: [
          { id: '1', type: 'account' },
          { id: '2', type: 'account' }
        ]
      }
    }
  },
  included: [{ 
    id: '1',
    type: 'account',
    attributes: {
      email: 'wecc@sweden.se'
    }
  }, {
    id: '2',
    type: 'account',
    attributes: {
      email: 'wecc@greece.gr'
    }
  }]
}
</code></pre>
<p>We will be posting a detailed Serializer transition guide shortly.</p>
<h3 id="newjsonserializerandrestserializerapi">New JSONSerializer and RESTSerializer API</h3>
<p>As we rewrote JSONSerializer and RESTSerializer to implement the new
Serializer API we also simplified and greatly improved their own APIs.
Previously the possible places to modify a response for <code>store.find('user', 1)</code> were</p>
<ul>
<li><code>extract</code></li>
<li><code>extractFind</code></li>
<li><code>extractSingle</code></li>
<li><code>normalizePayload</code></li>
<li><code>normalizeHash</code></li>
<li><code>normalize</code></li>
<li><code>extractMeta</code></li>
<li><code>normalizeRelationships</code></li>
<li><code>normalizeAttributes</code></li>
</ul>
<p>The new Serializer API allowed us to simplify these. If you receive a response
to <code>store.findRecord('user', 1)</code> in Ember Data 1.13 you can customize your response
in</p>
<ul>
<li><code>normalizeResponse</code> - entry method to the Serializer and responsible for normalizing any response, gets the full payload, returns a JSON API compound document</li>
<li><code>normalizeFindRecordResponse</code> - a normalizeResponse for a specific operation</li>
<li><code>normalize</code> - normalizes data for a single record, returns a JSON API compound document<ul>
<li><code>extractId</code> | <code>extractAttributes</code> | <code>extractRelationships</code> - normalize delegates to these methods to extract the id, attributes and relationships from the payload. They receive the full payload for a single record and return the subsets of data for id, attributes and relationships, conforming to the JSON API specification.</li></ul></li>
<li>extractMeta - extracts the metadata for a payload</li>
</ul>
<h4 id="transitiontothenewjsonserializerandrestserializerapis">Transition to the new JSONSerializer and RESTSerializer APIs</h4>
<p>If you have a custom serializer you will need to make some new changes
to your serializer to get it ready for Ember Data 2.0.</p>
<h5 id="customextractmethods">Custom <code>extract</code> Methods</h5>
<p>If you have custom <code>extract</code> hooks you need to do two things:</p>
<p>First, rename:</p>
<ul>
<li><code>extract()              =&gt; normalizeResponse()</code></li>
<li><code>extractFindAll()       =&gt; normalizeFindAllResponse()</code></li>
<li><code>extractFind()          =&gt; normalizeFindRecordResponse()</code></li>
<li><code>extractFindMany()      =&gt; normalizeFindManyResponse()</code></li>
<li><code>extractFindBelongsTo() =&gt; normalizeFindBelongsToResponse()</code></li>
<li><code>extractFindHasMany()   =&gt; normalizeFindHasManyResponse()</code></li>
<li><code>extractFindQuery()     =&gt; normalizeQueryResponse()</code></li>
<li><code>extractQueryRecord()   =&gt; normalizeQueryRecordResponse()</code></li>
<li><code>extractCreateRecord()  =&gt; normalizeCreateRecordResponse()</code></li>
<li><code>extractDeleteRecord()  =&gt; normalizeDeleteRecordResponse()</code></li>
<li><code>extractUpdateRecord()  =&gt; normalizeUpdateRecordResponse()</code></li>
<li><code>extractSave()          =&gt; normalizeSaveResponse()</code></li>
<li><code>extractSingle()        =&gt; normalizeSingleResponse()</code></li>
<li><code>extractArray()         =&gt; normalizeArrayResponse()</code></li>
</ul>
<p>Second, make sure that your <code>extract</code> hooks return a full JSON API compound document
(<a href="http://jsonapi.org/format/#document-top-level">http://jsonapi.org/format/#document-top-level</a>) with the primary
resource(s) in a <code>data</code> array or object and eventual sideloaded
resources in a <code>included</code> array. Every resource object
(<a href="http://jsonapi.org/format/#document-resource-objects">http://jsonapi.org/format/#document-resource-objects</a>) has to
follow the JSON API format with <code>id</code>, <code>type</code>, attributes in
<code>attributes</code> and relationships in <code>relationships</code>. For the full
specification of the JSON API format see
<a href="http://jsonapi.org/format/">http://jsonapi.org/format/</a>.</p>
<h5 id="customextractmetamethod">Custom <code>extractMeta</code> Method</h5>
<p>If you have a custom <code>extractMeta</code> method you have to make sure it
returns the meta data instead of calling <code>store.setMetadataFor()</code> (or
relying on <code>_super</code> to do so).</p>
<h5 id="customnormalizemethod">Custom <code>normalize</code> Method</h5>
<p>If you have a custom <code>normalize()</code> method you need to update this to
return a full JSON API Document
(<a href="http://jsonapi.org/format/#document-top-level">http://jsonapi.org/format/#document-top-level</a>) with the primary
resource object
(<a href="http://jsonapi.org/format/#document-resource-objects">http://jsonapi.org/format/#document-resource-objects</a>) located in
<code>data</code>.</p>
<h5 id="optintothenewserializerapi">Opt Into the New Serializer API</h5>
<p>To tell Ember Data that you are ready to use the new Serializer API,
add <code>isNewSerializerAPI: true</code> when extending <code>JSONSerializer</code> or
<code>RESTSerializer</code>. The new <code>JSONAPISerializer</code> uses the new Serializer
API by default. The <code>isNewSerializerAPI</code> flag is <strong>only</strong> required for
Ember Data 1.13 and will be removed in Ember Data 2.0. The new
<code>JSONAPISerializer</code> only supports the new Serializer API.</p>
<p>Thanks to <a href="https://github.com/wecc">@wecc</a> for his hard work on
implementing this feature in a backwards compatible way.</p>
<p>We would also like thank <a href="https://github.com/kurko">@kurko</a>
for his efforts maintaining the
<a href="https://github.com/kurko/ember-json-api">community JSON API adapter</a>.</p>
<h2 id="newerrorsapi">New Errors API</h2>
<p>Similarly to the find APIs, our error handling APIs have grown over time,
and the switch to JSON API has given us a great opportunity for cleanup
and standardisation. <a href="https://twitter.com/tchak13">@tchak</a> has done a great job rewriting our
Errors API to be JSON API compatible, while keeping backwards support for
REST/JSON/ActiveModel adapters. There are two main changes in Ember Data 1.13
error handling:</p>
<ul>
<li>Cleaner adapter hooks for errors</li>
<li>Using JSON API Error object format</li>
</ul>
<h3 id="cleaneradapterhooksforerrors">Cleaner adapter hooks for errors</h3>
<p>Previously, if you were subclassing the <code>RestAdapter</code> you could overwrite
<code>ajaxSuccess</code> and <code>ajaxError</code> hooks to implement custom error handling.
However, potential errors come in many flavors. For example, you could be receiving responses with a status code of <code>200</code> with the body of <code>{ error: error }</code>. In this case it was not intuitive to write error handling code in a method called <code>ajaxSuccess</code>. Because of this and many other examples, we realized that <code>ajaxSuccess</code> and <code>ajaxError</code> were not the
correct level at which to implement error handling.</p>
<p>In Ember Data 1.13 we are introducing a new, simpler adapter hook:
<code>handleResponse</code> while deprecating <code>ajaxSuccess</code> and
<code>ajaxError</code>.</p>
<p>The responsibility of <code>handleResponse</code> is to take the returned status,
response headers and payload, and decide whether to pass the payload through as
a success, or to return an instance of <code>AdapterError</code> or <code>InvalidError</code>.</p>
<p>For example, if your API engineers for some unknown reason decided to return
<code>200 OK</code> with an error message, you could subclass your adapter to handle this:</p>
<pre><code class="javascript language-javascript">handleResponse: function(status, headers, payload) {
  if (status === 200 &amp;&amp; payload.errors) {
    return new InvalidError(payload.errors);
  }
  return this._super(...arguments);
}
</code></pre>
<p>You could also subclass two helper methods, <code>isInvalid</code> and <code>isSuccess</code>
to customize when you adapter considers a request succesful or not valid.</p>
<p>Default implementation of <code>isInvalid</code> returns
true if http status code is <code>422</code>, however, you may desire other
semantics, for example checking the <code>code</code> property on a JSON API
error object.</p>
<p>This refactor also allows us to abstract away the jQuery <code>jqXHR</code> object, which
was tying Ember Data's Rest Adapter too closely with jQuery's implementation of ajax. New hooks take three arguments instead of <code>jqXHR</code>: status code, a hash of
response headers and parsed payload. It makes them agnostic about the
underlying implementation and will allow us to use methods like
<a href="https://developers.google.com/web/updates/2015/03/introduction-to-fetch?hl=en">fetch</a>
in the future.</p>
<h3 id="usingjsonapierrorobjectformat">Using JSON API Error object format</h3>
<p>Similarly to the rest of Ember Data 1.13, we have refactored the error handling to use JSON API. JSON API has specified an
<a href="http://jsonapi.org/format/#error-objects">error objects</a>
format. Starting with Ember Data 1.13 we are using JSON API format to
communicate errors from the adapter to the store.
We are deprecating the current Ruby on Rails inspired
format for creating <code>InvalidError</code> objects and replacing it with
proper JSON API objects. The old format is supported with a
deprecation warning in 1.13.</p>
<p>Deprecated format:</p>
<pre><code class="javascript language-javascript">new DS.InvalidError({
  first_name: ['is invalid']
});
</code></pre>
<p>New format:</p>
<pre><code class="javascript language-javascript">new DS.InvalidError([
  {
    source: { pointer: 'data/attributes/first_name' },
    detail: 'is invalid'
  }
]);
</code></pre>
<p>Thanks to <a href="https://github.com/tchak">@tchak</a> and
<a href="https://github.com/twokul">@twokul</a> for working on the design and
implementation of the new API.</p>
<h2 id="significantdeprecations">Significant Deprecations</h2>
<p>In addition to new features, Ember Data 1.13 introduces deprecations for
features and behavior that will be removed in Ember Data 2.0.</p>
<h3 id="asyncrelationships">Async Relationships</h3>
<p>In Ember Data 2.0 relationships will be asynchronous by default. Sync
relationships will still be supported but you will need to manually
opt into them by setting <code>{ async: false }</code> on your
relationships. Ember Data 1.13 will log a deprecation warning you if
you have any relationships where the <code>async</code> property is not
explicitly set. Additionally you can use
<a href="https://github.com/abuiles/ember-watson">ember-watson</a> to help
identify cases in your codebase where you have relationships without
an explicit <code>async</code> property.</p>
<h3 id="dsstorefiltermovedtoanaddon">DS.Store#filter Moved to an Addon</h3>
<p>With Ember Data 2.0 and the commitment to semver we found we were not
happy with the state of the current <code>store.filter()</code> method. It
currently only supports a limited number of uses cases and often is a
source of memory leaks in long running applications. In order to give
Ember Data time to iterate on a better filter API the current
<code>store.filter</code> method has been deprecated and its functionality is
being moved into an addon
<a href="https://github.com/ember-data/ember-data-filter">https://github.com/ember-data/ember-data-filter/</a>.</p>
<p>In Ember 2.0, if you would like to use the current <code>store.filter</code>
method you will need to include the ember-data-filter addon with your
application.</p>
<h3 id="dsactivemodeladaptermovedtoanaddon">DS.ActiveModelAdapter Moved to an Addon</h3>
<p><code>DS.ActiveModelAdapter</code> and <code>DS.ActiveModelSerializer</code> has also been
<a href="https://github.com/ember-data/active-model-adapter">moved to an addon</a>. It
will continue to be supported by the Ember Data team, however, it will
no longer ship with Ember Data by default in Ember Data 2.0.</p>
<h3 id="customstores">Custom Stores</h3>
<p>Over the years, Ember Data has supported a number of namespaces where
custom stores can be defined. In order to make things conceptually
simpler Ember Data 2.0 will require custom stores to be define as a
service.</p>
<p>If you have a custom store in your Ember CLI app defined in
<code>app/store.js</code> you will need to move it to <code>app/services/store.js</code>. If
you have a custom store in your globals app you will need to move it
to <code>App.StoreService</code>.</p>
<h3 id="jsonapiadapterdefault">JSON API Adapter Default</h3>
<p>In Ember Data 2.0 the default adapter will be the <code>JSONAPIAdapter</code>. In
Ember Data 1.13 when loading the default <code>RESTAdapter</code> there will be a
deprecation warning.</p>
<p>To silence the warning and continue using the <code>RESTAdapter</code> you will
need to set the <code>RESTAdapter</code> as your application adapter.</p>
<pre><code class="javascript language-javascript">// app/adapters/application.js
import DS from 'ember-data';

export default DS.RESTAdapter;
</code></pre>
<h3 id="storepushchanges"><code>store.push</code> Changes</h3>
<p>Previously, Ember Data allowed users to add a record to the store
using <code>store.push('model-name', {})</code>. This format has been deprecated
and now <code>store.push</code> will take a JSON API document as its first and
only argument. This new change will allow Ember Data to get better
performance in Ember Data 2.0 by deferring the creation of DS.Model
instances until they are needed by user code. <code>store.pushMany</code> has
also been deprecated because you can push multiple records using in a
JSON API document.</p>
<h3 id="rollbackrenamedtorollbackattributes"><code>rollback</code> Renamed to <code>rollbackAttributes</code></h3>
<p><code>record.rollback()</code> has been deprecated to
<code>record.rollbackAttributes()</code>. This new name more closely matches its
behavior and will allow for a new <code>record.rollback()</code> to be introduced
in the future that rolls back relationships in addition to attributes.</p>
<h3 id="isdirtyrenamedtohasdirtyattributes"><code>isDirty</code> Renamed to <code>hasDirtyAttributes</code></h3>
<p><code>record.isDirty()</code> has been deprecated to
<code>record.hasDirtyAttributes()</code>. This new name more closely matches its
behavior and will allow for a new <code>record.hasDirtyRelationships()</code> to be introduced
in the future that allows you to check dirtiness of relationships.</p>
<h3 id="preloadingrecorddataonfind">Preloading Record Data on Find</h3>
<p>If you previously used the preload argument to <code>store.find</code> it has
been moved into the preload key on <code>findRecord</code>'s options argument</p>
<pre><code class="javascript language-javascript">// Deprecated
store.find('comment', 1, { post: 1 });

// Ember Data 1.13 style
store.findRecord('comment', 1, { preload: { post: 1 }});
</code></pre>
<h2 id="changelog">Changelog</h2>
<p><a href="https://github.com/emberjs/data/blob/3bce36295a6e9f1bbe4824505046d22dc04d056d/CHANGELOG.md#release-113-june-16-2015">Ember Data 1.13</a></p>]]></description><link>https://blog.emberjs.com/ember-data-1-13-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-1-13-released</guid><pubDate>Thu, 18 Jun 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data v2.0 Released and v2.1 Beta Released]]></title><description><![CDATA[<p>We are excited to announce the release of Ember Data 2.0, the
second stable release since 1.13 that includes significant improvements,
cleanup, and cruft removal.</p>
<p><a href="http://emberjs.com/blog/2015/06/16/ember-project-at-2-0.html">As previously discussed</a>, Ember Data releases occur in
lockstep with Ember, to help developers better reason about
compatibility between these libraries. Ember Data 2.0 is designed to be
used in tandem with Ember 2.0, and like Ember 2.0, we have used the
occasion of a new major version number to remove deprecated features and
clean up the code.</p>
<p><strong>Ember Data 2.0 is about removing deprecated
functionality, not adding new features</strong>. If you've already started
using Ember Data 1.13 and cleared the deprecations, you should find
upgrading to Ember Data 2.0 to be very straightforward.</p>
<h3 id="jsonapi">JSON API</h3>
<p>In the <a href="http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html">Ember Data 1.13 blog post</a>, we described how we
had overhauled Ember Data's internals to use JSON API from top to
bottom.</p>
<p>Using JSON API dramatically simplified internal code and APIs, but I
want to emphasize that <strong>moving to JSON API internally does not affect
your applications, and you are in no way required to use JSON API
yourself to upgrade to newer versions of Ember Data</strong>.</p>
<p>The adapters that determine how your application talks to the backend
server remain unchanged, but this change should make the lives of
adapter authors much simpler going forward.</p>
<h3 id="unsaveddeletedrecords">Unsaved Deleted Records</h3>
<p>There is one significant breaking change in the move from 1.13 to
2.0. The short version of this change is <strong>locally deleted (unsaved)
records are no longer removed from RecordArrays and hasMany
arrays. Ember Data now removes the deleted record only after the
delete has been confirmed by the backend. There is also a
<a href="https://github.com/ember-data/ember-data-live-filter-by">new addon</a>
to make it easier to implement the old behavior.</strong></p>
<p>In Ember Data 1.13, once a record was marked as deleted, it was removed from
all of the <code>RecordArrays</code> and <code>hasMany</code> arrays it belonged to. This made it
difficult to create UIs where users could "un-delete" records.</p>
<p>For example, imagine you are building a document viewer app using Ember Data.
You show the user a list of documents they have access to. When the user
deletes a document, you want it to remain in the list, but with a different
visual treatment to indicate that it has been deleted locally (i.e., not saved back to the server).</p>
<p><img src="/images/blog/2015-08-03-ember-data-2-0-released/deleted-document.png" alt="Example UI with deleted document" /></p>
<p>Building this UI was difficult because the record would be removed from the
list as soon as you called <code>deleteRecord()</code> on the model.</p>
<p>In Ember Data 2.0, this will be a lot easier because records are no longer
removed from hasMany relationships or RecordArrays until the delete has been
acknowledged by the adapter. Note that Although deleted records will be visible
in hasMany relationships, they will not be serialized when saving these
relationships back to the server.</p>
<p>To make the transition easier, the Ember Data team (with help from
<a href="https://github.com/pangratz">Clemens Müller</a>) has released an addon called
<a href="https://github.com/ember-data/ember-data-live-filter-by">Ember Data Live filterBy</a>. This
allows the <code>filterBy</code> method on <code>RecordArray</code>s and <code>hasMany</code>
relationships to return a live filtered subset of the original
array. This can be used to filter out deleted but unsaved records to
preserve the old behavior, where records are removed from collections
as soon as they are deleted. This addon work with Ember Data 1.13 and Ember Data 2.0.</p>
<pre><code class="javascript language-javascript">App.PostController = Ember.Controller.extend({
  allPosts: function() {
    return this.store.peekAll('post');
  }.property()
  allUndeletedPosts: function() {
    return this.store.peekAll('post').filterBy('isDeleted', false, { live: true });
  }.property()
});
</code></pre>
<h2 id="emberdata21beta">Ember Data 2.1 Beta</h2>
<p>Ember Data data 2.1 will be the first release following Ember's 6 week
release cycle. Rather then rush new features into the beta before they
are ready, Ember Data 2.1 will not contain any new features or
deprecations. Instead the Ember Data team is going to spend this cycle
fixing issues, updating documentation and planning features for future
2.x releases.</p>
<h2 id="changelogs">CHANGELOGS</h2>
<ul>
<li><a href="https://github.com/emberjs/data/blob/v2.0.0/CHANGELOG.md">Ember Data 2.0.0 CHANGELOG</a></li>
<li><a href="https://github.com/emberjs/data/blob/v2.1.0-beta.1/CHANGELOG.md">Ember Data 2.1.0-beta.1 CHANGELOG</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-data-2-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-2-0-released</guid><pubDate>Wed, 02 Sep 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data 2.1 and 2.2 Beta Released]]></title><description><![CDATA[<p>Ember Data 2.1, a minor version release of Ember Data with bug fixes only, is released today. This release represents the work of over 26 direct contributors, and over 127 commits.</p>
<p>Ember Data 2.2 beta.1, the branch of Ember Data that will be released as stable in roughly six weeks, is also being released today.</p>
<h2 id="newfeaturesinemberdata21">New Features in Ember Data 2.1</h2>
<p>There are no new Features introduced in Ember Data 2.1. Instead the
Ember Data team spent this release cycle focused on improving the
guides, API documentation and fixing bugs.</p>
<p>See the <a href="https://github.com/emberjs/data/blob/v2.1.0/CHANGELOG.md">Ember Data 2.1.0 CHANGELOG</a> for a full list of all changes.</p>
<h2 id="emberdata22beta">Ember Data 2.2 beta</h2>
<p>No new features are currently planned for Ember Data 2.2. During the
canary cycle leading to this beta, the Ember Data team and community
have been primarily focused on bug fixes and performance
improvements. The Ember Data team expects the introduction of new
features to resume in Ember Data 2.3.</p>
<p>For more details on changes in 2.2, review the
<a href="https://github.com/emberjs/data/blob/v2.2.0-beta.1/CHANGELOG.md">Ember Data 2.2.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-data-2-1-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-2-1-released</guid><pubDate>Mon, 05 Oct 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data 2.2 and 2.3 Beta Released]]></title><description><![CDATA[<p>Ember Data 2.2, a minor version release of Ember Data with bug fixes
only, is released today. This release represents the work of over 21
direct contributors, and over 140 commits.</p>
<p>Ember Data 2.3 beta.1, the branch of Ember Data that will be released
as stable in roughly six weeks, is also being released today.</p>
<h3 id="changesinemberdata22">Changes in Ember Data 2.2</h3>
<p>There are no new features introduced in Ember Data 2.2. Instead the
this release contains bugfixes and documentation improvements for
Ember Data.</p>
<p>See the <a href="https://github.com/emberjs/data/blob/v2.2.0/CHANGELOG.md">Ember Data 2.2.0 CHANGELOG</a> for a full list of all changes.</p>
<h3 id="emberdata23beta">Ember Data 2.3 beta</h3>
<p>Ember Data 2.3 beta is released today, and in six weeks it will become the
new stable version of Ember Data.</p>
<h4 id="embercliaddon">Ember CLI Addon</h4>
<p>Previously the primary way of consuming Ember Data was using the bower
package. The existing Ember Data addon for Ember CLI added Ember Data
to the <code>bower.json</code> file. This often lead to some confusion because
updating the version of the Ember Data addon on <code>packages.json</code> would
not update the version of Ember Data included in your app.</p>
<p>Starting in the Ember Data 2.3.0 release, Ember Data will be packaged
and distributed as an Ember CLI addon. This will allow users to
consume Ember Data in the same way that they would any other
addon. Additionally, contributing to Ember Data should be easier as
building and testing the Ember Data project now follows Ember CLI
addon conventions.</p>
<p>Thanks to <a href="https://github.com/fivetanley">fivetanley</a> for his hard
work in porting Ember Data to the addon infrastructure.</p>
<p>For more details on changes landing in 2.3, review the
<a href="https://github.com/emberjs/data/blob/v2.3.0-beta.1/CHANGELOG.md">Ember Data 2.3.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-data-2-2-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-2-2-released</guid><pubDate>Tue, 17 Nov 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data 2.3 and 2.4 Beta Released]]></title><description><![CDATA[<p>Ember Data 2.3, a minor version release of Ember Data, is released today. This release represents the work of over 32 direct contributors, and over 196 commits.</p>
<p>Ember Data 2.4 beta.1, the branch of Ember Data that will be released as stable in roughly six weeks, is also being released today.</p>
<h3 id="changesinemberdata23">Changes in Ember Data 2.3</h3>
<p>Ember Data 2.3 is now a full Ember CLI addon. Previous versions of
Ember Data required users to include both the <em>ember-data</em> package in
their project's <code>package.json</code> file and the <em>ember-data</em> package in
their project's <code>bower.json</code> file. This resulted in confusion because
updating <em>ember-data</em> in <code>package.json</code> would not update <em>ember-data</em>
in <code>bower.json</code>.</p>
<p>To upgrade Ember Data to version 2.3 in your Ember CLI projects please
do the following:</p>
<ol>
<li>remove the <code>ember-data</code> package from your <code>bower.json</code></li>
<li>update <code>ember-cli-shims</code> package to version <code>0.1.0</code></li>
</ol>
<pre><code class="json language-json">   ...
   "dependencies": {
     "handlebars": "2.0.0",
     "ember": "~2.2.0",
-    "ember-cli-shims": "0.0.6",
+    "ember-cli-shims": "0.1.0",
     "ember-cli-test-loader": "ember-cli-test-loader#0.1.3",
-    "ember-data": "~1.13.12",
     "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.5",
     ...
</code></pre>
<p>Then in your <code>package.json</code> update <code>ember-data</code> to <code>^2.3.0</code></p>
<pre><code class="json language-json">   ...
   "devDependencies": {
     ...
     "ember-cli-sri": "^2.0.0",
     "ember-cli-uglify": "^1.2.0",
-    "ember-data": "^2.2.1",
+    "ember-data": "^2.3.0",
     "ember-disable-proxy-controllers": "^1.0.1",
     ...
</code></pre>
<p>Thanks to <a href="https://github.com/fivetanley">@fivetanley</a>, for his heroic
efforts in converting Ember Data's build to Ember CLI's addon
infrastructure.</p>
<h3 id="importingmodules">Importing Modules</h3>
<p>The Ember Data addon allows users to import modules directly into
their application instead of accessing modules top level <code>DS</code> namespace.</p>
<p>The following module paths are considered to be public API and will be supported until at least Ember Data 3.0:</p>
<pre><code class="javascript language-javascript">// DS.Model
import Model from 'ember-data/model';

// DS.RESTSerializer
import RESTSerializer from 'ember-data/serializers/rest';

// DS.JSONSerializer
import JSONSerializer from 'ember-data/serializers/json';

// DS.JSONAPISerializer
import JSONAPISerializer from 'ember-data/serializers/json-api';

// DS.JSONAPIAdapter
import JSONAPIAdapter from 'ember-data/adapters/json-api';

// DS.RESTAdapter
import RESTAdapter from 'ember-data/adapters/rest';

// DS.Adapter
import Adapter from 'ember-data/adapter';

// DS.Store
import Store from 'ember-data/store';

// DS.Transform
import Transform from 'ember-data/transform';

// DS.attr
import attr from 'ember-data/attr';

// DS.hasMany or DS.belongsTo
import { hasMany, belongsTo } from 'ember-data/relationships';
</code></pre>
<p>Modules that are not considered to be public API have been placed under the <code>ember-data/-private</code> path. Please do not import these modules into your app or test code as they may be changed or removed <em>without warning</em>.</p>
<p>Thanks to <a href="https://github.com/rwjblue">@rwjblue</a> for implementing this
module API.</p>
<h4 id="notablebugfixes">Notable Bug Fixes</h4>
<h5 id="pr4025usekeyforrelationshipforbelongstoandhasmanyhttpsgithubcomemberjsdatapull4025"><a href="https://github.com/emberjs/data/pull/4025/">PR #4025 Use keyForRelationship for belongsTo and hasMany</a></h5>
<p>The <code>EmbeddedRecordsMixin</code> now uses <a href="http://emberjs.com/api/data/classes/DS.RESTSerializer.html#method_keyForRelationship">keyForRelationship</a> to generate the serialized key for embedded relationships. Thanks to <a href="https://github.com/GCorbel">@GCorbel</a> for this fix.</p>
<h5 id="pr3866allowstorepushtoacceptdatanullhttpsgithubcomemberjsdatapull3866"><a href="https://github.com/emberjs/data/pull/3866">PR #3866 Allow store.push to accept { data: null }</a></h5>
<p>The JSONAPISerializer now correctly accepts <code>{"data": null}</code> as a valid response instead of throwing an unhelpful error message. Thanks to <a href="https://github.com/mitchlloyd">@mitchlloyd</a> for the <a href="https://github.com/emberjs/data/issues/3790">bug report</a>.</p>
<p>See the <a href="https://github.com/emberjs/data/blob/v2.3.0/CHANGELOG.md">Ember Data 2.3.0 CHANGELOG</a> for a full list of all changes.</p>
<h3 id="emberdata24beta">Ember Data 2.4 beta</h3>
<p>Ember Data 2.4 beta is released today, and in six weeks it will become the
new stable version of Ember Data. This beta cycle introduces a single new feature.</p>
<h4 id="friendlyerrors">Friendly Errors</h4>
<p><a href="https://github.com/nikz">@nikz</a> has implemented
<a href="https://github.com/emberjs/rfcs/pull/101">RFC 101</a> which provides
more context for <code>RESTAdapter</code> and <code>JSONAPIAdapter</code> errors in Ember
Data. Be sure to check out the
<a href="https://github.com/emberjs/data/pull/3930">pull request</a> for more
details.</p>
<p>For more details on changes in 2.4, review the
<a href="https://github.com/emberjs/data/blob/v2.4.0-beta.1/CHANGELOG.md">Ember Data 2.4.0-beta.1 CHANGELOG</a>.</p>
<h3 id="upcomingfeatures">Upcoming Features</h3>
<p>Two new features recently landed on the Ember Data canary branch. They
each address add some long requested features to Ember Data. However,
before they can be enabled in a beta branch the Ember Data team would
like the community to try them out and provide feedback on their
implementations. These two feature flagged features are only available
on the <code>master</code> branch (sometimes called "canary") of Ember Data. To
test them out please update the version of Ember Data in package.json
to <code>emberjs/data#master</code> and add the feature to the <code>EmberENV</code>'s
<code>FEATURES</code> object in <code>config/environment.js</code>.</p>
<pre><code class="javascript language-javascript">// config/environment.js
var ENV = {
  EmberENV: {
    FEATURES: {
      'ds-finder-include': true,
      'ds-references': true
    }
  }
};
</code></pre>
<p>For more information you can check out Ember's
<a href="https://guides.emberjs.com/v2.2.0/configuring-ember/feature-flags/">feature flags guide</a>.</p>
<h4 id="dsfinderinclude"><code>ds-finder-include</code></h4>
<p>The <code>ds-finder-include</code> feature allows an <code>include</code> query parameter to
be specified with using <code>store.findRecord()</code> and <code>store.findAll()</code> as
described in <a href="https://github.com/emberjs/rfcs/pull/99">RFC 99</a>. This
should make it easier to specify when backends should return
sideloaded relationships. Thanks to
<a href="https://github.com/HeroicEric">@HeroicEric</a> for implementing this
feature.</p>
<pre><code class="javascript language-javascript">// GET /articles/1?include=comments

var article = this.store.findRecord('article', 1, { include: 'comments' });
</code></pre>
<pre><code class="javascript language-javascript">// GET /articles?include=comments

var article = this.store.findAll('article', { include: 'comments' });
</code></pre>
<h4 id="dsreferences"><code>ds-references</code></h4>
<p>The <code>ds-references</code> feature implements the references API as described
in <a href="https://github.com/emberjs/rfcs/pull/57">RFC 57</a>. References is a
low level API to perform meta-operations on records, has-many
relationships and belongs-to relationships:</p>
<ul>
<li>get the current local data synchronously without triggering a fetch or producing a promise</li>
<li>notify the store that a fetch for a given record has begun, and provide a promise for its result</li>
<li>similarly, notify a record that a fetch for a given relationship has begun, and provide a promise for its result</li>
<li>retrieve server-provided metadata about a record or relationship</li>
</ul>
<p>Consider the following <code>post</code> model:</p>
<pre><code class="javascript language-javascript">// app/models/post.js
import Model from 'ember-data/model';
import { belongsTo, hasMany } from 'ember-data/relationships';

export default Model.extend({
  comments: hasMany(),
  author: belongsTo()
});
</code></pre>
<p>The references API now allows the possibility to interact with the relationships:</p>
<pre><code class="javascript language-javascript">var post = store.peekRecord('post', 1);

// check if the author is already loaded, without triggering a request
if (post.belongsTo('author').value() !== null) {
  console.log(post.get("author.name"));
} else {
  // get the id of the author without triggering a request
  var authorId = post.belongsTo("author").id();

  // load the author
  post.belongsTo('author').load();
  console.log(`Loading author with id ${authorId}`);
}

// reload the author
post.belongsTo('author').reload();

// get all ids without triggering a request
var commentIds = post.hasMany('comments').ids();

// check if there are comments, without triggering a request
if (post.hasMany('comments').value() !== null) {
  var meta = post.hasMany('comments').meta();
  console.log(`${commentIds.length} comments out of ${meta.total}`);
} else {
  post.hasMany('comments').load();
}

// reload comments
post.hasMany('comments').reload();
</code></pre>
<p>Thanks to <a href="https://github.com/pangratz">@pangratz</a> for implementing
this feature.</p>]]></description><link>https://blog.emberjs.com/ember-data-2-3-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-2-3-released</guid><pubDate>Tue, 12 Jan 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data 2.4 and 2.5 Beta Released]]></title><description><![CDATA[<p>Ember Data 2.4, a minor version release of Ember Data, is released today. This release represents the work of over 20 direct contributors, and over 76 commits.</p>
<p>Ember Data 2.5 beta.1, the branch of Ember Data that will be released as stable in roughly six weeks, is also being released today.</p>
<h3 id="changesinemberdata24">Changes in Ember Data 2.4</h3>
<h4 id="friendlyerrors">Friendly Errors</h4>
<p><a href="https://github.com/nikz">@nikz</a> has implemented
<a href="https://github.com/emberjs/rfcs/pull/101">RFC 101</a> which provides
more context for <code>RESTAdapter</code> and <code>JSONAPIAdapter</code> errors in Ember
Data. Be sure to check out the
<a href="https://github.com/emberjs/data/pull/3930">pull request</a> for more
details.</p>
<h4 id="importingmodules">Importing Modules</h4>
<p><a href="https://github.com/pangratz">@pangratz</a> <a href="https://github.com/emberjs/data/pull/4125">added public paths</a> to help you import the <code>DS.EmbeddedRecordsMixin</code> and <code>DS.Serializer</code> modules.</p>
<pre><code class="javascript language-javascript">// DS.EmbeddedRecordsMixin
import EmbeddedRecordsMixin from 'ember-data/serializers/embedded-records-mixin';

// DS.Serializer
import Serializer from 'ember-data/serializer';
</code></pre>
<h4 id="fastbootsupport">Fastboot Support</h4>
<p><a href="https://github.com/danmcclain">@danmcclain</a> added <a href="https://github.com/emberjs/data/pull/4111">two</a>
<a href="https://github.com/emberjs/data/pull/4113">commits</a> to enable support
for Ember Data with the
<a href="https://github.com/tildeio/ember-cli-fastboot">Ember CLI Fastboot addon</a>.</p>
<p>For more details on changes in 2.4, review the
<a href="https://github.com/emberjs/data/blob/v2.4.0/CHANGELOG.md">Ember Data 2.4.0 CHANGELOG</a>.</p>
<h3 id="upcomingfeaturesinemberdata25beta1">Upcoming Features in Ember Data 2.5.beta-1</h3>
<h4 id="dsfinderinclude"><code>ds-finder-include</code></h4>
<p>The <code>ds-finder-include</code> feature allows an <code>include</code> query parameter to
be specified with using <code>store.findRecord()</code> and <code>store.findAll()</code> as
described in <a href="https://github.com/emberjs/rfcs/pull/99">RFC 99</a>. The
<code>include</code> parameter tells JSON-API servers which relationships to
sideload in a response. Thanks to
<a href="https://github.com/HeroicEric">@HeroicEric</a> for implementing this
feature.</p>
<pre><code class="javascript language-javascript">// GET /articles/1?include=comments

var article = this.store.findRecord('article', 1, { include: 'comments' });
</code></pre>
<pre><code class="javascript language-javascript">// GET /articles?include=comments

var article = this.store.findAll('article', { include: 'comments' });
</code></pre>
<h4 id="dsreferences"><code>ds-references</code></h4>
<p>The <code>ds-references</code> feature implements the references API as described
in <a href="https://github.com/emberjs/rfcs/pull/57">RFC 57</a>. References is a
low level API to perform meta-operations on records, has-many
relationships and belongs-to relationships:</p>
<ul>
<li>get the current local data synchronously without triggering a fetch or producing a promise</li>
<li>notify the store that a fetch for a given record has begun, and provide a promise for its result</li>
<li>similarly, notify a record that a fetch for a given relationship has begun, and provide a promise for its result</li>
<li>retrieve server-provided metadata about a record or relationship</li>
</ul>
<p>Consider the following <code>post</code> model:</p>
<pre><code class="javascript language-javascript">// app/models/post.js
import Model from 'ember-data/model';
import { belongsTo, hasMany } from 'ember-data/relationships';

export default Model.extend({
  comments: hasMany(),
  author: belongsTo()
});
</code></pre>
<p>The references API now allows the possibility to interact with the relationships:</p>
<pre><code class="javascript language-javascript">var post = store.peekRecord('post', 1);

// check if the author is already loaded, without triggering a request
if (post.belongsTo('author').value() !== null) {
  console.log(post.get("author.name"));
} else {
  // get the id of the author without triggering a request
  var authorId = post.belongsTo("author").id();

  // load the author
  post.belongsTo('author').load();
  console.log(`Loading author with id ${authorId}`);
}

// reload the author
post.belongsTo('author').reload();

// get all ids without triggering a request
var commentIds = post.hasMany('comments').ids();

// check if there are comments, without triggering a request
if (post.hasMany('comments').value() !== null) {
  var meta = post.hasMany('comments').meta();
  console.log(`${commentIds.length} comments out of ${meta.total}`);
} else {
  post.hasMany('comments').load();
}

// reload comments
post.hasMany('comments').reload();
</code></pre>
<p>Thanks to <a href="https://github.com/pangratz">@pangratz</a> for implementing
this feature.</p>
<h4 id="dstransformpassoptions"><code>ds-transform-pass-options</code></h4>
<p>The <code>ds-transform-pass-options</code> feature allows for smarter transforms
by passing the options object from <code>DS.attr([type], [options])</code> into
the transform.</p>
<h5 id="example">Example</h5>
<pre><code class="javascript language-javascript">// app/models/post.js
export default DS.Model.extend({
  title: DS.attr('string'),
  markdown: DS.attr('markdown', {
    markdown: {
      gfm: false,
      sanitize: true
    }
  })
});
</code></pre>
<pre><code class="javascript language-javascript">// app/transforms/markdown.js
export default DS.Transform.extend({
  serialize: function (deserialized, attributeMeta) {
    return deserialized.raw;
  },

  deserialize: function (serialized, attributeMeta) {
    var options = attributeMeta.options.markdown || {};

    return marked(serialized, options);
  }
});
</code></pre>
<p>Thanks to <a href="https://github.com/pangratz">@pangratz</a> for implementing
this feature and <a href="https://github.com/knownasilya">@knownasilya</a> for
proposing the <a href="https://github.com/emberjs/rfcs/pull/1">RFC</a>.</p>
<p>For more details on changes in the 2.5 beta, please review the
<a href="https://github.com/emberjs/data/blob/v2.5.0-beta.1/CHANGELOG.md">Ember Data 2.5.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-data-2-4-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-2-4-released</guid><pubDate>Sun, 13 Mar 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data 2.5 and 2.6 Beta Released]]></title><description><![CDATA[<p>Ember Data 2.5, a minor version release of Ember Data, is released. This release represents the work of over 31 direct contributors, and over 137 commits.</p>
<p>Ember Data 2.6 beta.1, the branch of Ember Data that will be released as stable in roughly six weeks, is also being released.</p>
<h3 id="changesinemberdata25">Changes in Ember Data 2.5</h3>
<h4 id="dsfinderinclude"><code>ds-finder-include</code></h4>
<p>The <code>ds-finder-include</code> feature allows an <code>include</code> query parameter to
be specified using <code>store.findRecord()</code> and <code>store.findAll()</code> as
described in <a href="https://github.com/emberjs/rfcs/pull/99">RFC 99</a>. The
<code>include</code> parameter tells JSON-API servers which relationships to
sideload in a response, but it can also be used by custom adapters to
signal which relationships the backend can sideload to improve
performance.</p>
<p>Thanks to <a href="https://github.com/HeroicEric">@HeroicEric</a> for
implementing this feature.</p>
<pre><code class="javascript language-javascript">// GET /articles/1?include=comments

var article = this.store.findRecord('article', 1, { include: 'comments' });
</code></pre>
<pre><code class="javascript language-javascript">// GET /articles?include=comments

var article = this.store.findAll('article', { include: 'comments' });
</code></pre>
<h4 id="dsreferences"><code>ds-references</code></h4>
<p>The <code>ds-references</code> feature implements the references API as described
in <a href="https://github.com/emberjs/rfcs/pull/57">RFC 57</a>. References is a
low level API to perform meta-operations on records, has-many
relationships and belongs-to relationships:</p>
<ul>
<li>get the current local data synchronously without triggering a fetch or producing a promise</li>
<li>notify the store that a fetch for a given record has begun, and provide a promise for its result</li>
<li>similarly, notify a record that a fetch for a given relationship has begun, and provide a promise for its result</li>
<li>retrieve server-provided metadata about a record or relationship</li>
</ul>
<p>Consider the following <code>post</code> model:</p>
<pre><code class="javascript language-javascript">// app/models/post.js
import Model from 'ember-data/model';
import { belongsTo, hasMany } from 'ember-data/relationships';

export default Model.extend({
  comments: hasMany(),
  author: belongsTo()
});
</code></pre>
<p>The references API now allows the possibility to interact with the relationships:</p>
<pre><code class="javascript language-javascript">var post = store.peekRecord('post', 1);

// check if the author is already loaded, without triggering a request
if (post.belongsTo('author').value() !== null) {
  console.log(post.get("author.name"));
} else {
  // get the id of the author without triggering a request
  var authorId = post.belongsTo("author").id();

  // load the author
  post.belongsTo('author').load();
  console.log(`Loading author with id ${authorId}`);
}

// reload the author
post.belongsTo('author').reload();

// get all ids without triggering a request
var commentIds = post.hasMany('comments').ids();

// check if there are comments, without triggering a request
if (post.hasMany('comments').value() !== null) {
  var meta = post.hasMany('comments').meta();
  console.log(`${commentIds.length} comments out of ${meta.total}`);
} else {
  post.hasMany('comments').load();
}

// reload comments
post.hasMany('comments').reload();
</code></pre>
<p>Thanks to <a href="https://github.com/pangratz">@pangratz</a> for implementing
this feature.</p>
<h4 id="dstransformpassoptions"><code>ds-transform-pass-options</code></h4>
<p>The <code>ds-transform-pass-options</code> feature allows for smarter transforms
by passing the options object from <code>DS.attr([type], [options])</code> into
the transform.</p>
<h5 id="example">Example</h5>
<pre><code class="javascript language-javascript">// app/models/post.js
export default DS.Model.extend({
  title: DS.attr('string'),
  markdown: DS.attr('markdown', {
    markdown: {
      gfm: false,
      sanitize: true
    }
  })
});
</code></pre>
<pre><code class="javascript language-javascript">// app/transforms/markdown.js
export default DS.Transform.extend({
  serialize: function (deserialized, attributeMeta) {
    return deserialized.raw;
  },

  deserialize: function (serialized, attributeMeta) {
    var options = attributeMeta.options.markdown || {};

    return marked(serialized, options);
  }
});
</code></pre>
<p>Thanks to <a href="https://github.com/pangratz">@pangratz</a> for implementing
this feature and <a href="https://github.com/knownasilya">@knownasilya</a> for
proposing the <a href="https://github.com/emberjs/rfcs/pull/1">RFC</a>.</p>
<h3 id="upcomingfeaturesinemberdata26beta1">Upcoming Features in Ember Data 2.6.beta-1</h3>
<ul>
<li><code>ds-serialize-ids-and-types</code></li>
</ul>
<p>Enables a new <code>ids-and-type</code> strategy (in addition to the already existing <code>ids</code> and <code>records</code>) for
serializing has many relationships using the <code>DS.EmbeddedRecordsMixin</code> that  will include both
<code>id</code> and <code>type</code> of each model as an object.</p>
<p>For instance, if a user has many pets, which is a polymorphic relationship, the generated payload would be:</p>
<pre><code class="javascript language-javascript">{
  "user": {
    "id": "1"
    "name": "Bertin Osborne",
    "pets": [
      { "id": "1", "type": "Cat" },
      { "id": "2", "type": "Parrot"}
    ]
  }
}
</code></pre>
<p>This is particularly useful for polymorphic relationships not backed by <a href="https://en.wikipedia.org/wiki/Single_Table_Inheritance">STI</a> when including the id of the records is not enough.</p>
<p>For more details on changes in the 2.6 beta, please review the
<a href="https://github.com/emberjs/data/blob/v2.6.0-beta.1/CHANGELOG.md">Ember Data 2.6.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-data-2-5-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-2-5-released</guid><pubDate>Tue, 03 May 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data 2.6 and 2.7 Beta Released]]></title><description><![CDATA[<p>Ember Data 2.6, a minor version release of Ember Data, is
released. This release represents the work of over 22 direct
contributors, and over 85 commits.</p>
<p>Ember Data 2.7 beta.1, the branch of Ember Data that will be released
as stable in roughly six weeks, is also being released.</p>
<h3 id="changesinemberdata26">Changes in Ember Data 2.6</h3>
<ul>
<li><code>ds-serialize-ids-and-types</code></li>
</ul>
<p>Enables a new <code>ids-and-type</code> strategy (in addition to the already existing <code>ids</code> and <code>records</code>) for
serializing has many relationships using the <code>DS.EmbeddedRecordsMixin</code> that  will include both
<code>id</code> and <code>type</code> of each model as an object.</p>
<p>For instance, if a user has many pets, which is a polymorphic relationship, the generated payload would be:</p>
<pre><code class="javascript language-javascript">{
  "user": {
    "id": "1"
    "name": "Bertin Osborne",
    "pets": [
      { "id": "1", "type": "Cat" },
      { "id": "2", "type": "Parrot"}
    ]
  }
}
</code></pre>
<!--alex ignore just-->
<p>This is particularly useful for polymorphic relationships not backed
  by <a href="https://en.wikipedia.org/wiki/Single_Table_Inheritance">STI</a>
  when just including the id of the records is not enough.</p>
<p>Thanks to <a href="https://github.com/cibernox">@cibernox</a> for
implementing this feature.</p>
<h3 id="upcomingfeaturesinemberdata27beta1">Upcoming Features in Ember Data 2.7.beta-1</h3>
<h4 id="dsbooleantransformallownull4022httpsgithubcomemberjsdatapull4022"><code>ds-boolean-transform-allow-null</code> <a href="https://github.com/emberjs/data/pull/4022">#4022</a></h4>
<p>Allow <code>null</code>/<code>undefined</code> values for boolean attributes via <code>attr('boolean', { allowNull: true })</code></p>
<pre><code class="javascript language-javascript">// app/models/user.js
import Model from 'ember-data/model';
import attr from 'ember-data/attr';

export default Model.extend({
  email: attr('string'),
  username: attr('string'),
  wantsWeeklyEmail: attr('boolean', { allowNull: true })
});
</code></pre>
<h4 id="dsimprovedajax3099httpsgithubcomemberjsdatapull3099"><code>ds-improved-ajax</code> <a href="https://github.com/emberjs/data/pull/3099">#3099</a></h4>
<p>Though <code>ajax()</code> (and <code>ajaxOptions()</code>) of <code>DS.RESTAdapter</code> are marked as
private, they have been overwritten in many applications, since there is
currently no other way to customize the request.</p>
<p>This feature adds new public methods to <code>DS.RESTAdapter</code>, which allow to
customize the properties of a request:</p>
<ul>
<li><code>methodForRequest</code> to get the HTTP verb</li>
<li><code>urlForRequest</code> to get the URL</li>
<li><code>headersForRequest</code> to get the headers</li>
<li><code>dataForRequest</code> to get the data (query params or request body)</li>
</ul>
<p>The <code>params</code> hash passed to those methods has all the properties with
which the corresponding <code>find</code>, <code>createRecord</code>, <code>findQuery</code>, …  calls
have been invoked: <code>store</code>, <code>type</code>, <code>snapshot</code>(s), <code>id</code>(s) and <code>query</code>. The
<code>requestType</code> property indicates which method is requested; the possible
values are:</p>
<ul>
<li><code>createRecord</code></li>
<li><code>updateRecord</code></li>
<li><code>deleteRecord</code></li>
<li><code>query</code></li>
<li><code>queryRecord</code></li>
<li><code>findRecord</code></li>
<li><code>findAll</code></li>
<li><code>findMany</code></li>
<li><code>findHasMany</code></li>
<li><code>findBelongsTo</code></li>
</ul>
<p>Performing the actual AJAX request is handled by the <code>makeRequest</code>
method, which is similar to the existing <code>ajax</code> method: it makes the
request using <code>jQuery.ajax</code> and attaches success and failure handlers.</p>
<hr />
<p>Say your API handles creation of resources via PUT, this can now be
customized as follows:</p>
<pre><code class="javascript language-javascript">// adapters/application.js
import DS from 'ember-data';

export default DS.RESTAdapter.extend({
  methodForRequest(params) {
    if (params.requestType === 'createRecord') {
      return "PUT";
    }

    return this._super(...arguments);
  }
});
</code></pre>
<p>Thanks to <a href="https://github.com/pangratz">@pangratz</a> for
implementing this feature.</p>
<h4 id="dslinksinrecordarray4263httpsgithubcomemberjsdatapull4263"><code>ds-links-in-record-array</code> <a href="https://github.com/emberjs/data/pull/4263">#4263</a></h4>
<p>This feature exposes a <code>links</code> object on a <code>RecordArray</code>. This can be used to load additional links when  present in the response JSON-API document.</p>
<pre><code class="javascript language-javascript">store.query('post', { isRecent: true }).then((posts) =&gt; {
  posts.get('links.next');
});
</code></pre>
<p>Thanks to <a href="https://github.com/danmcclain">@danmcclain</a> for
implementing this feature.</p>
<p>For more details on changes in the 2.7 beta, please review the
<a href="https://github.com/emberjs/data/blob/v2.7.0-beta.1/CHANGELOG.md">Ember Data 2.7.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-data-2-6-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-2-6-released</guid><pubDate>Thu, 09 Jun 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data 2.7 and 2.8 Beta Released]]></title><description><![CDATA[<p>Ember Data 2.7, a minor version release of Ember Data, is
released. This release represents the work of over 27 direct
contributors, and over 103 commits.</p>
<p>Ember Data 2.8 beta.1, the branch of Ember Data that will be released
as stable in roughly six weeks, is also being released.</p>
<h3 id="blueprintchanges">Blueprint Changes</h3>
<p>In Ember Data 2.5 there was a change made to the blueprints to use
module paths when importing instead of importing the default DS
namespace. At the time this was thought to be a minor change and did
not receive much scrutiny. However, in time the Ember Data team has
discovered that the changes to the import statements in the blueprints
have made it more confusing for both new and experienced Ember
developers.</p>
<p>In Ember Data 2.5 and Ember Data 2.6 the following generator command for building a model:</p>
<p><code>ember generate model post content isDraft:boolean comments:has-many user:belongs-to</code></p>
<p>It would generate the following blueprint:</p>
<pre><code class="javascript language-javascript">// app/models/post.js
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { belongsTo, hasMany } from 'ember-data/relationships';

export default Model.extend({
  content: attr(),
  isDraft: attr('boolean'),
  comments: hasMany('comment'),
  user: belongsTo('user')
});
</code></pre>
<p>Ember Data 2.7 the same command will now generate the following blueprint:</p>
<pre><code class="javascript language-javascript">// app/models/post.js
import DS from 'ember-data';

export default DS.Model.extend({
  content: DS.attr(),
  isDraft: DS.attr('boolean'),
  comments: DS.hasMany('comment'),
  user: DS.belongsTo('user')
});
</code></pre>
<p>The main difference is the blueprints no longer use the paths to
import specific modules. We have found that encouraging users to omit
the paths results in better defaults for both new and experienced
Ember developers. The simpler <code>import DS from 'ember-data';</code> statement
has less room for typos and other errors and is easier to developers
to remember so they do not need reference documentation whenever they
want to add a new import.</p>
<p>This change <em>only</em> impacts the blueprints that are generated when
using the
<a href="https://ember-cli.com/user-guide/#using-ember-cli">ember-cli generate</a>
command. Code that is written to use the path imports will still
continue to work and be supported until at least Ember Data 3.0.</p>
<p>The Ember Data team will also be releasing patch releases to Ember
Data 2.5 and 2.6 to update their blueprint generators to match Ember
Data 2.7.</p>
<h3 id="changesinemberdata27">Changes in Ember Data 2.7</h3>
<h4 id="dsbooleantransformallownull4022httpsgithubcomemberjsdatapull4022"><code>ds-boolean-transform-allow-null</code> <a href="https://github.com/emberjs/data/pull/4022">#4022</a></h4>
<p>Allow <code>null</code>/<code>undefined</code> values for boolean attributes via <code>attr('boolean', { allowNull: true })</code></p>
<pre><code class="javascript language-javascript">// app/models/user.js
import DS from 'ember-data';

export default DS.Model.extend({
  email: DS.attr('string'),
  username: DS.attr('string'),
  wantsWeeklyEmail: DS.attr('boolean', { allowNull: true })
});
</code></pre>
<h4 id="dslinksinrecordarray4263httpsgithubcomemberjsdatapull4263"><code>ds-links-in-record-array</code> <a href="https://github.com/emberjs/data/pull/4263">#4263</a></h4>
<p>This feature exposes a <code>links</code> object on a <code>RecordArray</code>. This can be used to load additional links when  present in the response JSON-API document.</p>
<pre><code class="javascript language-javascript">store.query('post', { isRecent: true }).then((posts) =&gt; {
  posts.get('links.next');
});
</code></pre>
<p>Thanks to <a href="https://github.com/danmcclain">@danmcclain</a> for
implementing this feature.</p>
<h3 id="upcomingfeaturesinemberdata28beta1">Upcoming Features in Ember Data 2.8.beta-1</h3>
<h4 id="dsimprovedajax3099httpsgithubcomemberjsdatapull3099"><code>ds-improved-ajax</code> <a href="https://github.com/emberjs/data/pull/3099">#3099</a></h4>
<p>The <code>ds-improved-ajax</code> feature was originally planned to be released
in Ember Data 2.7. However, feedback from the beta found that many
people are overriding <code>ajax()</code> to change the protocol of the adapter
and the new methods added in made <code>ds-improved-ajax</code> made this usecase
harder to achieve. The Ember Data team has decided to delay the
<code>ds-improved-ajax</code> feature flag until the Ember Data 2.8 release while
improving the API for this usecase.</p>
<p>The <code>ds-improved-ajax</code> feature adds new public methods to
<code>DS.RESTAdapter</code>, which allow to customize the properties of a
request:</p>
<ul>
<li><code>methodForRequest</code> to get the HTTP verb</li>
<li><code>urlForRequest</code> to get the URL</li>
<li><code>headersForRequest</code> to get the headers</li>
<li><code>dataForRequest</code> to get the data (query params or request body)</li>
</ul>
<p>The <code>params</code> hash passed to those methods has all the properties with
which the corresponding <code>find</code>, <code>createRecord</code>, <code>findQuery</code>, …  calls
have been invoked: <code>store</code>, <code>type</code>, <code>snapshot</code>(s), <code>id</code>(s) and <code>query</code>. The
<code>requestType</code> property indicates which method is requested; the possible
values are:</p>
<ul>
<li><code>createRecord</code></li>
<li><code>updateRecord</code></li>
<li><code>deleteRecord</code></li>
<li><code>query</code></li>
<li><code>queryRecord</code></li>
<li><code>findRecord</code></li>
<li><code>findAll</code></li>
<li><code>findMany</code></li>
<li><code>findHasMany</code></li>
<li><code>findBelongsTo</code></li>
</ul>
<p>Performing the actual AJAX request is handled by the <code>makeRequest</code>
method, which is similar to the existing <code>ajax</code> method: it makes the
request using <code>jQuery.ajax</code> and attaches success and failure handlers.</p>
<hr />
<p>Say your API handles creation of resources via PUT, this can now be
customized as follows:</p>
<pre><code class="javascript language-javascript">// adapters/application.js
import DS from 'ember-data';

export default DS.RESTAdapter.extend({
  methodForRequest(params) {
    if (params.requestType === 'createRecord') {
      return "PUT";
    }

    return this._super(...arguments);
  }
});
</code></pre>
<p>Thanks to <a href="https://github.com/pangratz">@pangratz</a> for
implementing this feature.</p>
<p>For more details on changes in the 2.8 beta, please review the
<a href="https://github.com/emberjs/data/blob/v2.8.0-beta.1/CHANGELOG.md">Ember Data 2.8.0-beta.1 CHANGELOG</a>.</p>]]></description><link>https://blog.emberjs.com/ember-data-2-7-released</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-2-7-released</guid><pubDate>Mon, 25 Jul 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[EmberData 4.12 Special LTS Update]]></title><description><![CDATA[<!-- alex ignore special-->
<h2 id="emberdata412specialltsupdate">EmberData 4.12 Special LTS Update</h2>
<!-- alex ignore just-->
<p>In our <a href="https://blog.emberjs.com/ember-data-5-x-update-2023-04-15">5.0 Announcement</a> we promised extended support for 4.12 LTS <strong>beyond</strong> <em>just bug fixes</em>.</p>
<!-- alex ignore simple-->
<blockquote>
  <p>This support extends beyond simple bug-fixes. If minor enhancements can be made to better support new presentation class implementations that support the 4.x series we will willingly accept them. Our goal is simple: we want no one left behind.</p>
</blockquote>
<p>To this end, here are the changes we currently plan to make for 4.12 to ensure our users can both upgrade to 4.12 from 4.6 and 4.11 more seamlessly <em>and</em> to provide additional tools for users on 4.12 to begin shifting to the RequestManager paradigm as early as possible for their app.</p>
<h2 id="buildersandbuildutils">Builders and Build utils</h2>
<ol>
<li><p>The first LTS release of <code>@ember-data/rest</code> and <code>@ember-data/active-record</code> will have their peer-dependency supported versions set to include <code>~4.12.3</code> of <code>@ember-data/store</code>.</p>
<ul>
<li>Once apps have updated from 4.12 to the 5.x LTS they should use the associated release's version to ensure maximum inter-compatibility.</li></ul></li>
<li><p><code>@ember-data/request-utils</code> has no dependencies or peer-dependencies on other EmberData packages, and thus can be used with any version immediately. However, when using it with <code>4.12</code> we suggest pinning to a 5.x LTS version once it is available.</p>
<ul>
<li>Once apps have updated from 4.12 to the 5.x LTS they should use the associated release's version to ensure maximum inter-compatibility.</li></ul></li>
<li><p><code>@ember-data/json-api/request</code> will be backported</p>
<ul>
<li><p>we are unsure we will be able to backport support for <code>serializePatch</code> or the new cache relationships diffing APIs. More likely than not these will not be backported. If any portion of them is, they are likely to operate somewhat differently due to a different underlying graph implementation.</p></li>
<li><p>we may investigate whether <code>@ember-data/json-api</code> and <code>@ember-data/graph</code> could have their peer-dependencies loosened to allow 4.x store as an alternative path to support diffing. Many apps may find this a feasible approach as the deprecations that affect them in 4.x were relatively minor. Similarly 4.12 packages would have theirs loosened to allow their 5.x counterparts.</p></li></ul></li>
</ol>
<h2 id="requestmanager">RequestManager</h2>
<p>Improvements to the CacheHandler made in 5.x leading up to the first 5.x LTS will be backported. We anticipate this part being relatively straightforward.</p>
<p>4.12 LTS will have its peer-deps loosened to allow <code>@ember-data/request</code> 5.x.</p>
<h2 id="removalofemberrunlooptosupportupgradingfrom4xto412">Removal of ember runloop to support upgrading from 4.x to 4.12</h2>
<p>We've seen that the small amount of runloop usage remaining in EmberData can cause unintended timing issues with interleaved renders when attempting to upgrade to 4.12. We're going to attempt to backport the work that fully removed this from EmberData. That work was primarily changes to the test suite.</p>
<h2 id="additionalsuggestionsfor412applications">Additional Suggestions for 4.12 Applications</h2>
<p>We suggest 4.12 applications experiment with removing the behavior of RSVP Promises flushing in Ember's runloop. This may cause subtle timing issues in tests that make some tests appear to newly leak (in reality if this happens those tests already leaked but the leak was resolved before the afterEach began destroying the test container), but should be safe for application code in production.</p>
<p>To experiment with this fix, add the following to your <code>app.js</code></p>
<pre><code class="ts language-ts">import RSVP from 'rsvp';

// fix RSVP
RSVP.configure('async', (callback, arg) =&gt; queueMicrotask(() =&gt; callback(arg)));
</code></pre>
<p>This change will make RSVP promises behave almost identically to real promises. The reason
this could help is because we have noticed that many of the most difficult aspects of upgrading to 4.12 and beyond were due to accidental interleaved renders. RSVP Promises without this fix are one source of such renders.</p>
<h2 id="schemarecordupdate">SchemaRecord Update</h2>
<p>We are in the early phases of building the replacement for <code>@ember-data/model</code>. As we've said before, we believe this replacement will provide an improved migration path from 4.12 to 5.x for many applications. We also believe it will replace the need for ModelFragments entirely for those users.</p>
<p>A few of the things we're currently working on to support this migration path:</p>
<ul>
<li><a href="https://github.com/emberjs/data/issues/8884">Native Class Codemod for models</a></li>
<li><a href="https://github.com/emberjs/data/issues/8893">Strict Relationships Codemod</a></li>
<li><a href="https://github.com/emberjs/data/issues/8887">Replacement decorators for attr|belongsTo|hasMany</a></li>
</ul>
<p>You can use the <a href="https://github.com/emberjs/data/issues?q=is%3Aissue+is%3Aopen+label%3Av4-to-v5">v4-to-v5 label</a> to see a full list of the things we're currently tracking to help with the v4 to v5 migration.</p>
<h2 id="apartingrequest">A Parting Request</h2>
<p>If your app is currently stuck on a 4.x version of EmberData for reasons beyond needing to resolve deprecations or usage of ModelFragments (we're coming for you still), we'd like to hear from you!</p>
<p>For those users we see still downloading 3.x versions, we'd like to hear more about where you got stuck as well. Was it a particular deprecation in EmberData? In ember-source? Please open a ticket with <a href="https://github.com/emberjs/data">EmberData</a> or start a discussion in the #ember-data channel on <a href="https://discord.gg/emberjs">Discord</a> to discuss.</p>]]></description><link>https://blog.emberjs.com/ember-data-4-12-special-release-update-2023-09-22</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-4-12-special-release-update-2023-09-22</guid><pubDate>Mon, 25 Sep 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[EmberData 5.X Update]]></title><description><![CDATA[<p>This week, in coordination with the broader Ember project, EmberData released 4.12, its final
4.x version, and began iterating towards the first release of the 5.x series.</p>
<h2 id="awrapon4x">A wrap on 4.x</h2>
<p>This final release of the 4.x cycle introduced several new concepts to support a new paradigm for managing <a href="https://github.com/emberjs/data/tree/v4.12.0/packages/request#readme">Requests</a> and new capabilities for <a href="https://api.emberjs.com/ember-data/release/classes/%3CInterface%3E%20Cache">Caching Data</a>.</p>
<p>The primary focus of these changes was to support caching <strong>Documents</strong> and to ensure that <strong>Resources</strong> are handled opaquely. Loosely defined: A Document encompasses the full response returned by an API request, and can typically be identified uniquely by url. Documents may contain many resources or references to resources, where a resource is defined as some data which your application or the API treats as uniquely identifiable.</p>
<blockquote>
  <p><em>Note:</em> Historically, Model has mapped to a resource "type" and serves to present the data for a resource. It may be useful to think about resources as the backing data for a Model; however, resources can be far more generic than this and could even be anything. This includes raw strings, html, xml, buffers, images, blobs, and streams!</p>
</blockquote>
<p>Collectively, these changes allow applications the capability of building highly advanced request and cache capabilities within familiar EmberData paradigms. We suggest reading the respective RFCs for <a href="https://github.com/emberjs/rfcs/pull/860">RequestManager</a> and <a href="https://github.com/emberjs/rfcs/pull/854">Cache</a> to gain a fuller appreciation of the motivations and capabilities they bring.</p>
<p>While these new primitives may not at first feel like a substantial shift, over the course of 5.x as the new request story is polished we expect for the recommended experience when using EmberData to significantly evolve, with that evolution driven by these changes.</p>
<p>The Polaris experience for EmberData will be focused around this new request experience, working with documents (and pagination) by default, and the new presentation class described below.</p>
<h2 id="lookingaheadto5x">Looking ahead to 5.x</h2>
<p>Throughout the 5.x cycle we expect to introduce two important new defaults while deprecating an old stalwart.</p>
<p>For nearly 17 years, <a href="https://github.com/sproutcore/sproutcore/commit/f6248b1650a688a401cc6eea135fbe983e20cd12#diff-011979c89114a908391f35c2053dc2ba84da4d331cc97730039b2b2da623ffee">Model</a> has been a foundational primitive around which EmberData was understood. Since those earliest days, the language and ecosystem have evolved, the kinds of applications we build has evolved, and the patterns by which we access and mutate data have evolved. While Model has undergone small amounts of evolution in syntax, its underlying patterns have remained unevolved.</p>
<p>In more recent years, various 3rd party attempts have been made to address some of the shortcomings of the Model paradigm. <a href="https://github.com/hjdivad/ember-m3">ember-m3</a> explored what it might mean to have schema-driven models. <a href="https://github.com/adopted-ember-addons/ember-data-model-fragments">ember-data-model-fragments</a> offered a deep-tracking workaround. <a href="https://github.com/embermap/ember-data-storefront">ember-data-storefront</a> offered alternative data access patterns to simplify the mental model of asynchronous edges in relational data. <a href="https://github.com/danielspaniel/ember-data-change-tracker">ember-data-changetracker</a>, <a href="https://github.com/poteto/ember-changeset">ember-changeset</a>, and <a href="https://github.com/yapplabs/ember-buffered-proxy">ember-buffered-proxy</a> offered mechanisms for streamlined mutation flows and more easily discardable changes.</p>
<p>We appreciate each of these addons for tackling challenging aspects of working with EmberData and addressing the genuine needs of our consumers, and we are thankful to all the maintainers over the years that helped these projects along.</p>
<p>In the absence the public APIs that EmberData now offers, many of these libraries built features on an unstable foundation and relied on private and intimate API contracts that were constantly changing. Consequently, applications using these addons have encountered significant difficulties when attempting to upgrade their version of EmberData.</p>
<p>So throughout the 3.x and 4.x cycles, we began evolving a new set of public APIs on top which we could support these ideas without compromise. RequestManager and Cache are the result of these efforts.</p>
<p>While this means these libraries can now rewrite to utilize public APIs and achieve improved stability, we also intend to bring most of the ideas explored by each of these libraries into the core recommended experience of EmberData itself.</p>
<p><strong>What does this mean?</strong></p>
<p>Today, Model serves two competing purposes: its static properties are used to declare schema information for attributes and relationships, while at runtime it is also the class we instantiate to present the data for a single resource out of the cache.</p>
<p>Importantly, both of these behaviors (schema and presentation) are just a <em>configuration</em> of public APIs (respectively, via <a href="https://api.emberjs.com/ember-data/4.12/classes/Store/methods/registerSchema?anchor=registerSchema&show=inherited">registerSchema</a> and the hook <a href="https://api.emberjs.com/ember-data/4.12/classes/Store/methods/instantiateRecord%20(hook)?anchor=instantiateRecord%20(hook">instantiateRecord</a>) done for the <code>@ember-data/model</code> package. Schema no longer <em>needs</em> to be sourced from a Model, and record instances no longer <em>need</em> to be instances of Model. While this has been true for some time, when paired with the new request and cache APIs the potential now exists for far more declarative schema sources and far more powerful presentation classes.</p>
<p>Over the course of 5.x, we expect to introduce new defaults for declaring schemas, and new experiences for working with cached data: especially around presenting asynchronous data, paginated data, and handling mutation flows.</p>
<p>From a features perspective:</p>
<ul>
<li>an optional JS-like/Model-familiar schema syntax for build-time-compilation of schemas<ul>
<li>by default these schemas would be imported as JSON by your application, though just-in-time fetching of schemas is also possible</li></ul></li>
<li>immutable record state</li>
<li>deep tracking of dirty state on mutable copies of records</li>
<li>paginated relationships by default</li>
<li>always-sync access to current relationship state, with easy access request APIs that can be invoked from JS or templates. (This will be similar to the <a href="https://github.com/emberjs/data/blob/v4.12.0/packages/store/src/-private/document.ts">Document Presentation Class</a> introduced in 4.12.</li>
</ul>
<h2 id="liftingalltides">Lifting all Tides</h2>
<p>A significant motivation for shipping Request and Cache in the 4.x series, even if it took till the end (as it did) is that we believe the easiest migration path for most applications looking to resolve deprecations around promise-proxies, async relationships, computed chains, and array-like APIs will be to incrementally migrate from Model to its replacement.</p>
<p>By shipping the request and cache APIs in 4.12, we've ensured that powerful replacements can be built that are compatible with 4.x enabling this migration path to be created. While we expect many applications might choose to implement their own presentation class – as often a custom class is capable of doing powerful things derived from Schema that a more generic presentation class could not do –&nbsp;<strong>we are additionally committing to making the official Model replacement compatible with EmberData 4.12</strong></p>
<p>This means (for instance) that the migration path for an application using <a href="https://github.com/adopted-ember-addons/ember-data-model-fragments">ember-data-model-fragments</a> is to help that library become compatible with 4.12, update their application to 4.12, and begin incrementally migrating from Model+ModelFragments to the new presentation class which will offer deep-tracking out of the box.</p>
<p>For <a href="https://github.com/adopted-ember-addons/ember-data-model-fragments">ember-data-model-fragments</a> specifically, we commit to providing extensive time to assist in adding support for 4.12 to the current 3.28+ branch that some teams have been using today. In this way, we hope to give even those teams facing hurdles in the jump to 4.0 a carrot and a mechanism to leap quickly to 5.x.</p>
<h2 id="emberdata412willbecomeaspeciallts">EmberData 4.12 will become a Special LTS</h2>
<p>In addition to the commitments above, we are planning on declaring EmberData 4.12 as a special LTS release.</p>
<p>4.12 will remain an actively supported LTS for the entire duration of the 5.x cycle, extending until the first 6.x LTS is released. This is in addition to our regular LTS support policy, and <em>only applies to the EmberData project</em></p>
<p>This support extends <em>beyond</em> simple bug-fixes. If minor enhancements can be made to better support new presentation class implementations that support the 4.x series we will willingly accept them. Our goal is simple: we want no one left behind.</p>]]></description><link>https://blog.emberjs.com/ember-data-5-x-update-2023-04-15</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-5-x-update-2023-04-15</guid><pubDate>Sat, 15 Apr 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data Meeting Minutes - 2014/06/25]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the Ember Data team meets privately every
Wednesday at 11am PST through Google Hangout for a weekly
discussion of all things Ember-Data.</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats)
  [@terzicigor](https://twitter.com/terzicigor) -->
<p><a href="https://twitter.com/tomdale">@tomdale</a>,
<a href="https://twitter.com/wycats">@wycats</a>,
<a href="https://twitter.com/terzicigor">@terzicigor</a></p>
<h3 id="serializerrefactor">Serializer refactor</h3>
<p>We discussed how best to refactor the existing serializers, especially the work lead by <a href="https://twitter.com/BezoMaxo">@BMac</a> to break up the
Rest Serializer into a JSON Serializer + a Sideloading mixin. While working on it, there were several issues raised, including the problem of
how to make sure that mixins that extend the JSON Serializer(Embedded records mixin right now, and Sideloading mixin in the future) have their
hooks called in the right order and that they do not interfere with each other.</p>
<p>Decided that the refactor into a mixin is a good idea.
Tom raised the idea of having a serialization pipeline, but we decided to punt on that for now.
Decided to wait on more use cases before deciding whether/and how to reorganize the hooks such that mixins are easier to use/write.</p>
<h3 id="zalgopromiseproxy">Zalgo Promise Proxy</h3>
<p>Discussed how to address the problem of serializing async relationships.
<a href="https://twitter.com/terzicigor">@terzicigor</a> and <a href="https://twitter.com/stefanpenner">@stefanpenner</a> have previously come up with the idea of having
a Zalgo Proxy, a proxy that would be passed to the serialize hook and would proxy access to relationships as synchronous.</p>
<p>Decided it is a good idea but needs to be fully specced out and needs a better name.</p>
<h3 id="syncsettingofasyncrelationships">Sync setting of async relationships</h3>
<p>Discussed the problem of how to set/bind two async relationships. For example currently binding an async belongsTo
to an async hasMany does not work because the binding tries to set a promiseProxy and not a model.</p>
<p>Decided to make template bindings work with promises, while not letting users manually set a promise.
Will require some Ember-Metal work to get working</p>
<h3 id="exploreawayfornicelygettingasyncversionofamodel">Explore a way for nicely getting a sync version of a model</h3>
<p>Decided to explore a nice way of calling then on a model and/or several relationships at once which would return a promise
that would resolve once all the relationships are loaded.</p>
<h3 id="thinkabouthowtoincorporateasyncwaitfromes7">Think about how to incorporate async wait from ES7</h3>
<p><a href="https://twitter.com/wycats">@wycats</a> was very excited about the possibility of having Ember-Data support async wait from ES7.
Said it could make dealing with asynchronicity much nicer. No conclusion, due to a lack of time for someone to investigate.</p>]]></description><link>https://blog.emberjs.com/ember-data-meeting-minutes-2014-06-25</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-meeting-minutes-2014-06-25</guid><pubDate>Thu, 03 Jul 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data Meeting Minutes - 2014/07/02]]></title><description><![CDATA[<p>Although most of our collaboration takes place on Github, IRC
(<code>#emberjs</code> on freenode.net), and our <a href="http://discuss.emberjs.com/">Discourse site</a>
the Ember Data team meets privately every
Wednesday at 11am PST through Google Hangout for a weekly
discussion of all things Ember-Data.</p>
<h4 id="attendees">Attendees</h4>
<!--   [@ebryn](https://twitter.com/ebryn),
  [@krisselden](https://twitter.com/krisselden),
  [@machty](https://twitter.com/machty),
  [@rwjblue](https://twitter.com/rwjblue),
  [@trek](https://twitter.com/trek),
  [@stefanpenner](https://twitter.com/stefanpenner),
  [@wagenet](https://twitter.com/wagenet),
  [@tomdale](https://twitter.com/tomdale),
  [@wifelette](https://twitter.com/wifelette),
  [@wycats](https://twitter.com/wycats)
  [@hjdivad](https://twitter.com/hjdivad)
  [@terzicigor](https://twitter.com/terzicigor) -->
<p><a href="https://twitter.com/tomdale">@tomdale</a>,
<a href="https://twitter.com/wycats">@wycats</a>,
<a href="https://twitter.com/terzicigor">@terzicigor</a></p>
<h3 id="pushpayloaddiscussion">PushPayload discussion</h3>
<p>We discussed the <a href="http://discuss.emberjs.com/t/adding-a-function-to-ed-store-to-normalize-push-a-single-type/5321">PushPayload proposal</a></p>
<p>@wycats concluded that the original decision for <code>pushPayload</code> on the store to accept a <code>type</code> argument was a mistake.
Decided that instead of creating several new hooks, the best course of actions seems to be to add a <code>normalize</code> method to the store.</p>
<p>Thus instead of doing <code>pushAndNormalize</code> from the discuss proposal, one can do</p>
<p><code>store.push(type, store.normalize(type, payload))</code></p>
<p>It also seems nice to have a <code>normalize</code> method on the store as the inverse of <code>serialize</code> which already exists on the model.</p>
<h3 id="groupcoalescing">Group Coalescing</h3>
<p><a href="https://twitter.com/hjdivad">@hjdivad</a> and <a href="https://twitter.com/terzicigor">@terzicigor</a> recently added a
<a href="https://github.com/emberjs/data/commit/60b518e5b012c9dc1427256d635f46fc91bee019">groupedRecordsForFindMany</a> hook on the findCoalescing
branch to enable users to decide how to group coalesced requests.</p>
<p>The hook was given a +1. We also realized that this hook will also solve the problem of <a href="https://github.com/emberjs/data/issues/651">URLs being too long for findMany</a></p>]]></description><link>https://blog.emberjs.com/ember-data-meeting-minutes-2014-07-02</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-meeting-minutes-2014-07-02</guid><pubDate>Thu, 03 Jul 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data Meeting Minutes - 2014/08/20]]></title><description><![CDATA[<p>Every week, the Ember Data team meets to discuss improvements and vision for
the Ember Data Project.</p>
<h2 id="attendees">Attendees</h2>
<ul>
<li>Tom Dale (@tomdale)</li>
<li>Igor Terzic (@terzicigor)</li>
<li>Stanley Stuart (@fivetanley)</li>
</ul>
<h2 id="singlesourceoftruth">Single Source of Truth</h2>
<p>This was a fairly brief meeting and mostly involved a code review of Igor's
excellent work on the Single Source of Truth Branch. At a high level, the work
in this branch vastly simplifies many internals in Ember Data on how
relationships keep up to date. These changes will also bring many bugfixes
around inconsistencies related to relationships. You can read more about the
goals of this branch in "The Road to Ember Data 1.0" <a href="http://emberjs.com/blog/2014/03/18/the-road-to-ember-data-1-0.html">blog post</a>.
You can read about the bug fixes referenced in the <a href="https://github.com/emberjs/data/pull/2208">pull request</a>. The
Single Source of Truth changes are expected to land in Ember Data v1.0.0-beta.10.</p>
<!-- Links -->]]></description><link>https://blog.emberjs.com/ember-data-meeting-minutes-2014-08-20</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-meeting-minutes-2014-08-20</guid><pubDate>Sat, 23 Aug 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Data Progress Update]]></title><description><![CDATA[<p>A month ago, we told you about our <a href="/blog/2013/03/22/stabilizing-ember-data.html">plans for stabilizing Ember
Data</a>. I'd like
to give you an update on the status of those efforts.</p>
<p>First, though, I'd like to thank everyone who has been contributing to Ember
Data. As an open source project, a healthy, active community is our
lifeblood. In particular, I want to call out Igor Terzic, Stefan Penner,
Paul Chavard and Gordon Hempton for going above and beyond the call of
duty.</p>
<p>Thanks to their efforts, <a href="https://github.com/emberjs/data/pulse/monthly">we've been making steady progress towards
triaging and reviewing pull requests and
issues</a>.</p>
<p>Additionally, Yehuda and I have been able to devote significant time to
working on Ember Data thanks to the financial support of
<a href="http://www.addepar.com">Addepar</a>. They have my sincere thanks for being
a company that understands the importance of investing in open source.</p>
<h3 id="anewfocus">A New Focus</h3>
<p>Imagine that you are starting a new job as a developer on an existing
server-side web application. On the first day, you begin the process of
familiarizing yourself with the codebase.</p>
<p>Since you have experience with the server-side MVC framework that this
company uses, the day is going well. You see that the templates are
cleanly separated from the controller logic, which is itself cleanly
separated from the models.</p>
<p>But, wait: something looks amiss in the model code. You take a closer look.</p>
<p>Instead of using an ORM (like ActiveRecord), which queries the database
for you and automatically turns the results into objects, it looks like
they're issuing queries manually.</p>
<p><em>"No problem,"</em> you think, <em>"I can write SQL with my eyes closed."</em></p>
<p>But something doesn't look quite right. Upon closer examination, you see
that database queries aren't written in SQL, but some query language
you've never seen before.</p>
<p>You go to your manager's office and ask her about it.</p>
<!-- alex ignore simple -->
<p><em>"Oh yeah,"</em> she says, <em>"We didn't have time to learn how to setup an
existing database, and our needs were pretty simple at the time. We
decided to roll our own, lightweight database with a simplified query
language.  I guess it sort of grew over time as our needs grew."</em></p>
<p>Horrified, you tell her that you don't think it's going to be a good
fit, turn in your badge, and head to your car.</p>
<p>Unfortunately, when you land your next job, the above scenario plays out
all over again. Instead of using SQL, you discover that they too have rolled
their own custom, ad hoc querying language! This repeats, over and over,
until your descent into madness is complete and you retire to a cabin in
the woods.</p>
<p>While this hopefully sounds like something out of a nightmare, the sad
fact is that this is precisely the state of the art when it comes to
writing web JSON APIs. Whether you're writing an Ember.js application, a
mobile app for Android or iOS, or a desktop app, anything that consumes
a web API typically has to deal with URL patterns and JSON structures that are
ad hoc and informally-specified.</p>
<p><strong>This is bad.</strong> Even though we have figured out a standard way of
describing models and their relationships on the server, getting them
into the browser requires every developer write custom, imperative
code. <strong>It's a colossal waste of human time and energy.</strong></p>
<p><img src="/images/blog/most-web-architectures.png" alt="A diagram showing most current web architectures. A conventional MVC
server framework asks for records from a database using a standardized
query language (SQL). A conventional client-side MVC app, however, uses
ad hoc JavaScript to retrieve records from the same web server. An
illustrated picture of Jackie Chan looking frustrated appears to the
right." /></p>
<p>The good news is that the solution is now more apparent: if you
have a conventional framework on the server and a conventional framework
on the client, they should be able to communicate, automatically, using
a standard interchange format.</p>
<p>The reality, however, is that Ember.js developers need to use existing
APIs that aren't 100% consistent. While we were building towards the
future, we were also trying to build something that could be used in the
interim. In retrospect, trying to meet both goals muddled our
message, confused users, and complicated the architecture.</p>
<p>Instead, <strong>Ember Data will now focus on being the best possible library
for Ember.js apps to communicate with consistent, conventional APIs.</strong></p>
<p>We will leave bridging the gap in the very capable hands of simpler
libraries that require less conceptual overhead to work with custom JSON
APIs, such as:</p>
<ul>
<li><a href="https://github.com/ebryn/ember-model">ember-model</a></li>
<li><a href="https://github.com/endlessinc/ember-restless">ember-restless</a></li>
<li><a href="https://github.com/charlieridley/emu">emu</a></li>
</ul>
<p>To be clear: Ember Data will not be limited to one <em>particular</em>
convention. We are excited to see the number of third-party adapters,
such as those for
<a href="https://github.com/clintjhill/ember-parse-adapter">Parse</a>,
<a href="https://github.com/toranb/ember-data-django-rest-adapter">Django</a>,
<a href="https://github.com/rpflorence/ember-localstorage-adapter">localStorage</a>,
and <a href="https://github.com/thomasboyt/ember-firebase-adapter">Firebase</a>,
continue to grow. The only important feature is that the interchange
between Ember Data and the backend be consistent across all models and
their relationships.</p>
<h3 id="whatdoesthismean">What Does This Mean?</h3>
<p>Most users of Ember Data will not have to make any changes to their
application. If you are using the REST adapter with something like the
<code>ActiveModel::Serializers</code> gem in Ruby on Rails, you will continue to not
have to write any network code—defining your schema in JavaScript is
enough for us to know how to load data from the server.</p>
<p>The only notable immediate change is that we will be removing the
<code>BasicAdapter</code> that we described in last month's blog post. This adapter
was designed to be a stopgap measure to help people use Ember Data with
ad hoc JSON APIs, but we committed the cardinal sin of inventing an API
instead of extracting it from a real application as we usually do.</p>
<p>Developers who had tried out the <code>BasicAdapter</code> appreciated our efforts, but
found it lacking in several important areas. We believe focus is
important, so we will be focusing our efforts on conventional APIs and
will leave the cases previously covered by the <code>BasicAdapter</code> to other
libraries.</p>
<p>The other change is that we will be updating the documentation on the
Ember.js website to reflect this new focus, as well as providing
documentation on how to connect Ember apps to less well-defined JSON
APIs.</p>
<h3 id="jsonapi">JSON API</h3>
<p>In order for Ember Data apps to communicate with a server automatically,
the interchange format must be semantically rich enough to capture all
of the changes to models and their relationships that you may make on
the client.</p>
<p>Over time, we have been building more functionality into the JSON
format used by the <code>RESTAdapter</code>. We have decided to formalize this
JSON format so that any backend, whether it be Ruby on Rails, Django,
node.js, or your other favorite server technology, can interact with
Ember.js apps without users having to write network code.</p>
<p>We have begun the process of documenting this format at
<a href="http://jsonapi.org/">JSONAPI.org</a> with <a href="https://twitter.com/brixen">Brian
Shirai</a>. This is a living document that
formally describes the JSON format we hope that the authors of
server-side frameworks will use to get seamless compatibility with
Ember.js applications. Other JavaScript framework are
encouraged to adopt this format so that they can get the same benefit.</p>
<p>Because the best standards are driven by real implementations, <a href="https://twitter.com/steveklabnik">Steve
Klabnik</a> and <a href="https://twitter.com/spastorino">Santiago
Pastorino</a> (both major contributors to
Ruby on Rails) have volunteered to integrate this specification into the
<code>rails-api</code> and <code>ActiveModel::Serializers</code> projects. This
proof-of-concept will allow us to verify the specification is solving
real-world problems.</p>
<p>This work will make it easier for Ember.js developers to
integrate with Ruby on Rails, and we hope other server-side frameworks
vendors follow suit.</p>
<p>The <code>RESTAdapter</code> will continue to be configurable, so if you
want to use a JSON API that differs from the default specification, but
is still consistent across all of your models, you don't have to write
an adapter from scratch.</p>
<h3 id="regularreleases">Regular Releases</h3>
<p>Now that Ember Data is stabilizing rapidly, we will start doing regular
beta releases to make it easier for users to communicate about different
versions. The first release, which we'll be releasing in the next few
days, will be version 0.13. In keeping with the <a href="http://semver.org/">SemVer
standard</a>, we reserve the right to change public
APIs until we reach a 1.0.0 candidate. That being said, we will try our
best to continue keeping the app-facing API stable.</p>
<p>We're excited about the future of Ember Data. In the same way we fought
for strong application architecture conventions in the browser, we will
continue to fight for better compatibility between the client and
server. Hopefully soon, writing low-level XHR code will be an optional
optimization, not a requirement.</p>]]></description><link>https://blog.emberjs.com/ember-data-progress-update</link><guid isPermaLink="true">https://blog.emberjs.com/ember-data-progress-update</guid><pubDate>Fri, 03 May 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember FastBoot 1.0 Released]]></title><description><![CDATA[<p>We are thrilled to share that we have released Ember FastBoot 1.0 (including ember-cli-fastboot addon, fastboot-app-server and other FastBoot libraries).</p>
<h2 id="whatisemberfastboot">What is Ember FastBoot?</h2>
<p><a href="http://www.ember-fastboot.com/">Ember FastBoot</a> is a server-side rendering solution for ambitious Ember apps,
allowing your Ember apps to use principles of progressive enhancement, such as an initial render of your app without JavaScript.
It provides a complete solution for server-side rendering of your app from development to deployment.</p>
<p>FastBoot works by running your Ember app in Node and shipping the rendered HTML of your initial requested route in your index.html (which also contains scripts for your app to boot in browser) to the user.
This helps you show meaningful content to your user while the JavaScript is being downloaded, and also helps the initial page of your app to paint faster.
Once the JavaScript downloads and your Ember app in the browser boots, it takes over the initial rendered HTML.
It also helps the content in your Ember application to be accessible to everyone, even if they turned off JavaScript.</p>
<p>FastBoot brings in an ecosystem to make it easier for your Ember apps to be built and deployed in a FastBoot-friendly way. To make your Ember app run in FastBoot, you only need to install the <code>ember-cli-fastboot</code> addon and make sure your app runs in Node. After installing the addon, you can continue building and developing your app using the same Ember CLI commands as you would without FastBoot. FastBoot also provides an application server (<a href="https://github.com/ember-fastboot/fastboot-app-server"><code>fastboot-app-server</code></a>) to run and deploy your Ember app in a Node environment. It manages downloading the Ember app, starting multiple HTTP server processes, and detecting when new versions of the application have been deployed.</p>
<h2 id="journeytoemberfastboot10">Journey to Ember FastBoot 1.0</h2>
<p>We have been working on making Ember FastBoot a 1.0 candidate for a long time. Early on, FastBoot worked by forking your Ember build and creating a different set of assets that were meant to be loaded and run in a Node environment. This meant that the assets being shipped to the browser and to Node contained almost the same content but they were packaged as different assets. It also meant that when developing your Ember app locally, for every incremental change, a developer had to wait for both assets to finish building before testing the change. With the help and feedback of early adopters in the community, we realized this strategy was turning out to be less developer-friendly.</p>
<p>Therefore, to make sure the developer experience for Ember apps with FastBoot is the same as a vanilla app using Ember CLI, we decided to change the strategy on how to build the assets that need to be loaded in Node. Instead of forking the build and creating two sets of assets (one for browser and one for Node), we decided to build an additional asset for FastBoot that will be loaded with the same assets that are sent to the browser. This asset will allow apps/addons to override/add any behavior for their app when running in Node. This helped to make sure the build times with FastBoot were the same as a vanilla app.</p>
<p>This also unlocked the potential to be able to run the server and browser versions of an app during development with a single command: the <code>ember serve</code> command Ember developers are already used to.</p>
<!-- alex ignore just -->
<p>We also exposed an <a href="https://github.com/ember-cli/rfcs/pull/80">additional public API</a> in Ember CLI that allowed FastBoot to serve index.html with server rendered template using <code>ember serve</code>. This API allows any other addon to tap into Ember CLI’s development-time Express server, not just FastBoot.</p>
<p>All of these changes meant that we had to make a hard decision to break some addons’ compatibility with FastBoot. There were many addons that were made FastBoot-compatible (during early adoption), and we tried very hard to make sure these continued to work with this change. However, there was no good way to do so in all cases without compromising the developer experience. Therefore, we realized we had to break some addons that were already FastBoot-compatible. We have a <a href="https://gist.github.com/kratiahuja/d22de0fb1660cf0ef58f07a6bcbf1a1c">migration guide</a> for addon authors to migrate to the new build strategy, and have already proactively reached out to many addon authors to help them resolve any compatibility issues</p>
<p>We’re sorry we had to make a backwards-incompatible change before the 1.0 release, but we hope you agree that the significant improvement to the developer experience is worth the pain.</p>
<p>By enhancing Ember CLI public API and taking advantage of those new capabilities, Ember developers that want to use FastBoot in their apps can now build their assets using <code>ember build</code>, serve and develop locally using <code>ember serve</code>. In the coming months, we will be exposing more declarative APIs in Ember CLI that will help app and addons import assets that aren’t FastBoot-compatible.</p>
<h2 id="thankyou">Thank You</h2>
<p>With this, please check out the Ember FastBoot <a href="http://ember-fastboot.com">website</a> to learn more on how to make your Ember apps work in FastBoot. If you find any issues, please open issues in the appropriate repository in <a href="https://github.com/ember-fastboot">ember-fastboot</a>.</p>
<!-- alex ignore white -->
<p>This release wouldn’t have been possible without the help, support and feedback of the awesome Ember community. We also would not have been able to make FastBoot better without the vision and guidance of <a href="http://github.com/tomdale">Tom Dale</a>, <a href="https://github.com/stefanpenner">Stefan Penner</a>, <a href="https://github.com/rwjblue">Robert Jackson</a> and the entire Ember CLI core team. Thanks to <a href="https://github.com/arjansingh">Arjan Singh</a>, <a href="https://github.com/danmcclain">Dan McClain</a>, <a href="https://github.com/habdelra">Hassan Abdel-Rahman</a>, <a href="https://github.com/kellyselden">Kelly Selden</a>, <a href="https://github.com/marcoow">Marco Otte-Witte</a>, <a href="https://github.com/pwfisher">Patrick Fisher</a>, <a href="https://github.com/ronco">Ron White</a>, <a href="https://github.com/simonihmig">Simon Ihmig</a>, <a href="https://github.com/tsubomii">Tsubomi Imamura</a>, <a href="https://github.com/thoov">Travis Hoover</a> and many other contributors who helped along the way.</p>]]></description><link>https://blog.emberjs.com/ember-fastboot-1-0-release</link><guid isPermaLink="true">https://blog.emberjs.com/ember-fastboot-1-0-release</guid><pubDate>Wed, 19 Jul 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Guides Status Update]]></title><description><![CDATA[<p>The road to Ember 2.0 has been long and rewarding: the community and team have invested in huge efforts to move Ember to a component-based architecture; we released a stable Ember Data; and we unified our development process with Ember CLI. All in all, we've made huge progress.</p>
<p>Unfortunately, our docs efforts haven’t kept up with all of those improvements. We know that many Ember users have been frustrated that they can't find the resources they need to take advantage of new features.</p>
<p><strong>Over the next few releases, we'll be focusing on major improvements to the content of the Ember Guides and the process of landing new features so we don't fall behind again.</strong></p>
<h2 id="upcomingreleases">Upcoming releases</h2>
<p>Here's what you can expect in the coming weeks and months:</p>
<p><strong><em>Ember Data</em></strong>: Several of us are working hard to update the Models section of the Guides to properly document Ember Data in its stable form. This should be released imminently.</p>
<p><strong><em>Ember 2.1</em></strong>: Several people are working on reviewing the Guides from beginning to end to improve the quality of the writing and make sure that all of the information is up to date. We aim to have this completed for the 2.1 release of the Guides.</p>
<p><strong><em>Ember 2.2</em></strong>: A few contributors are writing an updated version of the tutorial that used to be at the beginning of the Guides. We aim to have the first version in the 2.2 release.</p>
<h2 id="betterprocess">Better process</h2>
<p>Until recently, the Ember Guides and API documentation were maintained by the same developers who wrote the code for Ember.js itself. As the burden has grown, the developers bringing you Ember have stopped being able to tackle both writing the code and documenting it. We've realized that we need a more pragmatic and structured approach to keeping the documentation up-to-date.</p>
<p>We’ve created a new Docs subteam to help drive the direction of the documentation and help make sure that new features always include documentation. It includes existing Ember core team members, along with fresh faces @locks and @michaelrkn. With extra bandwidth from members who are focused exclusively on documentation, we've already made great strides in improving the documentation and filling in missing pieces.</p>
<p>Additionally, the team has agreed that <strong>no new feature will land in a stable release of Ember without documentation and updates to relevant guides</strong>. We don’t want documentation to languish again.</p>
<h2 id="gettinginvolved">Getting involved</h2>
<p>Whether you're a new Ember dev or an old hand, there is lots of work that you can help out with:</p>
<ul>
<li>Check out issues labeled <a href="https://github.com/emberjs/guides/labels/help%20wanted">help wanted</a> on the Guides repo.</li>
<li>Read through the <a href="https://github.com/emberjs/guides/blob/master/CONTRIBUTING.md">guidelines for contributing</a> to the Guides.</li>
<li>If you'd like to help out but get stuck along the way at any point, join us in the <a href="https://embercommunity.slack.com/messages/documentation/">documentation Slack channel</a>.</li>
<li>Contact @locks or @michaelrkn on Slack if you're interested in joining the Docs subteam.</li>
</ul>
<p>To help other contributors stay productive, please keep your contributions and questions limited to issues that are not being worked on by other contributors, and avoid asking for status updates. If you're curious about the progress of the Guides, you can follow along on commits to the <a href="https://github.com/emberjs/guides">Guides repo</a> and read the <a href="https://github.com/emberjs/core-notes/tree/master/docs-team">Docs team weekly meeting minutes</a>.</p>
<!-- alex ignore brother-sister -->
<p>Like all of Ember.js and its sister projects, the Guides are maintained by an all-volunteer team. Please take a moment to thank them online, buy them a beer at your local meetup, and best yet, chip in and help out yourself!</p>
<p><em>Thanks to Yehuda Katz and Leah Silber for reviewing the draft of this post.</em></p>]]></description><link>https://blog.emberjs.com/ember-guides-status-update</link><guid isPermaLink="true">https://blog.emberjs.com/ember-guides-status-update</guid><pubDate>Wed, 02 Sep 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Homepage survey]]></title><description><![CDATA[<p>The first version of <a href="/">emberjs.com</a> was created over 7 years ago, in 2011! Since then there's not only been a major redesign, but countless features, blog posts, guides, examples, and lessons learned added to the site. It's been thrilling to watch the Ember community evolve emberjs.com over the years.</p>
<div class="layout mb-3">
  <div class="lg:col-2 sm:col-2">
    <h3 class="text-center">2011</h3>
    <a href="/images/blog/2018-07-30-ember-homepage-survey/2011.png">
      <img src="/images/blog/2018-07-30-ember-homepage-survey/2011.png" alt="Emberjs.com in 2011">
    </a>
  </div>
  <div class="lg:col-2 sm:col-2">
    <h3 class="text-center">2015</h3>
    <a href="/images/blog/2018-07-30-ember-homepage-survey/2015.png">
      <img src="/images/blog/2018-07-30-ember-homepage-survey/2015.png" alt="Emberjs.com in 2015">
    </a>
  </div>
  <div class="lg:col-2 sm:col-2">
    <h3 class="text-center">2018</h3>
    <img src="/images/blog/2018-07-30-ember-homepage-survey/2018.png" alt="The future homepage?">
  </div>
</div>
<div class="spacer"></div>
<p>That said, we believe it's time for another redesign of the homepage. The marketing copy doesn't capture many of the amazing innovations that have landed in Ember over the past few years. We want the homepage to reflect how great it is to be an Ember developer in 2018.</p>
<p>But first we need your help!</p>
<p>We want to find out what makes you continue to use Ember in a world full of alternatives, so we can better communicate Ember's value proposition to others who might find similar success.</p>
<p>By taking a few minutes to <a href="/homepage-survey">answer these questions</a>, you can help influence the messaging behind Ember's future homepage and any other marketing materials we create.</p>
<p>We really appreciate your time, and thanks!</p>
<p><a href="/homepage-survey">Click here to participate in the homepage survey!</a></p>]]></description><link>https://blog.emberjs.com/ember-homepage-survey</link><guid isPermaLink="true">https://blog.emberjs.com/ember-homepage-survey</guid><pubDate>Mon, 30 Jul 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Community Update from the Learning Team]]></title><description><![CDATA[<p>Each Ember team meets in person at EmberConf. For many of us, it was our first chance to sit down in person and plan together! This is important for us because it allows us spend an entire day getting to know each other and plan for the upcoming year.</p>
<p>In order to keep the community updated while we move initiatives forward, we'd like to share with you the major outcomes from our face to face meeting. The learning team (and friends!) spent the day reviewing our current workload, extracting all of the ideas from <code>@locks</code>' brain, and reviewing priorities for the upcoming year.</p>
<h2 id="goals">Goals</h2>
<p>We had a few goals for the day:</p>
<ul>
<li>craft a mission statement</li>
<li>identify all of the initiatives that were in the scope of the learning team</li>
<li>put all of the initiatives into categories</li>
<li>prioritize the categories</li>
</ul>
<p>We were able to identify categories of work that naturally fell in to one of two directions - user support and marketing. Here are some of of those categories, with initiatives for each:</p>
<h3 id="usersupport">User Support</h3>
<ul>
<li>Guides</li>
<li>API Docs (version support, modules API, Broccoli)</li>
<li>Tutorials (101 Quickstart, 201 Contacts, 301 Super Rentals)</li>
<li>Infrastructure (subdomains, Ember-izing the website)</li>
<li>Internal Evangelism (office hours, mentoring, simplify contribution process)</li>
<li>Tooling and Maintenance (Inspector, Language Servers, Twiddle)</li>
</ul>
<h3 id="marketing">Marketing</h3>
<ul>
<li>Website ("devsign", upgrades &amp; maintenance)</li>
<li>External Evangelism (tech group outreach, podcast &amp; blog collaboration)</li>
<li>Traditional Marketing (Blog, Ember Doctrine, Why Ember, Testimonials)</li>
</ul>
<p>There's more to this list, but we hope this gives everyone a good idea of the direction we are heading. The Ember Learning Team meets every Thursday at 1pm EST. Meeting details are in the topic of the <a href="https://embercommunity.slack.com/messages/C04KG57CF/">#team-learning channel</a> on Slack - we invite you to join us!</p>]]></description><link>https://blog.emberjs.com/ember-learning-update</link><guid isPermaLink="true">https://blog.emberjs.com/ember-learning-update</guid><pubDate>Sun, 22 Apr 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember Node.js LTS Support]]></title><description><![CDATA[<!-- alex ignore steward-stewardess -->
<p>Ember is committed to being a good steward of our collective codebases as part of the <a href="https://nodejs.org/en/">Node.js</a> <a href="https://www.npmjs.com/">ecosystem</a>. In that spirit we will be following the <a href="https://github.com/nodejs/LTS#lts-schedule">Node.js Long Term Support Schedule</a> to provide clear guarantees of which versions of Node.js we support and how long we will support them. We will test against the same set of releases which the Node.js Long-term Support Working Group says they support: any "Current", "Active LTS", or "Maintenance" releases.</p>
<h3 id="whatdoessupportmean">What does support mean?</h3>
<p>All Ember projects can be expected to work in any of the supported Node.js versions and will support every documented feature. We will not maintain separate branches or classes of support for different Node.js support classifications. For example, Ember CLI can be expected to work the same running on a "Maintenance" Node.js version as it does on a "Current" Node.js version. Not all of our projects presently align to this pattern but we will, over time, coalesce to this state.</p>
<p>Meeting this commitment does not come without cost and tough decisions. However, as maintainers of foundational libraries, we believe that it is in our best interest to validate the legitimacy of the Node.js LTS plans, help position Node.js as a reliable and dependable tool for all enterprises, and contribute toward improving the reputation of the ecosystem.</p>
<h3 id="howwedropsupport">How We Drop Support</h3>
<p>To make it easier for us to deliver on our support promise we have adopted a policy that the <code>HEAD</code> of our <code>master</code> branches will be compatible with all versions of Node.js currently receiving support. For any Ember project on the day we drop support for a Node.js version the following things will happen:</p>
<ul>
<li>We will update the <code>engines</code> key inside of <code>package.json</code> to specify the versions supported by the project.</li>
<li>We will update the testing targets to remove the newly-unsupported Node.js version from the list.</li>
<li>We will begin accepting code without testing it against the newly-unsupported version of Node.js.</li>
</ul>
<p>For projects with an unspecified release model we will release one last version of the project prior to those steps. The version number change will reflect <a href="http://semver.org/">SemVer</a> with respect to the APIs of the project and not take into consideration removal of Node.js version support. This means that the release may show up as a "patch" version release. For example, if we're dropping support for Node.js 0.10 and have a project at version 1.3.3 we can drop Node.js 0.10 support when we release version 1.3.4.</p>
<p>For Ember CLI, which follows a six week release train model, we will continue to patch the currently released version and maintain compatibility. Those patches will not break compatibility with the Node.js versions that Ember CLI supported when it was released. The next six week release of Ember CLI will drop support for the newly-unsupported Node.js version. For example, if we release Ember CLI 2.8.0 on September 6, drop support for Node.js 0.10 on October 1, and discover a bug on October 5 necessitating a 2.8.1 patch release that release will support Node.js 0.10 even though we have officially dropped support. The first version which will not support Node.js 0.10 will be Ember CLI 2.9.0 scheduled to be released on October 17.</p>
<h3 id="nodejs010nodejs012">Node.js 0.10 &amp; Node.js 0.12</h3>
<p>Over the next four months Node.js will remove the 0.10 and 0.12 versions from "Maintenance." We in the Ember community will follow suit. This means that on October 1, 2016 we will drop support for Node.js 0.10 and on January 1, 2017 we will drop support for Node.js 0.12.</p>
<p>Both of these versions are very long in the tooth and have had a good run but we're not sad to see them go. We're looking forward to getting to use <a href="http://kangax.github.io/compat-table/es6/#node012">language features we've had for years in other environments</a>.</p>
<h3 id="recommendedversion">Recommended Version</h3>
<p>We recommend that you use the most-recent "Active LTS" version of Node.js. At present that is <a href="https://nodejs.org/en/download/">Node.js v4.5.0</a>. This is not to say that you may not use other versions, but by rule the current "Active LTS" will receive the most attention during our testing cycles and be most broadly used within the community.</p>
<h3 id="futureplans">Future Plans</h3>
<p>We recognize that we don't have the privilege of unilaterally setting this as the default for the entire Node.js ecosystem. It is our hope that with leadership from our community we can encourage more of the Node.js ecosystem to commit to following the schedule laid out by the Node.js LTS Working Group.</p>
<p>We don't presently rely upon transpilation to support older versions of the Node.js runtime from a codebase using current JavaScript features. This may change in time but we don't yet believe the story for tooling and debugging of transpiled JavaScript for Node.js has reached the inflection point where the benefits outweigh the costs.</p>
<p>Further, if we find ourselves maintaining our own forks or depending upon legacy versions of much of the JavaScript ecosystem, we reserve the option to change our approach in the future. As always we will be paying close attention to the community's needs and will give at least a six month notice of any change to this stated support policy.</p>
<!-- alex ignore special -->
<p><em>Special thanks to <a href="https://github.com/ErisDS">Hannah Wolfe</a> for helping direct us to this approach.</em></p>]]></description><link>https://blog.emberjs.com/ember-node-lts-support</link><guid isPermaLink="true">https://blog.emberjs.com/ember-node-lts-support</guid><pubDate>Wed, 07 Sep 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember 2.x Project]]></title><description><![CDATA[<p>For the past several years, when we've talked about "Ember releases", we were always talking about releases of the Ember codebase itself.</p>
<p>In practice, that has meant that in order to put together the full, recommended Ember stack, you needed to figure out not only what Ember version to use, but also what versions of our other libraries and tools worked with it.</p>
<p>Starting with Ember 2.0, we will coordinate every release of Ember with releases of the main ecosystem tools maintained by the core team:</p>
<ul>
<li>Ember CLI</li>
<li>Ember.js</li>
<li>Ember Data</li>
<li>Liquid Fire</li>
<li>List View</li>
</ul>
<p><strong>All of these tools will share a version number with Ember itself.</strong></p>
<p>Upgrading to Ember 2.3 means that you'll get a new version of the Ember tools and a new version of Ember. You'll also get new versions of Liquid Fire, List View and Ember Data designed to work with (and tested against) Ember 2.3.</p>
<p>These projects will also ship betas alongside Ember itself, meaning that when Ember 2.3-beta.1 is released, there will be versions of Ember Data, Liquid Fire and List View released at the same time that are tested against the new beta.</p>
<p><strong>We are in the process of aligning the versions now; you should start to see releases of Ember Data and Liquid Fire numbered "2.0 beta" in the next few days.</strong></p>
<p>At a high level, the goal of these releases is for "upgrading to Ember 2.3" to mean upgrading Ember CLI to that version, and getting all of the improvements across all of the projects at once, without having to figure out how to separately upgrade each piece.</p>
<p>We expect that Semver and a shared community experience of upgrading at once will make this upgrade relatively painless, and will continue to work on improvements to the process that eliminates sources of pain due to upgrades. (See the <a href="https://github.com/emberjs/rfcs/blob/two-dot-x-improvements/active/0000-improved-release-cycle.md">Release Cycle Improvements</a> RFC for more on improvements we already have planned for the 2.x cycle.)</p>
<h3 id="frequentlyaskedquestions">Frequently Asked Questions</h3>
<p>While I tried to answer the most common questions I've heard from people, I'm sure I missed some.</p>
<blockquote>
  <p>What does this mean for right now?</p>
</blockquote>
<p>We have shipped Ember 2.0 beta, and are in the process of shipping "2.0 beta" versions of the remaining projects.</p>
<p>In practice, this means shipping a final version of the projects that will be compatible with Ember 1.13, and buttoning up any final changes that need to be made before they join Ember's semantic versioning pace.</p>
<p>There will be a separate blog post in the next few days describing precisely how this will affect Ember Data, but the short version is the same. There will be a final version of Ember Data that will be compatible with the versions that have been shipping all year, and then we will ship Ember Data 2.0 beta, aligned with Ember itself.</p>
<blockquote>
  <p>Doesn't this mean that Ember is becoming a huge monolithic project that is now tightly coupled with all of these other projects?</p>
</blockquote>
<p>No. The reason to share a version number is almost entirely about convenience and a less fragmented ecosystem. While it is technically true that Liquid Fire 2.4 will work fine with Ember 2.6, this means that applications will practically be on a smorgasboard of versions of the core libraries, making it harder to write tutorials and answer questions, even once it is clear what version of Ember a user is using.</p>
<p>What this means it that if a user is using Ember 2.4, and asks a question about animations or Ember Data, it is possible to answer the question without asking a half-dozen other questions to learn basic things about the user's environment.</p>
<p>Similarly, if you are looking at a tutorial that was built for Ember 2.4, you know that it will not be targeting a different version of the other core libraries, with the caveats that would bring.</p>
<blockquote>
  <p>But doesn't this mean that upgrading Ember is a huge "big bang
  upgrade" that will take an even longer amount of time to perform now that it's coupled with Ember CLI, Ember Data, and Liquid Fire?</p>
</blockquote>
<p>While in principle upgrading Ember.js without one of the other libraries might seem like it would take less time, we don't think this is true in practice.</p>
<p>By aligning the release cycles and versions of the most common libraries, it is possible for upgrade guides to cover all of the instructions that you will need in one place, and you will be sharing an upgrade experience with the rest of the ecosystem.</p>
<p>When you ask a question in IRC, on GitHub Issues or on Stack Overflow about upgrading to Ember 2.4, the known caveats for the entire upgrade process will be well-known and well-trod.</p>
<p>This is not the case if you are trying to upgrade to Ember 2.5 while remaining on Ember CLI 2.2 with List View 2.3 and Liquid Fire 2.1. It <strong>might</strong> work out, but the number of people sharing the same combination will be very low, and the people maintaining the libraries might not even have considered that precise combination.</p>
<p><strong>In practice, the fact that all of these libraries share the same SemVer requirements should make upgrading across all five components more straight forward than trying to cobble together a multi-version stack yourself.</strong></p>
<!-- alex ignore just -->
<blockquote>
  <p>I don't agree with anything you said here and just want to pick and choose the versions of the libraries I want to use.</p>
</blockquote>
<p>Go for it! The people maintaining each of these libraries want older versions of the libraries to work with newer versions of Ember, because it makes their jobs easier.</p>
<p>If you are deeply committed to upgrading a piece at a time, even though it will mean you will need to work out the details on your own, feel free to attempt it, and report bugs if you encounter any problems.</p>
<p>(There is one minor caveat. As of Ember 2.0, Liquid Fire and Ember Data make minor use of private Ember APIs. We intend to replace those APIs with public APIs within the first few releases.)</p>]]></description><link>https://blog.emberjs.com/ember-project-at-2-0</link><guid isPermaLink="true">https://blog.emberjs.com/ember-project-at-2-0</guid><pubDate>Tue, 16 Jun 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.10 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.10 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 4.11 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs410">Changes in Ember.js 4.10</h3>
<p>Ember.js 4.10 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.10 introduced 2 bug fixes.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20327">#20327</a> - Fix the types for the mutation-methods of <code>NativeArray</code></li>
<li><a href="https://github.com/emberjs/ember.js/pull/20283">#20283</a> - revert TS <code>compilerOptions.target</code> to ES2017</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 4.10 introduced 3 features.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20270">#20270</a> / <a href="https://github.com/emberjs/ember.js/pull/20271">#20271</a> - Add new imports for <code>getOwner</code> and <code>setOwner</code> from <code>@ember/owner</code> and introduce new <code>@ember/routing</code> sub-modules</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20253">#20253</a> - Add the <code>Resolver</code> type to preview types</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20319">#20319</a> - resolve services with <code>Owner.lookup</code></li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.10 introduced 3 deprecations.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20341">#20341</a> - Deprecations for importing <code>htmlSafe</code> and <code>isHTMLSafe</code> from <code>@ember/string</code>. They have moved to <code>@ember/template</code></li>
<li><a href="https://github.com/emberjs/ember.js/pull/20344">#20344</a> - Deprecate <code>@ember/string</code> when used from ember-source. You should use the <code>@ember/string</code>-addon</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20342">#20342</a> - Deprecate @ember/error</li>
</ul>
<!-- Block end -->
<p>For more details on changes in Ember.js 4.10, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.10.0">Ember.js 4.10.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata410">Changes in Ember Data 4.10</h3>
<p>Due to low availability for the Ember Data team this cycle, Ember Data does not have a new release, so it remains at 4.9.</p>
<p>Please see the <a href="https://blog.emberjs.com/ember-4-9-released">Ember 4.0 release blog post</a> for details about v4.9 of Ember Data.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli410">Changes in Ember CLI 4.10</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember CLI 4.10 introduced 0 bug fixes.</p>
<h4 id="features-1">Features</h4>
<p>Ember CLI 4.10 introduced 5 features.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10048">#10048</a> Make addAddonsToProject support creating a new project with custom target directory</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10054">#10054</a> Conditionally apply ESLint parser options in <code>app</code> and <code>addon</code> blueprints</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10060">#10060</a> Replace <code>eslint-plugin-node</code> with <code>eslint-plugin-n</code> in blueprints</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10062">#10062</a> Update Prettier config in blueprints to only use single quotes for <code>.js</code> and <code>.ts</code> files</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10132">#10132</a> Add @ember/string as a dependency of projects</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 4.10 introduced 0 deprecations.</p>
<p>For more details on the changes in Ember CLI 4.10 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.10.0">Ember CLI 4.10.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-4-10</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-4-10</guid><pubDate>Fri, 13 Jan 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.11 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.11 of Ember.js, Ember Data, and Ember CLI. <!-- Block start: Uncomment if an LTS candidate --><!--This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule.--><!-- Block end --></p>
<p>This release kicks off the 4.12 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs411">Changes in Ember.js 4.11</h3>
<p>Ember.js 4.11 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.11 introduced 0 bug fixes.</p>
<h4 id="features">Features</h4>
<p>Ember.js 4.11 introduced 2 features.</p>
<ol>
<li>Stable TypeScript types for the <code>@ember/owner</code> package (first released in 4.10).</li>
<li>Stable TypeScript types for the <code>@ember/error</code> package.</li>
</ol>
<p>Both of these packages already had types available as part of <a href="https://blog.emberjs.com/announcing-official-typescript-types-public-preview/">the public preview types</a>, so you might wonder: <em>What is new here?</em> The answer is: these are the first type definitions generated from Ember's own TypeScript source code, instead of written by hand. This means that these types are <em>guaranteed</em> to match Ember's own behavior: they literally cannot get out of sync.</p>
<p>If you are already using the public preview types, as documented in <a href="https://blog.emberjs.com/announcing-official-typescript-types-public-preview/">the announcement post</a>, you don't have to do anything. If you would like to opt into using the new stable and preview types, you can add this to your project (e.g. in <code>app.ts</code>):</p>
<pre><code class="ts language-ts">import 'ember-source/types';
import 'ember-source/types/preview';
</code></pre>
<p><strong>Reminder:</strong> while these two packages are now stable, much of Ember's types are still in preview, and subject to change between minor releases. We expect to finish getting the rest of Ember's types stable, and therefore following Ember's normal stability rules, early in the upcoming 5.x releases!</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.11 introduced 0 deprecations.</p>
<!-- Block start: If there were no deprecations, remove this block -->
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework. No new deprecations are allowed after the <code>.10</code> release, to minimize churn before the next major release.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 4.11, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.11.0">Ember.js 4.11.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<p>Ember Data 4.10, which was not released at the time of the broader Ember 4.10 release, has now been released and is essentially a re-release of Ember Data 4.9 with some fixes around <code>@ember/error</code> and <code>@ember/string</code> deprecations. Ember Data 4.11.0 is also a re-release of Ember Data 4.10. However, there were several very important fixes shipped in Ember Data 4.11.1, 4.11.2 and 4.11.3 that users should be aware of.</p>
<h3 id="changesinemberdata411">Changes in Ember Data 4.11</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember Data 4.11 introduced 0 bug fixes.</p>
<p>Ember Data 4.11.1 introduced 1 important bug fix for a bug around embroider compatibility that prevented users from using Ember Data in embroider Ember applications starting in Ember Data 4.8. <a href="https://github.com/emberjs/data/pull/8427">The fix</a> means that Ember apps using Ember Data can also use embroider again!</p>
<p>Ember Data 4.11.2 introduced <a href="https://github.com/emberjs/data/pull/8433">1 bug fix</a> that addresses computed chains not updating in EmberData 4.8 and up.</p>
<p>Ember Data 4.11.3 introduced <a href="https://github.com/emberjs/data/pull/8439">1 bug fix</a> that addresses an issue around infinite recursion in ember-concurrency and another involving SSR/test memory leaks.</p>
<h4 id="features-1">Features</h4>
<p>Ember Data 4.11 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 4.11 introduced 0 deprecations.</p>
<p>For more details on changes in Ember Data 4.11 (and 4.11.1, 4.11.2 and 4.11.3) please review the
<a href="https://github.com/emberjs/data/releases/tag/v4.11.0">Ember Data 4.11.0 release page</a> and the <a href="https://github.com/emberjs/data/blob/master/CHANGELOG.md">Ember Data changelog</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli411">Changes in Ember CLI 4.11</h3>
<p>Ember CLI</p>
<p>Ember CLI did not introduce new bug fixes, features or deprecations, but there were a few updates that added <a href="https://github.com/ember-cli/ember-cli/pull/10103"><code>ember-modifier</code></a> and <a href="https://github.com/ember-cli/ember-cli/pull/10109"><code>tracked-built-ins</code></a> to the app blueprint and there was <a href="https://github.com/ember-cli/ember-cli/pull/10110">one update</a> addressing a dependency vulnerability.</p>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 4.11 introduced 0 bug fixes.</p>
<h4 id="features-2">Features</h4>
<p>Ember CLI 4.11 introduced 0 features.</p>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 4.11 introduced 0 deprecations.</p>
<p>For more details on the changes in Ember CLI 4.11 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.11.0">Ember CLI 4.11.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-4-11</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-4-11</guid><pubDate>Sun, 05 Mar 2023 12:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.12 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.12 of Ember.js, EmberData, and Ember CLI. <!-- Block start: Uncomment if an LTS candidate --><!--This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule.--><!-- Block end --></p>
<p>This release kicks off the 5.0 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs412">Changes in Ember.js 4.12</h3>
<p>Ember.js 4.12 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.12 introduced 3 bug fixes.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20388">#20388</a> - Don't run getters while applying mixins, ensuring that getters are never evaluated while applying
mixins.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20398">#20398</a> - Fix runloop types on TypeScript 5.0+ where types around <code>bind</code> were flagged with an assignability error.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20385">#20385</a> - Improve the error for owner methods called after destroy where the error message did not indicate what was being looked up.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 4.12 introduced 3 features.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/releases/tag/v4.12.0">#20352</a> - Enable generating Typescript blueprints when <code>isTypeScriptProject</code> is <code>true</code> without additional environment variables per <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan">RFC #800</a>.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20355">#20355</a> - Enhance the Typescript blueprint for generated services per <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan">RFC #800</a>.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20356">#20356</a> - Generate signature in TypeScript Glimmer Component blueprints per <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan">RFC #800</a>.</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.12 introduced 0 deprecations.</p>
<!-- Block start: If there were no deprecations, remove this block -->
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework. No new deprecations are allowed after the <code>.10</code> release, to minimize churn before the next major release.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 4.12, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.12.0">Ember.js 4.12.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>There were many significant changes to EmberData in 4.12, including:</p>
<ul>
<li>some big steps towards Embroider support with improved build times and addons that are close to v2 addons - full embroider support is the flip of a switch away once a few issues are resolved;</li>
<li>lots of improved documentation, including the docs around Cache, Notifications, Identity Management, and Record Lifecycle, also includes inline deprecation docs and granular stripping;</li>
<li>introducing <code>@ember-data/request</code> and the <code>RequestManager</code>, a package that can be used independently (but also comes bundled with <code>ember-data</code>) that re-envisions how data fetching is managed for both EmberData and applications more broadly - see the <a href="https://github.com/emberjs/data/tree/v4.12.0/packages/request#readme">docs</a> and <a href="https://github.com/emberjs/rfcs/pull/860">related RFC</a>;</li>
<li>Cache Spec 2.1 implementation - using the power of <code>store.request</code>, requests are now capable of providing a cache-key or being cached by URL, with full lifecycle control and notification subscriptions. Documents are a first-class citizen of the Cache and EmberData more broadly. To go with this, the <code>JSON:API</code> cache previously provided by <code>@ember-data/record-data</code> is now upgraded to the 2.1 spec and available as the <code>@ember-data/json-api</code> package. While this cache does not yet implement the full suite of cache 2.1 APIs, support for all Cache 2.1 APIs has been added to the store. Read more about Cache 2.1 in the <a href="https://github.com/emberjs/rfcs/pull/854">related RFC</a>.</li>
</ul>
<h3 id="changesinemberdata412">Changes in EmberData 4.12</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>EmberData 4.12 introduced 20 bug fixes.</p>
<h4 id="features-1">Features</h4>
<p>EmberData 4.12 introduced 24 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>EmberData 4.12 introduced 2 deprecation removals.</p>
<p>We are not detailing all the work done in this release, here, so for more details on changes in EmberData 4.12 please review the thorough notes on the
<a href="https://github.com/emberjs/data/releases/tag/v4.12.0">EmberData 4.12.0 release page</a> and the <a href="https://github.com/emberjs/data/blob/master/CHANGELOG.md">EmberData changelog</a></p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and EmberData, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli412">Changes in Ember CLI 4.12</h3>
<p>Ember CLI</p>
<p>Ember CLI did not introduce new bug fixes, features or deprecations, but there were a few updates that added <a href="https://github.com/ember-cli/ember-cli/pull/10103"><code>ember-modifier</code></a> and <a href="https://github.com/ember-cli/ember-cli/pull/10109"><code>tracked-built-ins</code></a> to the app blueprint and there was <a href="https://github.com/ember-cli/ember-cli/pull/10110">one update</a> addressing a dependency vulnerability.</p>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 4.12 introduced 2 bug fixes.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10091">#10091</a> - Fix looking up the default blueprint for scoped addons</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10192">#10192</a> - The <code>addon</code> command should throw when no addon name is provided</li>
</ul>
<h4 id="features-2">Features</h4>
<p>Ember CLI 4.12 introduced 11 features.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10122">#10122</a> - Add Stylelint setup to <code>app</code> and <code>addon</code> blueprints</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10142">#10142</a> - Update ESLint to v8 in <code>app</code> and <code>addon</code> blueprints</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10157">#10157</a> - Exclude <code>ember-cli-terser</code> when generating apps using the <code>--embroider</code> option</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10159">#10159</a> - Exclude <code>ember-cli-sri</code> when generating apps using the <code>--embroider</code> option</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10161">#10161</a> - Remove NPM version checking</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10169">#10169</a> - Remove <code>app.import</code> comment in <code>app</code> blueprint</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10172">#10172</a> - Lazy require heavier packages</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10173">#10173</a> - Don't delete the newly-generated app directory when an error occurs</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10180">#10180</a> - Update <code>ember-welcome-page</code> to v7 in <code>app</code> blueprint</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10188">#10188</a> - Update ESLint parser <code>ecmaVersion</code> to <code>latest</code> in <code>app</code> blueprint</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10189">#10189</a> - Add v4.8 LTS to <code>addon</code> blueprint - Remove v3.28 LTS and <code>ember-classic</code> scenario</li>
</ul>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 4.12 introduced 0 deprecations.</p>
<p>For more details on the changes in Ember CLI 4.12 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.12.0">Ember CLI 4.12.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-4-12</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-4-12</guid><pubDate>Wed, 12 Apr 2023 12:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.3 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.3 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 4.4 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs43">Changes in Ember.js 4.3</h3>
<p>Ember.js 4.3 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.3 introduced 3 bug fixes.</p>
<ul>
<li>A memory leak in the Router Service class is fixed (<a href="https://github.com/emberjs/ember.js/pull/20025">#20025</a>). It was affecting tests and FastBoot apps.</li>
<li>Using <code>RouterService#transitionTo</code> no longer adds unspecified default query parameters to the URL (<a href="https://github.com/emberjs/ember.js/pull/19971">#19971</a>).</li>
<li><code>FactoryManager</code> correctly associate props with factory and owner (<a href="https://github.com/emberjs/ember.js/pull/20024">#20024</a>).</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 4.3 introduced 0 features.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.3 introduced 0 deprecations.</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 4.3, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.3.0">Ember.js 4.3.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata43">Changes in Ember Data 4.3</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember Data 4.3 introduced many bug fixes! Contributors to the project
were hard at work to address things that were reported between <code>v3.28</code> and
<code>v4.2</code>.</p>
<p>Many of the bugfixes listed below have been backported to
<code>v3.28</code>. That means if you get the latest patch release of <code>v3.28-v4.2</code>,
you will get these benefits too.</p>
<p>The list below covers highlights only. See the <a href="https://github.com/emberjs/data/compare/v4.2.0…v4.3.0">commit history</a> for a comprehensive list.</p>
<ul>
<li>Pushing records with duplicate identifiers does not cause duplicate records
<a href="https://github.com/emberjs/data/pull/7801">#7801</a>.</li>
<li>Fix a bug with encoding space characters when serializing query params
<a href="https://github.com/emberjs/data/pull/7834">#7834</a>.</li>
<li>Fix a regression where <code>createRecord</code> crashed when a setter which sets an
attribute is involved in the <code>createRecord</code>.</li>
<li>Fix a regression to support <code>await</code> for loading relationships
<a href="https://github.com/emberjs/data/issues/7684">#7684</a>.</li>
<li><a href="https://github.com/emberjs/data/compare/v4.2.0…v4.3.0">…and more!</a></li>
</ul>
<h4 id="features-1">Features</h4>
<p>Ember Data 4.3 introduced 4 features.</p>
<ul>
<li><a href="https://github.com/emberjs/data/pull/7227">Better debuggability</a>! When your
app is in <code>DEBUG</code> mode, it is now easier to dig into <code>Store</code>, <code>Symbol</code>, and
<code>RecordReference</code>.</li>
<li><a href="https://github.com/emberjs/data/pull/7887">Add support for Customizeable test setups</a>
as described in <a href="https://emberjs.github.io/rfcs/0637-customizable-test-setups.html">RFC 637</a>.</li>
<li>The Reference API is now <a href="https://github.com/emberjs/data/pull/7796">compatible with autotracking</a>.</li>
<li><code>attributesDefinitionFor</code> and <code>relationshipsDefinitionFor</code> have a
<a href="https://github.com/emberjs/data/pull/7867/files">simpler API</a>,
following <a href="https://emberjs.github.io/rfcs/0794-ember-data-schema-definition-service-simplify.html">RFC 794</a>.</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 4.3 introduced 0 deprecations.</p>
<p>Support for the <code>toJSON</code> method on Ember Data records has been removed. It was deprecated in <code>3.x</code> and slated for removal in <code>4.x</code>.
If your app uses this method, follow the <a href="https://deprecations.emberjs.com/ember-data/v3.x/#toc_record-toJSON">deprecation guide</a>.</p>
<p>Some more previously-deprecated APIs were slated for removal in the <code>4.x</code>
series, and have <a href="https://github.com/emberjs/data/pull/7861">now been removed</a>:</p>
<ul>
<li>Evented.</li>
<li>Lifecycle events like <code>didCreate</code>.</li>
<li>Default adapter. Adapter type must be specified now.</li>
<li>Test registrations.</li>
<li><code>belongs-to-push</code> of record.</li>
<li><code>mismatched-inverse</code>.</li>
</ul>
<p>For more details on changes in Ember Data 4.3, please review the
<a href="https://github.com/emberjs/data/compare/v4.2.0…v4.3.0">Ember Data 4.3.0 commits</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli43">Changes in Ember CLI 4.3</h3>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 4.3 introduced 1 bug fix.</p>
<ul>
<li>The broccoli debug folder is added to the <code>gitignore</code> file (<a href="https://github.com/ember-cli/ember-cli/pull/9680">#9680</a>).</li>
</ul>
<h4 id="features-2">Features</h4>
<p>Ember CLI 4.3 introduced 2 features.</p>
<ul>
<li>Customisation of setupTest* functions (<a href="https://github.com/ember-cli/ember-cli/pull/9803">#9803</a>). This adds a <code>tests/helpers/index.js</code> file where <code>setupApplicationTest</code>, <code>setupRenderingTest</code>, and <code>setupTest</code> functions will be wrapped and exported, creating a single place to edit for each type of test setup. Tests generated using <code>ember generate</code> will import the setup functions from that file.</li>
<li>Add support for specifying a path for the <code>ember generate</code> command (<a href="https://github.com/ember-cli/ember-cli/pull/9387">#9387</a>). This allows you to run <code>ember g ../../../node_modules/ember-source/blueprints/component</code> to generate a component.</li>
</ul>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 4.3 introduced 1 deprecation.</p>
<ul>
<li>Deprecate Bower support (<a href="https://github.com/ember-cli/ember-cli/pull/9707">#9707</a>). This implements the deprecation messages from <a href="https://github.com/bertdeblock/rfcs/blob/deprecate-bower-apis/text/0772-deprecate-bower-support.md">RFC 772</a>.</li>
</ul>
<p>For more details on the changes in Ember CLI 4.3 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.3.0">Ember CLI 4.3.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-4-3</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-4-3</guid><pubDate>Wed, 20 Apr 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.4 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.4 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 4.4 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs44">Changes in Ember.js 4.4</h3>
<p>Ember.js 4.4 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.4 introduced 1 bug fix.</p>
<ul>
<li>Calling isEmpty on instances of ObjectProxy wrapping ArrayProxy was not working, this is fixed in <a href="https://github.com/emberjs/ember.js/pull/16879/files">#16879</a>.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 4.4 introduced 4 features.</p>
<ul>
<li>The <code>{{unique-id}}</code> helper will be included by default in new Ember apps. Developers can use this helper to generate a unique ID string suitable for use as an ID attribute in the DOM. Notably, this removes the need for a backing class since it can be directly used in template-only components. (<a href="https://github.com/emberjs/ember.js/pull/19882">#19882</a>/<a href="https://github.com/emberjs/ember.js/pull/20005">#20005</a>)</li>
<li>When a deprecation has the  <code>until</code>  field set, it will now be logged with the other information. (<a href="https://github.com/emberjs/ember.js/pull/20014">#20014</a>)</li>
<li>The customization of <code>setupTest*</code> functions is now available. The app and addon blueprints will create a file at <code>tests/helpers/index.js</code> where these functions will be wrapped and exported, creating a local place to edit for each type of test setup. Tests generated using <code>ember generate</code> will import the setup functions from that file. (<a href="https://github.com/emberjs/ember.js/pull/19981">#19981</a>)</li>
<li>The <code>hasListeners</code> function is now public, so you can call this before calling <code>removeListeners</code>. (<a href="https://github.com/emberjs/ember.js/pull/17978">#17978</a>)</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.4 introduced 0 deprecations.
For more details on changes in Ember.js 4.4, please review the  <a href="https://github.com/emberjs/ember.js/releases/tag/v4.4.0">Ember.js 4.4.0 release page</a> .</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 4.4, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.4.0">Ember.js 4.4.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata44">Changes in Ember Data 4.4</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember Data 4.4 introduced 0 bug fixes and some tests and documentation improvements.</p>
<h4 id="features-1">Features</h4>
<p>Ember Data 4.4 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 4.4 introduced 1 deprecations.</p>
<ul>
<li><code>Model.save()</code> will return a native <code>Promise</code> instead of a <code>PromiseProxyMixin</code>. To return a <code>Promise</code>, you can <a href="https://api.emberjs.com/ember-data/4.4/modules/@ember-data%2Fdeprecations">set your <code>compatWith</code> to 4.4</a>. (<a href="https://github.com/emberjs/data/pull/7868">#7868</a></li>
</ul>
<p>Support for the <code>toJSON</code> method on Ember Data records has been removed. It was deprecated in <code>3.x</code> and slated for removal in <code>4.x</code>.
If your app uses this method, follow the <a href="https://deprecations.emberjs.com/ember-data/v3.x/#toc_record-toJSON">deprecation guide</a>.</p>
<p>For more details on changes in Ember Data 4.4, please review the
<a href="https://github.com/emberjs/data/compare/v4.1.0…v4.4.0">Ember Data 4.4.0 commits</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli44">Changes in Ember CLI 4.4</h3>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 4.4 introduced 3 bug fixes.</p>
<ul>
<li>Update <code>since.available</code> and <code>since.enabled</code> versions for Bower deprecations. (<a href="https://github.com/ember-cli/ember-cli/pull/9822">#9822</a>)</li>
<li>The addon <code>.gitignore</code> file blueprinted contained <code>/DEBUG/</code> when it should not, fixed in <a href="https://github.com/ember-cli/ember-cli/pull/9850">#9850</a>.</li>
<li>The add-on README will now use more standard markdown for the headers. (<a href="https://github.com/ember-cli/ember-cli/pull/9611">#9611</a>).</li>
</ul>
<h4 id="features-2">Features</h4>
<p>Ember CLI 4.4 introduced 0 features.</p>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 4.4 introduced 0 deprecations.</p>
<p>For more details on the changes in Ember CLI 4.4 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.4.0">Ember CLI 4.4.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-4-4</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-4-4</guid><pubDate>Fri, 27 May 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 4.7 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 4.7 of Ember.js, Ember Data, and Ember CLI.</p>
<p>This release kicks off the 4.8 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs47">Changes in Ember.js 4.7</h3>
<p>Ember.js 4.7 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 4.7 introduced 1 bug fix.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20126">Replacing Firefox detection that used a deprecated browser API</a></li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 4.7 introduced 0 features.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 4.7 introduced 0 deprecations.</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 4.7, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.7.0">Ember.js 4.7.0 release page</a>.</p>
<hr />
<h2 id="emberdata">Ember Data</h2>
<p>Ember Data is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata47">Changes in Ember Data 4.7</h3>
<p>Version 4.7 implements a "2.1" cache spec while deprecating the v1 cache spec. This spec differs somewhat from the <a href="https://rfcs.emberjs.com/id/0461-ember-data-singleton-record-data">original 2.0 RFC</a>, an updated RFC specifying the modifications will be published soon. Users looking to migrate to the 2.1 cache should expect that the finalized version of 2.1 enforces that the cache is always a singleton (vs merely allowed to be a singleton), and that data provided to the store and queries to the store from the cache should always contain identifiers in their stable form. This latter point is enforced in 4.7, the former is not yet enforced.</p>
<!-- markdownlint-disable MD036 -->
<p><strong>Performance Improvements</strong></p>
<blockquote>
  <p>Note: many performance improvements are gated by deprecation removal, meaning that you need to resolve all deprecations for EmberData 4.7 and mark your app as compatible with that version in order to opt in to the fastest codepaths.
  All applications should observe significant speed improvements when using EmberData 4.7. The below call-outs are in relation to EmberData 4.6.</p>
</blockquote>
<ul>
<li>Pushing new data into the cache is now ~33% faster</li>
<li>Accessing the LiveArray (peekAll / findAll) for the first time is now 97% faster</li>
<li>Initial Access of Related Records is now ~80% faster</li>
<li>Destroying all records (e.g. also sending an API request) in a loop is 62% faster</li>
<li>Unloading all records (of all types) is ~98% faster</li>
</ul>
<p>Read more in the <a href="https://github.com/emberjs/data/releases/tag/v4.7.1">release notes</a>.</p>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember Data 4.7 introduced 8 bug fixes and some tests and documentation improvements. Additional details are in the <a href="https://github.com/emberjs/data/releases/tag/v4.7.1">release notes</a>.</p>
<ul>
<li><a href="https://github.com/emberjs/data/pull/8089">#8089</a> Unpin yarn for consumers</li>
<li><a href="https://github.com/emberjs/data/pull/8108">#8108</a> Fix earlier versions of node-14</li>
<li><a href="https://github.com/emberjs/data/pull/8118">#8118</a> Reopen deprecation should properly pass original arguments</li>
<li><a href="https://github.com/emberjs/data/pull/8113">#8113</a> Account for multi-options-per-identifer possibility</li>
<li><a href="https://github.com/emberjs/data/pull/8109">#8109</a> Add optional polyfill for crypto.randomUUID</li>
<li><a href="https://github.com/emberjs/data/pull/8116">#8116</a> Clear subscriptions once unsubscribed, don't unnecessarily churn on subscriptions</li>
<li><a href="https://github.com/emberjs/data/pull/8128">#8128</a> <code>backgroundReloads</code> should not affect <code>recordIsLoaded</code></li>
<li><a href="https://github.com/emberjs/data/pull/8159">#8159</a> uuid polyfill logic (@runspired)</li>
</ul>
<h4 id="features-1">Features</h4>
<p>Ember Data 4.7 introduced 2 features.</p>
<ul>
<li><a href="https://github.com/emberjs/data/pull/7955">#7955</a> Explicit Polymorphic Relationship Support <a href="https://rfcs.emberjs.com/id/0793-polymporphic-relations-without-inheritance">emberjs/rfcs#793</a></li>
<li><a href="https://github.com/emberjs/data/pull/8134">#8134</a> The return values of hasMany relationships, peekAll, findAll and query are now proxies to native arrays and as such all native array APIs are now usable. These objects will act fully as if they are native arrays. Restrictions on immutability of the result of peekAll and query still apply (<a href="https://rfcs.emberjs.com/id/0846-ember-data-deprecate-proxies">RFC 846</a>).</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember Data 4.7 introduced 13 deprecations. Additional details are in the <a href="https://github.com/emberjs/data/releases/tag/v4.7.1">release notes</a>.</p>
<ul>
<li><a href="https://github.com/emberjs/data/pull/8093">#8093</a> Implement helper deprecations (<a href="https://rfcs.emberjs.com/id/0742-ember-data-deprecate-helper-functions">RFC 742</a>).</li>
<li><a href="https://github.com/emberjs/data/pull/8092">#8092</a> Deprecate <code>Model.reopen</code>/<code>reopenClass</code> and eager static fields lookups (implements <a href="https://rfcs.emberjs.com/id/0738-ember-data-deprecate-model-reopen">RFC 738</a> and <a href="https://rfcs.emberjs.com/id/0741-ember-data-deprecate-model-static-field-access-without-lookup">RFC 741</a>).</li>
<li><a href="https://github.com/emberjs/data/pull/8084">#8084</a> Eliminate InternalModel, nearly all private API's have undergone significant change, if your app previously used these APIs the most likely refactor is to use a custom model or a custom cache.</li>
<li><a href="https://github.com/emberjs/data/pull/8115">#8115</a> Implement strict relationships (<a href="https://rfcs.emberjs.com/id/0739-ember-data-deprecate-non-strict-relationships">RFC 739</a>).</li>
</ul>
<p>For more details on changes in Ember Data 4.7, please review the
<a href="https://github.com/emberjs/data/compare/v4.1.0…v4.7.1">Ember Data 4.7.1 commits</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and Ember Data, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or Ember Data by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli47">Changes in Ember CLI 4.7</h3>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 4.7 introduced 1 bug fix.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/9987">Rebuild failures no longer make the ember-cli process exit.</a></li>
</ul>
<h4 id="features-2">Features</h4>
<p>Ember CLI 4.7 introduced 0 features.</p>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 4.7 introduced 0 deprecations.</p>
<p>For more details on the changes in Ember CLI 4.7 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.7.0">Ember CLI 4.7.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-4-7</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-4-7</guid><pubDate>Mon, 05 Sep 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.1 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.1 of Ember.js, EmberData, and Ember CLI.</p>
<p>This release kicks off the 5.2 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<p>The headlining feature of this release is stable <a href="https://www.typescriptlang.org">TypeScript</a> support! 🎉 The framework now publishes TypeScript types built from Ember's own source code, with Ember's <a href="https://emberjs.com/releases/">strong Semantic Versioning commitment</a> baked in—bringing benefits for both TypeScript and JavaScript users. For details, a couple important caveats, and a migration guide, check out <a href="https://blog.emberjs.com/stable-typescript-types-in-ember-5-1">the accompanying blog post</a>.</p>
<h3 id="changesinemberjs51">Changes in Ember.js 5.1</h3>
<p>Ember.js 5.1 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 5.1 introduced 1 bug fix:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20461">#20461</a> - Fix a cyclic module crash when using Ember Engines and Ember FastBoot.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 5.1 introduced 1 feature:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20449">#20449</a> - Publish stable TypeScript types built from Ember's source.</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 5.1 introduced 0 deprecations.</p>
<p>For more details on changes in Ember.js 5.1, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.1.0">Ember.js 5.1.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata51">Changes in EmberData 5.1</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>EmberData 5.1 introduced 2 bug fixes:</p>
<ul>
<li><a href="https://github.com/emberjs/data/pull/8657">#8657</a> - Ensure deprecation configs are threaded to each package.</li>
<li><a href="https://github.com/emberjs/data/pull/8649">#8649</a> - <code>NotificationManager</code> should only invoke resource/document callbacks owned by the originating store.</li>
</ul>
<h4 id="features-1">Features</h4>
<p>EmberData 5.1 introduced 0 features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>EmberData 5.1 introduced 0 deprecations.</p>
<p>For more details on changes in EmberData 5.1, please review the
<a href="https://github.com/emberjs/data/releases/tag/v5.1.0">EmberData 5.1.0 release page</a> and for future planning please refer to the new 🔥 <a href="https://github.com/emberjs/data/blob/main/ROADMAP.md">EmberData Roadmap</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and EmberData, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli51">Changes in Ember CLI 5.1</h3>
<h4 id="bugfixes-2">Bug Fixes</h4>
<p>Ember CLI 5.1 introduced 2 bug fixes:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10300">#10300</a> - Do not try to wire up Testem unless a test framework is detected.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10256">#10276</a> - Widen peer dependency range for ember-source.</li>
</ul>
<h4 id="features-2">Features</h4>
<p>Ember CLI 5.1 introduced 2 features:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10256">#10256</a> - Align hbs templates generated by app blueprint with Prettier defaults.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10287">#10287</a> - Implementation of RFC 907 - pnpm support.</li>
</ul>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 5.1 introduced 0 deprecations.</p>
<p>For more details on the changes in Ember CLI 5.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.1.0">Ember CLI 5.1.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-1</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-1</guid><pubDate>Sat, 08 Jul 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.10 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.10 of Ember.js and Ember CLI. Following <a href="https://rfcs.emberjs.com/id/0830-evolving-embers-major-version-process">Ember's Major Version Policy</a>, 5.10 is the last release of the 5.x series that will have deprecations targeting 6.0. Version 5.12 in September will be the final release of the 5.x series.</p>
<p>This release kicks off the 5.11 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs510">Changes in Ember.js 5.10</h3>
<p>Ember.js 5.10 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 5.10 introduced 2 bug fixes.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20683">#20683</a> - Remove application-template-wrapper optional feature support as Ember has thrown since 4.0 with the feature enabled.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20685">#20685</a> - Remove support for non-glimmer template-only components as this optional feature became mandatory at 4.0.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 5.10 introduced no new features.</p>
<p>While there were no new features there was an exciting internal update to the Ember.js test suite, which now builds with Vite, with no AMD loader present. Which ensures that Ember is strictly following the ES module spec. Additionally, these <a href="https://github.com/emberjs/ember.js/pull/20675">changes</a> also makes Ember's prepublication build use Rollup instead of a custom broccoli pipeline.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 5.10 introduced 2 deprecations:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20660">#20660</a> - deprecate non-colocated component template resolution per <a href="https://rfcs.emberjs.com/id/0995-deprecate-non-colocated-components">RFC #995</a>.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20702">#20702</a> - deprecate array prototype extensions per <a href="https://rfcs.emberjs.com/id/0848-deprecate-array-prototype-extensions/">RFC #848</a>.</li>
</ul>
<p>For more details on changes in Ember.js 5.10, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.10.0">Ember.js 5.10.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>This release cycle EmberData is again electing to not release a new minor.</p>
<p>Work in the library continues to be focused primarily on aligning 4.12 and 5.3 to enable as many folks in the community to seamlessly upgrade as possible.</p>
<!-- alex ignore easy -->
<p>We continue to take our time with 5.4 as we intend to introduce a major new paradigm with it (the replacement for @ember-data/model) and believe releasing this new feature at once on the heels of two very robust LTSs (4.12 and 5.3) is the best approach for users looking to navigate upgrades easily.</p>
<p>Please see the <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">blog post</a> addressing EmberData's new versioning strategy for more information.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli510">Changes in Ember CLI 5.10</h3>
<h4 id="features-1">Features</h4>
<p>Ember CLI 5.10 introduced 1 new feature:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10464"></a> - update blueprint to specify a locale as the test helper <code>setupIntl()</code> in <code>ember-intl@v7</code> requires end-developers to specify a locale.</li>
</ul>
<p>For more details on the changes in Ember CLI 5.10 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.10.0">Ember CLI 5.10.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-10</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-10</guid><pubDate>Fri, 12 Jul 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.11 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.11 of Ember.js and Ember CLI. Following <a href="https://rfcs.emberjs.com/id/0830-evolving-embers-major-version-process">Ember's Major Version Policy</a>, the previous release, 5.10, was the last release of the 5.x series that will have deprecations targeting 6.0. Version 5.12 in September will be the final release of the 5.x series.</p>
<p>This release kicks off the 5.12 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs511">Changes in Ember.js 5.11</h3>
<p>Ember.js 5.11 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 5.11 introduced no bug fixes.</p>
<h4 id="features">Features</h4>
<p>Ember.js 5.11 introduced no new features. However, 5.11 did <a href="https://github.com/emberjs/ember.js/pull/20716">drop support</a> for Node.js v16, which is a breaking change.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 5.11 introduced no new deprecations.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>This release cycle EmberData is again electing to not release a new minor.</p>
<p>Work in the library continues to be focused primarily on aligning 4.12 and 5.3 to enable as many folks in the community to seamlessly upgrade as possible.</p>
<!-- alex ignore easy -->
<p>We continue to take our time with 5.4 as we intend to introduce a major new paradigm with it (the replacement for @ember-data/model) and believe releasing this new feature at once on the heels of two very robust LTSs (4.12 and 5.3) is the best approach for users looking to navigate upgrades easily.</p>
<p>Please see the <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">blog post</a> addressing EmberData's new versioning strategy for more information.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli511">Changes in Ember CLI 5.11</h3>
<h4 id="bugfixes-1">Bug fixes</h4>
<p>Ember CLI 5.11 introduced no bug fixes. However, Ember CLI 5.11 did <a href="https://github.com/ember-cli/ember-cli/pull/10474">improve the developer experience</a> of using the <code>WelcomePage</code> component.</p>
<h4 id="features-1">Features</h4>
<p>Ember CLI 5.11 introduced no new features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 5.11 introduced no new deprecations.</p>
<p>For more details on the changes in Ember CLI 5.11 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.11.0">Ember CLI 5.11.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-11</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-11</guid><pubDate>Fri, 23 Aug 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.12 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.12 of Ember.js and Ember CLI. Following <a href="https://rfcs.emberjs.com/id/0830-evolving-embers-major-version-process">Ember's Major Version Policy</a>, version 5.12 will be the final release of the 5.x series. This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule.</p>
<p>This release kicks off the 6.0 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs512">Changes in Ember.js 5.12</h3>
<p>Ember.js 5.12 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 5.12 introduced 2 bug fixes.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20746">#20746</a> - Not a bugfix directly in <code>ember-source</code>, but upgrades <code>glimmer-vm</code> to leverage removal of debugging code that results in some performance improvements.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20714">#20714</a> - Break the eager cycle for "deprecate" function in <code>@ember/debug</code>, which can cause problems depending on the load ordering of related modules.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 5.12 introduced no new features.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 5.12 introduced no new deprecations.</p>
<p>For more details on changes in Ember.js 5.12, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.12.0">Ember.js 5.12.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>This release cycle EmberData is again electing to not release a new minor.</p>
<p>Work in the library continues to be focused primarily on aligning 4.12 and 5.3 to enable as many folks in the community to seamlessly upgrade as possible.</p>
<!-- alex ignore easy -->
<p>We continue to take our time with 5.4 as we intend to introduce a major new paradigm with it (the replacement for @ember-data/model) and believe releasing this new feature at once on the heels of two very robust LTSs (4.12 and 5.3) is the best approach for users looking to navigate upgrades easily.</p>
<p>Please see the <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">blog post</a> addressing EmberData's new versioning strategy for more information.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli512">Changes in Ember CLI 5.12</h3>
<h4 id="bugfixes-1">Bug fixes</h4>
<p>Ember CLI 5.12 introduced no bug fixes. However, Ember CLI 5.12 did <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.12.0">upgrade many dependencies</a>, some of which resolved deprecations that were previously removed.</p>
<h4 id="features-1">Features</h4>
<p>Ember CLI 5.12 introduced no new features.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 5.12 introduced no new deprecations.</p>
<p>For more details on the changes in Ember CLI 5.12 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.12.0">Ember CLI 5.12.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-12</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-12</guid><pubDate>Fri, 04 Oct 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.2 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.2 of Ember.js, EmberData, and Ember CLI.</p>
<p>This release kicks off the 5.3 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs52">Changes in Ember.js 5.2</h3>
<p>Ember.js 5.2 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug Fixes</h4>
<p>Ember.js 5.2 introduced 2 bug fixes:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20505">#20505</a> Remove use of this.element in component-test and helper-test blueprints.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20501">#20501</a> Fix the types for the mutation-methods of NativeArray.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 5.2 introduced 1 feature:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20464">#20464</a> Create public import for uniqueId helper per <a href="https://rfcs.emberjs.com/id/0659-unique-id-helper">RFC #659</a>.</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 5.2 introduced 0 deprecations.</p>
<p>For more details on changes in Ember.js 5.2, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.2.0">Ember.js 5.2.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata52">Changes in EmberData 5.2</h3>
<p>EmberData 5.2 was a re-release of EmberData 5.1.2 and contains no new work.</p>
<p>EmberData 5.1.2 included <a href="https://github.com/emberjs/data/pull/8750">#8750</a> which ported several bug fixes:</p>
<ul>
<li>fix: @ember-data/debug should declare its peer-dependency on @ember-data/store <a href="https://github.com/emberjs/data/pull/8703">#8703</a></li>
<li>fix: de-dupe coalescing when includes or adapterOptions is present but still use findRecord <a href="https://github.com/emberjs/data/pull/8704">#8704</a></li>
<li>fix: make implicit relationship teardown following delete of related record safe <a href="https://github.com/emberjs/data/pull/8705">#8705</a></li>
<li>fix: catch errors during didCommit in DEBUG <a href="https://github.com/emberjs/data/pull/8708">#8708</a></li>
</ul>
<p>For more details on changes in EmberData 5.2, please review the
<a href="https://github.com/emberjs/data/releases/tag/v5.2.0">EmberData 5.2.0 release page</a> and for future planning please refer to the new 🔥 <a href="https://github.com/emberjs/data/blob/main/ROADMAP.md">EmberData Roadmap</a>, which did change as a result of 5.2 being a re-release.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and EmberData, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli52">Changes in Ember CLI 5.2</h3>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember CLI 5.2 introduced no bug fixes.</p>
<h4 id="features-1">Features</h4>
<p>Ember CLI 5.2 introduced 1 new feature:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10283">#10283</a> - refactor <code>--typescript</code> support in blueprints to not use <code>ember-cli-typescript</code>.</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 5.2 introduced no deprecations.</p>
<p>For more details on the changes in Ember CLI 5.2 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.2.0">Ember CLI 5.2.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-2</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-2</guid><pubDate>Sat, 19 Aug 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.3 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.3 of Ember.js, EmberData, and Ember CLI. <!-- Block start: Uncomment if an LTS candidate --><!--This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule.--><!-- Block end --></p>
<p>This release kicks off the 5.4 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs53">Changes in Ember.js 5.3</h3>
<p>Ember.js 5.3 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 5.3 introduced 1 deprecation.</p>
<ol>
<li>Deprecate implicit record loading in Ember Route per <a href="https://rfcs.emberjs.com/id/0774-implicit-record-route-loading">RFC #774</a>. Please see <a href="https://deprecations.emberjs.com/v5.x#toc_deprecate-implicit-route-model">the deprecation guide</a> for more information.</li>
</ol>
<!-- Block start: If there were no deprecations, remove this block -->
<p>Deprecations are added to Ember.js when an API will be removed at a later date. Each deprecation has an entry in the deprecation guide describing the migration path to a more stable API. Deprecated public APIs are not removed until a major release of the framework.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon if you would like to upgrade your application without immediately addressing deprecations.</p>
<!-- Block end -->
<p>For more details on changes in Ember.js 5.3, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.3.0">Ember.js 5.3.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<h3 id="changesinemberdata53">Changes in EmberData 5.3</h3>
<h4 id="bugfixes">Bug Fixes</h4>
<p>EmberData 5.3 introduced 10 bug fixes. Details are in the
<a href="https://github.com/emberjs/data/releases/tag/v5.3.0">EmberData 5.3.0 release page</a>.</p>
<h4 id="features">Features</h4>
<p>EmberData 5.3 introduced several new features.</p>
<p>This release primarily focused on polish for the <code>RequestManager</code> story, introducing builder utils, builders for <code>REST</code> <code>ActiveRecord</code> and <code>JSON:API</code> requests as well as serialization utils for <code>JSON:API</code> requests.</p>
<p>As part of shipping serialization utils, we implemented several long-awaited cache features to support them:</p>
<ul>
<li><code>cache.changedRelationships</code> retrieves a diff of what has been added or removed from each relationship for a resource</li>
<li><code>cache.hasChangedRelationships</code> answers whether any relationships have changed for a resource</li>
<li><code>cache.rollbackRelationships</code> will reset all relationships for that resource to their "remote" state, removing any local changes.</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>EmberData 5.3 introduced 5 deprecations.</p>
<p>As part of our ongoing efforts to modernize the library and to support the above changes, we implemented several new deprecations.</p>
<ul>
<li>Deprecate legacy import paths (<code>ember-data/</code>) except for <code>ember-data/store</code></li>
<li>Deprecate non-strict-type (e.g. "users" or "myType" instead of "user" and "my-type")</li>
<li>Deprecate non-strict-id (e.g . <code>1</code> instead of <code>"1"</code>)</li>
</ul>
<p>And in relationships specifically:</p>
<ul>
<li>deprecate fixing non-unique relationship payloads (when the same record is referenced multiple times in a related collection)</li>
<li>deprecate remote updates clearing local changes (an upcoming blog post will explain the new behavior here in detail)</li>
</ul>
<p>For more details on changes in EmberData 5.3, please review the
<a href="https://github.com/emberjs/data/releases/tag/v5.3.0">EmberData 5.3.0 release page</a>.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>While it is recommended to keep Ember CLI versions in sync with Ember and EmberData, this is not required. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli53">Changes in Ember CLI 5.3</h3>
<h4 id="features-1">Features</h4>
<p>Ember CLI 5.3 introduced 1 new feature:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10337">#10337</a> - the feature flag for pnpm support was removed, officially allowing using of the <code>--pnpm</code> flag.</li>
</ul>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember CLI 5.3 introduced 3 bug fixes.</p>
<h4 id="deprecations-2">Deprecations</h4>
<p>Ember CLI 5.3 introduced 1 deprecation.</p>
<ul>
<li>Deprecate outputPaths build option, as output paths will no longer be predetermined under Embroider</li>
</ul>
<p>For more details on the changes in Ember CLI 5.3 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.3.0">Ember CLI 5.3.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-3</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-3</guid><pubDate>Thu, 21 Sep 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.4 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.4 of Ember.js and Ember CLI. This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule.</p>
<p>This release kicks off the 5.5 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs54">Changes in Ember.js 5.4</h3>
<p>Ember.js 5.4 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="features">Features</h4>
<p>Ember.js 5.4 introduced 1 feature:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20521">#20521</a> Add TypeScript support for looking up controllers in the dependency injection registry</li>
</ul>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 5.4 introduced 2 bug fixes.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20529">#20529</a> - Don't rethrow string errors in handleTransitionReject</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20210">#20210</a> - Fix hanging tests caused by legacy rsvp code</li>
</ul>
<p>For more details on changes in Ember.js 5.4, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.4.0">Ember.js 5.4.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>EmberData did not release a new minor version during this release cycle, as such EmberData remains at 5.3 and 5.3 is a LTS candidate for EmberData.</p>
<p>Please see the <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">blog post</a> addressing EmberData's new versioning strategy for more information.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli54">Changes in Ember CLI 5.4</h3>
<h4 id="features-1">Features</h4>
<p>Ember CLI 5.4 introduced 4 new features.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10351">#10351</a> Remove ember-lts-4.4 scenario from addon blueprint</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10352">#10352</a> Add official support for Node.js v20</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10353">#10353</a> Remove all telemetry</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10368">#10368</a> Streamline package-manager CLI options</li>
</ul>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember CLI 5.4 introduced 1 bug fix.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10345">#10345</a> App blueprint may not have explicit-any in ember-data types</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember CLI 5.4 introduced 0 deprecations.</p>
<p>For more details on the changes in Ember CLI 5.4 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.4.0">Ember CLI 5.4.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-4</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-4</guid><pubDate>Fri, 03 Nov 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.5 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.5 of Ember.js and Ember CLI.</p>
<p>Version 5.4 of Ember.js and version 5.3 of EmberData are now promoted to LTS (Long Term Support). An LTS version of Ember continues to receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks). LTS releases typically occur every four minor versions. The previous LTS version of Ember.js was 4.12 and the previous LTS version of EmberData was also 4.12.</p>
<p>This release kicks off the 5.6 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs55">Changes in Ember.js 5.5</h3>
<p>Ember.js 5.5 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 5.5 introduced 2 bug fixes.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20575">#20575</a> Update backburner.js to 2.4.2 to ensure scheduleOnce works correctly following a cancelled job</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20578">#20578</a> Deprecate outlet TemplateFactory support</li>
</ul>
<p>For more details on changes in Ember.js 5.5, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.5.0">Ember.js 5.5.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>This release cycle EmberData is again electing to not release a new minor.</p>
<p>Currently work in the library is focused primarily on continuing to align 4.12 and 5.3 to enable as many folks in the community to seamlessly upgrade as possible.</p>
<!-- alex ignore easy -->
<p>We also want to take our time with 5.4 as we intend to introduce a major new paradigm with it (the replacement for @ember-data/model) and believe releasing this new feature at once on the heels of two very robust LTSs (4.12 and 5.3) is the best approach for users looking to navigate upgrades easily.</p>
<p>Please see the <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">blog post</a> addressing EmberData's new versioning strategy for more information.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli55">Changes in Ember CLI 5.5</h3>
<h4 id="features">Features</h4>
<p>Ember CLI 5.5 introduced 3 new features.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10332">#10332</a> Support converting gts to gjs files in blueprint</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10370">#10370</a> When generating a new app with --embroider use all optimisation flags</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10393">#10393</a> feat: add skip-install alias to skip-npm</li>
</ul>
<h4 id="bugfixes-1">Bug Fixes</h4>
<p>Ember CLI 5.5 introduced 1 bug fix.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10403">#10403</a> Fix some docs that were showing up weirdly in generated api docs</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember CLI 5.5 introduced 1 deprecation.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10350">#10350</a> Deprecate Travis CI support</li>
</ul>
<p>For more details on the changes in Ember CLI 5.5 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.5.0">Ember CLI 5.5.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-5</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-5</guid><pubDate>Sun, 17 Dec 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.6 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.6 of Ember.js and Ember CLI.</p>
<p>This release kicks off the 5.7 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs56">Changes in Ember.js 5.6</h3>
<p>Ember.js 5.6 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 5.6 introduced 3 bug fixes.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20595">#20595</a> - A blueprint-generated file for an addon re-export should always be a JavaScript file, not a TypeScript file.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20603">#20603</a> - Internal templates should be strictMode and fix the declared types for <code>precompileTemplate</code>.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20605">#20605</a> - Move babel-plugin-ember-template-compilation to dependencies from devDependencies.</li>
</ul>
<p>For more details on changes in Ember.js 5.6, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.6.0">Ember.js 5.6.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>This release cycle EmberData is again electing to not release a new minor.</p>
<p>Work in the library continues to be focused primarily on aligning 4.12 and 5.3 to enable as many folks in the community to seamlessly upgrade as possible.</p>
<!-- alex ignore easy -->
<p>We continue to take our time with 5.4 as we intend to introduce a major new paradigm with it (the replacement for @ember-data/model) and believe releasing this new feature at once on the heels of two very robust LTSs (4.12 and 5.3) is the best approach for users looking to navigate upgrades easily.</p>
<p>Please see the <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">blog post</a> addressing EmberData's new versioning strategy for more information.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli56">Changes in Ember CLI 5.6</h3>
<h4 id="features">Features</h4>
<p>Ember CLI 5.6 introduced 2 new features.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10394">#10394</a> - <code>ember serve</code> will now automatically choose a port (starting with 4200), unless a port is explicitly set with the <code>--port flag</code> or the <code>$PORT</code> env variable.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10404">#10404</a> - Adds a workflow to deploy api docs to ember-learn/ember-cli.github.io and <a href="https://cli.emberjs.com/release/">the website</a>.</li>
</ul>
<p>For more details on the changes in Ember CLI 5.6 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.6.0">Ember CLI 5.6.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-6</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-6</guid><pubDate>Tue, 30 Jan 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.7 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.7 of Ember.js and Ember CLI.</p>
<p>This release kicks off the 5.8 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs57">Changes in Ember.js 5.7</h3>
<p>Ember.js 5.7 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="features">Features</h4>
<p>Ember.js 5.7 introduced 2 features.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20639">#20639</a> - Add an optional feature <code>no-implicit-route-model</code> to opt-in to the removal of the implicit loading of a model per <a href="https://rfcs.emberjs.com/id/0774-implicit-record-route-loading">RFC #774</a> and facilitated by <a href="https://github.com/emberjs/ember-optional-features/pull/334"><code>ember-optional-features</code></a>. Enabling this feature can be used to clear the <a href="https://deprecations.emberjs.com/v5.x#toc_deprecate-implicit-route-model">deprecation of the implicit route model behavior</a> once you ensure your project is not relying on that behavior.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20597">#20597</a> - Add explicit support for TypeScript versions 5.1, 5.2, and 5.3.</li>
</ul>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 5.7 introduced 2 bug fixes.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20645">#20645</a> - Make sure the component-class blueprint generates a component signature in a TypeScript project</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20579/files">#20579</a> - Type <code>cached</code> as a <code>MethodDecorator</code> instead of <code>PropertyDecorator</code>.</li>
</ul>
<p>For more details on changes in Ember.js 5.7, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.7.0">Ember.js 5.7.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>This release cycle EmberData is again electing to not release a new minor.</p>
<p>Work in the library continues to be focused primarily on aligning 4.12 and 5.3 to enable as many folks in the community to seamlessly upgrade as possible. Further patch releases of 5.3 will be forthcoming.</p>
<!-- alex ignore easy -->
<p>We continue to take our time with 5.4 as we intend to introduce a major new paradigm with it (the replacement for @ember-data/model) and believe releasing this new feature at once on the heels of two very robust LTSs (4.12 and 5.3) is the best approach for users looking to navigate upgrades easily.</p>
<p>Please see the <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">blog post</a> addressing EmberData's new versioning strategy for more information.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli57">Changes in Ember CLI 5.7</h3>
<h4 id="features-1">Features</h4>
<p>Ember CLI 5.7 introduced 1 new features.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10440">#10440</a> - Add an optional feature <code>no-implicit-route-model</code> to opt-in to the removal of the implicit loading of a model per <a href="https://rfcs.emberjs.com/id/0774-implicit-record-route-loading">RFC #774</a> and facilitated by <a href="https://github.com/emberjs/ember-optional-features/pull/334"><code>ember-optional-features</code></a> and the <a href="https://github.com/emberjs/ember.js/pull/20639">related</a> Ember.js pull request. Enabling this feature can be used to clear the <a href="https://deprecations.emberjs.com/v5.x#toc_deprecate-implicit-route-model">deprecation of the implicit route model behavior</a> once you ensure your project is not relying on that behavior.</li>
</ul>
<p>For more details on the changes in Ember CLI 5.7 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.7.0">Ember CLI 5.7.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-7</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-7</guid><pubDate>Sat, 09 Mar 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.8 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.8 of Ember.js and Ember CLI. This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule.</p>
<p>This release kicks off the 5.9 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs58">Changes in Ember.js 5.8</h3>
<p>Ember.js 5.8 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 5.8 introduced 1 bug fix.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20672">#20672</a> - Restore <code>{{this.attrs.foo}}</code> deprecation from the 3.x era. The API was accidentally not removed in 4.0, but the deprecation was removed.</li>
</ul>
<p>For more details on changes in Ember.js 5.8, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.8.0">Ember.js 5.8.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>This release cycle EmberData is again electing to not release a new minor.</p>
<p>Work in the library continues to be focused primarily on aligning 4.12 and 5.3 to enable as many folks in the community to seamlessly upgrade as possible. Further patch releases of 5.3 will be forthcoming.</p>
<!-- alex ignore easy -->
<p>We continue to take our time with 5.4 as we intend to introduce a major new paradigm with it (the replacement for @ember-data/model) and believe releasing this new feature at once on the heels of two very robust LTSs (4.12 and 5.3) is the best approach for users looking to navigate upgrades easily.</p>
<p>Please see the <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">blog post</a> addressing EmberData's new versioning strategy for more information.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli58">Changes in Ember CLI 5.8</h3>
<h4 id="features">Features</h4>
<p>Ember CLI 5.8 introduced 1 new feature.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10418">#10418</a> - Use <code>content-tag</code> to parse <code>.gts</code> files in blueprints rather than <code>ember-template-tag</code>.</li>
</ul>
<h4 id="bugfixes-1">Bug fixes</h4>
<p>Ember CLI 5.8 introduced 2 bug fixes.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10432">#10432</a> - Filter out tsconfig.declarations.json when running the addon blueprint without typescript enabled.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10438">#10438</a> - Add declarations folder to <code>.eslintignore</code> file in app blueprint so that running the <code>lint</code> script after the <code>prepack</code> script does not result in ESLint errors.</li>
</ul>
<p>For more details on the changes in Ember CLI 5.8 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.8.0">Ember CLI 5.8.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-8</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-8</guid><pubDate>Sat, 20 Apr 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 5.9 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 5.9 of Ember.js and Ember CLI.</p>
<p>Version 5.8 of Ember.js is now promoted to LTS (Long Term Support). The current LTS version of EmberData remains at version 5.3. An LTS version of Ember continues to receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks). LTS releases typically occur every four minor versions. The previous LTS version of Ember.js was 5.4.</p>
<p>This release kicks off the 5.10 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs59">Changes in Ember.js 5.9</h3>
<p>Ember.js 5.9 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 5.9 introduced 1 bug fix.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20656">#20656</a> and <a href="https://github.com/emberjs/ember.js/pull/20664">#20664</a> - Upgrade <code>router_js</code> to support <code>exactOptionalPropertyTypes</code>.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 5.9 introduced 1 feature:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20669">#20669</a> - Make deprecations throw when the until for <code>ember-source</code> has passed per <a href="https://rfcs.emberjs.com/id/0830-evolving-embers-major-version-process">RFC #0830</a>.</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 5.9 introduced 1 deprecation:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20653">#20653</a> - Deprecate <code>(action)</code> and <code>{{action}}</code> in templates per <a href="emberjs/rfcs#1006">RFC #1006</a>.</li>
</ul>
<p>For more details on changes in Ember.js 5.9, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v5.9.0">Ember.js 5.9.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>This release cycle EmberData is again electing to not release a new minor.</p>
<p>Work in the library continues to be focused primarily on aligning 4.12 and 5.3 to enable as many folks in the community to seamlessly upgrade as possible. Further patch releases of 5.3 will be forthcoming.</p>
<!-- alex ignore easy -->
<p>We continue to take our time with 5.4 as we intend to introduce a major new paradigm with it (the replacement for @ember-data/model) and believe releasing this new feature at once on the heels of two very robust LTSs (4.12 and 5.3) is the best approach for users looking to navigate upgrades easily.</p>
<p>Please see the <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">blog post</a> addressing EmberData's new versioning strategy for more information.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli59">Changes in Ember CLI 5.9</h3>
<h4 id="features-1">Features</h4>
<p>Ember CLI 5.9 introduced 2 new features:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10446">#10446</a> - Format markdown files in blueprints with Prettier.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10450">#10450</a> - Remove warning when encountering a <code>.js</code> file when generating a <code>TS</code> blueprint.</li>
</ul>
<h4 id="bugfixes-1">Bug fixes</h4>
<p>Ember CLI 5.9 introduced 1 bug fix:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10452">#10452</a> - Make sure to use the correct package manager in concurrently scripts.</li>
</ul>
<p>For more details on the changes in Ember CLI 5.9 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v5.9.0">Ember CLI 5.9.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-5-9</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-5-9</guid><pubDate>Thu, 06 Jun 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.1 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 6.1 of Ember.js and Ember CLI.</p>
<p>This release kicks off the 6.2 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs61">Changes in Ember.js 6.1</h3>
<p>Ember.js 6.1 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 6.1 introduced 1 bug fix.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20782">#20782</a> - Fixes Ember keyword shadowing: keywords should always be superseded by in-scope lexical variables.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 6.1 introduced 1 new feature.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20787">#20787</a> - Publish ember-source as v2 addon. The published contents of the package have already been compliant with the v2 addon spec for some time, but this actually flips the setting. Embroider builds will now be able to consume ember-source directly without ember-source going through any addon rewriting. Classic builds will continue to get all pre-existing ember modules via the vendor.js bundle, because otherwise it would introduce observable differences in when the ember modules become available in the AMD loader.</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 6.1 introduced no new deprecations.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>EmberData <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">broke from Lockstep versioning in November 2023</a>. Under the new policy, EmberData 5.3 is an LTS that supports <code>ember-source</code> 5.12 and <code>ember-source</code> 6.0. More compatibility info is available in the <a href="https://github.com/emberjs/data#compatibility">README</a>.</p>
<p>EmberData is also in the process of rebranding to WarpDrive. Stay tuned for more info!</p>
<p>This support extends beyond bug-fixes. If minor enhancements can be made to better support new presentation class implementations that support the 5.x series we will willingly accept them. Our goal is that we want no one left behind.</p>
<p>To learn about the motivation and goals for upcoming changes to EmberData in 5.x,
read the <a href="https://blog.emberjs.com/ember-data-5-x-update-2023-04-15/">blog post, EmberData 5.X Update</a>.</p>
<!-- alex ignore retext-equality -->
<p>This will help you form the mental model of what to expect across the 5.x series,
and understand deprecation removals in the context of the upcoming goals.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli61">Changes in Ember CLI 6.1</h3>
<h4 id="bugfixes-1">Bug fixes</h4>
<p>Ember CLI 6.1 introduced 2 bug fixes and backported one of the fixes to 6.0.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10564">#10564</a> - Add missing package for TS eslint config.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10527">#10527</a> - Update <code>@ember/test-helpers</code>, which was causing problems for the <code>cli@6.0.0</code> blueprints, since <code>test-helpers</code> 3.3.1 has a peer-dep on <code>ember-source</code> 4 || 5, while the blueprint has <code>ember-source@~6.0.0</code>.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10563">#10563</a> - Backport of the above fix to 6.0.</li>
</ul>
<h4 id="features-1">Features</h4>
<p>Ember CLI 6.1 introduced 2 new features in a single pull request.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10516">#10516</a> - Adds support for <code>eslint</code> 9 and the <a href="https://eslint.org/blog/2022/08/new-config-system-part-2/">new flat config system</a> and also adds support for <code>gjs</code> / <code>gts</code> by default.</li>
</ul>
<p>There were also several internal dependency updates you can find <a href="https://github.com/ember-cli/ember-cli/blob/master/CHANGELOG.md#v610">here</a>.</p>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 6.1 introduced no new deprecations.</p>
<p>For more details on the changes in Ember CLI 6.1 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v6.1.0">Ember CLI 6.1.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-6-1</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-6-1</guid><pubDate>Sat, 28 Dec 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.10 Released]]></title><description><![CDATA[<!-- alex ignore just -->
<p>The Ember project is excited to announce the release of Ember v6.10. This is a standard minor release as part of the <a href="https://emberjs.com/releases/">standard Ember Release Train process</a>. This release takes a big swing at cleaning up the blueprint for newly generated Ember apps by updating deprecated dependencies and upgrading the use of WarpDrive and Glint 🎉 Keep reading to find out more!</p>
<h2 id="emberjs610">Ember.js 6.10</h2>
<p>Ember.js 6.10 does not introduce any new features, but we have added one deprecation related to how the <code>ember-source</code> package will be published going forward.</p>
<h3 id="deprecatingembervendorbundles">Deprecating Ember Vendor Bundles</h3>
<p>Today, the published <code>ember-source</code> package contains several AMD-specific bundled builds of Ember that are appended to vendor.js in the classic build system. This used to be the main way that people got the Ember framework code into their apps before we started <a href="/ember-released-6-8/#toc_embroider-and-vite-by-default">generating new apps with Vite and Embroider in Ember 6.8</a>. Since then, for newly generated apps, the Vite build system would access the ESM sources in the published <code>ember-source</code> package directly.</p>
<p>For anyone who has not yet upgraded their build system to Vite, they will still be getting the old build behaviour where the pre-built AMD bundles will be added to vendor.js. The newly added deprecation will mean that after Ember 7.0 we will no longer publish <code>ember-source</code> with these pre-built AMD bundles and apps that are on the classic build system will start to consume <code>ember-source</code> via <code>ember-auto-import</code> in the same way as any other v2 addon (<code>ember-source</code> has been published as a v2 addon since <a href="/ember-released-6-1">Ember 6.1</a>). Most apps won't notice any difference once this change happens, and if you want to opt-into the behaviour early (and silence the deprecation) you can enable the new <code>use-ember-modules</code> optional feature which is described in the <a href="https://deprecations.emberjs.com/id/using-amd-bundles">AMD bundles deprecation guide</a>.</p>
<p>For more information and motivation you can check out the <a href="https://rfcs.emberjs.com/id/1101-deprecate-ember-vendor-bundles/">Deprecate Ember Vendor Bundles RFC</a></p>
<h2 id="embercliv610">Ember CLI v6.10</h2>
<p>Ember CLI has made a significant improvement to the number of reported package deprecations when installing a new application. There have also been some modernisations added to the default <code>@ember/app-blueprint</code> so that new apps are genrated using the <code>@warp-drive/*</code> packages and default WarpDrive setup (instead of the old <code>ember-data</code> pacakge), and Typescript apps are now generated with Glint 2. We have also stopped installing <code>tracked-built-ins</code> in newly generated ember apps because they are actually built-in now, and we have finally dropped <code>ember-auto-import</code> from the default blueprint.</p>
<p>Note: <code>ember-cli</code> has updated its required Node version to at least v20.19.0 because some of the dependency updates need <a href="https://nodejs.org/docs/latest-v20.x/api/modules.html#loading-ecmascript-modules-using-require">support for requiring ESM</a></p>
<h3 id="packageupdates">Package updates</h3>
<p>Usually updating dependencies doesn't make it to the highlight reel of a release, but this has been a major effort by <a href="https://github.com/bertdeblock">Bert De Block</a> who painstakingly went through all the dependencies of ember-cli and updated them all to the latest major and made any necessary changes as part of that upgrade. This <code>ember-cli</code> version also brings in the new major version of <code>broccoli</code>  which itself has had a bit of a package cleanup thanks to <a href="https://github.com/kategengler">Katie Gengler</a>. There is an ongoing effort to clean up all the remaining npm package deprecations when generating a new Ember app so watch this space for more updates!</p>
<h3 id="modernwarpdrivepackages">Modern WarpDrive Packages</h3>
<p>In case you didn't know, <code>ember-data</code> is in the process of rebranding itself to <a href="https://warp-drive.io/">WarpDrive</a>. It's mosly the same <code>ember-data</code> that we know and love, but it's starting to feel a lot more modern and fits in a lot better with the increasingly modern-feeling Ember ecosystem. For the past few versions <code>ember-data</code> has already been powered by the new <code>@warp-drive/*</code> packages, but this version is the first time that we drop the old <code>ember-data</code> package and start using WarpDrive packages directly.</p>
<p>Everything you are used to in <code>ember-data</code> should still work because for now the WarpDrive setup is being installed with <code>legacyMode</code> turned on. We haven't yet updated the Ember Guides to start using the more modern WarpDrive features (like schemas) so that will be something we communicate more about in upcoming releases</p>
<h3 id="glintv2">Glint v2</h3>
<p>Glint is the system that Ember uses to allow type-checking of your Glimmer templates. When Glint was first created it did a number of weird and wonderful hacks on top of <code>tsc</code> to get things to work, but this was hard to manage and always a bit brittle. Glint v2 is built on top of the <a href="https://volarjs.dev/">Volar.js Embedded Language Tooling Framework</a> and is specifically designed to work very well with GTS files. In this release we are generating new apps that use the <code>--typescript</code> flag with Glint v2 set up. If you are upgrading you can check out the <a href="https://typed-ember.gitbook.io/glint/v2-upgrade">Glint v2 upgrade guide</a> for more information.</p>
<h3 id="trackedbuiltinsactuallybuiltin">tracked-built-ins actually built-in</h3>
<p><code>tracked-built-ins</code> is a very useful addon with a collection of utilities like <code>TrackedObject</code>, <code>TrackedArray</code>, <code>TrackedMap</code>, etc. that we have been installing by default in new Ember apps since Ember v5.2. These utilities have been <a href="/ember-released-6-8#toc_emberreactivecollections">available in <code>ember-source</code> directly since v6.8</a> so in this release we have removed <code>tracked-built-ins</code> from the default addons in new applications.</p>
<h3 id="emberautoimportremoved">ember-auto-import removed</h3>
<p>Since we moved to using the <a href="/ember-released-6-8#toc_embroider-and-vite-by-default">Vite build system by default in v6.8</a> <code>ember-auto-import</code> has been completely inactive in new applications, but we weren't able to remove it from dependencies because of a bug. This may seem like a small thing to highlight in the release, but it has a decently large impact because even though we weren't actively using webpack for anything in the new build system, <code>ember-auto-import</code> was pulling in <code>webpack</code> as a peer dependency. So this change will stop you either installing unnecessary packages, remove missing peer warnings, or stop it being an error (depending on your package manager's approach to peers).</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-6-10</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-6-10</guid><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.11 Released]]></title><description><![CDATA[<!-- alex ignore just -->
<p>The Ember project is excited to announce the release of Ember v6.11. This is a standard minor release as part of the <a href="https://emberjs.com/releases/">standard Ember Release Train process</a>. This release is relatively light, considering the big things that we have released recently, but contains some very useful bugfixes and enhancements 💪</p>
<h2 id="emberjs611">Ember.js 6.11</h2>
<p>Ember.js 6.11 introduces no new features, fixes one bug related to using the new <code>@ember/reactive</code> namespace in Classic builds (for those not yet using the default Embroider+Vite build), and ships one minor enhancement that improves the developer experience of people using auto-complete in an IDE.</p>
<h3 id="addingemberreactivetotheamdbundles">Adding <code>@ember/reactive</code> to the AMD bundles.</h3>
<p>If you are already using the new default Vite-based build system you can skip this one because it only affects people still on the Classic ember-cli-based build system.</p>
<p><code>@ember/reactive</code> was <a href="/ember-released-6-8/#toc_emberreactivecollections">released in Ember@6.8</a> and provides built-in tracking utilities for common collection types (you can read more about it in the <a href="https://rfcs.emberjs.com/id/1068-tracked-collections/">Built in tracking utilities for common collections RFC</a>). For anyone already building their apps on Vite, or on Embroider@3 with Webpack and the <code>staticEmberSource: true</code> setting turned on, they would have been able to import from <code>@ember/reactive</code> without any problem.</p>
<p>Ember apps still using ember-cli for their build system don't use the sub-packages from the <code>ember-source</code> npm package directly, but instead rely on a pre-compiled vendor asset that defines all the "packages" available to import using AMD. This bugfix makes sure that <code>@ember/reactive</code> is included in those pre-compiled AMD bundles. To understand more about the AMD bundles you can check out the <a href="https://rfcs.emberjs.com/id/1101-deprecate-ember-vendor-bundles/">Deprecate Ember Vendor Bundles RFC</a> that explains more of the context.</p>
<p>Fixed in <a href="https://github.com/emberjs/ember.js/pull/21024">emberjs/ember.js PR#21024</a></p>
<h3 id="renamedefaultexportglimmercomponenttocomponentforautocompletedx">Rename default export GlimmerComponent to Component for autocomplete DX</h3>
<p>This is a very minor enhancement to the internals of the Ember codebase that helps give better hints to TypeScript autocomplete. You can read more about it in the <a href="https://github.com/emberjs/ember.js/pull/21014">description of PR #21014 that added this enhancement</a> but the short summary is that when you are typing "Component" in your editor (such as VSCode), you would never get an autocomplete suggestion to add the import statement:</p>
<p><code>import Component from '@glimmer/component'</code></p>
<p>This is because the internal name for the default export from <code>@glimmer/component</code> was actually called "GlimmerComponent". Now when you write "Component" in your editor you will be given a choice between <code>@glimmer/component</code> or <code>@ember/component</code>.</p>
<p>Introduced in <a href="https://github.com/emberjs/ember.js/pull/21014">emberjs/ember.js PR#21014</a></p>
<h2 id="embercliv611">Ember CLI v6.11</h2>
<p>Ember CLI had no new features, but fixed one bug in the configuration of babel for newly generated apps.</p>
<h3 id="fixdecoratortransformsruntimepathinbabelconfigmjs">Fix decorator-transforms runtime path in babel.config.mjs</h3>
<p>In the <code>@ember/app-blueprint@6.10.0</code> the <code>babel.config.cjs</code> was moved to <code>babel.config.mjs</code>. For most cases this doesn't make any difference. The one thing that can change when moving from CommonJS to ESM is how you resolve other modules. In CommonJS, in Node, you can use <code>require.resolve()</code> to get the <strong>path</strong> to another module using Node resolution rules. We used this in the default babel config to resolve the path to the runtime module you need for <a href="https://github.com/ef4/decorator-transforms">decorator-transforms</a>. When swapping to ESM, you need to update any <code>require.resolve()</code> to use the newer <code>import.meta.resolve()</code> function to locate that module. This can cause a subtle problem because <code>import.meta.resolve()</code> does not return a <strong>path</strong> but instead it returns a <strong>fileURL</strong>. The parts of babel that need to read the path to the runtime module for <code>decorator-transforms</code> don't understand fileURLs so we needed to pass the fileURL returned from <code>import.meta.resolve()</code> through the <code>fileURLToPath()</code> function.</p>
<p>This change has also been backported to <code>@ember/app-blueprint@6.10.5</code></p>
<p>Fixed in <a href="https://github.com/ember-cli/ember-app-blueprint/pull/226">ember-cli/ember-app-blueprint PR#226</a></p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-6-11</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-6-11</guid><pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.2 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 6.2 of Ember.js and Ember CLI.</p>
<p>This release kicks off the 6.3 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs62">Changes in Ember.js 6.2</h3>
<p>Ember.js 6.2 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 6.2 introduced 1 bug fix.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20811">20811</a> - fixes a type bug that prevented using the latest version of TypeScript.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 6.2 introduced no new features, but it did include several pieces of clean up:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20798">20798</a> - Remove old code that supported old ember-test-helpers</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20809">20809</a> - Remove long enabled EMBER<em>TYPESCRIPT</em>BLUEPRINTS feature flag</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 6.2 introduced no new deprecations.</p>
<p>For more details on changes in Ember.js 6.2, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v6.2.0-ember-source">Ember.js 6.2.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>EmberData <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">broke from Lockstep versioning in November 2023</a>. Under the new policy, EmberData 5.3 is an LTS that supports <code>ember-source</code> 5.12 and <code>ember-source</code> 6.0. More compatibility info is available in the <a href="https://github.com/emberjs/data#compatibility">README</a>.</p>
<p>EmberData is also in the process of rebranding to WarpDrive. Stay tuned for more info!</p>
<p>This support extends beyond bug-fixes. If minor enhancements can be made to better support new presentation class implementations that support the 5.x series we will willingly accept them. Our goal is that we want no one left behind.</p>
<p>To learn about the motivation and goals for upcoming changes to EmberData in 5.x,
read the <a href="https://blog.emberjs.com/ember-data-5-x-update-2023-04-15/">blog post, EmberData 5.X Update</a>.</p>
<!-- alex ignore retext-equality -->
<p>This will help you form the mental model of what to expect across the 5.x series,
and understand deprecation removals in the context of the upcoming goals.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli62">Changes in Ember CLI 6.2</h3>
<h4 id="bugfixes-1">Bug fixes</h4>
<p>Ember CLI 6.2 introduced no new bug fixes.</p>
<h4 id="features-1">Features</h4>
<p>Ember CLI 6.2 introduced 1 new feature.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10562">10562</a> - Allow creating apps and addons everywhere, including inside of a project directory.</li>
</ul>
<p>There were also several pieces of cleanup, enhancements and internal dependency updates:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10496">10496</a> - Clean up support for incorrect values for BROCCOLI_VIZ env var</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10555">10555</a> - Bump pnpm/action-setup to v4 in app and addon blueprints</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10577">10577</a> - Remove @ember/string from app blueprint</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10578">10578</a> - Test against Node v22</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10579">10579</a> - Update sort-package-json</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10580">10580</a> - Update LTS versions in blueprints</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10583">10583</a> - Update app blueprint to support ember-qunit v9</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10585">10585</a> - Support WRITE_FIXTURES in more test files</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 6.2 introduced no new deprecations.</p>
<p>For more details on the changes in Ember CLI 6.2 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v6.2.0">Ember CLI 6.2.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-6-2</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-6-2</guid><pubDate>Sat, 22 Feb 2025 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.3 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 6.3 of Ember.js and Ember CLI.</p>
<p>This release kicks off the 6.4 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs63">Changes in Ember.js 6.3</h3>
<p>Ember.js 6.3 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 6.3 includes 1 noteworthy bug fix:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20825">#20825</a> Remove the <code>helper</code> wrapper from the helper generator; <a href="https://guides.emberjs.com/release/components/helper-functions/#toc_global-helper-functions">Plain functions as helpers</a> have been supported since v4.5.</li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 6.3 introduces 1 new feature.</p>
<h5 id="20800httpsgithubcomemberjsemberjspull20800templatetagsupportinroutes"><a href="https://github.com/emberjs/ember.js/pull/20800">#20800</a> Template Tag support in Routes</h5>
<p>Following <a href="https://rfcs.emberjs.com/id/1046-template-tag-in-routes/">RFC #1046</a>, Ember now supports the use of <code>&lt;template&gt;</code> authoring-format Glimmer components (gjs | gts) in place of route templates.</p>
<p>This is a replacement for the <a href="https://github.com/discourse/ember-route-template">ember-route-template</a> addon.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 6.3 introduces 1 new deprecation.</p>
<h5 id="20526httpsgithubcomemberjsemberjspull20526deprecatesimportinginjectfromemberservice"><a href="https://github.com/emberjs/ember.js/pull/20526">#20526</a> Deprecates importing inject from @ember/service.</h5>
<p>The export is renamed to service per <a href="https://rfcs.emberjs.com/id/0752-inject-service/">RFC #0752</a>. See the <a href="https://deprecations.emberjs.com/id/importing-inject-from-ember-service">deprecation guide</a> for more information.</p>
<p>For more details on changes in Ember.js 6.3, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v6.3.0-ember-source">Ember.js 6.3.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>EmberData <a href="https://blog.emberjs.com/updates-to-ember-data-versioning-strategy">broke from Lockstep versioning in November 2023</a>. Under the new policy, EmberData 5.3 is an LTS that supports <code>ember-source</code> 5.12 and <code>ember-source</code> 6.0. More compatibility info is available in the <a href="https://github.com/emberjs/data#compatibility">README</a>.</p>
<p>EmberData is also in the process of rebranding to WarpDrive. Stay tuned for more info!</p>
<p>This support extends beyond bug-fixes. If minor enhancements can be made to better support new presentation class implementations that support the 5.x series we will willingly accept them. Our goal is that we want no one left behind.</p>
<p>To learn about the motivation and goals for upcoming changes to EmberData in 5.x,
read the <a href="https://blog.emberjs.com/ember-data-5-x-update-2023-04-15/">blog post, EmberData 5.X Update</a>.</p>
<!-- alex ignore retext-equality -->
<p>This will help you form the mental model of what to expect across the 5.x series,
and understand deprecation removals in the context of the upcoming goals.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli63">Changes in Ember CLI 6.3</h3>
<h4 id="bugfixes-1">Bug fixes</h4>
<p>Ember CLI 6.3 includes 4 noteworthy bug fixes:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10612">#10612</a> Fix ember-data TS config in monorepo when using npm or yarn v1</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10592">#10592</a> Fix ESLint config for v1 addons</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10633">#10633</a> / <a href="https://github.com/ember-cli/ember-cli/pull/10638">#10638</a> Fix Ember Data package versions in the blueprint</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10643">#10643</a> Remove unmaintained ember-cli-lodash-subset in favor of requiring functions directly from lodash</li>
</ul>
<h4 id="features-1">Features</h4>
<p>Ember CLI 6.3 introduces 5 new feature and noteworthy enhancements:</p>
<h5 id="vanillaprettiersetupperrfc1055httpsrfcsemberjscomid1055vanillaprettiersetupinblueprints">Vanilla <code>Prettier</code> setup per <a href="https://rfcs.emberjs.com/id/1055-vanilla-prettier-setup-in-blueprints">RFC #1055</a></h5>
<p><a href="https://github.com/ember-cli/ember-cli/pull/10596">#10596</a> moves the default <a href="https://prettier.io/"><code>Prettier</code></a> setup to no longer be run through linters (ESLint, Stylelint) but to be run directly.
The following scripts are adding to package.json via the blueprint:</p>
<ul>
<li><code>npm run format</code> runs <code>prettier . --cache --write</code>. This will format all files with Prettier that are not ignored in the Prettier configuration. Previously this would only have applied to files configured in your linters. <code>npm run lint:fix</code> will run this command.</li>
<li><code>npm run lint:format</code> runs <code>prettier . --cache --check</code> This runs <code>prettier</code> as a linter and allows <code>npm run lint</code> to fail if prettier has not run.</li>
</ul>
<p>As noted in the RFC: we use <code>format</code> instead of <code>lint:format:fix</code>, because we don't want to run Prettier parallel to ESLint and Stylelint when fixing lint errors. The <code>lint:fix</code> script will always run <code>format</code> last to avoid competing changes.</p>
<p>Prettier will now run over all files, not just JavaScript and TypeScript. Files can be excludde by adding globs to the <a href="https://prettier.io/docs/ignore"><code>.prettierignore</code> file</a>.</p>
<h5 id="addemberclideprecationworkflowtoappblueprintperrfc1009httpsrfcsemberjscomid1009movedeprecationworkflowtoapps">Add ember-cli-deprecation-workflow to app blueprint per <a href="https://rfcs.emberjs.com/id/1009-move-deprecation-workflow-to-apps">RFC #1009</a></h5>
<p><a href="https://github.com/ember-cli/ember-cli/pull/10588">#10588</a> Adds the <code>ember-cli-deprecation-workflow</code> addon to the default blueprint for apps and generates the setup for the addon as well.</p>
<p>The addon enables collecting deprecations as they happen and creating a configuration so that you can silence deprecations or make them throw. See <a href="https://github.com/ember-cli/ember-cli-deprecation-workflow#ember-cli-deprecation-workflow">the README</a> for more information.</p>
<p>For example, you may wish to silence a deprecation that is coming from an addon while you await an updated version, or you may wish to cause a deprecation to throw that you have already cleared and do not wish to allow to regress.</p>
<h5 id="otherenhancementsofnote">Other enhancements of note</h5>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10613">#10613</a> Support --ember-data / --no-ember-data flags when creating a new app</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10617">#10617</a> Use <code>staticInvokables</code> in the app (embroider) blueprint</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10595">#10595</a> Update @glimmer/component to v2 in blueprints</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 6.3 introduces 1 new deprecation:</p>
<h5 id="deprecatev1addoncontentfortypesperrfc1029httpsrfcsemberjscomid1029deprecateappprefix">Deprecate v1 addon <code>contentFor</code> types per <a href="https://rfcs.emberjs.com/id/1029-deprecate-app-prefix/">RFC #1029</a></h5>
<p><a href="https://github.com/ember-cli/ember-cli/pull/10589">#10589</a> deprecates <code>contentFor</code> with the following types:</p>
<ul>
<li>app-prefix</li>
<li>app-suffix</li>
<li>tests-prefix</li>
<li>tests-suffix</li>
<li>vendor-prefix</li>
<li>vendor-suffix</li>
</ul>
<p>The deprecation guide is not yet published but the content can be read in the <a href="https://rfcs.emberjs.com/id/1029-deprecate-app-prefix/">RFC</a>.</p>
<p>For more details on the changes in Ember CLI 6.3 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v6.3.0">Ember CLI 6.3.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-6-3</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-6-3</guid><pubDate>Fri, 28 Mar 2025 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.4 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 6.4 of Ember.js and Ember CLI. This release of Ember.js is an LTS (Long Term Support) candidate. LTS candidates prioritize stability over the addition of new features, and have an extended support schedule.</p>
<p>This release kicks off the 6.5 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs64">Changes in Ember.js 6.4</h3>
<p>Ember.js 6.4 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 6.4 includes 4 noteworthy bug fixes:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20842">#20842</a> / <a href="https://github.com/emberjs/ember.js/pull/20864">#20864</a> Upgrade glimmer-vm.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20872">#20872</a> <code>{{debugger}}</code> will now work again in templates</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20850">#20850</a> Correct publication of source maps for ember-source</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20867">#20867</a> Fix LOG_VERSIONS.</li>
</ul>
<h4 id="potentiallybreaking">Potentially Breaking</h4>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20842">#20842</a> [BREAKING] Drop support for TypeScript 4.9 to allow for glimmer-vm upgrade.<ul>
<li>Ember now tests against TypeScript 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7.
Per the rolling support window, following <a href="https://www.semver-ts.org/">Semantic Versioning for TypeScript Types</a>, the supported range of TypeScript versions across two Ember LTS releases must always overlap.
For more examples, see the <a href="https://blog.emberjs.com/stable-typescript-types-in-ember-5-1/">Stability heading in this blog post</a>.</li>
<li>We now require consumers use <code>verbatimModuleSyntax</code>.</li></ul></li>
</ul>
<h4 id="features">Features</h4>
<p>Ember.js 6.4 introduces no new features.</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 6.4 introduces no new deprecations.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>EmberData 5.4 has been released with many updates that will be more extensively covered in a full stand alone blog post.</p>
<p>EmberData is also in the process of rebranding to WarpDrive. Stay tuned for more info!</p>
<p>To learn about the motivation and goals for upcoming changes to EmberData in 5.x,
read the <a href="https://blog.emberjs.com/ember-data-5-x-update-2023-04-15/">blog post, EmberData 5.X Update</a>.</p>
<!-- alex ignore retext-equality -->
<p>This will help you form the mental model of what to expect across the 5.x series,
and understand deprecation removals in the context of the upcoming goals.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli64">Changes in Ember CLI 6.4</h3>
<h4 id="bugfixes-1">Bug fixes</h4>
<p>Ember CLI 6.4 includes 4 bug fixes:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10685">#10685</a> Add configuration to opt new projects out of the deprecated behavior of the Store class extending EmberObject. If upgrading you may need to alter this configuration when updating with <code>ember-cli-update</code> or otherwise applying the blueprint.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10620">#10620</a> Handle errors gracefully when proxy target is down.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10641">#10641</a> Fix eslint parser for js when using --typescript flag.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10659/files">#10659</a> Improve de-typing .gts files.</li>
</ul>
<h4 id="features-1">Features</h4>
<p>Ember CLI 6.4 introduces 1 new feature:</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10661">#10661</a> Update ember-try to v4 in blueprints.</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 6.4 introduces no new deprecations.</p>
<p>For more details on the changes in Ember CLI 6.4 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v6.4.0">Ember CLI 6.4.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-6-4</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-6-4</guid><pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.5 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 6.5 of Ember.js and Ember CLI.</p>
<p>Version 6.4 of Ember.js is now promoted to LTS (Long Term Support). The current LTS version of EmberData remains at version 5.3. An LTS version of Ember continues to receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks). LTS releases typically occur every four minor versions. The previous LTS version of Ember.js was 5.8.</p>
<p>This release kicks off the 6.6 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs65">Changes in Ember.js 6.5</h3>
<p>Ember.js 6.5 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 6.5 introduced no bug fixes.</p>
<h4 id="features">Features</h4>
<p>Ember.js 6.5 introduces 2 new features:</p>
<ul>
<li>A <code>--route-authoring-format=strict</code> option has been added to the route generator to generate template-tag components as route templates per <a href="https://rfcs.emberjs.com/id/1046-template-tag-in-routes">RFC #1046</a>.</li>
<li>Options <code>--strict</code> or <code>--tt</code> were added to the Component blueprint to generate template-tag components per <a href="https://rfcs.emberjs.com/id/0779-first-class-component-templates">RFC #0779</a>.</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 6.5 introduces 1 new deprecation:</p>
<ul>
<li><code>import Ember from 'ember'</code> has been deprecated per <a href="https://rfcs.emberjs.com/id/1003-deprecation-import-ember-from-ember">RFC #1003</a>. This deprecates many APIs that were available off of that Ember import. The deprecation guides for each of those APIs can be found <a href="https://deprecations.emberjs.com/v6.x">here</a>.</li>
</ul>
<p>For more details on changes in Ember.js 6.5, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v6.5.0-ember-source">Ember.js 6.5.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>EmberData 5.5 has been released, and along with EmberData 5.4, there are many updates that will be more extensively covered in a full stand alone blog post.</p>
<p>EmberData is also in the process of rebranding to WarpDrive. Stay tuned for more info!</p>
<p>To learn about the motivation and goals for upcoming changes to EmberData in 5.x,
read the <a href="https://blog.emberjs.com/ember-data-5-x-update-2023-04-15/">blog post, EmberData 5.X Update</a>.</p>
<!-- alex ignore retext-equality -->
<p>This will help you form the mental model of what to expect across the 5.x series,
and understand deprecation removals in the context of the upcoming goals.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli65">Changes in Ember CLI 6.5</h3>
<h4 id="bugfixes-1">Bug fixes</h4>
<p>Ember CLI 6.5 introduced no bug fixes.</p>
<h4 id="features-1">Features</h4>
<p>Ember CLI 6.5 introduces 1 new feature:</p>
<ul>
<li>A <code>--strict</code> flag is now available for <code>ember new</code> and <code>ember addon</code> to generate components and routes as template-tag components per <a href="https://rfcs.emberjs.com/id/1046-template-tag-in-routes">RFC #1046</a> and <a href="https://rfcs.emberjs.com/id/0779-first-class-component-templates">RFC #0779</a>.</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 6.5 introduces no new deprecations.</p>
<p>For more details on the changes in Ember CLI 6.5 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v6.5.0-ember-cli">Ember CLI 6.5.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-6-5</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-6-5</guid><pubDate>Fri, 04 Jul 2025 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.6 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 6.6 of Ember.js and Ember CLI.</p>
<p>This release kicks off the 6.7 beta cycle for all sub-projects. We encourage our community (especially addon authors) to help test these beta builds and report any bugs before they are published as a final release in six weeks' time. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>You can read more about our general release process here:</p>
<ul>
<li><a href="http://emberjs.com/releases/">Release Dashboard</a></li>
<li><a href="https://blog.emberjs.com/new-ember-release-process/">The Ember Release Cycle</a></li>
<li><a href="https://blog.emberjs.com/ember-project-at-2-0/">The Ember Project</a></li>
<li><a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a></li>
</ul>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs66">Changes in Ember.js 6.6</h3>
<p>Ember.js 6.6 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<p>Ember.js 6.6 introduced a few pieces of clean up, but generally introduced no new features, bug fixes or deprecations.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20909">#20909</a> - remove microtask in runtime compiler.</li>
<li><a href="https://github.com/emberjs/ember.js/pull/20627">#20627</a> - remove escapeExpression from <code>@ember/template</code>.</li>
</ul>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 6.6 introduced 0 bug fixes.</p>
<h4 id="features">Features</h4>
<p>Ember.js 6.6 introduces 0 new features:</p>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 6.6 introduces 0 new deprecation:</p>
<p>For more details on changes in Ember.js 6.6, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v6.6.0-ember-source">Ember.js 6.6.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>EmberData 5.6 has been released, and along with EmberData 5.5 and 5.4, there are many updates that will be more extensively covered in a full stand alone blog post.</p>
<p>EmberData is also in the process of rebranding to WarpDrive. Stay tuned for more info!</p>
<p>To learn about the motivation and goals for upcoming changes to EmberData in 5.x,
read the <a href="https://blog.emberjs.com/ember-data-5-x-update-2023-04-15/">blog post, EmberData 5.X Update</a>.</p>
<!-- alex ignore retext-equality -->
<p>This will help you form the mental model of what to expect across the 5.x series,
and understand deprecation removals in the context of the upcoming goals.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli66">Changes in Ember CLI 6.6</h3>
<h4 id="bugfixes-1">Bug fixes</h4>
<p>Ember CLI 6.6 introduced 2 bug fixes.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10711">#10711</a> - fix yuidoc generation on publish.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10702">#10702</a> - update ember-data and unify the versions between <code>@</code> and non-<code>@</code>.</li>
</ul>
<h4 id="features-1">Features</h4>
<p>Ember CLI 6.6 introduces 4 new features and pieces of cleanup.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10749">#10749</a> - Update all dependencies for 6.6 release.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10751">#10751</a> - Backport drop node 18.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10701">#10701</a> - Support Bun.</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10664">#10664</a> - Remove ember-fetch.</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 6.6 introduces 0 new deprecations.</p>
<p>For more details on the changes in Ember CLI 6.6 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v6.6.0-ember-cli">Ember CLI 6.6.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-6-6</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-6-6</guid><pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.7 Released]]></title><description><![CDATA[<p>Today the Ember project is releasing version 6.7 of Ember.js and Ember CLI.</p>
<p>A release of Ember is comprised of many projects: ember-source, ember-cli, and all the learning team projects. We follow a <a href="http://emberjs.com/releases/">6-week release train</a> that includes alpha and beta cycles to ensure changes are well-tested. We encourage our community (especially addon authors) to help test the beta builds and report any bugs before they are published as a final release. The <code>ember-try</code> addon is a great way to continuously test your projects against the latest Ember releases. While we only consider the release to be complete upon publication of the blog post, the 6-week cycle is anchored by the release of the ember-source package at the beginning of the process. Releases x.4, x.8 and x.12 will become an LTS candidate, so checkout <a href="https://blog.emberjs.com/announcing-embers-first-lts/">Ember LTS Releases</a> if you want to know more.</p>
<hr />
<h2 id="emberjs">Ember.js</h2>
<p>Ember.js is the core framework for building ambitious web applications.</p>
<h3 id="changesinemberjs67">Changes in Ember.js 6.7</h3>
<p>Ember.js 6.7 is an incremental, backwards compatible release of Ember with bug fixes, performance improvements, and minor deprecations.</p>
<h4 id="bugfixes">Bug fixes</h4>
<p>Ember.js 6.7 introduced no unreleased bug fixes.</p>
<h4 id="features">Features</h4>
<p>Ember.js 6.7 introduces no new features, but includes 1 enhancement:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20939">#20939</a> Adds <code>import { trustHTML } from '@ember/template';</code> as an alias of `import { htmlSafe } from '@ember/template', for naming that better matches the behavior.</li>
</ul>
<h4 id="deprecations">Deprecations</h4>
<p>Ember.js 6.7 introduces no new deprecations.</p>
<p>For more details on changes in Ember.js 6.7, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v6.7.0-ember-source">Ember.js 6.7.0 release page</a>.</p>
<hr />
<h2 id="emberdata">EmberData</h2>
<p>EmberData is the official data persistence library for Ember.js applications.</p>
<p>EmberData 5.7 has been released, and along with EmberData 5.6, 5.5 and 5.4, there are many updates that will be more extensively covered in a full stand alone blog post.</p>
<p>EmberData is also in the process of rebranding to WarpDrive. Stay tuned for more info!</p>
<p>To learn about the motivation and goals for upcoming changes to EmberData in 5.x,
read the <a href="https://blog.emberjs.com/ember-data-5-x-update-2023-04-15/">blog post, EmberData 5.X Update</a>.</p>
<!-- alex ignore retext-equality -->
<p>This will help you form the mental model of what to expect across the 5.x series,
and understand deprecation removals in the context of the upcoming goals.</p>
<hr />
<h2 id="embercli">Ember CLI</h2>
<p>Ember CLI is the command line interface for managing and packaging Ember.js applications.</p>
<h3 id="upgradingembercli">Upgrading Ember CLI</h3>
<p>You may upgrade Ember CLI using the <code>ember-cli-update</code> project:</p>
<pre><code class="bash language-bash">npx ember-cli-update
</code></pre>
<p>This utility will help you to update your app or addon to the latest Ember CLI version. You will probably encounter merge conflicts, in which the default behavior is to let you resolve conflicts on your own. For more information on the <code>ember-cli-update</code> project, see <a href="https://github.com/ember-cli/ember-cli-update">the GitHub README</a>.</p>
<p>It is not required to keep Ember CLI versions in sync with Ember and EmberData. After updating ember-cli, you can keep your current version(s) of Ember or EmberData by editing <code>package.json</code> to revert the changes to the lines containing <code>ember-source</code> and <code>ember-data</code>.</p>
<h3 id="changesinembercli67">Changes in Ember CLI 6.7</h3>
<h4 id="bugfixes-1">Bug fixes</h4>
<p>Ember CLI 6.7 introduced 1 bug fix.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10794">#10794</a> fixes a null pointer exception, this bug seems to have been introduced since 6.4.0.</li>
</ul>
<h4 id="features-1">Features</h4>
<p>Ember CLI 6.7 introduces 1 new feature.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10742">#10742</a> drops support for Node 18, making Node 20 the default for Ember CLI and adds support for Node 24.</li>
</ul>
<h4 id="deprecations-1">Deprecations</h4>
<p>Ember CLI 6.7 introduces 0 new deprecations.</p>
<p>For more details on the changes in Ember CLI 6.7 and detailed upgrade
instructions, please review the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v6.7.0-ember-cli">Ember CLI 6.7.0 release page</a>.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-6-7</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-6-7</guid><pubDate>Wed, 03 Sep 2025 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.8 Released]]></title><description><![CDATA[<!-- alex ignore just -->
<p>The Ember project is excited to announce the release of Ember v6.8. This is a standard minor release as part of the <a href="https://emberjs.com/releases/">standard Ember Release Train process</a>, but this release isn't just like every other release! We have some exciting new framework features that unlock a new world of experimentation and our build system is now using <a href="https://vite.dev">Vite</a> by default when you generate a new app! 🎉 Keep reading to find out all the details!</p>
<h2 id="emberjsv68">Ember.js v6.8</h2>
<p>Ember.js 6.8 introduces 3 key features, 2 new things for Ember developers to use today and a new way to publish the <code>ember-source</code> package. We have also included one bugfix and there are no new deprecations.</p>
<h3 id="keyfeatures">Key Features</h3>
<h4 id="rendercomponent"><code>renderComponent</code></h4>
<p>The new <code>renderComponent</code> API provides a way to render components directly into any DOM element, making it easier to integrate components in other environments like <code>d3</code>, <code>ag-grid</code>, WYSIWYG editors, etc. This feature is particularly useful for micro applications, REPLs, and "islands"-based tools.</p>
<p><code>renderComponent</code> can be imported from <code>@ember/renderer</code> and accepts a component definition along with configuration options:</p>
<pre><code class="gjs language-gjs">import { renderComponent } from '@ember/renderer';

const Greeting = &lt;template&gt;Hello {{@name}}!&lt;/template&gt;;

const result = renderComponent(Greeting, {
  into: document.querySelector('#my-element'),
  args: { name: 'World' }
});

// Clean up when done
result.destroy();
</code></pre>
<p>The API supports several configuration options including:</p>
<ul>
<li><code>into</code>: The DOM element to render into</li>
<li><code>args</code>: Arguments to pass to the component - these can be a <code>trackedObject</code></li>
<li><code>owner</code>: Optional owner object for service access, (or minimal partial implementation of what your component needs)</li>
</ul>
<p>You can read more about this on in <a href="https://rfcs.emberjs.com/id/1099-rendercomponent/"><code>renderComponent()</code> RFC #1068</a></p>
<h4 id="emberreactivecollections"><code>@ember/reactive/collections</code></h4>
<p>Ember 6.8 introduces a new package <code>@ember/reactive/collections</code> that provides built-in tracking utilities for common collections. This package includes tracked versions of JavaScript's native collection types: <code>trackedArray</code>, <code>trackedObject</code>, <code>trackedMap</code>, <code>trackedSet</code>, <code>trackedWeakMap</code>, and <code>trackedWeakSet</code>.</p>
<p>These utilities offer performance and ergonomics improvements over what has been used via public APIs.</p>
<pre><code class="gjs language-gjs">import { trackedArray } from '@ember/reactive/collections';
import { on } from '@ember/modifier';

const items = trackedArray(['apple', 'banana']);

// usually you would have the pushed item be dynamic but this is only a demo
const addItem = (item) =&gt; items.push('cherry');

&lt;template&gt;
  {{#each items as |item|}}
    &lt;div&gt;{{item}}&lt;/div&gt;
  {{/each}}

  &lt;button type="button" {{on "click" addItem}}&gt;
    Add Item
  &lt;/button&gt;
&lt;/template&gt;
</code></pre>
<p>You can read more about this in the <a href="https://rfcs.emberjs.com/id/1068-tracked-collections/">Built in tracking utilities for common collections RFC #1068</a>.</p>
<p>This feature was inspired by <code>tracked-built-ins</code> and brings these essential reactivity primitives directly into the framework core.</p>
<h4 id="trustedpublishing">Trusted publishing</h4>
<p>v6.8.0 of <code>ember-source</code> is the first minor version of the package to be published to <code>npm</code> with <a href="https://docs.npmjs.com/trusted-publishers">Trusted Publishing</a>. We will be implementing this across all our packages.</p>
<p>At the bottom of the <a href="https://www.npmjs.com/package/ember-source">npm package page</a>, you'll find a section labeled 'Provenance' that provides verification that the package contents were published from the source repository.</p>
<h3 id="bugfixes">Bug fixes</h3>
<p>Ember.js 6.8 introduces 1 bug fix.</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/pull/20988">#20988</a> Removes unnecessary package ember-cli-htmlbars-inline-precompile from component-test blueprint</li>
</ul>
<hr />
<h2 id="embercliv68">Ember CLI v6.8</h2>
<p>Ember CLI 6.8 introduces 2 key features, a brand-new default app blueprint and a new default for generated templates. There are also 3 minor features, 5 bugfixes, and 2 new deprecations introduced.</p>
<h3 id="keyfeatures-1">Key Features</h3>
<h4 id="embroiderandvitebydefault">Embroider and Vite by default</h4>
<p>This is the first release that enables Embroider by default! 🎉 This has been a monumental effort by the whole community over many years and it represents a new era for Ember developers. The improvements to the developer experience and new capabilities are so numerous that they deserve their own blog post, but here are some of the highlights</p>
<ul>
<li>Lightning-fast rebuild speeds thanks to using <a href="https://vite.dev/">Vite</a> in development</li>
<li>Smaller and faster production builds because we no longer use AMD in production</li>
<li>You can now use any rollup-plugin or vite plugin to augment your build - no more need for ember-cli specific addons</li>
<li>More explicit build tooling - e.g. your Babel config is part of your app and no-longer managed by ember-cli, hidden away from you</li>
</ul>
<!-- alex ignore just -->
<p>These are just some of the highlights, but one key theme that has been true throughout the effort to make Vite the default build system for Ember apps is that we now have an opportunity to integrate much more seamlessly with the wider JS ecosystem. Ember is no longer working in a walled garden, forced to re-implement every good idea that the JS community comes up with. If someone comes up with a Vite plugin that does something cool, chances are that adding it to your Vite config in your Ember app will just work!</p>
<p>Anyone generating a new app using <code>ember new</code> after Ember CLI v6.8 will get an app generated with the new <code>@ember/app-blueprint</code> by default. The new app blueprint has a lot of changes, but each change is explained in great detail in the <a href="https://rfcs.emberjs.com/id/0977-v2-app-format">V2 App Format RFC</a> so it's worth taking a look to understand all the changes.</p>
<p>If you have the need to generate a new app with the classic blueprint after Ember CLI v6.8, we have provided a new blueprint <code>@ember-tooling/classic-build-app-blueprint</code>. You can opt into this blueprint with the <code>-b</code> argument:</p>
<pre><code class="bash language-bash">ember new -b @ember-tooling/classic-build-app-blueprint
</code></pre>
<p>This is not intended to be used long term, for most teams the new default Vite-based blueprint will be the right choice and it represents the intended future direction of the Ember project. Providing the legacy classic-build blueprint is in keeping with Ember's dedication to backwards compatibility and will give teams that can't yet upgrade to Vite some breathing space to upgrade at their own pace.</p>
<p>This also means that any team relying on <a href="https://github.com/ember-cli/ember-cli-update"><code>ember-cli-update</code></a> can still have an update path without being automatically upgraded to Vite. If you have an existing application and you do want to upgrade to vite you should check out the <a href="https://github.com/mainmatter/ember-vite-codemod"><code>ember-vite-codemod</code></a> which will guide you through the upgrade process.</p>
<h4 id="componentandroutestrictbydefault">Component and Route <code>--strict</code> by default</h4>
<p>Now that the default blueprint is using Vite by default it makes sense for newly generated Components and Route templates to use template-tag format (a.k.a GJS). This means that all of the templates in your app will be in "strict mode" and not look up any of the Invokables (Components, Helpers, or Modifiers) on the global resolver, but instead use local scoping to know what Invokable to use in your templates. In practice, for most people, this would mean importing any components that you are using at the top of the file that you are using them (this is why this feature is sometimes referred to as template-imports). This allows build systems to have a better understanding of where your code is coming from and can significantly improve tree-shaking and developer tooling performance.</p>
<p>With the Vite blueprint it makes sense to enable the strict-mode template generation by default, and to keep the new app blueprint and the classic app blueprint in sync we also decided to make it the default for new apps generated with the classic app blueprint. In practice this only sets the required setting in the <code>.ember-cli</code> settings file in your repo to the new default values.</p>
<p>You can read more about the specifics of this feature in the <a href="https://rfcs.emberjs.com/id/0779-first-class-component-templates">First-Class Component Templates RFC #779</a>.</p>
<h3 id="otherfeatures">Other Features</h3>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10844">#10844</a> throw an error when <code>ember (generate|destroy) (http-proxy|http-mock|server)</code> is used in a Vite-based project</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10804">#10804</a> Support a <code>--ts</code> alias for the <code>addon</code>, <code>init</code> and <code>new</code> commands</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10791">#10791</a> update the format of the ember-cli-update.json to directly target the blueprint used to generate</li>
</ul>
<h3 id="bugfixes-1">Bug fixes</h3>
<p>Ember CLI 6.8 introduced 5 bug fixes.</p>
<ul>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10826">#10826</a> move resolution of @ember/app-blueprint to prevent loading latest and always load the direct dependency of ember-cli</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10782">#10782</a> update heimdall-fs-monitor to fix error in Node 24</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10803">#10803</a> Add "ember-blueprint" to keywords in <code>package.json</code> for the classic blueprints <code>@ember-tooling/classic-build-addon-blueprint</code> and <code>@ember-tooling/classic-build-app-blueprint</code></li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10798">#10798</a> Add <code>@warp-drive/ember/install</code> to remove deprecation when generating a classic app import from ember-data breakage/deprecation</li>
<li><a href="https://github.com/ember-cli/ember-cli/pull/10707">#10707</a> Enabled recommended configs from eslint-plugin-n and eslint-plugin-qunit in the classic app blueprint</li>
</ul>
<h3 id="deprecations">Deprecations</h3>
<p>Ember CLI 6.8 introduces 2 new deprecations.</p>
<h4 id="emberinitwithfilenamesorglobs"><code>ember init</code> with file names or globs</h4>
<p><code>ember init</code> is a little known (and under documented) functionality of the <code>ember-cli</code> blueprint system. An even less known functionality was the ability to filter the files that get reinitialized by a path or a glob when running <code>ember init</code>. We know that this was a mostly unknown feature because it was never added to the <code>ember init --help</code> documentation and it has been broken for some time. Instead of trying to fix it for all the new blueprints we opted to deprecate the functionality. You can read more about the deprecation on the <a href="https://deprecations.emberjs.com/id/init-no-file-names/">deprecation guide for <code>init-no-file-names</code></a></p>
<h4 id="embernewembroider"><code>ember new --embroider</code></h4>
<p>Generating an ember app with <code>ember new --embroider</code> generated an app using Embroider@v3 with Webpack. Since Embroider@v4 and Vite is now the default for newly generated apps and provides a significantly better developer experience, nobody should be generating new apps with Embroider@v3 any more. To support people who haven't yet upgraded from Embroider@v3 to Embroider@v4 yet, we have opted not to make this argument generate a new Vite app and instead deprecated it. You can read more about the deprecation on the <a href="https://deprecations.emberjs.com/id/dont-use-embroider-option/">deprecation guide for <code>dont-use-embroider-option</code></a></p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-6-8</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-6-8</guid><pubDate>Sat, 25 Oct 2025 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember 6.9 Released]]></title><description><![CDATA[<!-- alex ignore just -->
<p>The Ember project is excited to announce the release of Ember v6.9. This is a standard minor release as part of the <a href="https://emberjs.com/releases/">standard Ember Release Train process</a>. Version 6.8 of Ember.js is now promoted to LTS (Long Term Support). An LTS version of Ember continues to receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks). LTS releases typically occur every four minor versions. The previous LTS version of Ember.js was 6.4.</p>
<h2 id="emberjsv69">Ember.js v6.9</h2>
<p>All changes in Ember.js 6.9 were internal, docs, and/or bugfixes that were backported.</p>
<hr />
<h2 id="embercliv69">Ember CLI v6.9</h2>
<p>Ember CLI 6.9 upgrades <code>broccoli</code> to <code>^4.0.0</code> and as a consequence, the minimum Node version Ember CLI supports is now 20.19. This is in accordance with our <a href="https://emberjs.com/node-support/">Node Support Policy</a>.</p>
<p>We have released a new major of <code>broccoli</code> to address security vulnerabilities and deprecations in dependencies of the package. These vulnerabilities should not have been exploitable as <code>broccoli</code> should only ever be run in a development environment but this fixes a number of <code>npm audit</code> headaches. There is more work to do here in updating our long-tail of dependencies. The major of <code>broccoli</code> is otherwise completely API-compatible. We have dropped support for <code>node</code> &lt; <code>20.19</code> because we need the <a href="https://nodejs.org/pt-br/blog/release/v20.19.0"><code>require(esm)</code></a> feature that was backported to that version.</p>
<h2 id="thankyou">Thank You!</h2>
<p>As a community-driven open-source project with an ambitious scope, each of these releases serves as a reminder that the Ember project would not have been possible without your continued support. We are extremely grateful to our contributors for their efforts.</p>]]></description><link>https://blog.emberjs.com/ember-released-6-9</link><guid isPermaLink="true">https://blog.emberjs.com/ember-released-6-9</guid><pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate></item><item><title><![CDATA[Security Releases - Ember 1.2.2, and 1.3.2]]></title><description><![CDATA[<!-- alex ignore clearly -->
<p>Because developers trust Ember.js to handle sensitive customer data in
production, we take the security of the project extremely seriously.  In
fact, we're one of the few JavaScript projects that has a <a href="/security/">clearly
outlined security policy</a> and a
<a href="https://groups.google.com/forum/#!forum/ember-security">low-traffic mailing list exclusively for security
announcements</a>.</p>
<p>Today we are announcing the release of Ember.js 1.2.2,
1.3.2, and 1.4.0-beta.6 that contain an important security fix:</p>
<ul>
<li>1.4.0-beta.6 -- <a href="https://github.com/emberjs/ember.js/compare/v1.4.0-beta.5…v1.4.0-beta.6">Compare View</a></li>
<li>1.3.2 -- <a href="https://github.com/emberjs/ember.js/compare/v1.3.1…v1.3.2">Compare View</a></li>
<li>1.2.2 -- <a href="https://github.com/emberjs/ember.js/compare/v1.2.1…v1.2.2">Compare View</a></li>
</ul>
<p>These releases contain the fix for an XSS vulnerability that
you can learn more about on our security mailing list:</p>
<ul>
<li><a href="https://groups.google.com/forum/#!topic/ember-security/1h6FRgr8lXQ">CVE-2014-0046</a></li>
</ul>
<p>It is recommended that you update immediately. In order to ease
upgrading, the only major change in each release is the security fix
(other than 1.4.0-beta.6, which is a normal beta channel release with
the fix rolled in).</p>
<p>We would like to thank Hyder Ali of <a href="https://www.zoho.com">Zoho</a>
for responsibly disclosing and working with us on the patch
and the advisory.</p>
<p>If you discover what you believe may be a security issue in Ember.js, we
ask that you follow our <a href="/security/">responsible disclosure
policy</a>.</p>
<p>If you are using Ember.js in production, please consider subscribing to
our <a href="https://groups.google.com/forum/#!forum/ember-security">security announcements mailing
list</a>.  It is
extremely low-traffic and only contains announcements such as these.</p>
<h2 id="additionalreading">Additional Reading</h2>
<ul>
<li><a href="/blog/2013/04/05/announcing-the-ember-security-policy.html">Ember.js Security Policy Announcement</a></li>
<li><a href="/security/">Ember.js Security Policy</a></li>
<li><a href="https://groups.google.com/forum/#!forum/ember-security">Ember.js Security Group</a></li>
</ul>]]></description><link>https://blog.emberjs.com/ember-security-releases</link><guid isPermaLink="true">https://blog.emberjs.com/ember-security-releases</guid><pubDate>Fri, 07 Feb 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ember v4 TypeScript Support Update]]></title><description><![CDATA[<p>The <a href="https://github.com/typed-ember">Typed Ember</a> team—<a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/dfreeman">Dan Freeman (@dfreeman)</a>, and <a href="https://github.com/jamescdavis">James Davis (@jamescdavis)</a>—is happy to announce that the <code>@types</code> type definition packages, maintained on <a href="https://github.com/DefinitelyTyped/DefinitelyTyped">Definitely Typed</a>, now have full support for Ember 4.x!</p>
<p><a href="https://www.typescriptlang.org">TypeScript</a> is "JavaScript with syntax for types.…&nbsp;a strongly typed programming language that builds on JavaScript, giving you better tooling at any scale." Using Ember will never require using TypeScript, but we aim to provide a best-in-class experience of using TypeScript, with benefits for JavaScript users too. Want to try it out? Follow <a href="https://docs.ember-cli-typescript.com">the docs</a> for <a href="https://github.com/typed-ember/ember-cli-typescript">ember-cli-typescript</a>.</p>
<p>This update for Ember v4 types brings <em>two major changes</em> with <em>two big benefits</em>.</p>
<p>The two major changes:</p>
<ul>
<li><p><strong>All APIs which were deprecated during the 3.x cycle and removed in Ember v4.0.0 have been dropped from the types.</strong> Amusingly, this includes a number of things which were deprecated in 2.x and removed at 3.0, and even a few which were deprecated the 1.x era and removed at 2.0! Additionally, a number of types representing private API have been removed, in line with our standing policy of providing types for only public APIs.</p></li>
<li><p><strong>The minimum supported TypeScript version is 4.4.</strong> This aligns with our upcoming proposal for Ember’s own TypeScript support policy, where major releases will generally adopt a recent TypeScript version as their minimum supported version, and with a support policy similar to that for browsers and Node LTS releases. (Keep your eyes open for a forthcoming RFC tackling those details!)</p></li>
</ul>
<p>The two big benefits:</p>
<ol>
<li><p><strong>If you’re a JavaScript Ember user</strong>, your editor tooling may get a bit smarter and better. VS Code (and other editors) can take advantage of these types to provide you with better autocomplete, docs, etc. and those will correctly reflect Ember v4 APIs.</p></li>
<li><p><strong>If you’re a TypeScript Ember user</strong>, you can now use v4 in your <code>@types</code> dependencies. That will give you the same benefits as JavaScript users get via the up-to-date definitions for Ember itself, but it will also catch more errors and provide <em>much</em> better feedback in many cases, because we are now using the latest and greatest features of TypeScript for these types.</p></li>
</ol>
<p>Note that we have <em>not</em> yet removed the v3 deprecations or updated the strictness of the Ember Data v4 types, but we <em>have</em> updated Ember Data’s types to use the same minimum TypeScript version and to be compatible with the changes made in Ember’s types. (Unfortunately, none of the Typed Ember maintainers has deep familiarity with Ember Data!) If you’d like to help get those up to date, reach out to us in <a href="https://discord.com/channels/480462759797063690/484421406659182603">#e-typescript on the Ember Discord</a>!</p>
<h2 id="notablechanges">Notable changes</h2>
<ul>
<li><p>The types now use <code>"strict": true</code> in their compiler options. <em>In general</em>, this will not cause you any work; instead, it means that internally the types have to be more robust, which should cause you <em>fewer</em> issues when working in strict mode yourself. However, in a few cases, it meant we caught type safety bugs during the upgrade, which may show up in changes like those listed below.</p></li>
<li><p><strong>Breaking:</strong> The types now use <code>unknown</code> in many places where <code>any</code> was previouly used.</p></li>
<li><p><strong>Breaking:</strong> many of the API types have been improved and many bugs fixed. This means that they are likely to reject a number of invocations which were allowed previously, but which would produce bugs at runtime, were misleading or confusing, etc.</p>
<p>A few notable examples:</p>
<ul>
<li>The <code>beforeModel</code> and <code>afterModel</code> hooks on <code>Route</code>s have been updated to require that you return either a <code>Promise</code> or <em>nothing</em>, since return values are otherwise ignored. If you were returning non-<code>Promise</code> values previously, you should remove those <code>return</code> statements.</li></ul>
<!-- alex ignore invalid -->
<ul>
<li>The <code>@ember/runloop</code> functions now robustly check their arguments. If you were passing invalid arguments for the callbacks, the compiler will  now catch that.</li></ul></li>
</ul>
<!-- alex ignore just -->
<ul>
<li><strong>Breaking:</strong> The <code>TestContext</code> for the callbacks used in <code>module</code>, <code>beforeEach</code>, <code>afterEach</code>, <code>test</code>, etc. has moved from <code>ember-test-helpers</code> to <code>@ember/test-helpers</code>. Having nearly everything be in <code>@ember/test-helpers</code> but <em>not</em> <code>TestContext</code> has been a persistent source of confusion over the years, and was just a bit of historical baggage left over from before <code>@ember/test-helpers</code> existed. If <a href="https://github.com/emberjs/rfcs/pull/785">RFC #0785</a> is merged, we will also be able to move away from using the <code>TestContext</code> at all!</li>
</ul>
<h2 id="upgrading">Upgrading</h2>
<p>To use these types, follow these upgrade steps:</p>
<ol>
<li><p><strong>Update your project to use TypeScript 4.4 or later.</strong> Fix any type errors this identifies (especially if you are using the recommended <code>"strict": true</code> settings).</p></li>
<li><p><strong>Update to Ember 4.0 or later.</strong> This <em>itself</em> will require removing all the deprecated code paths, which will be the major effort.</p></li>
<li><p><strong>Update to Ember Data 4.0 or later.</strong></p></li>
<li><p><strong>Update the core Ember and Ember Data types.</strong> This may mean doing a fair bit of cleanup across your code base to bring things in line with the stricter and more robust types we now supply.</p>
<ul>
<li><p>Upgrade <code>@types/ember</code> to <code>"~4.0"</code>.</p></li>
<li><p>Upgrade all <code>@types/ember__*</code> <em>except</em> <code>@types/ember__string</code> and <code>@types/ember__test-helpers</code> to <code>"~4.0"</code>.</p></li>
<li><p>Upgrade <code>@types/ember-data__*</code> to <code>"~4.0"</code>.</p></li></ul></li>
<li><p><strong>Update related types packages.</strong> Some <code>@ember/*</code> packages are versioned separately from the packages in <code>ember-source</code> and so need their own updates:</p>
<ul>
<li><p>Update <code>@types/ember__string</code> to <code>"~3.0"</code>.</p></li>
<li><p>Update <code>@ember/test-helpers</code> to <code>"~2.6"</code>. <strong>This will not compile until you complete step 6 below.</strong></p></li></ul></li>
<li><p><strong>Update testing infrastructure.</strong> While these packages are technically independent of the Ember major version, coordinating this particular upgrade required updating them in parallel.</p>
<ul>
<li><p>Upgrade to <code>ember-qunit@^5</code> and <code>@types/ember-qunit@^5</code>.</p></li>
<li><p>Anywhere you have imported <code>TestContext</code> from <code>ember-test-helpers</code>, replace it with <code>import { type TestContext } from '@ember/test-helpers';</code>. You will likely be able to merge this with existing imports from <code>@ember/test-helpers</code>.</p></li>
<li><p>Remove all references to <code>ember-test-helpers</code> from your project, and remove <code>@types/ember-test-helpers</code> from your dependencies.</p></li></ul></li>
</ol>
<p>Once everything is compiling again, you will be good to go!</p>
<p><strong>Note:</strong> you <em>must</em> generate a new lockfile, use yarn <code>resolutions</code>, or manually delete all of these <code>@types</code> package versions from your existing lock file when doing the upgrade, or you will certainly see conflicts between existing (transitive) dependencies on these types and your updated versions. This is the result of two things which are reasonable on their own but do not work together well:</p>
<ul>
<li><p>TypeScript can only type check successfully if there is only a single representation of a given type (for example, <code>EmberObject</code>). If it ends up with conflicting definitions of the same type, it has to give up because it does not know what it should choose.</p></li>
<li><p>npm and Yarn both try to preserve existing transitive dependencies and installing new copies when you bump a version. This is the safest behavior for runtime dependencies! It means that if you update a top-level dependency, if some other package is depending on a different version of it transitively, that other package does not break.</p></li>
</ul>
<h2 id="whatifigetstuck">What if I get stuck?</h2>
<p>You may hit interesting challenges in dealing with the improved type strictness in places where your code relied on the loose (or erroneous!) types before. If you are having a hard time, please reach out in <a href="https://discord.com/channels/480462759797063690/484421406659182603">#e-typescript on Discord</a> or <a href="https://github.com/typed-ember/ember-cli-typescript/discussions">start a Discussion on the ember-cli-typescript-repo</a>. The Typed Ember team is happy to help, and many other people in the community are as well.</p>
<p>Also, while we’ve done our very best to make this totally bug-free, it’s entirely possible that we missed something or made a mistake! Please feel free to check in with us <a href="https://discord.com/channels/480462759797063690/484421406659182603">on Discord</a> or to <a href="https://github.com/typed-ember/ember-cli-typescript/issues">file a bug</a>. We encourage you to check with us first, though: in many cases things which seem like bugs are actually the type system catching errors the previous types couldn’t catch!</p>
<h2 id="thefuture">The future</h2>
<p>We hope (and fully expect!) this to be the last major release of Ember’s types on DefinitelyTyped. During the 4.x series, we aim to finish the work to <a href="https://github.com/emberjs/rfcs/pull/724">officially support TypeScript</a>. That will make it much easier for TypeScript users and maintainers to deal with both major and minor updates:</p>
<ul>
<li><p>Deprecations will automatically be present in both types and run-time code, and they will be removed right alongside runtime changes when prepping for a major release.</p></li>
<li><p>The design of deprecations or changes will include smooth migration paths for types as well as for the runtime behavior of the app.</p></li>
<li><p>More generally, having types as first-class parts of every design discussion means that new APIs will be TypeScript-friendly automatically. (Many older Ember APIs are <em>very</em> unfriendly to TypeScript!)</p></li>
<li><!-- alex ignore just -->
<p>The supported TypeScript versions will be documented clearly, just like with Node and browsers, making it easier for you to know what you should do to stay up to date.</p></li>
<li><p>Breaking changes in one package will not necessarily cause breaking changes in other packages. The updates to the test infrastructure types, for example, will not breaking in the future!</p></li>
</ul>
<p>And as always, those benefits will extend to <em>even more</em> of our JavaScript users, because many more editors take advantage of types which ship natively with packages than implicitly take advantage of the types from DefinitelyTyped.</p>
<p>Keep your eyes open for an RFC in the next few weeks tackling all of these kinds of things and more. Happy TypeScripting!</p>]]></description><link>https://blog.emberjs.com/ember-v4-typescript-support-update</link><guid isPermaLink="true">https://blog.emberjs.com/ember-v4-typescript-support-update</guid><pubDate>Tue, 25 Jan 2022 18:50:00 GMT</pubDate></item><item><title><![CDATA[EmberConf 2017: State of the Union]]></title><description><![CDATA[<p>Ember.js (or should we say <a href="http://yehudakatz.com/2011/12/08/announcing-amber-js/">Amber.js</a>) turned five years old last December. In some ways, five years is a short amount of time. But when measured in web framework years, it feels like a downright eternity.</p>
<p>As Yehuda and I were getting ready for our keynote presentation at this year's EmberConf, we tried to remember what developing web apps was really like in 2011. We knew that the web had changed for the better since then, but I think we both had repressed our memories of how truly awful it was.</p>
<h2 id="thewebin2011">The Web in 2011</h2>
<p>The most popular browser in 2011, by a wide margin, was IE8. Today, for most people, IE8 is a distant, half-remembered nightmare.</p>
<p>Today, we freely use new language features like async functions, destructuring assignment, classes, and arrow functions. We even get to use not-quite-standardized features like decorators ahead of time thanks to transpilers like Babel and TypeScript. In 2011, however, everyone was writing ES3. ES5 was considered too "cutting edge" for most people to adopt.</p>
<p>DOM and CSS features we've come to take for granted weren't available, like Flexbox and even <code>querySelectorAll</code>. Hard as it is to believe now, <em>no one even questioned whether you might not need jQuery</em>.</p>
<p><img src="/images/blog/2017-04-05-emberconf-2017-state-of-the-union/web-in-2011.png" alt="Slide showing the state of the web in 2011. No browsers implement WebSockets, Flexbox doesn't exist, only 49% of browsers have Web Workers, and IE8 has 27% market share. Chrome (all versions) is a distant second place at 18% market share." /></p>
<h2 id="emberin2011">Ember in 2011</h2>
<p>Ember was still finding its sea legs, too. There was no Ember App Kit yet, let alone Ember CLI. There was no router. npm 1.0 wasn't released until halfway through 2011. Ember apps used a global namespace and many people included their Handlebars templates in inline script tags.</p>
<pre><code class="html language-html">&lt;html&gt;
  &lt;head&gt;
    &lt;script src="/public/ember.js"&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;script type="text/x-handlebars"&gt;
      Hello, &lt;strong&gt;{{firstName}} {{lastName}}&lt;/strong&gt;!
    &lt;/script&gt;

    &lt;script type="text/x-handlebars" data-template-name="say-hello"&gt;
      &lt;div class="my-cool-control"&gt;{{name}}&lt;/div&gt;
    &lt;/script&gt;

    &lt;script&gt;
      App.ApplicationController = Ember.Controller.extend({
        firstName: "Trek",
        lastName: "Glowacki"
      });
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>As antiquated as this feels today, this was more or less how most JavaScript apps were written.</p>
<p>Some parts of Ember are truly embarrassing to look back on. Because IE was so dominant, our rendering engine was optimized for its performance quirks. DOM APIs were extremely slow, so our templates were string-based: render everything as a string of HTML, and then insert it with a single <code>innerHTML</code> operation. (Modern rendering engines like React, Angular, and Glimmer all create their own DOM instead of asking the browser to parse HTML.)</p>
<p>Unfortunately, letting the browser create our DOM elements for us led to some… interesting approaches to go back and find them later. For one thing, we had to use the awkward <code>{{bindAttr}}</code> helper to bind an element's attributes.</p>
<pre><code class="handlebars language-handlebars">&lt;div id="logo"&gt;
  &lt;img {{bindAttr src=logoUrl}} alt="Logo"&gt;
&lt;/div&gt;
</code></pre>
<p>Even worse was the <a href="http://colynb.com/posts/dom-horror-with-emberjs.html">Eldritch horror awaiting anyone who looked at the DOM</a>:</p>
<pre><code class="html language-html">&lt;div id="ember162" class="ember-view"&gt;
    &lt;h2&gt;Welcome to Ember.js&lt;/h2&gt;

    &lt;script id="metamorph-1-start" type="text/x-placeholder"&gt;&lt;/script&gt;
    &lt;script id="metamorph-0-start" type="text/x-placeholder"&gt;&lt;/script&gt;
    &lt;ul&gt;
        &lt;script id="metamorph-5-start" type="text/x-placeholder"&gt;&lt;/script&gt;
        &lt;script id="metamorph-2-start" type="text/x-placeholder"&gt;&lt;/script&gt;
        &lt;li&gt;
            &lt;script id="metamorph-6-start" type="text/x-placeholder"&gt;&lt;/script&gt;
            red
            &lt;script id="metamorph-6-end" type="text/x-placeholder"&gt;&lt;/script&gt;
        &lt;/li&gt;
        &lt;script id="metamorph-2-end" type="text/x-placeholder"&gt;&lt;/script&gt;
        &lt;script id="metamorph-3-start" type="text/x-placeholder"&gt;&lt;/script&gt;
        &lt;li&gt;
            &lt;script id="metamorph-7-start" type="text/x-placeholder"&gt;&lt;/script&gt;
            yellow
            &lt;script id="metamorph-7-end" type="text/x-placeholder"&gt;&lt;/script&gt;
        &lt;/li&gt;
        &lt;script id="metamorph-3-end" type="text/x-placeholder"&gt;&lt;/script&gt;
        &lt;script id="metamorph-4-start" type="text/x-placeholder"&gt;&lt;/script&gt;
        &lt;li&gt;
            &lt;script id="metamorph-8-start" type="text/x-placeholder"&gt;&lt;/script&gt;
            blue
            &lt;script id="metamorph-8-end" type="text/x-placeholder"&gt;&lt;/script&gt;
        &lt;/li&gt;
        &lt;script id="metamorph-4-end" type="text/x-placeholder"&gt;&lt;/script&gt;
        &lt;script id="metamorph-5-end" type="text/x-placeholder"&gt;&lt;/script&gt;
    &lt;/ul&gt;
    &lt;script id="metamorph-0-end" type="text/x-placeholder"&gt;&lt;/script&gt;
    &lt;script id="metamorph-1-end" type="text/x-placeholder"&gt;&lt;/script&gt;
&lt;/div&gt;
</code></pre>
<p>All of that in order to render what today looks like this:</p>
<pre><code class="html language-html">&lt;div&gt;
    &lt;h2&gt;Welcome to Ember.js&lt;/h2&gt;
    &lt;ul&gt;
        &lt;li&gt;red&lt;/li&gt;
        &lt;li&gt;yellow&lt;/li&gt;
        &lt;li&gt;blue&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;
</code></pre>
<h2 id="aheadofthecurve">Ahead of the Curve</h2>
<p>As bad as some of the early stuff was, we also have to credit Ember with being ahead of the curve. In many ways, Ember has continued to push the state of the art of client-side JavaScript forward.</p>
<p>Ember was the first to declare that build tools were critical to any frontend stack, making Ember CLI a first class part of the framework. Having opinionated build tools meant that we were able to be the first framework to embrace next-generation features of ES6, like Promises and modules, to name a few.</p>
<p><img src="/images/blog/2017-04-05-emberconf-2017-state-of-the-union/ember-cli.png" alt="Screenshot of the Ember CLI website" /></p>
<p>While other frameworks have only recently landed Ahead of Time (AOT) compiled templates, we've had them for years—and have now moved on to an even more efficient compiled bytecode format. Indeed, the fact that we've compatibly moved from string-based rendering to DOM-based rendering to our new VM-based architecture with Glimmer has been one of the keys to Ember's longevity.</p>
<p>Perhaps the biggest impact Ember has had is not the <em>what</em> but the <em>how</em>.</p>
<p>Major changes to the framework go through an RFC process that solicits community feedback early and often. By requiring new features to go through a rigorous design process, even seasoned contributors must articulate rationales and the context driving different tradeoffs. I often hear from developers who don't even use Ember that they've adopted our RFC process for their own teams at work.</p>
<p>Ember was also the first major framework to adopt Chrome's six week release cycle. By putting all new work behind feature flags, a big feature taking longer than expected doesn't block getting other important improvements into your hands. Stable, beta and canary release channels let you decide for yourself the balance between riding the cutting edge or preferring battle-tested stability.</p>
<p>Ember's 2.0 release was also novel: it was the first framework to release a major new version without any breaking changes. An Ember app running on 1.13 could upgrade seamlessly to Ember 2.0, so long as it had no deprecation warnings.</p>
<p>While the transition was bumpier than we would have liked for many people, this experiment showed how valuable focusing on upgrade paths is. Compared to the previous status quo of releasing new major versions that require you to effectively rewrite your app, we believe Ember 2.0 was an important bellwether that showed that JavaScript frameworks can make progress without breaking their ecosystem.</p>
<p>I'd be remiss if I didn't mention the Ember router.</p>
<p>Routers that map URLs on to application code exist in every server-side framework, such as Rails and Django. Stateful UI architecture has also been around forever. Ember's architecture borrows a lot from Cocoa, but the MVC idea has been around since at least Smalltalk-76.</p>
<p>Ember's contribution was to stumble on to the idea that, in single-page apps, <em>URLs and app architecture are intrinsically linked</em>. By tying the models and components that appear on screen to the URL, keeping the two in sync becomes the framework's job.</p>
<p>Circa 2011 and before, it was common to hear people lament that JavaScript had become the new Flash. Websites that heavily relied on JavaScript "felt broken" in sometimes hard-to-articulate ways. Refreshing the page left you looking at a different thing. Sharing links took people to the wrong place. Bookmarks didn't work. Command-clicking to open in a new tab didn't work.</p>
<p>In 2017, people use JavaScript-driven apps all the time and rarely notice. By making the URL the cornerstone of how you organize your application, for the first time, Ember helped you build JavaScript applications were no longer <em>broken by default</em>.</p>
<p>Today there are fantastic routers available for React, Angular and other libraries, and all of them can trace a lineage back to Ember's router. The turning point for the wider acceptance of single-page apps happened when, as a community, we started to embrace the URL. Ember's router led that charge.</p>
<h2 id="whatsnext">What's Next?</h2>
<p><img src="/images/blog/2017-04-05-emberconf-2017-state-of-the-union/hn-thread.png" alt="Screenshot of a Hacker News thread where people joke about JavaScript frameworks dying after a competitor is released. &quot;Ember? I thought that died after React came out.&quot; &quot;React? I thought that died after Vue.js came out.&quot; &quot;Vue.js? I thought that died when Angular 4 came out.&quot; &quot;Angular 4? I thought that died when Scala.js came out.&quot; &quot;Scala.js? I thought that died when Inferno came out.&quot; &quot;Inferno? I thought that died when Riot came out.&quot; &quot;Riot? I thought that died when Rakun.js came out.&quot; &quot;That's why I stick to jQuery 1.2 Ain't neveh goin' nowheh!&quot; The final comment reads: &quot;I can't wait to retire.&quot;" /></p>
<p>Five years is a good run for JavaScript frameworks. We've done much, much better than average: most frameworks die young.</p>
<p>But what should our next move be? Many worthy competitors have come along, without all of the backwards compatibility baggage. Almost all of Ember's standout features, like build tools, AOT template compilation, first-class router, and server-side rendering are available for competing libraries.</p>
<p>We <em>could</em> decide to put Ember into maintenance mode, cede the future to the newcomers, and focus on catering to the existing user base for many years to come. But I don't think that's what we should do.</p>
<p>I think it's possible to stay cutting edge without breaking the apps people have spent years investing in, and I think we have the formula for doing it.</p>
<h2 id="whatdidntwork">What Didn't Work?</h2>
<p>With the benefit of hindsight, we can examine the improvements we've tried to make to Ember in the last year or two, and figure out what worked and what didn't.</p>
<p>It's a little bit embarrassing to have to write this, since it's something I knew <em>intellectually</em> beforehand. But, in short, what didn't work for us was anything requiring big design upfront.</p>
<p>We wanted to make Ember easier to learn, so we wanted to eliminate controllers from the programming model. To do that, we wanted to introduce the idea of "routable components"—components that are managed by the router.</p>
<p>But we also wanted to make Ember more approachable by introducing components that used <code>&lt;angle-bracket&gt;</code> syntax, so they work like the HTML elements people are already familiar with. And if we were introducing routable components, they should use the new component syntax—we shouldn't introduce a new API that people immediately felt like they had to rewrite.</p>
<p>We were also embarrassed that the design of the "pods" filesystem layout was left in a half-completed state, and we considered it to be a dead end for other features we wanted to introduce. But filesystem layout touches nearly everything, so the Module Unification RFC became another design that invisibly delayed other important features.</p>
<p>All of this work felt high-stakes because it touched such a fundamental part of Ember: the component API. Ember contributors felt like this was their one shot to get in that feature they'd always wanted. And if you had one shot, one opportunity, to seize everything you ever wanted in one moment, would you capture it, or let it slip?</p>
<p>Creating this series of dependencies meant that one disagreement on a particular RFC could delay work on another that, from the outside, seemed unrelated. It also became near impossible for any one person to keep the state of all of the proposals in their head, so we did a very bad job of communicating status updates to the community. It's no surprise that many people perceive Ember as having slowed down over the last year.</p>
<h2 id="whatdidwork">What Did Work?</h2>
<p>Despite these missteps, we actually did ship some pretty cool stuff in 2016 that people were able to use right away.</p>
<p>FastBoot is an addon that people can drop in to their app to get server-side rendering with minimal setup. Engines allow big teams to split their app into smaller apps that can be worked on (and loaded) independently.</p>
<p>In both cases, we focused on adding small primitives into the framework that exposed some missing capability.</p>
<p>For example, for FastBoot, <a href="https://github.com/emberjs/ember.js/pull/12394">we added the <code>visit()</code> method to <code>Ember.Application</code></a>. This method takes a URL and allows you to programmatically route an Ember app (instead of having to change the browser's <code>window.location</code> directly). FastBoot uses this API to render Ember applications in Node.js.</p>
<p>While we figure out the best way to deploy production-ready server-side rendered JavaScript apps, we can move that experimentation out of Ember and into the <code>ember-fastboot</code> addon.</p>
<p>Engines worked similarly: <a href="https://github.com/emberjs/rfcs/blob/master/text/0010-engines.md">an RFC proposed a small set of primitives</a>, and then the addon could build on these to add features we were less certain of.</p>
<p>And there's Glimmer 2.</p>
<p>Shipping in Ember 2.10, this ground-up rewrite of our rendering engine was a huge success. We dramatically reduced compiled template size, with many apps seeing 30-50% reductions in total payload (after gzip!).</p>
<p>Initial rendering performance was also improved. For example, the "Render Complex List" scenario in <a href="https://github.com/eviltrout/ember-performance">ember-performance</a> ran 2x faster in Ember 2.10 than 2.9.</p>
<p>Incredibly, these results were achieved as a <em>drop-in upgrade</em> to Ember.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">I can&#39;t think of a release of a library/framework that reduced my app&#39;s size AND significantly improved perf - Ember 2.10 is super rare.</p>&mdash; Robin Ward (@eviltrout) <a href="https://twitter.com/eviltrout/status/808710602021634048">December 13, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Ground-up rewrites are usually fraught with compatibility peril. In this case, the secret was to invest upfront in infrastructure that allowed us to keep both the old and new rendering engine on <code>master</code> at the same time.</p>
<p>Rendering tests were run twice, once on each engine, so we always had a snapshot of how far along we were. And by making compatibility with the existing API the goal from the start, there was no temptation to start from a "pure" re-implementation and figure out compatibility later.</p>
<h2 id="ournewmodusoperandiunlockedexperimentationinplaceupgrades">Our New Modus Operandi: Unlocked Experimentation, In-Place Upgrades</h2>
<p>Going forward, we will prioritize adding missing capabilities and primitives to the core Ember framework. No one should feel like they need core team approval to experiment with new ways of building applications.</p>
<p>In some places, we're already good at this. For example, <a href="http://www.ember-redux.com/">ember-redux</a> and <a href="https://ember-concurrency.com/#/docs">ember-concurrency</a> are two examples that push the state of the art by building on top of Ember's already well-rationalized object model. Other areas, like our router and components, have been less open for experimentation (at least when using public API).</p>
<p>If we do decide that an existing feature needs a rethink, we will follow the Glimmer model: keep both the old and new running at once, and hold off merging until tests (and your apps!) work without changes.</p>
<p>This is another example of something that we should have observed ahead of time. We're big fans of the <a href="https://github.com/extensibleweb/manifesto">Extensible Web Manifesto</a>, and this bears an uncanny resemblance to that.</p>
<h2 id="glimmersperformancesweetspot">Glimmer's Performance Sweet Spot</h2>
<p>Last year, we talked about Glimmer's VM architecture and promised many performance benefits to come. We delivered Glimmer in Ember 2.10 and this year we're continuing to reap the performance rewards of its modular VM architecture.</p>
<p>Benchmarks are essential to measuring our performance improvements, but benchmarks are also dangerous. Focusing on the wrong benchmark, or only one kind of benchmark, can cause you to miss important context.</p>
<p><a href="http://benediktmeurer.de/2017/03/01/v8-behind-the-scenes-february-edition/">V8's Benedikt Meurer has a fantastic blog post about their new Ignition + TurboFan architecture</a>, and how years of benchmark competition had caused them to be "over-focused on the peak performance case" while "baseline performance was a blind spot."</p>
<!-- alex ignore trap -->
<p>JavaScript libraries can fall into the same trap too. Community discussion often ends up focused around one measurement, which libraries then feel obligated to optimize for.</p>
<p>For example, a few years ago it was updating performance and the infamous <code>dbmon</code> demo.</p>
<p><img alt="Screenshot of the dbmon/dbmonster stress test demo app." src="/images/blog/2017-04-05-emberconf-2017-state-of-the-union/dbmon-screenshot.png" style="background-color: transparent"></p>
<p><em>The dbbane of my existence.</em></p>
<p>Now the focus has turned to initial render times, as people (rightfully) focus on improving the experience of users on lower-end mobile devices and networks. But there is a point at which you hit diminishing returns optimizing for the initial render while sacrificing update performance.</p>
<p>Fundamentally, this is a tradeoff about bookkeeping. Do more bookkeeping upfront during initial render and subsequent renders can be better optimized. Do less bookkeeping and initial renders will be faster, but updating gets close to being a full re-render. There are other considerations like file size, eager vs. lazy parsing, optimizing for the JIT compiler, etc., but this accounts for most of the algorithmic performance differences.</p>
<p>Due to the drop-in nature of the Glimmer upgrade, we knew we couldn't regress on Ember's world-class update performance, even as we worked to improve initial render performance. This required us to find an architecture that would strike the optimal balance between the two.</p>
<p>If you're interested in more of the details, and in particular how the Glimmer VM maintains better performance by default compared to Virtual DOM libraries as your UI scales, I highly recommend <a href="http://yehudakatz.com/2017/04/05/the-glimmer-vm-boots-fast-and-stays-fast/">Yehuda's blog post explaining the design decisions that helped us hit our performance targets</a>.</p>
<p>All of this is to say, Glimmer offers a novel approach to rendering component-based web UIs. It's great that Ember users get to take advantage of it. But what about everyone else?</p>
<h2 id="emberadoption">Ember Adoption</h2>
<p>One of my favorite pastimes is watching videos of old Steve Jobs presentations. One I like in particular is his 1998 Macworld keynote, when he had only been back at Apple for a year. Apple was on the brink of failure, low on money and with warehouses full of unwanted computers. The press, mainstream and tech journalists alike, all used one word to describe Apple: <em>beleaguered</em>.</p>
<p>When Steve showed up at Apple, he rapidly turned things around. The confusing product lineup was replaced with a simple-to-understand consumer/pro laptop/desktop matrix. They delivered the original, Bondi blue iMac, showing they still had the ability to deliver innovative new products.</p>
<p>Despite this, it's hard to turn around a narrative. The press would give a reason why Apple was doomed to fail, and when Apple would fix that problem, they would come up with a <em>new</em> reason why Apple was doomed to fail.</p>
<p>Borrowing from Maslow's Hierarchy of Needs, Steve introduced the Apple Hierarchy of Skepticism:</p>
<p><img src="/images/blog/2017-04-05-emberconf-2017-state-of-the-union/apple-hierarchy-of-skepticism.png" alt="Steve Jobs' Apple Hierarchy of Skepticism slide. Numbered 1 to 5, from bottom to top: Survival, Stable Business, Product Strategy, Applications, Growth. The Survival, Stable Business, and Product Strategy rows are colored orange to indicate that they've been overcome. Applications and Growth are colored blue to indicate that they are the next area Apple will focus on to persuade the skeptics." /></p>
<blockquote>
  <p>"When I came to Apple a year ago, all I heard was 'Apple is dying, Apple can't survive.' It turns out that every time we convince people we've accomplished something at one level, they come up with something new. And I used to think this was a bad thing. I thought, 'When are they ever gonna believe that we're gonna be able to turn this thing around?'</p>
  <p>But actually now I think it's great! Because what it means is we've now convinced them that we've taken care of last month's question. And they're on to the next one! So I thought, let's get ahead of the game, let's figure out what all of the questions are gonna be, and map out where we are."</p>
</blockquote>
<p>Without being overly dramatic, I think there are some parallels between the 90's era Mac and Ember. While we have a fantastic community and high-profile, successful apps, it can feel like the momentum is somewhere else. And I know Ember users who have told me they feel beleaguered by this common reaction: "You use Ember? I thought React was the new thing?" I've even gotten it from my Lyft driver.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">.<a href="https://twitter.com/tomdale">@tomdale</a>: &quot;...if it makes you feel better, my lyft driver asked &#39;isn&#39;t ember dead and react is the new thing?&#39;&quot;</p>&mdash; Lady Zahra (@ZeeJab) <a href="https://twitter.com/ZeeJab/status/847489050130788352">March 30, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>When I think about the reasons people give for not using Ember, there are some that used to be common that I never hear anymore. Those ugly <code>&lt;script&gt;</code> tags in the DOM and lack of documentation were two major knocks against Ember, but we've since eliminated the DOM noise and invested heavily in guides and API documentation. We convinced people that these weren't a barrier anymore! But there are still lots of reasons people don't want to take another look at Ember.</p>
<p>Let's introduce our own Ember Hierarchy of Skepticism:</p>
<p><img src="/images/blog/2017-04-05-emberconf-2017-state-of-the-union/ember-hierarchy-of-skepticism.png" alt="Ember's Hierarchy of Skepticism. From 1 to 5, bottom to top: Metamorph Tags / bindAttr, No Documentation, Custom Object Model, Big File Size, Monolithic. The first two are colored orange to indicate that they are objections that we have overcome." /></p>
<p>By far, the three most common remaining reasons I hear for not using Ember are:</p>
<ul>
<li>It's monolithic and hard to adopt incrementally.</li>
<li>It's too big out of the box, particularly for mobile apps.</li>
<li>The custom object model is scary. I want to write JavaScript, not whatever <em>that</em> is.</li>
</ul>
<p>Starting today, we can focus on overcoming these last three barriers to Ember's growth.</p>
<h2 id="introducingglimmerjs">Introducing Glimmer.js</h2>
<p>With <a href="https://glimmerjs.com">Glimmer.js</a>, we've extracted the rendering engine that powers Ember and made it available to everyone.</p>
<!-- alex ignore simple -->
<p>Glimmer is only the component layer, so it's up to you to decide if you need routing, a data layer, etc. If you want to drop Glimmer components into an existing app, it's as simple as adding a Web Component.</p>
<p>For a quick, five minute tour of what building a Glimmer app is like, check out this video from <a href="https://embermap.com/">EmberMap</a>:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/i2rwIApjz-4?ecver=1" frameborder="0" allowfullscreen></iframe>
<p>Or visit <a href="https://glimmerjs.com">glimmerjs.com</a> to get started and read the documentation.</p>
<p>While extracting Glimmer to be used standalone from Ember, we also took the opportunity to clean up some of the API that people found most confusing when using Ember components.</p>
<h3 id="goodbyetagnameattributebindingsetc">Goodbye tagName, attributeBindings, etc.</h3>
<p>Tired of remembering all of the magic properties needed to configure a component's root element?</p>
<pre><code class="javascript language-javascript">import Ember from 'ember';

export default Ember.Component.extend({
  tagName: 'input',
  attributeBindings: ['disabled', 'type:kind'],
  disabled: true,
  kind: 'range'
});
</code></pre>
<p>In Glimmer, the component's root element is defined in the template, so all of that goes away. (You can think of the component template now being "outer HTML" instead of "inner HTML".) Here's the same component in Glimmer, with only a template:</p>
<pre><code class="handlebars language-handlebars">&lt;input disabled type="range" /&gt;
</code></pre>
<h3 id="es6classes">ES6 Classes</h3>
<p>This gets even nicer once you introduce dynamic data from the component into it. Here's the Ember component:</p>
<pre><code class="javascript language-javascript">import Ember from 'ember';

export default Ember.Component.extend({
  tagName: 'input',
  attributeBindings: ['disabled', 'type:kind'],
  disabled: false,
  kind: 'range',
  classNameBindings: 'type',
  type: 'primary'
});
</code></pre>
<p>Now in a Glimmer component, using ES6 class syntax to provide dynamic data:</p>
<pre><code class="handlebars language-handlebars">&lt;input disabled type="range" class={{type}} /&gt;
</code></pre>
<pre><code class="javascript language-javascript">import Component from '@glimmer/component';

export default class extends Component {
  type = 'primary'
}
</code></pre>
<h3 id="typescript">TypeScript</h3>
<p>Because Glimmer is written in TypeScript, it has great autocomplete and type definitions out of the box. And every new Glimmer app is configured to use TypeScript automatically.</p>
<p>JavaScript is still the primary way to write Glimmer apps. Because it's extracted from a JavaScript framework, Glimmer's API has been designed to be used with JavaScript from the start. TypeScript is an extra tool in your toolbelt—if you want it.</p>
<pre><code class="javascript language-javascript">import Component from '@glimmer/component';
export default class extends Component {
  firstName: string;
  lastName: string;
}
</code></pre>
<h3 id="computedproperties">Computed Properties</h3>
<p>Ember users love computed properties, but getting used to their syntax can be a challenge. Because Glimmer uses ES6 classes, you can use standard getters and setters:</p>
<pre><code class="javascript language-javascript">import Component from '@glimmer/component';

export default class extends Component {
  firstName = "Katie";
  lastName = "Gengler";

  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}
</code></pre>
<h3 id="decorators">Decorators</h3>
<p>Glimmer uses decorators (a Stage 2 TC39 proposal) to augment a class's properties and methods. For example, to mark a component property as "tracked" (so changes to it are updated in the DOM), use the <code>@tracked</code> decorator:</p>
<pre><code class="javascript language-javascript">import Component, { tracked } from '@glimmer/component';

export default class extends Component {
  @tracked firstName;
  @tracked lastName;

  @tracked('firstName', 'lastName')
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}
</code></pre>
<h3 id="actions">Actions</h3>
<p>Actions in Glimmer are functions, with optional argument currying. Use the <code>{{action}}</code> helper to bind the function to the component context:</p>
<pre><code class="javascript language-javascript">import Component, { tracked } from '@glimmer/component';

export default class extends Component {
  @tracked name: string;

  setName(name: string) {
    this.name = name;
  }
}
</code></pre>
<pre><code class="handlebars language-handlebars">&lt;button onclick={{action setName "Zahra"}}&gt;
  Change Name
&lt;/button&gt;
</code></pre>
<h3 id="nogetset">No <code>.get()</code>/<code>.set()</code></h3>
<p>In the above examples, you probably noticed that we never have to use the <code>.get()</code> method to retrieve a component property, or <code>.set()</code> to set one. This requirement frequently trips up new Ember users until they develop the right muscle memory. In Glimmer, we rely on ES5 getters and setters to intercept properties, so you never need to learn <code>.get()</code> and <code>.set()</code> at all.</p>
<h2 id="filesize">File Size</h2>
<p>Web developers are rightfully sensitive to file size. Not only do your app's dependencies need to be downloaded, JavaScript must be parsed and evaluated. Particularly on lower-end mobile devices, that can add up quickly.</p>
<p>Ember has historically been larger in file size than its competitors. Our line of reasoning was: for the kinds of apps people build with Ember, that's all code that you'll eventually need to pull in anyways.</p>
<p>Today, a hello world Ember app starts off with about 200KB of JavaScript. In my experience, most production Angular, Ember and React apps hover between 400KB to 700KB of JavaScript, sometimes more. (Sometimes a lot more.)</p>
<p>While this is true of many apps, it's not <em>universally</em> true. Sometimes people have hard file size requirements that disqualify Ember out of the gate. And when people are starting out on a greenfield app, it's hard for them to buy on faith that they will eventually need everything Ember offers. What if they don't? It feels safer to start small and bring things in piecemeal.</p>
<p><a href="https://medium.com/dailyjs/javascript-framework-battle-hello-world-in-each-cli-">Shane Osbourne recently compared the file size of a "hello world" app generated by each of the major frameworks' CLI tools.</a> While Ember is the largest, a Glimmer app is tiny: at 34KB, it's smaller than React, Angular and Vue. Only Preact comes in smaller.</p>
<p><img src="/images/blog/2017-04-05-emberconf-2017-state-of-the-union/hello-world-cli-size.png" alt="Chart showing relative file sizes of the default output from creating a new app with different frameworks' CLI tools. Ember is the largest at 198KB. Preact is the smallest at 8.8KB. Second smallest is Glimmer at 34KB. Vue, React and Angular weigh in at 43.8KB, 46KB and 92KB respectively." /></p>
<p>Best of all, we haven't yet begun to focus on bundle optimization. You can expect this size to decrease even more in the future.</p>
<p>So that's Glimmer.js. It's tiny, it's fast, and it can be adopted incrementally. Best of all, you can start playing with it today.</p>
<p>But… where does that leave Ember?</p>
<h2 id="backtoember">Back to Ember</h2>
<!-- alex ignore easy -->
<p>We believe that the key to balancing stability and progress in Ember is to make it easy to do experimentation outside of the framework. The only way to truly get a sense of something is to be able to use it.</p>
<p><strong>Glimmer components are the future of components in Ember.</strong></p>
<p>We want to let you—and everyone—get a chance to use Glimmer components before we make them an official part of Ember. But we're not leaving Ember users out in the cold until that happens.</p>
<p>A few weeks before EmberConf, <a href="https://github.com/emberjs/rfcs/pull/213">Godfrey Chan submitted the "Custom Component API" RFC</a>. This RFC is the key to bringing Glimmer components to Ember apps. Because the Glimmer VM is really a "library for writing component libraries," we can let addons specify their own custom component API.</p>
<p>Notably, this means we're working on making it possible to use the Glimmer components you've seen above in your existing Ember apps by installing an addon.</p>
<p>Best of all, Glimmer apps use the Module Unification filesystem layout. This is the link between the Ember and Glimmer worlds. If you decide you actually <em>do</em> need all of the functionality Ember offers, you will be able to drag and drop your Glimmer components into an Ember app.</p>
<p>One last thing. If you take a peek under the hood of a new Glimmer app, you'll see that it's made up of a few different npm packages, like <code>@glimmer/application</code>, <code>@glimmer/di</code>, etc. We spent time making sure these packages follow modern best practices for distributing JavaScript in 2017.</p>
<p>Much of the secret sauce of a Glimmer app is in the ahead-of-time compilation we do with Rollup, so I recommend most people use the default Ember CLI flow documented on the website. That said, there's no stopping an enterprising developer from using these packages in other environments. Let experimentation reign!</p>
<h2 id="emberin2017">Ember in 2017</h2>
<p>While we're excited about Glimmer, work on Ember is not slowing down. If anything, the focus on exposing capabilities means that the pace of community experimentation should noticeably tick upwards.</p>
<p>Module Unification for Ember apps is <a href="https://github.com/ember-cli/ember-resolver/pull/182">under active development</a>. We're applying the lessons we learned and are working to expose the primitives needed to be able to implement the Module Unification filesystem layout in an addon. Development is happening on the <code>master</code> branch of <code>ember-resolver</code> <a href="https://github.com/ember-cli/ember-resolver#current-feature-flags">behind a feature flag</a>.</p>
<p>As we upstream Glimmer.js code into Ember, this gives us a great excuse to <a href="https://github.com/emberjs/ember.js/issues/15058">clean up older tests</a> so that we can run them against the old and new implementation, as we did with rendering tests and Glimmer VM integration.</p>
<p>We've also begun to <a href="https://github.com/emberjs/ember.js/pull/14805">implement a routing service</a> that gives applications and addons imperative control over the router. This is exciting because, previously, routing-related features like the built-in <code>{{link-to}}</code> helper relied on private API. With the routing service, developers will have the tools to build their own <code>{{link-to}}</code> helper if they wish.</p>
<p>Long term, our goal is to break Ember apart into a series of small modules. Each piece of Ember should be an npm package that you can remove if you don't need it.</p>
<p>(Unlike most small modules approaches, things will work together if you <em>do</em> need them. We remain strongly opposed to forcing integration work onto application developers.)</p>
<p>It should also work in reverse: if you start with Glimmer and realize you actually do need a router, services, a data layer, etc., you should be able to incrementally <code>npm install</code> your way to Ember.</p>
<p><img src="/images/blog/2017-04-05-emberconf-2017-state-of-the-union/spectrum-of-app-complexity.png" alt="Diagram showing a spectrum from less complext to more complex. On the left side is Glimmer logo for less complex applications. On the right side is Ember, for ambitious applications. In the middle is a sequence of npm install commands that show how you can move incrementally up the scale, one package at a time: npm install @ember/router, npm install @ember/service, and npm install @ember data." /></p>
<p>This is the future we've always dreamed of for Ember: a complete, cohesive front-end stack for those who want it, with the ability to quickly pare it down if the need arises.</p>
<p>We're not there quite yet, but it's an exciting goal to build toward and I think we've shown tangible progress already with Glimmer. I hope you are as excited about Ember and Glimmer as we are, and we can't wait to see all of the cool stuff you build with them!</p>]]></description><link>https://blog.emberjs.com/emberconf-2017-state-of-the-union</link><guid isPermaLink="true">https://blog.emberjs.com/emberconf-2017-state-of-the-union</guid><pubDate>Wed, 05 Apr 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[EmberConf 2023]]></title><description><![CDATA[<p><img src="https://blog.emberjs.com/images/blog/emberconf-2023.png" alt="EmberConf 2023 in Portland Oregon" /></p>
<p>We're thrilled to announce that <a href="https://www.emberconf.com">EmberConf 2023</a> will take place on July 20-21 at the Oregon Convention Center in Portland, OR. The venue is state-of-the-art and fully accessible. We're excited to offer both in-person and live online attendance options. <a href="http://www.emberconf.com">Tickets are on sale now</a>!</p>
<p>This is the first conference back in person since the pandemic, and we're taking all the necessary precautions to ensure a safe and enjoyable experience for everyone attending in person (check out the <a href="https://www.emberconf.com/faqs">FAQ page</a> for details on our specific precautions). For those attending online, we're working hard to provide an engaging and interactive experience as well. You might not be there with us in person, but we’ll try our best to make everyone feel included!</p>
<!-- alex ignore just -->
<p>As we celebrate 10 years since Ember 1.0, we’ll focus on not just Ember’s longevity, but Ember’s modern-day community. The talks and workshops have been specifically chosen to help meet users where they are right now, and the practical challenges they face day-to-day.</p>
<!-- alex ignore just -->
<p>We're excited to welcome amazing new and returning speakers, including Yehuda Katz (co-creator of Ember.js), Kenigbolo Meya Stephen, Ed Faulkner, and Julia Donaldson. Whether you're a seasoned Ember developer or just getting started, EmberConf is the perfect opportunity to learn, grow, and connect with the Ember community.</p>
<!-- alex ignore special -->
<p>EmberConf is intended to be as inclusive as possible so that anyone and everyone feels comfortable and able to attend. We're offering childcare, private infant feeding spaces, closed captioning, and can accommodate special meal requests. We also have a strong and enforced code of conduct to ensure that everyone is treated with respect and dignity. We also have unlimited Scholarship tickets to our virtual event for students, or anyone who might not otherwise be able to attend.</p>
<p>EmberConf provides attendees with unique opportunities to learn from the best and brightest in the Ember community, as well as to network with other developers and industry professionals. You'll have the chance to ask questions, participate in hands-on workshops, and engage with other attendees in interactive sessions!</p>
<p>Registration is now open, and we encourage you to reserve your spot today. Don't miss out on this incredible opportunity to learn and connect with the Ember community!</p>
<p>Do you work for a company that uses Ember? <a href="https://www.emberconf.com/become-a-sponsor">Pitch them on Sponsoring</a>! We have a variety of sponsorship packages to fit every budget. EmberConf sponsors help make it all happen (seriously, this stuff is expensive!), and every single one makes a big difference.</p>
<p>Stay tuned for updates and more information about EmberConf, and check out all the details at <a href="http://www.emberconf.com/">www.emberconf.com</a>. We can't wait to see you there!</p>]]></description><link>https://blog.emberjs.com/emberconf-2023</link><guid isPermaLink="true">https://blog.emberjs.com/emberconf-2023</guid><pubDate>Mon, 24 Apr 2023 12:00:00 GMT</pubDate></item><item><title><![CDATA[Ember.js Native Class Update - 2019 Edition]]></title><description><![CDATA[<p>(This post was originally published on <a href="https://www.pzuraq.com/emberjs-native-class-update-2019-edition/">www.pzuraq.com</a>)</p>
<p>These are exciting times in Ember! With Ember Octane just around the corner, native class support has <a href="https://emberjs.com/blog/2018/12/13/ember-3-6-released.html#toc_new-features-2">officially landed in v3.6</a> (with a <a href="https://github.com/pzuraq/ember-native-class-polyfill">polyfill</a> supporting v3.4+), and the <a href="https://github.com/emberjs/rfcs/blob/master/text/0408-decorators.md">Decorators RFC</a> has been merged and will be implemented soon (pending decorators moving to stage 3 in the January meeting). Some time ago, I wrote <a href="https://medium.com/build-addepar/es-classes-in-ember-js-63e948e9d78e">an article</a> that detailed how to use native classes in Ember, along with best practices for writing them. Since then, some major changes have occured, and I wanted to give a quick update for early adopters and folks who are curious about them in general.</p>
<p>This post will focus on changes since the original article and current best practices.  We'll be talking about:</p>
<ul>
<li><a href="#toc_native-class-constructor-update-rfc">The Native Class Constructor Update RFC</a></li>
<li><a href="#toc_code-new-code-vs-code-create-code"><code>new</code> vs. <code>create</code></a></li>
<li><a href="#toc_code-constructor-code-vs-code-init-code"><code>constructor</code> vs. <code>init</code></a></li>
<li><a href="#toc_class-fields-vs-code-extend-code">Class Fields vs. <code>extend()</code></a></li>
<li><a href="#toc_avoid-class-field-arrow-functions">Avoid Class Field Arrow Functions</a></li>
<li><a href="#toc_code-super-code-vs-code-_super-code"><code>super</code> vs. <code>_super()</code></a></li>
<li><a href="#toc_when-it-s-ok-to-use-code-extend-code">When It's Ok to Use <code>extend()</code></a></li>
<li><a href="#toc_avoiding-code-reopen-code-and-code-reopenclass-code">Avoiding <code>reopen</code> and <code>reopenClass</code></a></li>
<li><a href="#toc_avoiding-code-emberobject-code">Avoiding <code>EmberObject</code></a></li>
<li><a href="#toc_misc-class-tips">Misc. Class Tips</a></li>
</ul>
<p>If you're new to native classes in Ember, the most comprehensive and up-to-date documentation is the <a href="https://ember-decorators.github.io/ember-decorators/docs/native-class-basics">official Ember Decorators documentation site</a>, where you can find a detailed guide to all of the differences in native classes and an overview of native class features. The <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes">MDN documentation on classes</a> is also a great resource for learning more about the basics of native classes and how things like inheritance in Javascript work in the first place (spoiler: it's sometimes just a <em>little</em> bit confusing).</p>
<p>Alright, without further ado, let's get this inaugural blog post started!</p>
<h2 id="nativeclassconstructorupdaterfc">Native Class Constructor Update RFC</h2>
<p>After the <a href="https://github.com/emberjs/rfcs/blob/master/text/0240-es-classes.md">original ES Class RFC</a> was merged, it became clear that there were some major ergonomic issues with the behavior of <code>EmberObject</code>'s constructor. Specifically, the behavior led to default values always overwriting values passed to <code>create</code> (as discussed in the <a href="https://medium.com/build-addepar/es-classes-in-ember-js-63e948e9d78e#96a9">Class Fields section</a> of the original article). This behavior was a constant stumbling block for new and current Ember users alike, so we made a <a href="https://github.com/emberjs/rfcs/blob/master/text/0337-native-class-constructor-update.md">second RFC</a> that updated <code>EmberObject</code> to assign values passed in <em>last</em>.</p>
<p>This means that many of the workarounds that were used to assign class fields before are <em>no longer necessary</em> 🎉. It is now best practice to assign default values to class fields:</p>
<pre><code class="javascript language-javascript">// before
class Person extends EmberObject {
  firstName = this.firstName || 'Bruce';
  lastName = this.lastName || 'Wayne';
}

class Person extends EmberObject {
  firstName = _.defaultTo(this.firstName, 'Bruce');
  lastName = _.defaultTo(this.lastName, 'Wayne');
}

class Person extends EmberObject {
  @argument firstName = 'Bruce';
  @argument lastName = 'Wayne';
}

// after
class Person extends EmberObject {
  firstName = 'Bruce';
  lastName = 'Wayne';
}
</code></pre>
<h2 id="newvscreate"><code>new</code> vs. <code>create</code></h2>
<p>As a consequence of the constructor update RFC, creating an instance of a class using <code>new EmberObject()</code> was made impossible. This was never a <em>public</em> API, but did work previously, and some users had begun using it this way. For classes that extend <code>EmberObject</code>, you should continue to use <code>create()</code>:</p>
<pre><code class="javascript language-javascript">class Person extends EmberObject {
  firstName = 'Bruce';
  lastName = 'Wayne';
}

let person = Person.create({
  firstName: 'Carol',
  lastName: 'Danvers'
});
</code></pre>
<p>It's important to note that this <strong>only applies to classes that extend <code>EmberObject</code></strong>! For classes that do not, you should define your own constructor and use <code>new</code>:</p>
<pre><code class="javascript language-javascript">class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
}

let person = new Person('Carol', 'Danvers');
</code></pre>
<h2 id="constructorvsinit"><code>constructor</code> vs. <code>init</code></h2>
<p>There were also two changes to the behavior of the <code>constructor</code> method in classes that extend <code>EmberObject</code>:</p>
<ol>
<li>Injections are no longer available</li>
<li>Create params are no longer available</li>
</ol>
<p>These both get assigned <em>after</em> the object has been fully created, but <em>before</em> <code>init</code> is called. So, they are both available in <code>init</code>. The official recommendation is to always use <code>init</code> when extending from any <code>EmberObject</code> based classes, since it will consistently have everything needed.</p>
<pre><code class="javascript language-javascript">// before
class Profile extends Component {
  @service store;

  // argument
  person = this.person || null;

  constructor() {
    super(...arguments);
    let details = this.store.queryRecord('details', this.person.id);
  }
}

// after
class Profile extends Component {
  @service store;

  // argument
  person = null;

  init() {
    super.init(...arguments);
    let details = this.store.queryRecord('details', this.person.id);
  }
}
</code></pre>
<h2 id="classfieldsvsextend">Class Fields vs. <code>extend()</code></h2>
<p>When extending using <code>extend()</code>, all values that were passed in to the method were assigned to the <em>prototype</em> of the class.</p>
<pre><code class="javascript language-javascript">const Person = EmberObject.extend({
  sayHello() {
    console.log('hi!');
  },

  friends: [],
});

console.log(Person.prototype.hasOwnProperty('sayHello')); // true
console.log(Person.prototype.hasOwnProperty('friends')); // true
</code></pre>
<p>This led to the infamous "shared state" problem, where an object or array passed into a class definition would be shared between every instance of that class:</p>
<pre><code class="javascript language-javascript">let peterParker = Person.create();
let wandaMaximoff = Person.create();

peterParker.friends.push('Tony Stark');

console.log(wandaMaximoff.friends); // ['Tony Stark']
</code></pre>
<p>By contrast, when using <code>class ... extends</code>, only <em>methods</em> and
<em>getters/setters</em> are assigned to the prototype. Class fields are assigned to the
<em>instance</em> of the class:</p>
<pre><code class="javascript language-javascript">class Person extends EmberObject {
  sayHello() {
    console.log('hi!');
  }

  friends = []
}

console.log(Person.prototype.hasOwnProperty('sayHello')); // true
console.log(Person.prototype.hasOwnProperty('friends')); // false

let peterParker = Person.create();

console.log(peterParker.hasOwnProperty('sayHello')) // false
console.log(peterParker.hasOwnProperty('friends')) // true
</code></pre>
<p>One common pattern that existed to avoid the shared state problem in classic classes was assigning values in the <code>init</code> hook of the class. With native class fields this is <em>not</em> an issue. Class fields are assigned a new copy of their value for every instance, which means that there is no accidental sharing of state. The current best practice is to move any property assignments in <code>init</code> to class fields:</p>
<pre><code class="javascript language-javascript">// before
const Person = EmberObject.extend({
  init() {
    this.friends = [];
  }
});

// after
class Person extends EmberObject {
  friends = [];
}
</code></pre>
<p>One exception here is when you are assigning a value that was passed into the class constructor, for classes that do <em>not</em> extend <code>EmberObject</code>, or when you are defining a value based on <em>other</em> values:</p>
<pre><code class="javascript language-javascript">class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
}

class Person {
  firstName = 'Thor';
  lastName = 'Odinson';

  constructor() {
    // fullName is based on firstName and lastName, so
    // it should be assigned in the constructor
    this.fullName = `${this.firstName} ${this.lastName}`;
  }
}
</code></pre>
<p>The other exception is for static values that <em>should</em> be constant. Creating a new instance of the value for each instance of the class is <em>usually</em> a good thing, but in some cases this can be really bad for performance. For example, if you ever used the <code>layout</code> property to create a "single file component" with <code>ember-cli-handlebars-inline-precompile</code>, this will now create a new template per instance! This is why we created the <code>@layout</code> decorator in <code>ember-decorators</code>:</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';
import { layout } from '@ember-decorators/component';
import hbs from 'htmlbars-inline-precompile';

// before
export default Component.extend({
  // assigns the layout once to the prototype, so it's ok 👍
  layout: hbs`{{this.firstName}} {{this.lastName}}`,
});

// bad!
export default class PersonComponent extends Component {
  // creates a new instance of the layout for every component! 🛑
  layout = hbs`{{this.firstName}} {{this.lastName}}`;
}

// after
// creates one instance of the layout, and assigns it to the class 💯
@layout(hbs`{{this.firstName}} {{this.lastName}}`)
export default class PersonComponent extends Component {}
</code></pre>
<p>In cases where other types of values are static like this, consider create constants instead.</p>
<h2 id="avoidclassfieldarrowfunctions">Avoid Class Field Arrow Functions</h2>
<p>This one is more of a general native classes rule, rather than an Ember specific one. However, it is a pattern that is becoming more and more common, and it's something that should be avoided. Specifically, developers in the wider Javascript community are using arrow functions to create bound instance methods on a class for things like event handlers:</p>
<pre><code class="javascript language-javascript">// do not copy this. This is an antipattern!
class Checkbox {
  onClick = () =&gt; {
    // handle click
  };

  constructor(element) {
    this.element = element;

    this.element.addEventListener('click', this.onClick);
  }
}
</code></pre>
<p>The reasons why this is problematic include:</p>
<ol>
<li>It breaks inheritance and super, since class fields overwrite each other as the class is constructed</li>
<li><code>arguments</code> does not behave the same as a normal method</li>
<li>It's difficult to mock in tests, since you can't change the function on the prototype of the class.</li>
</ol>
<p>For more details, check out <a href="https://github.com/mbrowne/bound-decorator/blob/master/MOTIVATION.md">this rationale</a> on the official decorators proposal.</p>
<p>Instead, you can use the <code>@action</code> decorator provided by Ember (and Ember Decorators), which binds a the handler lazily:</p>
<pre><code class="javascript language-javascript">class Checkbox {
  @action
  onClick() {
    // handle click
  };

  constructor(element) {
    this.element = element;

    this.element.addEventListener('click', this.onClick);
  }
}
</code></pre>
<h2 id="supervs_super"><code>super</code> vs. <code>_super()</code></h2>
<p>When using native classes, you should <em>never</em> use <code>this._super()</code>. Unfortunately, there is not currently an assertion that prevents this (although we would like to add one), but there is a <a href="https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/no-ember-super-in-es-classes.md">linting rule</a> included with eslint-plugin-ember.</p>
<p>All instances of calls to <code>this._super()</code> can be replaced instead with the <code>super</code> keyword. <code>super</code> works a little bit differently than <code>this._super()</code> though. When called in a constructor, you use it directly:</p>
<pre><code class="javascript language-javascript">class Car extends Vehicle {
  constructor() {
    super(...arguments);

    this.wheels = 4;
  }
}
</code></pre>
<p>It's actually a syntax error if you don't use <code>super</code> this way in constructors. However, when not used from the constructor, <code>super</code> gives access to <em>all</em> of the parent class's instance properties and methods, and you must call the method on it explicitly:</p>
<pre><code class="javascript language-javascript">class Car extends Vehicle {
  start() {
    super.start(...arguments);

    this.currentGear = 'drive';
  }
}
</code></pre>
<p>You can even call <em>other</em> inherited methods using this, which is why you must specify it in the first place:</p>
<pre><code class="javascript language-javascript">class Car extends Vehicle {
  start() {
    super.ignition(...arguments);

    this.currentGear = 'drive';
  }
}
</code></pre>
<p>This design choice for <code>super</code> was really about embracing the nature of Javascript's prototypical inheritance, instead of choosing to mimic other languages like Java that have different inheritance patterns.</p>
<p>Finally, as with classic classes, you should generally pass all arguments through to the super calls for existing lifecycle hooks:</p>
<pre><code class="javascript language-javascript">class MultiSelectComponent extends Component {
  didInsertElement() {
    super.didInsertElement(...arguments);

    // setup component element
  }
}
</code></pre>
<h2 id="whenitsoktouseextend">When It's Ok to Use <code>extend()</code></h2>
<p>One major part of the original classes RFC was ensuring that native classes that extend from <code>EmberObject</code> would be able to interoperate with classic class syntax, meaning that you would be able to continue using <code>.extend()</code> with them, without having to worry if a particular class was defined using native syntax or not. This was also the answer to how mixins would interoperate with native classes, since they don't have a native equivalent yet.</p>
<p>However, it is also possible to use this feature in other ways, some of which have become antipatterns over time. For instance, <code>ember-cli-typescript</code> has recommended that users define their classes like so:</p>
<pre><code class="typescript language-typescript">// do not copy this. This is an antipattern!
export default class PersonComponent extends Component.extend({
  fullName: computed('firstName', 'lastName', {
    get() {
      return `${this.firstName} ${this.lastName}`;
    },
  }),
}) {
  firstName = 'Diana';
  lastName = 'Prince';
}
</code></pre>
<p>This recommendation was made because the future of decorators in Ember was unclear at the time, and the Ember Typescript team wanted to ensure that users could write <em>safe</em> code that wouldn't break at some point in the future. This was entirely reasonable, and really the best decision they could make at the time - this code is rock solid and <em>will not break</em> or need to be updated until Ember v4 at the earliest (yay stability)!</p>
<p>However, now that the Decorators RFC has been accepted, and <code>ember-decorators</code> has converted to matching the behavior of the RFC, this pattern is no longer ideal. In fact, it will be harder to convert going forward, since the <a href="https://github.com/scalvert/ember-es6-class-codemod">native class codemod</a> currently does not support this style of syntax - though it would definitely be possible to add, and we would love contributions!</p>
<p>So coming back to the original question - when should you use <code>.extend()</code>? There are only two cases where you should:</p>
<ol>
<li>When you are passing mixins to a class defined with native class syntax:</li>
</ol>
<pre><code class="javascript language-javascript">   export default class PersonComponent extends Component.extend(
     FullNameMixin,
     OtherMixin
   ) {
     firstName = 'Diana';
     lastName = 'Prince';
   }
</code></pre>
<ol start="2">
<li>When you are using classic class syntax to define a class:</li>
</ol>
<pre><code class="javascript language-javascript">   export default Component.extend({
     fullName: computed({
       get() {
         return `${this.firstName} ${this.lastName}`;
       }
     }),

     firstName: 'Diana',
     lastName: 'Prince',
   });
</code></pre>
<p>We're working on <a href="https://github.com/scalvert/eslint-plugin-ember-es6-class/issues/4">a linting rule</a> that will prevent this as well, but unfortunately this is not something we can assert against in Ember itself. In any case, you should definitely avoid mixing the two styles in all circumstances.</p>
<h2 id="avoidingreopenandreopenclass">Avoiding <code>.reopen()</code> and <code>.reopenClass()</code></h2>
<p>Native classes don't <em>really</em> have equivalents to <code>EmberObject</code>s ability to reopen class definitions willy-nilly and mess around with internals. You can patch class prototypes <em>directly</em>, but that's a much messier process in general, and that's a <em>good</em> thing - it turns out being able to completely redefine classes arbitrarily is not a great idea 🙃</p>
<!-- alex ignore simple -->
<p>However, there are legitimate use cases. In general, if you are relying on this behavior, you should <em>first</em> try to find a way to refactor off of it without touching prototypes, constructors, etc. In the case of <code>.reopenClass()</code>, this will oftentimes be as simple as adding <code>static</code> class fields and methods to the class definition, since that's almost always what the method is used for:</p>
<pre><code class="javascript language-javascript">// before
export default Component.extend({}).reopenClass({
  positionalParams: ['title', 'body']
});

// after
export default class BlogPostComponent extends Component {
  static positionalParams = ['title', 'body'];
}
</code></pre>
<!-- alex ignore easily -->
<p>In the cases where you <em>can't</em> easily refactor away from <code>.reopen()</code> or <code>.reopenClass()</code>, it's generally recommended that you <em>do</em> keep using them. Prototypes are <em>hard</em> (as I've personally learned <em>many</em> times throughout this process), and <code>EmberObject</code> and its methods are not deprecated, so they'll continue working for some time to come. You can take your time to think of better ways to refactor away from them, there's no rush!</p>
<h2 id="avoidingemberobject">Avoiding <code>EmberObject</code></h2>
<p>Alright, so after reading through all of that you may be thinking "that is a <em>lot</em> to remember", and you would be right. <code>EmberObject</code> works well with native classes, but there definitely are some oddities such as having to use <code>init</code> instead of <code>constructor</code>, <code>create</code> instead of <code>new</code>, etc. that may be hard to keep track of. If you'd prefer to <em>not</em> have to deal with these things, you actually can <em>opt-out</em> today!</p>
<p>All of Ember's decorators are completely compatible with <em>plain</em> native classes. There is absolutely no need to extend <code>EmberObject</code>, and in fact it should be considered best practice to <em>avoid</em> <code>EmberObject</code> whenever possible:</p>
<pre><code class="javascript language-javascript">// before
class Person extends EmberObject {
  firstName = null;
  lastName = null;

  @computed('firstName', 'lastName')
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

let person = Person.create({
  firstName: 'Carol',
  lastName: 'Danvers'
});

// after
class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  @computed('firstName', 'lastName')
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

let person = new Person('Carol', 'Danvers');
</code></pre>
<p>This means that any utility classes written using <code>EmberObject</code> can be rewritten and converted away from it. In fact, you should only need to remember the rules in this post for <em>framework primitives</em>, such as:</p>
<ul>
<li>Ember<ul>
<li><code>@ember/component</code></li>
<li><code>@ember/controller</code></li>
<li><code>@ember/helper</code></li>
<li><code>@ember/route</code></li>
<li><code>@ember/service</code></li></ul></li>
<li>Ember Data<ul>
<li><code>@ember-data/adapter</code></li>
<li><code>@ember-data/model</code></li>
<li><code>@ember-data/serializer</code></li></ul></li>
</ul>
<p><code>@glimmer/component</code>, which was recently accepted via RFC, will be implemented <em>without</em> extending <code>EmberObject</code> which means you will not need to remember the rules and exceptions for newer components either. In general, when in doubt, use native classes!</p>
<h2 id="miscclasstips">Misc. Class Tips</h2>
<p>This section is for a few remaining tips/best practices that I have developed myself in using native classes. These recommendations are from my own personal experience, so take what you will from them.</p>
<h3 id="alwaysgiveyourclassaname">Always give your class a name!</h3>
<p>Anonymous classes are a thing in JS:</p>
<pre><code class="javascript language-javascript">export default class {

}
</code></pre>
<p>While this may seem nice, if you do this everywhere it means that you're going to have hundreds of the same indistinguishable classes when you're trying to debug, especially in the memory debugger 😱 It also makes your codebase much less searchable. Always add a name, even if it seems redundant!</p>
<h3 id="typeyourframeworkclassnames">Type your (framework) class names</h3>
<p>In my experience, it generally makes sense to add the <em>framework</em> type of a class to its name as well. That is, if it is a <em>Route</em>, <em>Controller</em>, <em>Component</em>, or <em>Service</em>, you would want to name it <code>UserRoute</code>, <code>UserController</code>, <code>UserComponent</code>, or <code>UserService</code> respectively so you don't have 4 different classes named <code>User</code>!</p>
<p>This is less of a hard and fast rule though. It generally doesn't make sense for Models for instance (<code>UserModel</code> sounds meh) or various utility classes. And if you prefer being able to omit <code>Component</code> from the name of every single component, maybe they're generally clear enough without it! Still, the fact that Routes and Controllers have so much overlap suggests you'll probably want to distinguish them, and for some reason I feel the urge to add <code>Service</code> to the end of all my services.</p>
<p>Note that this only applies to <em>class names</em>, appending the type to the end of file names is definitely not a good idea.</p>
<h3 id="dontrelyonclassfieldassignmentorder">Don't rely on class field assignment order</h3>
<p>Class fields get assigned in order, from top to bottom. This means that it's entirely possible for a class field to rely on the values of <em>other</em> class fields:</p>
<pre><code class="javascript language-javascript">class Person {
  firstName = 'Tony';
  lastName = 'Stark';

  fullName = `${this.firstName} ${this.lastName}`;
}
</code></pre>
<p>This is a bad idea because it makes your class harder to refactor. Moving a field around can break your class in unexpected ways, and it might take minute to figure out what's going on. Class fields definitely <em>read</em> declaratively, and the fact that they <em>do</em> have an assignment order is actually rather odd in that sense - intuitively, you might expect them to all exist at once, like assigments on an object literal.</p>
<p>Note that this really only applies to class fields - once you're in a "hook" of some kind, like the <code>constructor</code> or <code>init</code>, it's safe to start using values. This is because moving the constructor around is safe, and functions are can be reasoned about locally (usually 😬):</p>
<pre><code class="javascript language-javascript">// EmberObject based class
import Component from '@ember/component';

class Person extends Component {
  init() {
    super.init(...arguments);
    this.fullName = `${this.firstName} ${this.lastName}`;
  }

  firstName = 'Tony';
  lastName = 'Stark';
}

// standard native classes
class Person {
  constructor() {
    this.fullName = `${this.firstName} ${this.lastName}`;
  }

  firstName = 'Tony';
  lastName = 'Stark';
}
</code></pre>
<p>Generally, derived state like this is handled better by getters/setters, so this should be avoided if possible by using those.</p>
<h2 id="additionalresources">Additional Resources</h2>
<ul>
<li><a href="https://ember-decorators.github.io/ember-decorators/docs/native-class-basics">Ember Decorators Guides</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes">MDN Class Documentation</a></li>
<li><a href="https://github.com/scalvert/ember-es6-class-codemod">The Native Class Codemod (WIP)</a></li>
<li><a href="https://github.com/scalvert/eslint-plugin-ember-es6-class">Ember Native Class ESLint Plugin</a></li>
</ul>
<!--alex enable just easy-->
<p>And that's all folks! If you have more questions, join the <a href="https://www.emberjs.com/community/">Ember Discord</a> and ask away, the <code>#e-decorators</code>, <code>#e-typescript</code>, <code>#st-native-classes</code>, and <code>#st-octane</code> channels are all great places to get some advice. Thanks for reading!</p>]]></description><link>https://blog.emberjs.com/emberjs-native-class-update-2019-edition</link><guid isPermaLink="true">https://blog.emberjs.com/emberjs-native-class-update-2019-edition</guid><pubDate>Sat, 26 Jan 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Embroider Initiative: Progress Update]]></title><description><![CDATA[<blockquote>
  <p>This post was originally published on <a href="https://mainmatter.com/blog/2023/11/16/embroider-initiative-progress-update/">mainmatter.com</a></p>
</blockquote>
<p>For anyone who has clicked the link to this blog post but doesn't already know,
Embroider is a new build pipeline that compiles Ember apps into spec-compliant,
modern JavaScript. Before Embroider, it was somewhat difficult to participate in
modern build-tooling optimisations such as code-splitting and tree-shaking.
Embroider allows you to opt-into these behaviours out of the box.</p>
<p>Embroider is of critical importance for the entire Ember ecosystem, yet has been
in development for many years with no clear end in sight. The Embroider
Initiative is spearheaded by Mainmatter with the support of a group of sponsors
to help speed up development on Embroider so that we can make it the default
build system for newly generated Ember apps as soon as possible. This will allow
Ember developers to continue leveraging its advantages while benefiting from a
modern build system. We hope to see Ember apps being built with Vite before the
end of the year.</p>
<p>The Embroider Initiative aims to:</p>
<ol>
<li><strong>Finish Embroider</strong> itself by assigning experienced Ember engineers
full-time to the project. This covers development work on Embroider and its
dependencies, as well as helping backers setting it up in their repos to
uncover and fix edge cases.</li>
<li><strong>Make Embroider maintainable</strong> by decentralizing technical knowledge beyond
the project's core developer <a href="https://github.com/ef4">Ed Faulkner</a> and thus
<a href="https://en.wikipedia.org/wiki/Bus_factor">improving the bus factor</a>.
Mainmatter makes use of the apprenticeship model to onboard and train new
developers on the intricate parts of the project.</li>
<li><strong>Shift the ecosystem and make Embroider mainstream</strong> by making it easier to
generate Embroider-optimized Ember apps and supporting addon developers make
their addons compatible with Embroider.</li>
</ol>
<p><strong>To reach these goals and keep up the momentum, the project needs your
financial support. Please <a href="https://mainmatter.com/contact">get in touch</a> to learn how to directly
benefit from this investment.</strong></p>
<p>Mainmatter founder and director Marco Otte-Witte recently
<a href="https://www.youtube.com/watch?v=QMUm6UOoNRs">talked about the Embroider Initiative and open source funding in general at EmberFest in Madrid</a>.
He detailed how important the Initiative is to the future of Ember itself and to
all companies that have built on Ember and need to secure the investments they
have made in Ember. He also went into detail about the Embroider Initiative in
his
<a href="https://mainmatter.com/blog/2023/06/09/securing-the-ecosystems-investment-in-emberjs/">original blog post that announced the initiative</a>.
This blog post will dive into the things our team has been able to achieve up
until now.</p>
<h2 id="gettingembertoworkwithvite">Getting Ember to work with Vite</h2>
<p>At EmberConf this year <a href="https://github.com/ef4">Ed Faulkner</a>
<a href="https://www.youtube.com/watch?v=8rnmGGY5rhk&t=1723s">announced that we were closing in on a Vite plugin for Embroider</a>.
While that was true at the time, we have learned a lot about the Vite build
process since then and we know more about the steps that are still required to
get the Vite integration working.</p>
<p>The Vite app that Ed demoed at EmberConf was a trivial app that is
<a href="https://github.com/embroider-build/embroider/tree/main/tests/vite-app">a package in the Embroider monorepo</a>
and if you wanted to test it yourself then you could either clone the Embroider
monorepo, or you could clone
<a href="https://github.com/mansona/ember-vite-app">this repo</a> which is essentially just
extracting the same test app into an independent repo. It works, and you can
even see the incredible rebuild speeds in action.</p>
<p>The issue with this trivial demo is that it doesn't represent an average Ember
application. There aren't any Ember applications out there that don't have a
single addon installed. While it's not exactly true that the demo doesn't have
<strong>any</strong> addons installed, it doesn't have any addons that are doing any real
work. And, as it turns out, getting dependencies to work right is the challenge
with the Vite build.</p>
<p>Ed and Mainmatter Senior Engineer Chris Manson have been pairing weekly,
plugging away at the remaining things that are required to fix the Vite build.
We are now optimistic we can get to a point where it's possible to build the
first real-world Ember applications with Vite until the end of the year.</p>
<h2 id="emberautoimportallowappimports">ember-auto-import <code>allowAppImports</code></h2>
<p>While the main focus of the Embroider Initiative was always going to be the
Embroider code base, there are other parts of the ecosystem that will require
some work to bring them more in line with how we want people to build their
apps.</p>
<p>If you're already using Embroider, you will know that a lot of the work to
package your app is done by Webpack. If you're still on a classic build, you may
not be aware that ember-auto-import uses Webpack under the hood to allow you to
seamlessly import from <code>node_modules</code>. This has been a very useful feature but
since the acceptance of the
<a href="https://rfcs.emberjs.com/id/0507-embroider-v2-package-format">v2 addon spec RFC</a>
we have noticed that we have a bit of a blindspot in classic builds. Since v2
addons can't influence the build in any way (effectively making them static
packages) addon authors need to add extra installation instructions to detail
how to add a Webpack plugin to their application build config if they still
wanted to influence the build process in any way. This is perfectly legitimate
in Embroider but it does not work for classic apps.</p>
<p>The issue is that ember-auto-import was originally designed to only work with
npm packages, so that means that classic apps couldn't add a Webpack plugin that
would influence the build process for any files controlled by their app, only
for files controlled by npm packages or addons. This has been a
<a href="https://github.com/simonihmig/ember-responsive-image/pull/442">blocker for some addon developers who want to upgrade their addons to the new v2 format</a>
and our solution to this problem has been to
<a href="https://github.com/embroider-build/ember-auto-import/pull/587">add a new config to ember-auto-import</a>
to allow you to specify parts of your app that should be under its control.</p>
<p>While this work has been done to facilitate v2 addons having the same install
instructions for classic ember-cli builds and Embroider apps, this functionality
could also be considered a way to allow you to opt-in to Embroider on a folder
by folder basis and when your whole app is being controlled by ember-auto-import
(and Webpack) the move to embroider should technically require no changes to the
app.</p>
<h2 id="progressforembroiderinitiativebackers">Progress for Embroider Initiative backers</h2>
<p>For the Embroider Initiative to be successful, it needs backing from companies
that would benefit from a modern and thriving Ember ecosystem. But the benefits
of sponsoring the project go beyond the end goal.</p>
<p>While all sponsorship tiers (starting at 3k€ for individual supporters) include
a backer's logo in Mainmatter communication around the Initiative, companies
committing 18k€ to the project get access to the weekly 1-hour call with the
team and get opportunities to discuss their technical needs and challenges
related to Embroider.</p>
<p>Premium tiers of 36k€ and above include a 2-hour weekly private session with
Mainmatter engineers focused on improving the backer's Ember build. In practice,
these backers have seen a great return on their investment as the Mainmatter
Embroider team has been able to deliver dramatic speed improvements to their
build, removing a bottleneck in their development process. Some issues specific
to these backers also resulted in solutions that the larger Ember community can
now benefit from.</p>
<p>Let's see some success stories in details:</p>
<h3 id="ticketsolve">Ticketsolve</h3>
<p>Like many companies, Ticketsolve has an internal addon that they use throughout
their other applications. Internal addons are a great place to start when you
are thinking about upgrading to Embroider for two reasons:</p>
<ol>
<li>It's an isolated place to opt into Embroider's stricter requirements</li>
<li>There is a
<a href="https://github.com/embroider-build/embroider/blob/main/docs/spec.md">clear specification</a>
of what your v2 addon can do.</li>
</ol>
<p>Chris' work on improving the ergonomics of the v2 addon blueprint in the early
weeks of the Embroider Initiative, proved very useful during the process of
converting Ticketsolve's internal addon.</p>
<p>After the internal addon was fully converted to v2 and deployed to all of
Ticketsolve's apps, our next step was to add support for
<a href="https://rfcs.emberjs.com/id/0779-first-class-component-templates/">GJS files</a>
in both the internal addon and their applications. The team also worked on the
ecosystem PRs required to enable GJS support in v2 addons in both a
<code>@embroider/addon-dev</code>
<a href="https://github.com/embroider-build/embroider/pull/1518">PR</a> and a
<a href="https://github.com/embroider-build/addon-blueprint/pull/159">PR</a> to the
<code>@embroider/addon-blueprint</code>.</p>
<p>Before the Embroider Initiative, Ticketsolve had one of their three apps already
running Embroider. We worked to update the Embroider version of that app, then
started to convert the remaining two apps. There were some challenges along the
way, mostly related to addons that just didn't support Embroider. A great
example of this is the
<a href="https://github.com/DockYard/ember-service-worker">ember-service-worker</a> addon
which uses the <code>postprocessTree()</code> hook that doesn't work with Embroider. We
updated the addon locally using <a href="https://pnpm.io/cli/patch"><code>pnpm patch &lt;pkg&gt;</code></a>
and
<a href="https://github.com/DockYard/ember-service-worker/pull/230">submitted a PR with the same changes</a>
to help the rest of the community.</p>
<p>This is only a fraction of the changes that came out of these pairing sessions,
but it gives a flavour of the kinds of things that we have been able to achieve.
While our Chris Manson has been instrumental in helping speed up this work,
Ticketsolve's engineer <a href="https://github.com/enspandi">Andreas Minnich</a> deserves a
shout-out for the colossal amount of work they have put into this effort between
pairing sessions.</p>
<h3 id="intercom">Intercom</h3>
<p>Intercom also had an internal addon they wanted to convert to v2 before working
on converting their main application. Mainmatter worked with them to convert
that and, incidentally, we also helped them to convert the tests app that was
documenting the v2 addon to use Embroider with the <code>staticAddonTestSupportTrees</code>
and <code>staticAddonTrees</code> flags turned on.</p>
<p>While this work was going on, Intercom Engineer
<a href="https://github.com/achambers">Aaron Chambers</a> had setup a CI build step that
would keep track if the main Intercom app could build with Embroider and if any
tests were passing. Because of this CI job, Aaron identified a 10x slowdown in
build times between Embroider v3.1 and v3.2. Chris used a number of pairing
sessions to dive into the issue and produce a number of flamecharts for their
Embroider builds to get an insight into what was causing their specific
slowdown. Those flamecharts were pointing at a particular part of Embroider's
package cache not working exactly as we intended it to. Ed Faulkner managed to
pinpoint the problem (while we were discussing it in the "hallway track" of
<a href="https://emberfest.eu">EmberFest</a>) and
<a href="https://github.com/embroider-build/embroider/pull/1609">opened a pull-request with the fix</a>.
This completely fixed the performance regression for Intercom.</p>
<p>The Mainmatter Embroider team also noticed that Intercom's build was behaving
differently on CI compared to running the exact same build locally. We tracked
it down to the fact that Intercom's CI was configured to create a symbolic link
to an existing <code>node_modules</code> folder rather than running a new <code>npm install</code> for
every job. As it turns out, this was the same reason that the CI was failing for
<a href="https://github.com/ember-cli/ember-cli/pull/10370">Chris' pull request to make Embroider optimised the default</a>
when running the command <code>ember new --embroider</code>. Chris identified the cause of
the issue inside Embroider and
<a href="https://github.com/embroider-build/embroider/pull/1622">fixed it</a> without the
need for any assistance from Ed, which also shows the success in making
Embroider more maintainable by increasing the team size and distributing
technical knowledge (more about this in the next section).</p>
<p>The rest of the pairing sessions were spent working through issues that were
causing tests to fail. Some of these issues were systemic and when they were
fixed they would turn hundreds of tests green (Intercom has a lot of tests),
while other problems were highly specific and required multiple pairing sessions
to identify and fix the problem. An example of this would be Intercom's use of
the charting library <a href="https://www.highcharts.com">Highcharts</a>. When a Highcharts
user needs to include timezones in their Date axis, the library will check for
the presence of <code>window.moment</code> and use it for any timezone-related
calculations. This allows the user to have a chance to setup <code>window.moment</code> to
use <code>moment-timezone</code> and correctly configure it with the right set of timezone
data for their application. With the move to Embroider, <code>window.moment</code> is no
longer accidentally set to the correct instance of <code>moment-timzone</code> as a
side-effect of the build system, so Highcharts wasn't finding the right instance
during its initialisation. It turns out that Highcharts
<a href="https://api.highcharts.com/highcharts/time.moment">provides a config option</a>,
<code>time.moment</code>, to cover this exact case and, as soon as the team set that
correctly in the application's charts base class, the x-axis started behaving
again.</p>
<p>Again, these are only a fraction of the changes that came out of these pairing
sessions. Both <a href="https://github.com/achambers">Aaron Chambers</a> and
<a href="https://github.com/22a">Peter Meehan</a> were able to achieve a lot of big things
over the course of the Embroider Initiative for Intercom and our team was more
than happy to help speed the process along.</p>
<h2 id="improvingthebusfactor">Improving the bus factor</h2>
<p>The goals of Embroider may seem simple from the outside, i.e. "just use Webpack
or Vite to build your Ember app", but when digging a bit deeper, it's easy to
see how complex of a project it really is. This complexity arises from the
project having challenging design constraints which pose a significant challenge
to anyone who would like to contribute to the core of Embroider. The main design
constraint that causes a lot of this complexity arises from the fact that the
team wants to provide an easy on-ramp for existing Ember apps to convert to
Embroider, and then slowly move those apps from full-compatibility mode to a
"fully static" build that can automatically benefit from tree-shaking and
code-splitting. This means that we need to provide systems that can
automatically convert the still-supported conventions of an Ember app to fully
standard compliant ESM code. This is a significant challenge since some of the
patterns that are still <strong>officially</strong> supported today date back to the 1.x
series of Ember which was released in 2015.</p>
<p>Because of the overall complexity of project and the rapid iteration of the
internal architecture, it hasn't been practical to create any documentation that
could communicate what is going on under the hood. This is illustrated by the
fact that <a href="https://github.com/achambers">Aaron Chambers</a> and
<a href="https://github.com/22a">Peter Meehan</a> put together a
<a href="https://github.com/embroider-build/embroider/pull/1459">document trying to explain the full architecture of the project</a>,
which was completely outdated only less than a month later when Ed Faulkner
merged
<a href="https://github.com/embroider-build/embroider/pull/1435">the first of many internal refactors</a>.</p>
<p>To address this challenge, we have adopted an apprenticeship model where
<a href="https://github.com/ef4/">Ed Faulkner</a> pairs with Chris every week,
collaborating on solving complex problems deep within the heart of the Embroider
codebase. This has made a significant improvement to the
<a href="https://en.wikipedia.org/wiki/Bus_factor">bus factor</a> of the Embroider project
and has also had a deep impact on its velocity.</p>
<p>With our second full-time engineer on the Embroider Initiative,
<a href="https://github.com/lolmaus/">Andrey Mikhaylov</a>, we have extended the
apprenticeship model by having Chris and Andrey pair-program for half a day each
week. This has helped both Chris and Andrey ramp up their knowledge of the
codebase while improving the overall project's bus factor.</p>
<h2 id="generalstabilityandecosystemimprovements">General stability and ecosystem improvements</h2>
<h3 id="providingwatchmodetestsforembroider">Providing watch-mode tests for Embroider</h3>
<p>Recently, <a href="https://github.com/chancancode">Godfrey Chan</a> has been discovering
some places in Embroider and our Webpack plugin that were
<a href="https://github.com/embroider-build/embroider/issues/1619">causing crashes when certain files were added or deleted</a>.
He has already come up with a
<a href="https://github.com/embroider-build/embroider/pull/1620">fix for some of the cases</a>,
but it showed a blind spot in the team's testing infrastructure that meant we
weren't testing "watch mode" in Embroider.
<a href="https://github.com/NullVoxPopuli">Preston Sego</a> and Chris paired together to
<a href="https://github.com/embroider-build/embroider/pull/1624">add some basic watch mode tests</a>
that would highlight the problem and prove the effectiveness of the fix, but
they were hit by some strange quirks that prevented the watch-mode tests from
ever exiting properly on the Windows CI job. Chris spent most of his
<a href="https://www.twitch.tv/real_ate">weekly streaming session on Twitch</a> trying to
<a href="https://github.com/embroider-build/embroider/pull/1624/files#diff-adeba5225992c6c7545d60355bcb082048a61ff39fdb2d9f5aa0d2c585e8d896R55-R62">figure out the solution</a>.
The team finally got the PR merged and is now ready to start adding more
expansive watch-mode tests.</p>
<h3 id="embercliupdatesupportingv2addons"><code>ember-cli-update</code> supporting v2 addons</h3>
<p><code>ember-cli-update</code> is a great asset to the Ember community, and it's a vital
tool during the push for Embroider and encouraging the community to use the new
v2 addon blueprint because a lot of the recent changes require updating both a
dependency version and related configuration.</p>
<p>One issue the team worked through was to fix CI, which had been broken for a
year. <code>ember-cli-update</code> interacts with the npm APIs to discover versions, but a
change on the npm side prevented it from functioning properly. The solution to
fixing CI was ultimately updating a dependency, <code>boilerplate-update</code>, to use
<a href="https://www.npmjs.com/package/pacote">pacote</a> to interact with the npm API.
Once the upstream dependency was updated, the team only needed to
<a href="https://github.com/ember-cli/ember-cli-update/pull/1243">add a few tweaks to ember-cli-update</a>
to get CI to finally pass. This gave us time and confidence for the rest of the
project.</p>
<p>The team then worked to get a new release of
<a href="https://github.com/ember-cli/ember-cli-update">ember-cli-update</a> so that it
could update any Ember addon generated with the
<a href="https://github.com/embroider-build/addon-blueprint">v2 addon blueprint</a>.</p>
<p><code>ember-cli-update</code> works by generating a diff between the version of the
blueprint that the app or addon was generated with, and the version to update it
to. Under the hood, this means that <code>ember-cli-update</code> will generate a pristine
new version of the app/addon at its current version, then generates a new
pristine copy of the target version. It generates a <code>git diff</code> between those
versions then applies that diff to the current app.</p>
<p>Generating these pristine "from" and "to" versions of the blueprint involved a
custom code-path in <code>ember-cli-update</code> that aimed at working around some bugs in
Node 8. As those workarounds were causing it to fail, Chris'
<a href="https://github.com/ember-cli/ember-cli-update/pull/1240">fix for custom blueprints</a>
involved removing these workarounds.
<a href="https://github.com/ember-cli/ember-cli-update/releases/tag/v2.0.0">This fix was released in <code>ember-cli-update v2.0.0</code></a>,
then followed by
<a href="https://github.com/ember-cli/ember-cli-update/releases/tag/v2.0.1">another release</a>
that fixed a small bug. These two releases are a big deal for the wider Ember
community, especially as its members are encouraged to migrate their existing v1
addons to v2 addons. They bring an important DX functionality that the Ember
community has come to expect.</p>
<h3 id="embroideroptimisedwiththeembroiderflag">Embroider optimised with the <code>--embroider</code> flag</h3>
<p>Creating a new Ember app with the <code>embroider</code> flag
(<code>ember new my-super-app --embroider</code>) generates a "full compat" app were none
of the
<a href="https://github.com/embroider-build/embroider#options">Embroider optimisation flags</a>
are passed to the build for the developer.</p>
<p>While more existing apps will work with a "full compat" mode, Ember has reached
a point where it makes sense for <strong>newly generated apps</strong> to start with a high
water mark so that developers don't accidentally or unconsciously add
functionality that won't work in a fully optimised Embroider application.
Developers have the option to turn off any of the optimisation flags, but it
would be a deliberate choice as they would need to add a specific dependency or
functionality to their app.</p>
<p>The Mainmatter Embroider team opened a
<a href="https://github.com/ember-cli/ember-cli/pull/10370">PR to switch the functionality</a>
so that passing the <code>--embroider</code> flag uses Embroider optimised by default. This
involved working through issues with some of the slow test suites that rely on a
custom package caching mechanism. The PR got merged and the functionality will
be part of Ember v5.5.</p>
<h3 id="scenariotesteresmcompatibility"><code>scenario-tester</code> ESM compatibility</h3>
<p><a href="https://github.com/embroider-build/scenario-tester">Scenario tester</a> is a
testing tool that the team makes use of a lot when testing Embroider and
<code>ember-auto-import</code>. It allows us to generate many scenarios with different
combinations of dependencies. We tried using it outside of Embroider, or more
specifically outside of a Typescript project, and saw it doesn't work in a CJS
environment.
<a href="https://github.com/embroider-build/scenario-tester/pull/18">Chris started the effort to move the Typescript build to output an ESM-compatible build</a>
so it can be consumed directly in ESM without a build step. The only remaining
task is to test if it will work in Embroider before merging and releasing the
new version.</p>
<h3 id="documentingthescenariotesterlibrary">Documenting the scenario-tester library.</h3>
<p><a href="https://github.com/ef4/scenario-tester/"><code>scenario-tester</code></a> is to Embroider
what <code>ember-try</code> is to Ember CLI: it's a tool that lets us perform automated
tests with various combinations of dependencies, configs and circumstances. The
approach of <code>scenario-tester</code> is different: instead of reinstalling dependencies
for every test case, it has all dependencies (including all versions of
dependencies) set up once, saving a lot of time. It leverages
<a href="https://github.com/stefanpenner/node-fixturify-project">fixturify-project</a> to
create and emit to filesystem Ember apps and addons with predefined dependencies
and configuration, in order to run tests on them.</p>
<h3 id="workingonthereverseexports">Working on the reverse-exports</h3>
<p>During the build, Embroider needs to expose Ember internals to Vite and Webpack
in a way they can understand and consume. Modern Ember apps can have multiple
<a href="https://nodejs.org/api/packages.html#package-entry-points">exports</a> entry
points in their <code>package.json</code> configs. This poses a peculiar challenge for
Embroider: it needs to know how to reorganize files in an Ember project in such
a way that they would resolve into paths defined as <code>exports</code> values.
Essentially, this requires resolving <code>exports</code> in reverse, and this it what the
<a href="https://github.com/embroider-build/embroider/pull/1652/">reverse-exports</a>
package is for.</p>
<h2 id="calltoaction">Call to action</h2>
<p>We are hoping we can extend the initiative's budget and timeline to keep up the
momentum in 2024 and finish the work we started. Please <a href="https://mainmatter.com/contact">get in touch</a>
to learn how to support the Embroider Initiative and directly benefit from this
investment!</p>]]></description><link>https://blog.emberjs.com/embroider-initiative-progress-update</link><guid isPermaLink="true">https://blog.emberjs.com/embroider-initiative-progress-update</guid><pubDate>Fri, 24 Nov 2023 11:49:41 GMT</pubDate></item><item><title><![CDATA[Evolving Ember’s Major Version Process]]></title><description><![CDATA[<p>We recently made a significant shift in how we think about versioning in Ember, with <a href="https://rfcs.emberjs.com/id/0830-evolving-embers-major-version-process/">RFC 0830: Evolving Ember’s Major Version Process</a>. Starting in the current 4.0 cycle, Ember major versions will be 18 months long, running from the <code>.0</code> release up to the <code>.12</code> release, and then starting a new major version.</p>
<p>For example, in the current <code>4.x</code> cycle, we will do minor releases up through <code>4.12</code> in April 2023, and then release <code>5.0</code> in May 2023. Then we will repeat, with <code>5.12</code> arriving in September 2024 and <code>6.0</code> coming in November 2024.</p>
<p>This is a pretty significant change, so it’s important to say up front the things that <em>aren’t</em> changing:</p>
<p><strong>Our approach to minor releases is not changing.</strong> We will keep releasing on the same steady cadence. Features will be in, or not, based on whether they’re ready.</p>
<p><strong>Our approach to Long Term Support releases is not changing.</strong> That means that every major version will have 3 LTS releases over its life: the <code>.4</code>, <code>.8</code> and <code>.12</code> releases. Having a minimum of 3 LTS releases is important to the project: the <code>.4</code> release is often “settling down” after the major and often has a lot of new features or changes in it, the <code>.8</code> release should usually be extra stable in the middle of the lifecycle, and the <code>.12</code> release will be a good time to get cleanup done in apps and addons before the major arrives!</p>
<!--alex ignore just-->
<p><strong>Our approach to Editions is not changing.</strong> Just like we did with Octane, we will release Polaris and any future edition in a minor release, when it is fully ready.</p>
<p><strong>Most importantly, <em>our approach to breaking changes is not changing</em>.</strong> We will not be making <em>more</em> breaking changes because of this policy, and we will not make breaking changes without clear migration paths.</p>
<p>We have also committed not to introduce new deprecations targeting the next major after the <code>.10</code> release of the current major. New deprecations <em>can</em> still be added in the <code>.11</code> or even the <code>.12</code> releases, but they have to target a later major. For example, any deprecations introduced in <code>4.11</code> would have to target at least <code>6.0</code>.</p>
<p>The only thing that <em>is</em> changing is that we now have the same kind of predictable cadence for major versions that we have had for minor versions for nearly a decade.</p>
<h2 id="whyarewedoingthis">Why are we doing this?</h2>
<p>Historically, major Ember versions have come rarely and unpredictably. Making major versions come <em>rarely</em> was intentional: We have strongly valued stability, and explicitly aimed to minimize the number of breaking changes developers have to deal with over time. Making major versions <em>unpredictably</em>, on the other hand, was incidental, not intentional, and it has caused some problems!</p>
<p>For the last nine years, Ember has released its minor versions on a predictable cadence. Every six weeks, we release a new minor version, and start a six-week beta period for the <em>next</em> minor version. We embraced this working approach right after 1.0 to avoid the problems that come when you have a “big bang” release after some longer period of time. When you go months or even years without a release, it can lead to a sense that <em>We have to get this feature in or it could be years before users see it!</em> By releasing regularly, we avoid that problem.</p>
<p>It’s worth reading <a href="https://blog.emberjs.com/new-ember-release-process/">the blog post where we announced it</a> to appreciate how little we have had to change since September 2013. The last time we made a big change was back when we <a href="https://blog.emberjs.com/announcing-embers-first-lts/">introduced LTS releases</a> in early 2016. This model has served us really well over the years!</p>
<p>For major versions, though, we have consistently ended up with the exact same problem our minor versions aimed to solve, but inverted. Instead of a rush to get new features <em>in</em>, the lead-up to every major version has come with a rush to get old and no-longer useful features <em>out</em>. The lead-ups to 2.0, 3.0, and 4.0 all saw a flurry of deprecations in the final few releases. This is exactly what we would expect! It’s the same basic feeling as with a rush to get features in before a big, rare release, but, again, inverted: <em>We have to get these old crufty bits out now or it could be years more of having to carry them around!</em></p>
<p>Combined with the rarity of our major releases, the result has been <em>less</em> stability and <em>more</em> churn when majors do come around. That’s the opposite of our goal!</p>
<p><a href="https://rfcs.emberjs.com/id/0830-evolving-embers-major-version-process/">RFC 0830</a> solves this by putting Ember major versions on a predictable cadence. Every 18 months, after the previous <code>.12</code> point release, there will be a new Ember major version. That means two big things:</p>
<ol>
<li><p>Our users can plan for Ember major versions. Knowing that there will be a major versions in (roughly) May 2023, November 2024, May 2026, November 2027, and so on makes it much easier to incorporate into planning cycles, including what deprecations to prioritize and when.</p></li>
<li><p>We (Ember maintainers) can plan for Ember major versions. In particular, it means we can target deprecations knowing what that means time-wise. We can ask whether it’s reasonable to target a deprecation for a 6.0 release in November 2024, and if not can push it back to the 7.0 release in May 2026, or even the 8.0 release in November 2027.</p></li>
</ol>
<h2 id="ourexpectedschedule">Our expected schedule</h2>
<p>Here’s how we expect this to work in practice, with expected dates for LTS releases and major releases:</p>
<table>
  <thead>
    <tr>
      <th>Ember Release</th>
      <th>Release date</th>
      <th>LTS date</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>4.8</td>
      <td>October 2022</td>
      <td>November 2022</td>
    </tr>
    <tr>
      <td>4.12</td>
      <td>April 2023</td>
      <td>May 2023</td>
    </tr>
    <tr class='highlight'>
      <td><strong>5.0</strong></td>
      <td><strong>May 2023</strong></td>
      <td>(N/A)</td>
    </tr>
    <tr>
      <td>5.4</td>
      <td>October 2023</td>
      <td>December 2023</td>
    </tr>
    <tr>
      <td>5.8</td>
      <td>April 2024</td>
      <td>May 2024</td>
    </tr>
    <tr>
      <td>5.12</td>
      <td>September 2024</td>
      <td>November 2024</td>
    </tr>
    <tr class='highlight'>
      <td> <strong>6.0</strong></td>
      <td> <strong>November 2024</strong> </td>
      <td>(N/A)</td>
    </tr>
    <tr>
      <td>6.4</td>
      <td>April 2025</td>
      <td>May 2025</td>
    </tr>
    <tr>
      <td>6.8</td>
      <td>October 2025</td>
      <td>November 2025</td>
    </tr>
    <tr>
      <td>6.12</td>
      <td>March 2026</td>
      <td>May 2026</td>
    </tr>
    <tr class='highlight'>
      <td><strong>7.0</strong></td>
      <td><strong>May 2026</strong></td>
      <td>(N/A)</td>
    </tr>
  </tbody>
</table>
<!--alex ignore of-course-->
<p>These dates are not set in stone, of course: they can slip a little, as happens sometimes with minor releases. But this represents our plan, and we are excited to see how it works in practice with a (very small) 5.0 coming up next May!</p>]]></description><link>https://blog.emberjs.com/evolving-embers-major-version-process</link><guid isPermaLink="true">https://blog.emberjs.com/evolving-embers-major-version-process</guid><pubDate>Fri, 23 Sep 2022 16:30:00 GMT</pubDate></item><item><title><![CDATA[Ember.js Face-to-Face Meeting Summary, Q4 2018]]></title><description><![CDATA[<p>Last month, members of the <a href="https://emberjs.com/team/">Ember.js Core Team</a> met in-person and remotely to review the direction that the framework API is headed, work through some architectural design questions, and figure out next steps. In this article, we’ll share a summary of the discussions and themes of the weekend.</p>
<h2 id="whathappensinaf2fmeeting">What happens in a F2F meeting?</h2>
<p>"F2F" stands for face-to-face, a meeting where members of a core team get together to work on problems or brainstorm in a way that is difficult to do remotely or in one-hour meetings. Each of the core teams of Ember meets at least once a year, often right after EmberConf.</p>
<p>All core teams make an effort to keeps notes of their meetings, and you can find the agenda and notes (covering day one) for the framework F2F <a href="https://github.com/emberjs/core-notes/blob/master/ember.js/2018-12/F2F-Ember-Core-Team-20181215.md">in the core notes repo</a>.</p>
<p>Read on for a summary of what was covered.</p>
<h2 id="octanerfcreview">Octane RFC review</h2>
<p>The F2F agenda focused on discussing and commenting on <a href="https://github.com/emberjs/rfcs/pulls">open RFCs</a>, especially those related to Ember “Octane”. Octane will be Ember’s first <a href="https://github.com/emberjs/rfcs/pull/371">edition release</a>, a minor version release of the framework accompanied by updated blueprints for new apps and documentation that focuses on new programming models. Octane will bring a new and improved developer experience to Ember. It will be a minor (non-breaking change) release of the framework that brings Ember’s newest and best features to the forefront.</p>
<p>Among the RFCs discussed were:</p>
<ul>
<li>Template Imports - The <a href="https://github.com/emberjs/rfcs/pull/367">Module Unification Packages RFC</a> introduced a method to import components from an addon into a template. There is a lot of interest in unifying any import design with the semantics and syntax of JavaScript itself, and this was debated extensively. Keep your eyes peeled for an RFC discussing concrete API proposals!</li>
<li><a href="https://github.com/emberjs/rfcs/pull/386">Remove jQuery by default</a> - Dropping jQuery from Ember’s default blueprint impacts other packages your app may use. Instead of jQuery being implicitly present, those packages must now explicitly require it. A large part of the feedback and discussion of this RFC was focused on the impacts this change has on other app dependencies. Additionally some libraries are dependent upon jQuery prefilters to modify every request to a server (for example to add an authorization header), and updates to the RFC were requested to address that. <a href="https://github.com/emberjs/rfcs/pull/386#issuecomment-449666712">Read our detailed feedback here</a>.</li>
<li><a href="https://github.com/emberjs/rfcs/pull/416">Glimmer Components</a> and <a href="https://github.com/emberjs/rfcs/pull/415">Render Element Modifiers</a> - The Glimmer Components RFC introduces an API for components that does not include any DOM-based hooks (for example <code>didInsertElement</code>). The "Render Element Modifiers" RFC is intended to bring those APIs back into Ember with a different approach. In the discussion we realized the APIs being suggested for this narrow case are extremely similar to the APIs you might want for modifiers as a general tool. Trying to bridge the gap between this use-case and a generalized design for invokable modifiers was brought up as a goal.</li>
<li><a href="https://github.com/emberjs/rfcs/pull/371">Editions</a></li>
<li><a href="https://github.com/emberjs/rfcs/pull/410">Tracked Properties</a></li>
<li><a href="https://github.com/emberjs/rfcs/pull/408">Decorators</a></li>
</ul>
<p>One of the framework’s main strengths is that Ember apps have uncommon longevity compared to many other apps in the JavaScript ecosystem. We believe it’s important that these new features all work well as a whole unit, in terms of current user adoption, new learner experience, and technical performance.</p>
<p>To learn more about Octane and how these RFCs work to support it, see the <a href="https://github.com/emberjs/rfcs/pull/364">2018 Roadmap RFC</a> by Tom Dale, which introduces Octane, and the <a href="https://github.com/emberjs/rfcs/pull/371">Editions RFC</a> by Dave Wasmer.</p>
<h2 id="reviewofwebsiteimprovementprogress">Review of website improvement progress</h2>
<p>There is an opportunity to refresh and renew more than our APIs. As previously described in <a href="https://the-emberjs-times.ongoodbits.com/">The Ember Times</a>, significant work is underway to improve the architecture, look, and feel of our public website, <a href="https://emberjs.com">emberjs.com</a>. Framework core team members received an update on the latest progress, which is now an <a href="https://github.com/emberjs/rfcs/pull/425">RFC open to public review</a>. Over the past year, many pieces of the multiple web apps that make up our public site have been refactored to use a central style guide and common UI components, making the upcoming visual refactor possible. This work has been done in <a href="https://github.com/ember-learn/ember-styleguide">ember-styleguide</a>.</p>
<p>There has been major progress in accessibility, consistency, and better marketing messaging of the site, but there’s still more work to do! The Learning Team and the Website Strike team are on the job. Stay tuned for more updates in the new year.</p>
<h2 id="actionitems">Action items</h2>
<p>It’s safe to say that there’s a lot of work to do for the features and documentation that make up the Octane edition! To follow along or help out, see the <a href="https://github.com/emberjs/ember.js/issues/17234">Octane Tracking Issue</a>. The new architecture for the public site is a work in progress app found <a href="https://github.com/ember-learn/ember-website">here</a>.</p>
<h2 id="whatsnext">What’s next?</h2>
<p>Before every <a href="https://emberconf.com/">EmberConf</a>, the largest gathering of Ember devs, there’s always a flurry of activity. It seems like the first quarter of 2019 might be the liveliest one yet! There are less than two months to go, and some big plans underway. Stay tuned for updates via <a href="https://the-emberjs-times.ongoodbits.com/">The Ember Times</a>, the <a href="https://twitter.com/emberjs">Ember.js Twitter</a>, and “watch” the <a href="https://github.com/emberjs/ember.js">ember.js GitHub repository</a>… if you dare.</p>
<p>Hope to see you in March at EmberConf!</p>]]></description><link>https://blog.emberjs.com/framework-f2f</link><guid isPermaLink="true">https://blog.emberjs.com/framework-f2f</guid><pubDate>Fri, 25 Jan 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember JS Framework Takes the GAAD Pledge]]></title><description><![CDATA[<p>As we join <a href="https://globalaccessibilityawarenessday.org/">Global Accessibility Awareness Day</a> (GAAD) in celebrating its tenth anniversary, we are delighted to announce that the <a href="https://emberjs.com/">Ember JavaScript Framework</a> has taken the GAAD pledge <strong>to make accessibility a core value of our framework</strong>.</p>
<p>For those who know the project well, this will come as no surprise. It’s no secret that we think that accessibility is an integral part of quality code. <a href="https://github.com/emberjs/ember.js">Ember.js</a> is committed to providing a well-lit path for developer success, and our plans to make it easier for developers to write accessible code are part of that. In 2020, the Ember Accessibility Strike Team became the <a href="https://blog.emberjs.com/accessibility-working-group-update">Ember Accessibility Working Group</a>, demonstrating our commitment to long-term accessibility growth in the framework.</p>
<h2 id="whatwevedonesofar">What We've Done So Far</h2>
<p>Ember has also been shipping improvements with the “accessibility by default” developer experience in mind. These improvements include support for default app language (RFC <a href="https://emberjs.github.io/rfcs/0635-ember-new-lang.html">#635</a>), default page titles (RFC <a href="https://emberjs.github.io/rfcs/0645-add-ember-page-title-addon.html">#645</a>), added <a href="https://guides.emberjs.com/release/accessibility/application-considerations/">content to the guides</a> specifically for accessibility, changes to the <a href="https://ember-styleguide.netlify.app/concepts/colors/">website design</a> for better accessibility, and addition of accessibility-related linting rules to <a href="https://github.com/ember-template-lint/ember-template-lint">Ember Template Lint</a>. Members of the Accessibility Working Group also published two new addons, <a href="https://github.com/KamiKillertO/ember-context-id-helper">ember-context-id-helper</a> and <a href="https://github.com/ember-a11y/ember-select-light">ember-select-light</a>, to give developers more tools to craft accessible code.</p>
<h2 id="whatwehaveplanned">What We Have Planned</h2>
<p>Looking forward, we have even more accessibility-related work planned. Two RFCs have been merged that target specific improvements; one addresses a way to make it easier to associate elements through unique id attributes in template-only components (RFC <a href="https://emberjs.github.io/rfcs/0659-unique-id-helper.html">#659</a>), and the other proposes an interactive way to create new Ember apps, ensuring that accessible outcomes are front and center (RFC <a href="https://emberjs.github.io/rfcs/0638-interactive-app-creation.html">#638</a>).</p>
<p>We will continue on our journey of accessibility with more improvements to the guide prose and code samples, as well as implement targeted improvements to the design of the guides and API documentation. Our goal is to reach <a href="https://ember-styleguide.netlify.app/concepts/accessibility/">WCAG’s AA level of conformance on our official project websites</a>, and we are determined to see this through to completion.</p>
<h2 id="howyoucanhelp">How You Can Help</h2>
<p>We also invite everyone to help make Ember a more accessible framework. There are lots of ways to get involved! Here are a few ideas:</p>
<ul>
<li>Help maintain a11y-specific addons in the <a href="https://github.com/ember-a11y">Ember A11y</a> organization.</li>
<li>Contribute <a href="https://github.com/ember-template-lint/ember-template-lint/issues?q=is%3Aopen+is%3Aissue+label%3Aa11y">additional template linting rules</a> to Ember Template Lint</li>
<li>Tackle an accessibility-related <a href="https://help-wanted.emberjs.com/ember-a11y">Help Wanted issue</a></li>
<li>Add accessible component patterns to the <a href="https://github.com/ember-components/ember-component-patterns">Ember Component Patterns</a> Project</li>
<li>Provide feedback to the team<ul>
<li>by email: core@emberjs.com</li>
<li>on Twitter: <a href="https://twitter.com/emberjs">https://twitter.com/emberjs</a></li>
<li>by filing an issue on GitHub: <a href="https://github.com/emberjs/ember.js/issues">https://github.com/emberjs/ember.js/issues</a></li></ul></li>
</ul>
<p>Today we reaffirm our commitment to accessibility by taking the GAAD Pledge. As we continually improve Ember, accessibility is an integral part of our core values. No matter where you are on your accessibility journey, we invite you to take a closer look at Ember and see the many ways that the framework supports developers to build high-quality applications that are accessible for everyone.</p>]]></description><link>https://blog.emberjs.com/gaad-2021</link><guid isPermaLink="true">https://blog.emberjs.com/gaad-2021</guid><pubDate>Thu, 20 May 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[Celebrating Accessibility in Ember]]></title><description><![CDATA[<p>As we celebrate <a href="https://globalaccessibilityawarenessday.org/">Global Accessibility Awareness Day (GAAD)</a>, I also want to take the time to celebrate the incredible progress that the Ember community has made in our accessibility (a11y) efforts. Over the past few years, the Ember community has been purposefully strategic about accessibility improvements; it hardly came as a surprise that we made our commitment to accessibility even more visible by taking the GAAD Pledge last year to make accessibility a core value of our framework.</p>
<h2 id="gettingstartedsettinggoals">Getting Started: Setting Goals</h2>
<p>After completing an analysis of the accessibility-related shortcomings shared both across all JS Frameworks and in Ember specifically, a tangible list of items that could be improved emerged. It was also clear that additional education of the community was needed to increase mindshare regarding accessiblilty in general.</p>
<!-- alex ignore of-course -->
<p>Of course, there is a forever-long list of accessibility improvements to be made across the web; to avoid trying to boil the proverbial ocean, it was important to set a north-star goal to help orient all efforts.</p>
<p>To that end, the goal became this: <strong>no <em>new</em> Ember app should fail accessibility conformance checks.</strong> By this, we mean running the <code>ember new MY-APP</code> command, and adding at least one additional route (<code>ember generate route NAME</code>).</p>
<h2 id="improvements">Improvements</h2>
<p>There have been some distinct areas of improvement, and I want to take the time to highlight and celebrate them!</p>
<h3 id="communityeducation">Community Education</h3>
<!-- alex ignore special -->
<p>One of the ways our community shares big ideas is through <a href="https://emberconf.com">EmberConf</a>, our primary annual conference. Thanks to the specific efforts of the conference program committee and the speakers who submitted CFPs, we witnessed a shift: talks began including more accessibility. In the past two Ember conferences, nearly every talk has directly discussed accessibility as it relates to the subject matter being presented. From "nearly none" to "almost all" over the space of 2-3 years is really something special; kudos to the conference speakers for providing this valuable information to our community!</p>
<p>This year, I <em>especially</em> loved <a href="https://www.youtube.com/watch?v=QJxtGuJ2E0U">Space Jamming Accessibility by Zoë Bijl & Jenny Judova</a>. Want to browse all of talks and learn more? Check out our YouTube channel: <a href="https://www.youtube.com/c/EmberMeetupVideos">https://www.youtube.com/c/EmberMeetupVideos</a></p>
<p>Additionally, the #talk-a11y channel on the <a href="https://discord.gg/emberjs">Ember Community Discord Server</a> has been a great place for folks to ask questions and get help implementing accessible interfaces in their Ember apps. The top question has probably been, "how do I make an accessible card component?" Thanks to the <a href="https://inclusive-components.design/cards/">Inclusive Components</a> project for recommending <em>such</em> a great solution. The answer is permanently pinned to that channel!</p>
<h2 id="frameworkimprovements">Framework Improvements</h2>
<h3 id="pagetitles">Page Titles</h3>
<p>The first framework improvement to land was adding <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title#accessibility_concerns">page titles</a> by default, as outlined by <a href="https://rfcs.emberjs.com/id/0645-add-ember-page-title-addon">RFC #645</a>. When you generate a new route in Ember, the corresponding page template will have <code>{{page-title "ROUTE NAME"}}</code> at the very top of the template. Users only have to provide a meaningful page name and the framework will put it in the correct place!</p>
<p>By default, using the helper will append additional titles to the root. Developers can customize the separator used, and the order of the titles (maybe you would like the page title first, followed by the site title!)</p>
<h3 id="langattribute">Lang Attribute</h3>
<p>Another framework improvement was to add the ability to apply a <code>lang</code> attribute to the <code>&lt;html&gt;</code> element for your app. <code>ember new my-app --lang en</code>, where the value following the <code>--lang</code> flag is the language code (e.g., "en" is English; "en-US" is specifically American English); this was outlined in <a href="https://rfcs.emberjs.com/id/0635-ember-new-lang">RFC #635</a>.</p>
<p>One interesting thing about this project was finding the places where there are programming languages who shared the same code as spoken languages:</p>
<ol>
<li>CSS is a recently revived language called Coastanoan</li>
<li>XML is Malaysian sign language</li>
<li>TS is the Tsonga language, spoken by three countries in Africa</li>
</ol>
<p>Huge thank you to <a href="https://github.com/josephdsumner">Joseph Sumner</a> for doing the lion's share of the work to make this happen!</p>
<h3 id="uniqueidsupport">Unique Id Support</h3>
<!-- alex ignore easy -->
<p>It was too easy to not get the feedback that your <code>input</code> element needed an associated <code>label</code> element! As a first step, we improved the guides, adding clearer language and illustrations. Next, we tested out the ideas presented in <a href="https://rfcs.emberjs.com/id/0659-unique-id-helper">RFC #659</a> in <a href="https://github.com/KamiKillertO/ember-context-id-helper">ember-context-id-helper</a></p>
<p>And now we have a proper id helper, baked into Ember by default!</p>
<p>In Ember v.4.4.0, the <code>{{unique-id}}</code> helper will be included by default in new Ember apps. Developers can use this helper to generate a unique ID string suitable for use as an ID attribute in the DOM. Notably, this removes the need for a backing class since it can be directly used in template-only components!</p>
<p>A sample invocation of such a component might look like this:</p>
<pre><code class="handlebars language-handlebars">&lt;MyFormGroup @id={{unique-id}} /&gt;
</code></pre>
<p>Each invocation of <code>{{unique-id}}</code> will return a new, unique ID string.</p>
<p>You can also use the <code>let</code> helper to create an ID that can be reused within a template.</p>
<pre><code class="handlebars language-handlebars">{{#let (unique-id) as |emailId|}}
  &lt;label for={{emailId}}&gt;Email address&lt;/label&gt;
  &lt;input id={{emailId}} type="email" /&gt;
{{/let}}
</code></pre>
<h3 id="interactiveemberappcreation">Interactive Ember App Creation</h3>
<p>To build on this, look for <a href="https://rfcs.emberjs.com/id/0638-interactive-app-creation">RFC #638</a>, an interactive way to create new Ember apps, to come to life soon! <a href="https://github.com/bertdeblock">Bert De Block</a> has <a href="https://github.com/ember-cli/ember-cli/pull/9824">submitted a PR to ember-cli</a>. The idea is that you will be able to type <code>ember new --interactive</code> (or <code>ember new -i</code> for short) and be presented with some questions in your CLI that will guide you with strong defaults, but give you room to customize.</p>
<h2 id="ecosystemimprovements">Ecosystem Improvements</h2>
<p>Not every improvement lands directly in the default Ember blueprint, however. Some solutions need time to be battle-tested in Ember apps, so we ship them as an Ember addon to be tested and gather feedback BEFORE we put them into the default app experience.</p>
<h3 id="accessiblerouting">Accessible Routing</h3>
<p>While the router in general is due for a refresh, we didn't want to wait to ship an a11y solution! There have been several ideas for how to solve accessible routing in Ember over the years, but we landed on <a href="https://github.com/ember-a11y/ember-a11y-refocus">ember-a11y-refocus</a>, as it provides three critical missing pieces all at once:</p>
<ol>
<li>It adds a (customizable!) message to the page to let the screen reader user know that the route has changed and regular page navigation can resume (it is similar to <a href="https://github.com/ember-a11y/a11y-announcer">https://github.com/ember-a11y/a11y-announcer</a> but does not use <code>aria-live</code>).</li>
<li>It moves the focus to that message for the screen reader user, effectively resetting focus in Ember apps (similar to how a native web page/site works).</li>
<li>It provides a default (but optional) bypass mechanism so the user can skip to the page's primary content (see <a href="https://www.w3.org/TR/WCAG20-TECHS/G1.html">https://www.w3.org/TR/WCAG20-TECHS/G1.html</a>).</li>
</ol>
<p>It even provides a customizable way to <a href="https://github.com/ember-a11y/ember-a11y-refocus#customizing-the-definition-of-a-route-change">define a route change</a> to support the current implementation of query params.</p>
<p>Have you tried this out in your Ember apps yet? We'd love to hear about it! We also have <a href="https://github.com/emberjs/rfcs/issues/749">an issue defined</a> to write an RFC that proposes adding this to the framework by default.</p>
<h3 id="accessibleemberappexample">Accessible Ember App Example</h3>
<p>If you want to find a really perfect start for your Ember application, check out <a href="https://github.com/ember-sample-apps/accessibility-base">ember-sample-apps/accessibility-base</a>. This sample app provides all the specific tweaks that an Ember app needs, and the README itemizes the details:</p>
<ol>
<li>adds <code>lang</code> attribute in <code>app/index.html</code> (you can also do this via <code>ember new my-app --lang en</code> where <code>en</code> is the spoken language code for your application)</li>
<li>adds <code>user-scalable=yes</code> to the <code>meta</code> tag with the <code>viewport</code> attribute.</li>
<li>adds <code>ember-a11y-refocus</code> addon for accessible routing.</li>
<li>adds a <code>main</code> element with <code>id="main"</code> around the <code>{{outlet}}</code> in <code>app/application.hbs</code> (needed by <code>ember-a11y-refocus</code>).</li>
</ol>
<h2 id="tooling">Tooling</h2>
<p>We continue our efforts to detect accessibility issues as early as possible, working to make continuous accessibility a reality. Thanks to the efforts of <a href="https://github.com/judithhinlung">Judith Lung</a> and other community members, the linting automation made available by [ember-template-lint] continues to increase! Additionally, the community continues to maintain <a href="https://github.com/ember-a11y/ember-a11y-testing">ember-a11y-testing</a>, our testing tool that uses <a href="https://github.com/dequelabs/axe-core">axe-core</a> to provide excellent dynamic testing support. Thank you for all you do!</p>
<p>We're seeing an increase in individual accessibility efforts as well, even useful outside of the Ember ecosystem.</p>
<p>In particular, Agathe Badia's <a href="https://github.com/Agathebadia/colorblind-emulator">Colorblindness Emulator</a> is an easy-to-use browser extension that anyone can use to test the color-contrast in their designs. She gave <a href="https://www.youtube.com/watch?v=E1n99HOBQT0">a fantastic talk about colorblindness</a> with lots of scientific detail at EmberConf 2022-- check out her talk and the browser extension to become more knowledgeable in this area, it's really fascinating.</p>
<p>My own pet project, <a href="https://a11y-automation.dev">A11y Automation Tracker</a>, itemizes potential violations and tracks the automation that exists to prevent these issues. It's already being used to inspire additional tooling and in project planning, to help keep teams on target and figure out where automation exists…or doesn't exist yet, and opportunities exist to build something new.</p>
<h2 id="moretoship">More to Ship</h2>
<p>As always, there is still more to do. While concentrated efforts have been made to improve Ember's <a href="https://emberjs.com">website</a>, there is still more work to be done to improve the <a href="https://guides.emberjs.com">guides</a> and the <a href="https://api.emberjs.com/ember/release">API docs</a>, most notably, getting the updated styles from the <a href="https://github.com/ember-learn/ember-styleguide">ember-styleguide</a> applied to both of those sites. Over the last year, the effects of the global pandemic really hampered progress on the website in general; get in touch with the learning team in the #dev-learning-team channel (on Discord) if you are able to help out with this. We can use the help!</p>
<p>We're also experimenting with a digital brand shift to make Ember orange a bit more accessible - if you took this year's community survey, you might have noticed the slight color change. This was based on <a href="https://codepen.io/melsumner/pen/JjOmGGr">some color experiments</a>-- so keep an eye out for an RFC on this topic in the near future.</p>
<p>It takes a lot to keep Ember's accessibility efforts going, so thank you to every single community member who has helped move us along in our accessibility journey. You have shown have the passion, patience and persistence required to make it happen and I'm grateful every day for every single one of you.</p>]]></description><link>https://blog.emberjs.com/gaad-2022</link><guid isPermaLink="true">https://blog.emberjs.com/gaad-2022</guid><pubDate>Thu, 19 May 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Glimmer's In Canary, Test Your Apps!]]></title><description><![CDATA[<p>After months of work, <strong>Glimmer is landing in Canary today</strong>.</p>
<p>What this means:</p>
<ul>
<li>The test suite passes.</li>
<li>We have tested Glimmer on our own apps, and, for the most part, apps boot and
run correctly.</li>
<li>There are still known issues (see below), including with the test helpers.</li>
<li>At this point, we need community help to identify compatibility issues not
covered by the test suite.</li>
<li>We expect to continue improving compatibility with the pre-Glimmer engine for
some time, as new issues come to light.</li>
</ul>
<p>Glimmer is the new rendering engine the Ember community has been working on for
the past several months. It is the first ground-up change to the templating
engine since SproutCore 2.0, and takes advantage of the groundwork laid by
HTMLBars to dramatically improve re-rendering performance. It also sets the
stage for more performance improvements during the 2.x series, and
React-inspired improvements to the Ember programming model. Best of all, we are
landing Glimmer in Ember 1.13, compatible with the full public API of Ember
1.x.</p>
<p>It's also worth noting that while our apps feel faster, not every
performance benchmark will necessarily show marked improvement. There
will be more on this below, but the Glimmer refactor focused primarily
on dramatic improvements to re-rendering performance and programming
model improvements.</p>
<p>Initial render of component-heavy pages shows some improvement in most
of our tests, but you should expect to see the biggest improvements when
re-rendering lists, especially when you are not using deprecated
functionality.</p>
<p>Once we land Glimmer, you will probably see a variety of different
benchmarks testing various aspects of Ember. We expect to see benchmarks
showing that there are still pathologically slow scenarios in Ember,
especially in areas that we did not focus on improving. We expect to
continue to improve performance across Ember throughout the 2.x series,
and discuss that more below.</p>
<p>Also note that while we took great pains to support features present in
Ember 1.12 (including many long-deprecated features), that compatibility
often comes with significant performance costs. In some cases, seemingly
similar constructs (e.g. <code>{{#each posts as |post|]}</code> vs. <code>{{#each posts
itemController='post' as |post|}}</code>) have significantly different
internal implementation, and the Ember 2.0 version has vastly better
performance.</p>
<p>Finally, there will be an upcoming guide in the next week or so that
describes the new features of the Glimmer engine (<code>attrs</code>, new lifecycle
hooks, keys in <code>#each</code>), but at the moment we are focusing on
compatibility with 1.x and testing the 1.x API with existing
applications.</p>
<p>Please follow these instructions to test Ember-CLI apps with Canary:</p>
<ul>
<li><a href="http://www.ember-cli.com/#using-canary-build-instead-of-release">http://www.ember-cli.com/#using-canary-build-instead-of-release</a></li>
</ul>
<h2 id="knownissues">Known Issues</h2>
<p>There are several known issues that you should consider when evaluating
Glimmer:</p>
<ul>
<li>There are still a few memory leaks that we have identified and are
quickly addressing.</li>
<li>The concept of <code>controller</code> in templates and actions in Ember 1.x was
fairly nuanced. Glimmer started with a simpler model and layered
compatibility on top. There are known gaps in the compatibility layer
that we are still addressing.</li>
<li>There are still a number of issues in the testing helpers (especially
the faux unit tests that use "isolated containers") that are causing
apps that work correctly to fail tests. We are working to fix the test
helpers, and should have that work done before we release 1.13 beta.</li>
<li>There are likely a number of not-yet-known compatibility issues in
Glimmer. You should assume that the vast majority of issues you
encounter when testing Glimmer over the next few weeks will be addressed
before the final release.</li>
<li>The compatibility layer is quite slow in some areas, making the
overall Glimmer engine slower than we would like. We have plans to
improve overall performance through the canary and beta cycle, and
then in the 2.0 release cycle.</li>
<li><strong>In general, the Glimmer effort was an attempt to improve
re-rendering performance, especially in large lists.</strong> It also laid
the groundwork for significant performance work in initial render and
throughout the framework, but that work is not yet done. Expect to see
continued performance improvements in Ember throughout the 2.x cycle
as a result of this change.</li>
</ul>
<p>The most critical of these caveats should be addressed before we release 1.13
beta, and we expect to continue work on the remaining issues throughout the
1.13 beta cycle.</p>
<p>Because of the magnitude of this change, and the proximity to the Ember 2.0
"cruft removal" pass, we plan to aggressively fix reported bugs during the 1.13
beta period. There will be another post describing our 1.13 and 2.0 release
plans with more precision in the next few weeks.</p>
<h2 id="performancegains">Performance Gains</h2>
<p>The biggest performance gains in Glimmer come from moving to a simpler
rendering model, built on top of HTMLBars.</p>
<p>First, this allowed us to remove <strong>all</strong> internal views for constructs
like <code>{{foo}}</code>, <code>{{#if bar}}</code> and even in <code>{{#each posts as |post|}}</code>.
This view removal has an impact on initial render, because these
constructs are very common in real-world templates.</p>
<p>Second, as we have discussed extensively, this allows us to
significantly improve the performance of re-rendering, which makes it
practical to re-render lists with entirely new arrays with very good
performance. Previously, achieving reasonable performance was very
difficult, and even when possible, came with significant bookkeeping
overhead.</p>
<p>Interestingly, we have found that when testing real apps, the
performance gains are much more widespread than we expected, in large
part because of the simplification of the overall model.</p>
<p><strong>Glimmer's performance in real applications has pleasantly surprised
us, exceeding the improvements we've seen in benchmarks designed to
stress-test pathological cases.</strong></p>
<p>When upgrading to Glimmer, please pay attention to the
real-world performance of your application <strong>in production mode</strong> and
after clearing any deprecations with performance warnings.</p>
<h2 id="deprecatedfeatures">Deprecated Features</h2>
<p>Throughout the 1.x series, Ember has deprecated features we intended to
remove in 2.0. That process has continued with Ember 1.13, which will
contain Glimmer.</p>
<p>However, it's worth noting that Glimmer is the first major change to
many parts of the view layer since SproutCore 2! As a result,
perfect compatibility, especially in private APIs, was more
challenging.</p>
<p>During the process of building Glimmer, we found various semantics of
"controller"s to be the most challenging. For the most part, this is
because the concept of controller has a number of different meanings
depending on context (routes, <code>{{render}}</code>, <code>{{#each posts
itemController='post'}}</code>, <code>{{#each posts itemController='post' as
|post|}}</code>, <code>{{#with someController}}</code>, etc.).</p>
<p>Controllers and components both manage a template's "context" (called
"self" in Glimmer) and serve as a target for actions. Mirroring these
semantics, which are effectively derived from implementation details of
Ember 1.x's rendering engine, has been a challenge. We're confident they
are very close, but encourage you to open an issue if they have changed.</p>
<p>Glimmer, through HTMLBars, has a much clearer concept of "scope", and
features like <code>{{yield}}</code> work directly with that scope object. We were
able to get the Ember test suite passing by implementing the old
semantics on top of the new scope concept, but <strong>we are aware that we
have gaps in our implementation.</strong></p>
<p>Please let us know if you find controller semantics that we have
implemented incorrectly. Bug reports would help, JSBins would help more,
and pull requests with failing tests would help even more.</p>
<p>Finally, for the best experience with Glimmer, you should try to move
your application away from <code>itemController</code>, <code>{{render}}</code> and other
constructs that manipulate the controller from the template. We know
that this is not always possible (our applications all still make
use of some cases of these features),  which is why we worked so hard on
compatibility.</p>
<p>That said, you'll get better performance and a quicker upgrade path to
2.0 if you work on eliminating uses of these features soon. Implementing
them correctly added enough complexity that we will want to move
somewhat aggressively in 2.x to enable us to further improve
performance.</p>]]></description><link>https://blog.emberjs.com/glimmer-merging</link><guid isPermaLink="true">https://blog.emberjs.com/glimmer-merging</guid><pubDate>Tue, 05 May 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Glimmer.js Progress Report]]></title><description><![CDATA[<p>At EmberConf in March of this year, <a href="https://emberjs.com/blog/2017/04/05/emberconf-2017-state-of-the-union.html#toc_introducing-glimmer-js">we announced Glimmer.js</a>, a
library for building modern UI components optimized for the mobile web. I wanted
to give an update on what we've been working on since then.</p>
<p>There were two primary motivations for releasing Glimmer.js as a standalone project:</p>
<ol>
<li>We wanted people who aren't "all in" on Ember to have a way to incrementally
adopt part of the framework.</li>
<li>We wanted a laboratory where we could freely run experiments on what a
next-generation component library might look like, without creating churn for
Ember users.</li>
</ol>
<p>Because Ember's rendering layer is built on top of the shared Glimmer VM,
successful experiments have a clear path to make their way upstream to Ember
users. And, once stabilized, we'd like Glimmer.js to be the default component
API for new Ember apps—but it's still too premature to set any timelines for
that today.</p>
<h2 id="unlockingexperimentation">Unlocking Experimentation</h2>
<p>While Ember is known for incorporating the best ideas from across the JavaScript
ecosystem, it's important that we contribute back our own innovations, too.
Refining new ideas takes time and, often, a few false starts. How do we
reconcile the need to experiment with Ember's vaunted stability guarantees?</p>
<p>One of the themes we discussed in our keynote was a new focus on <em>unlocking
experimentation</em>, that is, allowing people to easily try out and share unproven
ideas on top of the stable Ember core.</p>
<p>Unlocking experimentation doesn't just allow for <em>more</em> ideas; it also leads to
<em>better</em> ideas, because you can try things without worrying about breaking
changes. With Glimmer.js, we wanted to eat our own experimental dogfood.</p>
<p>We've wanted to overhaul the component API in Ember for some time now. But
because components play such a central role, we knew that we <em>had</em> to have a
tangible implementation for people to play with before we could credibly ask
them to comment on an RFC. And we knew that having an implementation would
almost certainly shake out problems with the design that we would need to
address.</p>
<p>Glimmer.js is our way to iterate on a new component API until we have something
we feel confident submitting to the Ember RFC process.</p>
<!--alex disable gal-guy-->
<p>We've already received incredibly useful feedback from early adopters. In
addition, fellow core team member Chad Hietala and I have been on a team at
LinkedIn using Glimmer.js to build a production application.</p>
<p><a href="http://david.heinemeierhansson.com/posts/6-why-theres-no-rails-inc">To quote DHH</a>:</p>
<blockquote>
  <p>The best frameworks are in my opinion extracted, not envisioned. And the best
  way to extract is first to actually do.</p>
</blockquote>
<p>If you notice that a lot of the items I describe below are performance-related,
that is at least partly due to our product's all-consuming focus on mobile load
times. We are extremely excited about some of the recent breakthroughs we've
made and have enjoyed proving out some of our more esoteric ideas in a real app.</p>
<h2 id="whatsnewinglimmer">What's New in Glimmer</h2>
<p>We've been really, really busy and I've got a ton of updates to share with you. This blog post
got pretty long, so here's the short version:</p>
<p><strong></p>
<ol>
<li>We're adopting <code>&lt;Capital /&gt;</code>-style component syntax.</li>
<li>We're adding support for customizing a component's DOM attributes with <code>...attributes</code>.</li>
<li>You'll be able to teleport your component's elements anywhere in the DOM with the built-in <code>{{in-element}}</code> helper.</li>
<li>We've now got what we think might just be the fastest component library in the running, with:</li>
<li>Compiled binary bytecode</li>
<li>Incremental rendering</li>
<li>SSR with incremental rehydration
</strong></li>
</ol>
<h3 id="adoptingcapitalcomponents">Adopting <code>&lt;Capital /&gt;</code> Components</h3>
<p>One of the most eagerly-awaited features of Glimmer.js is "angle bracket
components," or components that you invoke <code>&lt;like-this /&gt;</code> instead of
<code>{{like-this}}</code>. I personally really like this syntax because it visually
disambiguates components from the dynamic data that flows through them.
It also unifies the attribute syntax between HTML and components:</p>
<pre><code class="handlebars language-handlebars">{{! Ember }}
{{my-button title=title label=(t "Do Something")}}

{{! HTML }}
&lt;button title={{title}} label={{t "Do Something"}}&gt;&lt;/button&gt;

{{! Glimmer.js (today) }}
&lt;my-button @title={{title}} @label={{t "Do Something"}} /&gt;
</code></pre>
<p>This syntax is how Glimmer.js works today. However, the more we discussed the
design and started using it in real projects, the more we believed that this
exact API was flawed and needed to be rethought.</p>
<p>First, a short history lesson. When we introduced components in Ember (back
before Ember 1.0!), we required them to include a dash (<code>-</code>) in their name. This
rule came from the then-new <a href="https://www.w3.org/TR/custom-elements/#custom-element-conformance">Custom Elements spec</a>, a key part
of the Web Components API.</p>
<p>Web Components have the problem of needing to disambiguate between built-in elements
and custom elements. What happens if I make a component called <code>&lt;vr&gt;&lt;/vr&gt;</code> and later
the browser adds a built-in Virtual Reality element with the same name?</p>
<p>The compromise was that custom elements must have a dash, keeping single-word
elements reserved for future versions of the HTML standard.</p>
<p>Of course, Ember components don't have the same problem, because they use
<code>{{</code> and <code>}}</code> as delimeters instead of <code>&lt;</code> and <code>&gt;</code>. Nonetheless, we preemptively adopted
this constraint because we assumed Web Components were going to take the world
by storm and at some point we would need to migrate Ember components to Web
Components.</p>
<p>As time has passed, though, it's become increasingly clear that the use cases
served by Web Components, wonderful as they are, do not have the full set of
functionality to replace everything that an Ember component (or React component,
etc.) needs to do.</p>
<p>Meanwhile, the more components I write, the more grating the naming restriction
feels. I hate the cognitive overhead of having to invent silly names like
<code>{{x-button}}</code> when a single word would be much more descriptive.</p>
<p>Unfortunately, this puts us in a bit of a pickle:</p>
<ol>
<li>We want to drop the annoying <code>dasherized-component</code> requirement.</li>
<li>We want to adopt <code>&lt;angle&gt;</code> brackets syntax for components, but now we have
the same naming collision hazard as Web Components.</li>
<li>People want to use Web Components in their apps, so how do we know if
<code>&lt;my-button&gt;</code> means "create a custom element" or "create a Glimmer
component"?</li>
</ol>
<p>The core team has circled around different designs for <em>months</em>, and this topic
has dominated both our weekly calls and our in-person meetings.</p>
<p>At the most recent face-to-face meeting in Austin, we finally reached consensus
on a proposal that I'm really excited about.</p>
<p>How do you disambiguate between Glimmer components and HTML elements? Our
proposal is to borrow the same rule that React uses: <em>components always start
with a capital letter</em>.</p>
<p>Our above example turns into this:</p>
<pre><code class="handlebars language-handlebars">{{! new Glimmer.js }}
&lt;Button @title={{title}} @label={{t "Do Something"}} /&gt;
</code></pre>
<p>I love this for a few different reasons.</p>
<p>First, to me, the capital letter makes components <em>really</em> stand out in the
template, and we can improve syntax highlighting in editor plugins to make it
stand out even more. It also makes it clear when you're invoking a Web Component
or not, whereas the original Glimmer.js syntax was ambiguous.</p>
<p>Second, I hate the friction of having to invent a two-word name. The app I work
on has at least three different conventions people use to prefix or suffix
components. It feels bad and makes templates look more noisy than they should.
When we switched from dasherized to capitals, it felt viscerally like an
improvement.</p>
<p>Third, for better or worse, many people consider React to be an "industry
standard" and aligning component naming makes Glimmer templates feel that much
more familiar. (Although do note that we are just adopting the naming
convention, not JSX itself!)</p>
<p>This change also helps us solve the problem of "fragment" or "tagless"
components, i.e., templates that don't have a single root element.</p>
<p>While we've supported this in Ember for a long time, we were nervous about the
potential for confusion if you typed something like <code>&lt;my-button /&gt;</code> in a
template, which looks like a Web Component, and it didn't always correlate to a single
element in the DOM.</p>
<p>Today in Glimmer.js, it is a compile-time error if your component template
doesn't have a single root element. With <code>&lt;Capital&gt;</code> components, we will remove
this restriction and allow you to have whatever you want in your template.</p>
<p>One side-effect of this is that we will replace <code>this.element</code> (which today is a
reference to the component's root element) with <code>this.bounds.firstNode</code> and
<code>this.bounds.lastNode</code>, allowing you to traverse the range of DOM nodes
belonging to your component.</p>
<p>There are still some open questions about what, if any, sugar to provide for the
single-element case.</p>
<p>For example, we could make <code>this.element</code> available in just those cases,
although we're concerned that someone coming along and adding an extra element
to a template could subtly break any code relying on <code>this.element</code>. Another
proposal was to set <code>this.element</code> to the element with <code>...attributes</code> on it
(see below). We're looking forward to more design and discussion about how to
make this ergonomic without being error-prone.</p>
<h3 id="componentattributes">Component Attributes</h3>
<p>Without getting into a full explanation of the difference between properties and
attributes in the DOM, suffice it to say that most web developers have a muddy mental
model at best. (And rightfully so—it took me forever to understand the difference.)</p>
<p>While you can get pretty far pretending properties and attributes are
interchangeable, eventually you are going to run into cases where you really
have to set a property or you really have to set an attribute.</p>
<p>Server-side rendering (SSR) complicates the issue because, of course, HTML can
<em>only</em> serialize attributes, not properties.</p>
<p>One drawback of both Ember and React's components is that they don't do a great
job of making it easy for consumers of components to set attributes.</p>
<p>Let's take React as an example (although, again, it applies just as much to
Ember). I want to write a reusable <code>HiResImage</code> component that anyone can
install from npm and use in their apps. It wraps an <code>&lt;img&gt;</code> element and renders
a low-resolution image by default, swapping in a high-resolution image when
clicked.</p>
<pre><code class="javascript language-javascript">// HiResImage.jsx
import { Component } from 'react';

export default class HiResImage extends Component {
  render(props, state) {
    let showHiRes = () =&gt; { this.setState({ hiRes: true }); }
    let { src, hiResSrc } = props;
    let { hiRes } = state;

    return &lt;img src={hiRes ? hiResSrc : src} onClick={showHiRes}&gt;;
  }
}
</code></pre>
<p>Now we can use the component like this:</p>
<pre><code class="html language-html">&lt;HiResImage src="corgi.jpg" hiResSrc="corgi@2x.jpg" /&gt;
</code></pre>
<p>But what happens if I want to set the width of the underlying <code>img</code> element via
its <code>width</code> attribute?</p>
<pre><code class="html language-html">&lt;HiResImage width="100%" src="corgi.jpg" hiResSrc="corgi@2x.jpg" /&gt;
</code></pre>
<p>This won't work because the only attributes or properties that get set are the
ones we've manually listed in our <code>render()</code> method! The <code>width</code> attribute here
will just get ignored.</p>
<p>We have a few options, but none of them are that great.</p>
<ul>
<li>We could enumerate all of the possible valid <code>img</code> attributes that might get
passed in, but that is error-prone (new attributes get added all the time) and
takes a lot of code.</li>
<li>We could use the spread operator (<code>...props</code>), but that will set <em>everything</em>
passed in as an attribute, even "known" props that aren't attributes, like
<code>hiResSrc</code>.</li>
<li>If we're using Babel, we can use rest syntax in object destructuring to
separate "known" and "unknown" props: <code>let { src, hiResSrc, ...attrs } =
props</code>. But this requires non-trivial runtime work, and means any props passed
in by accident will now be treated as an attribute.</li>
<li>In Preact, the problem is even trickier because it will always set the <code>width</code>
property no matter what, never the attribute. And setting the <code>width</code>
<em>property</em> to <code>"100%"</code> results in an image zero pixels wide.</li>
</ul>
<p>With Glimmer.js, you explicitly disambiguate between properties and attributes via
the presence of the <code>@</code> sigil. In symmetry with HTML, attributes do not have <code>@</code>,
while component arguments (<code>props</code> in React parlance) do:</p>
<pre><code class="handlebars language-handlebars">&lt;HiResImage @src="corgi.jpg" @hiResSrc="corgi@2x.jpg" width="100%" /&gt;
</code></pre>
<p>In this example, <code>src</code> and <code>hiResSrc</code> are JavaScript values passed as arguments
to the component object, and <code>width</code> is serialized to a string and set as an
attribute.</p>
<p>"But wait," you ask, "if components aren't required to have a single root
element anymore, where do attributes go?"</p>
<p>With recent changes in Glimmer VM, we can now support an <code>...attributes</code> syntax
that we've colloquially started calling "splattributes" (because they "splat"
attributes from the outside onto an element).</p>
<p>In our case, the Glimmer.js version of the <code>HiResImage</code> component might look like this:</p>
<pre><code class="javascript language-javascript">// component.js
import Component, { tracked } from '@glimmer/component';

export default class HiResImage extends Component {
  @tracked hiRes = false;

  showHiRes() {
    this.hiRes = true;
  }
}
</code></pre>
<pre><code class="handlebars language-handlebars">{{!-- template.hbs --}}
{{#if hiRes}}
  &lt;img src={{@hiResSrc}} ...attributes&gt;
{{else}}
  &lt;img src={{@src}} {{on click=(action showHiRes)}} ...attributes&gt;
{{/if}}
</code></pre>
<p>Here, any attributes passed in on the invoking side will be "splatted" onto the
appropriate element.</p>
<p>So what happens if you try to pass attributes to a component that doesn't have
<code>...attributes</code>? At runtime, you'll get a hard error telling you that the
component should add <code>...attributes</code> to one or more elements. We can probably
produce compile-time errors in the majority of less dynamic cases, too.</p>
<h3 id="portals">Portals</h3>
<p>Typically, the component hierarchy maps directly to the DOM hierarchy, meaning
all of a component's elements are rendered inside a DOM element that belongs to
the parent component.</p>
<p>Occasionally, though, it can be helpful to break out of the current DOM tree and
render a component's content somewhere else. While there are many different use
cases, the most common one I've seen is for rendering modal dialogs.</p>
<p>This is easy to do now with the built-in <code>{{in-element}}</code> helper. This helper
will render the block you pass to it inside a foreign element. (In React-land,
this functionality is usually referred to as a portal, and as of React 16 is
included by default in <code>react-dom</code>.)</p>
<p>For example, if I had a <code>Modal</code> component and I wanted to always render its
content into a specially-styled element at the root of the body (with <code>position:
fixed</code>, say), I might write it like this:</p>
<pre><code class="javascript language-javascript">// component.js
import Component from '@glimmer/component';

export default class Modal extends Component {
  modalElement = document.getElemenyById('modal');
}
</code></pre>
<pre><code class="handlebars language-handlebars">{{!-- template.hbs --}}
{{#in-element modalElement}}
  &lt;h1&gt;Modal&lt;/h1&gt;
  {{yield}}
{{/in-element}}
</code></pre>
<p>Now in my app, I can invoke my <code>Modal</code> component as deep into the hierarchy as I
want, and the content will be rendered into the root modal element:</p>
<pre><code class="handlebars language-handlebars">{{!-- template.hbs --}}
{{#if hasErrors}}
  &lt;Modal&gt;
    &lt;p&gt;You dun goofed:&lt;/p&gt;
    &lt;ul&gt;
      {{#each errors as |error|}}
        &lt;li&gt;{{error}}&lt;/li&gt;
      {{/each}}
    &lt;/ul&gt;
  &lt;/Modal&gt;
{{/if}}
</code></pre>
<h3 id="binarytemplates">Binary Templates</h3>
<p>It's crucial that web apps render instantly, or else users go elsewhere. When it
comes to improving web performance, one of the most frequent recommendations
you'll hear is to minimize the amount of total JavaScript in your app.</p>
<p>There are two reasons for this: not only does more JavaScript take longer to
download, just <em>parsing</em> the JavaScript can become a noticeable bottleneck on
underpowered devices.</p>
<p>Complicating the advice to "use less JavaScript" is the fact that most modern
JavaScript libraries, including Angular, React, Vue and Svelte, compile
component templates (or JSX) to JavaScript, which gets embedded in application
code. Without aggressive hand optimization, more templates means more
JavaScript.</p>
<p>Ember used to do the same thing, compiling Handlebars templates into JavaScript
code that would first create and then update a component's DOM tree.</p>
<p>With Glimmer, however, we took a different approach. Instead of generating
JavaScript, today we compile templates into a JSON data structure of "opcodes,"
or rendering instructions. A small runtime evaluates these opcodes, translating
them into DOM creation, DOM updates, invocation of component hooks, etc.</p>
<p>Not only is <a href="https://jsperf.com/json-parse-vs-eval-corrected/1">a JSON parser much faster than a full-blown JavaScript
parser</a>, aggressively sharing
code in the Glimmer VM generates less on-device memory pressure and allows
JavaScript engines like V8 to more quickly generate JIT-optimized code.</p>
<p>Best of all, our compact JSON format is significantly smaller than the
equivalent compiled JavaScript. We received many reports of apps dropping 30-50%
in total (post-gzip!) size after upgrading to Ember 2.10, the first version to
use this JSON-based approach.</p>
<p>As exciting as this was, we knew that JSON was not the final word in compactly
and efficiently representing compiled templates.</p>
<p>At runtime, the Glimmer VM today gathers the JSON for each template and compiles
them into a final, internal representation that is just a large array of 32-bit
integers. After looking at traces of real-world Glimmer.js apps, we knew we
could improve boot times by precomputing this final compilation step at build
time.</p>
<p>Helpfully, browsers have become increasingly fluent at dealing with binary data,
largely driven by demanding multimedia use cases like audio, video, and 3D
graphics. And while JSON is fast to parse, as the old saw goes, no parse is faster
than <em>no</em> parse. What if we could serialize compiled templates into a binary format
that the VM could start executing <em>without a parse step</em>?</p>
<p>I'm no M. Night Shyamalan, so you've probably already guessed the ending here:
that's exactly what we've done. Recent versions of Glimmer VM include the
<code>@glimmer/bundle-compiler</code> package, our name for the compiler that produces a
binary "bundle" of all of your compiled templates.</p>
<p>We are planning to land support for binary templates as an opt-in in Glimmer.js
soon. (The feature is already landed in the low-level Glimmer VM but is not yet
exposed in a convenient way.)</p>
<p>One thing to note about the bundle compiler is that it requires knowing your
entire program statically at build time. The browser tends to be a pretty
dynamic environment, however, so Glimmer VM still supports "lazy compilation"
(i.e. compiling to JSON) as a first-class mode.</p>
<p>In the Ember ecosystem, apps and addons do very dynamic things (like register
components at runtime) which are incompatible with the bundle compiler. We want
to enable binary templates in Ember, but this is farther out because we will
need to figure out exactly what the constraints are and provide guidance for
app and addon authors.</p>
<p>In exchange for the (admittedly pretty incredible) performance benefits, binary
templates also introduce extra complexity.</p>
<p>Binary templates can't be inlined in HTML or JavaScript, so they must be fetched
as early as possible in the page lifecycle. No browser I tested yet supports
<code>&lt;link rel="preload" as="fetch"&gt;</code>, which would allow a streaming HTML parser to
detect and fetch binary data very early in the page load. No tools or CDNs know
what the heck a <code>.gbx</code> file is (the file extension of compiled binaries), and
require manual configuration. You probably want H2 Push for this, but that's
its own can of worms.</p>
<p>Getting these optimally deployed will probably be painful for a while, but I have
faith that the Ember community will do what it does best and rally around a set
of shared, high quality solutions for dealing with this.</p>
<p>If you're curious about the details of how binary templates work, don't miss
Chad's <a href="https://www.linkedin.com/pulse/glimmers-optimizing-compiler-chad-hietala/">recent post about the optimizing
compiler</a>.</p>
<h3 id="serversiderendering">Server-Side Rendering</h3>
<p>Server-side rendering, or SSR, is a technique for rendering your components on
the server. It allows you to send meaningful HTML to a user's browser so that
they see something other than an empty white rectangle before your JavaScript
finishes loading.</p>
<p>Ember supports SSR through <a href="https://ember-fastboot.com/">FastBoot</a>, and Glimmer
VM is Ember's rendering engine, so you can probably guess that Glimmer already
has support for SSR, too.</p>
<p>That's true, but there are two shortcomings we want to address:</p>
<ol>
<li>Running Glimmer.js apps in SSR mode is not as easy as it should be.</li>
<li>Today we take a performance hit because of how we serialize to HTML.</li>
</ol>
<p>To address the first problem, we are going to make SSR a first-class API and
document exactly how you go from writing a Glimmer.js app to connecting it to a
Node HTTP server.</p>
<p>Second, after looking at profiles of our app running in SSR mode, we noticed
that there is some low-hanging fruit to pick in how we generate HTML.</p>
<p>Glimmer is able to run in Node because, internally, we use an abstraction for building
and modifying the DOM. Instead of calling <code>document.createElement(tagName)</code> directly, for
example, an opcode might instead call <code>this.dom.createElement(tagName)</code>, going through a DOM
construction helper.</p>
<p>In the browser, this just proxies to <code>document.createElement</code>, but in Node, we
instead use <a href="https://github.com/ember-fastboot/simple-dom">simple-dom</a>, a
lightweight implementation of a small subset of the DOM API—a "virtual DOM," if
you will. Once rendering is complete, we use simple-dom's built-in serializer to convert
the DOM tree to HTML and send it over the wire.</p>
<p>This approach has the huge advantage of keeping the DOM mutable, just like in
the browser. Particularly with FastBoot, where we wanted existing Ember apps to
be able to adopt SSR, this was an important compatibility feature.</p>
<p>The downside to preserving mutability is that it introduces a performance
double-whammy.</p>
<p>HTML is immutable, in the sense that once I write <code>&lt;div&gt;</code>, there's nothing I can
write later in the file to go back and add an attribute to that element. If the
DOM is mutable, then we have to wait for the entire document to settle before we
can serialize to HTML and start writing to the HTTP socket.</p>
<p>This delays the time to first byte (TTFB) by at least the time it takes to
render the entire page, even though many of the components may have finished
rendering hundreds of milliseconds previously.</p>
<p>The other performance hit is that we now have two (often large) trees to
traverse: first we walk the tree of components in the initial render, and then
we have to walk DOM tree during HTML serialization. This is predominantly a CPU
cost, but allocating all of these temporary "virtual DOM" nodes doesn't help
memory costs, either.</p>
<p>Chad has been doing some experiments with implementing a version of our DOM
abstraction that writes HTML directly to a stream. This solves both of the
above-mentioned performance pitfalls nicely.</p>
<p>By writing directly to the stream, the host Node environment can start flushing
bytes to the browser immediately in a background thread. And by writing strings
directly to the stream buffer, we can avoid allocating intermediate data
structures entirely.</p>
<p>For this to work, we have to introduce two requirements:</p>
<ol>
<li>Components can only render once on the server, so any data fetching needs to
happen <em>before</em> the initial render starts.</li>
<li>Internally, we need to order opcodes to align with HTML; that is, we need to
ensure that we always create an element and set its attributes before
attempting to append any child nodes. (Luckily for us, it happened to work
this way already.)</li>
</ol>
<p>We are hoping to test this approach in a real app in the next few weeks and
report back on the results. We are tentatively optimistic that this will result
in significant performance improvements, and suspect it may outperform even the
best SSR implementations of Virtual DOM-based libraries like React and Preact
because it requires fewer allocations.</p>
<h3 id="rehydration">Rehydration</h3>
<p>Rehydration is the ability of a client-side JavaScript app to "reconnect"
components to the DOM generated by server-side rendered HTML. In many ways, a
robust rehydration implementation is the holy grail that reunites the
progressive enhancement and "all JavaScript all the time" camps.</p>
<p>The server can serve up meaningful HTML, viewable even when JavaScript isn't
available, and that HTML gets "progressively enhanced" with interactivity once
the JavaScript loads and components rehydrate. But because components can <em>also</em>
still produce their own DOM, you retain all of the benefits of client-side
JavaScript, including the ability to work offline.</p>
<p>Glimmer supports rehydration natively via its <a href="https://github.com/glimmerjs/glimmer-vm/blob/72a1483/packages/@glimmer/runtime/lib/vm/element-builder.ts">ElementBuilder</a> abstraction.
In SSR mode, you can enable the <a href="https://github.com/glimmerjs/glimmer-vm/blob/72a1483/packages/%40glimmer/node/lib/serialize-builder.ts">SerializeBuilder</a>, which includes additional
comment annotations for where dynamic sections start and end.</p>
<p>For example, given this template:</p>
<pre><code class="handlebars language-handlebars">&lt;span class="user__name"&gt;{{@user.name}}&lt;/span&gt;
</code></pre>
<p>The serialized output would include comments indicating the dynamic portion:</p>
<pre><code class="html language-html">&lt;span class="user__name"&gt;&lt;!--%+block:0%--&gt;Chad Hietala&lt;!--%-block:0%--&gt;&lt;/span&gt;
</code></pre>
<p>In the browser, Glimmer is configured to use the
<a href="https://github.com/glimmerjs/glimmer-vm/blob/72a1483/packages/%40glimmer/runtime/lib/vm/rehydrate-builder.ts#L20">RehydrateBuilder</a>. The RehydrateBuilder treats the existing
DOM as a stack, and as the VM requests new elements get created, it compares the
top of the "DOM stack" to the requested element. If it matches, the element is
reused and the DOM is not mutated at all. In the case of a mismatch, the
current block is cleared and the appropriate element is created and put in
its place. The comment annotations are also stripped during this process, so you
see a pristine DOM in your developer tools.</p>
<p>We have rehydration working in our app, and we consider it to be a first-class
part of the Glimmer SSR story.</p>
<h3 id="incrementalrendering">Incremental Rendering</h3>
<p>The thing about low-end mobile devices is that no matter how much you optimize,
performing the initial render of most modern web applications is going to be
slow. While it's important to chase the fastest raw performance possible (and we
certainly have with Glimmer!), on some devices it's just unavoidable to have
initial renders that take 500ms to over a second.</p>
<p>This produces a terrible user experience because it blocks the main thread. If
the user happens to be scrolling, their scroll suddenly starts to stutter.
Videos and animated GIFs freeze, the browser stops updating the layout, and
everything generally feels "janky."</p>
<p>The problem is that, by dominating the main thread for so long, we're not being
good citizens of the web. The CPU is a shared resource, and we're hogging it all
for ourselves for a huge chunk of time.</p>
<p>But what if we had a way to render a few components at a time, periodically
giving control back to the browser so it could handle scrolling, painting, etc.?</p>
<p>Glimmer's architecture is actually <em>perfectly</em> suited for this, because at the
end of the day it's just executing a linear sequence of operations. We can
execute each opcode, one by one, and pause execution if it starts taking too
long.</p>
<p>Best of all, because normal rendering and rehydration go through nearly
identical code paths, this technique applies whether you're creating fresh DOM
or just rehydrating DOM created from server-rendered HTML.</p>
<p>Incremental rehydration feels <em>amazing</em>, even on low-end devices on slow
networks. The server sends complete HTML, which the browser can incrementally
parse and render, even before CSS and JavaScript have started loading. Once the
JavaScript does finish loading, it can rehydrate arbitrarily complex DOM while
maintaining 60fps scrolling, never taking more than ~16ms before returning
execution to the browser.</p>
<p>We're using <a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback"><code>requestIdleCallback</code></a> in our app to drive rehydration, which
provides a "deadline" describing how much time we have to do work before causing
user-noticeable jank. We execute opcodes until we hit the deadline, then
schedule the VM to resume in another idle callback if there are additional
operations to execute. For browsers without <code>requestIdleCallback</code>, we can fall
back to <code>setTimeout</code> and approximate deadlines.</p>
<h2 id="wrappingup">Wrapping Up</h2>
<p>Except where noted, everything I've described above is available in raw,
low-level form in Glimmer VM today. We will be releasing a new version of
Glimmer.js imminently that includes the updated VM, including the change to
<code>&lt;Capital /&gt;</code> components, fragment templates, etc.</p>
<p>Once that's done, our next task will be to make enabling binary templates, SSR,
rehydration, etc. as easy as possible.</p>
<p>We are also actively working on making Glimmer components available in Ember apps
via an addon, as well as updating Ember to use the latest version of Glimmer VM.
Once that lands, it should unlock the ability to use rehydration in FastBoot.</p>
<p>I hope this overview has got you as excited as I am. Glimmer's VM architecture
has been the gift that keeps on giving, and I've been surprised by how
relatively easy implementing the above features has been on top of the core
architecture.</p>
<p>Best of all, I don't think we've yet hit the end of the possibilities that
Glimmer unlocks. In this post, I've focused on features that are either done or
close to being done, and haven't yet mentioned some of the ideas we're excited
to try, like running Glimmer in a Web Worker, porting the core VM to
WebAssembly, and more. We've also been working closely with our browser
implementer friends to see what lessons can be applied to the web platform so
everyone benefits from our experimentation.</p>
<p>Lastly, I'd like to thank LinkedIn and Tilde for funding a great deal of the
implementation work. Not only is all of this work released under the open source
MIT license, we do all of our work out in the open on GitHub. I invite you to
follow along on the <a href="https://github.com/glimmerjs/glimmer-vm">Glimmer VM</a> and <a href="https://github.com/glimmerjs/glimmer.js">Glimmer.js</a>
repositories.</p>
<p>Thank you so much for reading this far, and I can't wait to get all of this cool
stuff into your hands. We are looking forward to seeing what the community can
build with these powerful primitives. We'll post again once we've released the
next version of Glimmer.js with these features integrated, so stay tuned to the
blog. And if you've got any questions or want to help out, leave a comment below
or come see us on GitHub!</p>]]></description><link>https://blog.emberjs.com/glimmer-progress-report</link><guid isPermaLink="true">https://blog.emberjs.com/glimmer-progress-report</guid><pubDate>Tue, 10 Oct 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Announcing Glint 1.0]]></title><description><![CDATA[<p>After two years in public preview and contributions from dozens of community members, the Ember
TypeScript team is excited to announce the release of <a href="https://github.com/typed-ember/glint">Glint 1.0</a>!</p>
<p>While Glint has been available as an unstable prerelease for some time, the project has now
reached a level of stability and functionality that we're comfortable recommending it even for
large applications with a low tolerance for churn.</p>
<h2 id="whatisglint">What is Glint?</h2>
<p>In an Ember application, templates are the connective glue that bind together all the different
pieces of your codebase. On its own, however, TypeScript can't see what's happening in your
templates, so any typechecking or other helpful aids it provides can only ever operate upon
small islands of disconnected code, and all of your connections are completely opaque to the
tooling.</p>
<p><a href="https://typed-ember.gitbook.io/glint">Glint</a> enables TypeScript to understand your templates as well, meaning you get
end-to-end type safety for your entire application. You also get editor support for things like
documentation and type info on hover, jumping to definitions, and automated codefixes and
refactorings.</p>
<p><img src="/images/blog/2023-04-27-glint-1-0/rename.gif" alt="A component argument is renamed in a TS file and propagated to templates that reference it, then vice versa." /></p>
<!-- alex ignore just -->
<p>And, just like your editor can use TypeScript under the covers to provide many of those features
even in vanilla JavaScript files, Glint can do the same! For example, here Glint is showing info in a template with a JS backing class:</p>
<p><img src="/images/blog/2023-04-27-glint-1-0/js-info.png" alt="Type info and documentation prose displayed on hover in a template with a plain JavaScript backing class." /></p>
<p>Glint also works even better with the <code>&lt;template&gt;</code> tag feature which enables Glimmer and Ember apps
to put their component templates right next to their JavaScript or TypeScript code.</p>
<h2 id="getstarted">Get Started</h2>
<p>If you've been holding off on Glint due to its experimental status or stability disclaimers, now is
a great time to explore <a href="https://typed-ember.gitbook.io/glint/environments/ember/installation">setting it up in your application</a> or <a href="https://typed-ember.gitbook.io/glint/environments/ember/authoring-addons">adding Glint types to addons
you maintain</a>. And again, Glint can be useful even in <a href="https://typed-ember.gitbook.io/glint/using-glint/with-js">apps with no TypeScript at
all</a>!</p>
<h2 id="whatsnext">What's Next?</h2>
<p>As both Ember and TypeScript continue to evolve, we'll be working in Glint to keep pace with those
changes. There are also plenty of opportunities still to add further bells and whistles to the
language server to reach full parity with native TypeScript.</p>
<p>We’d like to take this opportunity to say thanks to the many contributors who have helped get us
here, trying out early versions of Glint in their projects, reporting issues and opening PRs.
Reaching this point would not have been possible without the community and those contributors—thank
you!</p>]]></description><link>https://blog.emberjs.com/glint-1-0-released</link><guid isPermaLink="true">https://blog.emberjs.com/glint-1-0-released</guid><pubDate>Thu, 27 Apr 2023 15:00:00 GMT</pubDate></item><item><title><![CDATA[Global Accessibility Awareness Day]]></title><description><![CDATA[<p>Happy Global Accessibility Awareness Day!</p>
<p>To mark this occasion, I'd like to talk about the ways Ember already helps you make accessible applications, give you an update on what Ember has been doing to make it easier than ever to create accessible Ember applications, and finally a few things that you can do starting today to make your applications more accessible.</p>
<h2 id="accessibilityinember">Accessibility in Ember</h2>
<p>Because Ember is an HTML-first framework, it is straight-forward to write accessible applications from day one. Here are just some of the ways that we have provided a solid foundation for you to build your applications, no matter what scale or what size team you have, or what level of talent you have on your team.</p>
<ol>
<li>Accessibility on our Core Team - As an accessibility expert, I provide feedback on new features while we are designing them, to ensure that we're setting our users up for success. Having that kind of representation on a framework's core team demonstrates Ember's commitment to accessibility and recognizes that accessibility cannot be an afterthought.</li>
<li>Accessibility in our Guides - Not only have we added an <a href="https://guides.emberjs.com/release/accessibility/">accessibility section in our guides</a>, we are also working on our code samples to make sure that they are accessible too!</li>
<li>Accessibility tooling - Specifically, we have two ways to support accessible development:<ol>
<li><a href="https://github.com/ember-template-lint/ember-template-lint">ember-template-lint</a>: this comes with a new Ember app by default, and we have some accessibility-focused rules in there to help you succeed- and we are continually adding more! This provides static analysis support right in the developer workflow, and can reduce the number of issues in your code before you commit a single line!</li>
<li><a href="https://github.com/ember-a11y/ember-a11y-testing">ember-a11y-testing</a>: built on top of axe-core, ember-a11y-testing provides dynamic analysis for your code, by checking for common accessibility issues. This helps developers ensure that the code they write will be able to be understood by assistive technology.</li></ol></li>
<li>Accessibility Support in the Community - Ember users can ask questions in our <a href="https://discord.gg/emberjs">community Discord chat</a> in the #topic-a11y channel, and get answers and help right away. Additionally, we've started <a href="https://emberjs-1.gitbook.io/ember-component-patterns/">compiling accessible component patterns</a> that will help developers more deeply understand the patterns they are asked to create.</li>
</ol>
<h2 id="updateonembersa11ystriketeam">Update on Ember's A11y Strike Team</h2>
<p>After identifying the issues that keep brand new Ember apps from meeting legal conformance requirements, an issue was filed that outlined the <a href="https://github.com/emberjs/rfcs/issues/595">Technical A11y Issues in New Ember Apps</a>. A strike team was formed with the goal of submitting RFCs that propose a clear path forward for each of these five issues:</p>
<ol>
<li>Accessible Routing- when a user with a screen reader navigates to a new URL within an Ember app, no information is given to the user to let them know that the navigation was successful.</li>
<li>Page Titles- Ember provides the base HTML boilerplate that is needed for a valid web page in the index.html file. However, the&nbsp;<code>&lt;title&gt;</code>&nbsp;element is missing, and there is no way to provide that content.</li>
<li>Label support for Input elements- The input component that is built into Ember supports at least 30 standard attributes but provides no way to ensure that the inputs have labels.</li>
<li>Missing default language declaration- There is no default language declaration on the <html> element in the index.html file.</li>
<li>Splattributes- Right now, <code>...attributes</code> do not have a guaranteed merge order. This is problematic in cases where some <code>aria-</code> attributes can have multiple values, and the order of those values matter.</li>
</ol>
<p>The strike team meets every week on Wednesdays, and has made progress on proposed solutions. Keep an eye out for new RFCs in the next few weeks that especially cover adding support for unique page titles as well as missing default language declaration support.</p>
<p>Another thing that has come out of this strike team's work is that there are other things that we'd like to do for the long-term, and consideration for a more permanent accessibility working group is now being discussed. Want to participate in the strike team's work? Check out the #st-a11y channel on <a href="https://discord.gg/emberjs">Discord</a>, and let us know! The meetings are also open to anyone who wants to attend.</p>
<h2 id="buildmoreaccessibleemberappstoday">Build More Accessible Ember Apps Today!</h2>
<p>So what can you do <strong>today</strong> to improve the accessibility of your Ember application? Here are a few suggestions:</p>
<ul>
<li>Ask about accessibility at work. Is it already baked into your design and development workflow? This is a great day to get that conversation going if it isn't already!</li>
<li>Check your package.json file and see if the most recent version of ember-template-lint is there. Try running the linter inside of your project with the <code>yarn lint:hbs</code> command in the terminal. What issues does it show?</li>
<li>Install the <a href="https://accessibilityinsights.io/">Accessibility Insights</a> extension in your browser and turn on the tab stops checker. Then check the tabbing order of your website. Does the focus move from left to right and top to bottom? This is an easy way to check for keyboard traps, too! This browser extension allows you to toggle different checks that will help you quickly test different accessibility concerns for your website, and give you additional guidance for any manual checks you might have to do.</li>
<li>Help out by writing new rules for <a href="https://github.com/ember-template-lint/ember-template-lint">ember-template-lint</a>. Get stuck, or need a new issue to work on? There's a Discord channel for that too- check out #e-template-lint and get the help you need.</li>
</ul>
<p>Have you already done these things? How about browsing the internet today with a screen reader turned on, or only using your keyboard?</p>
<h2 id="closing">Closing</h2>
<p>I'd like to close by giving a shoutout to <a href="https://www.crowdstrike.com/">CrowdStrike</a> and <a href="https://www.linkedin.com/">LinkedIn</a>, and <a href="https://allovue.com/">Allovue</a>, just a few of the companies that use Ember and are also actively working to make accessibility improvements to their products. CrowdStrike let us know that in just this month, they have improved the keyboard accessibility of some of their more complex graphs, enhanced their SVG graphs with custom roles, and improved focus outlines for radio buttons. Great job!!</p>
<p>By creating a better future for accessible application development, we create products that make it possible for <em>everyone</em> to use. My goal is to get accessibility into the design and development workflow so it is in the list of a product's design constraints. I believe Ember is the framework that will help you do just that. Avoid costly lawsuits and code rewrites by putting accessibility into the base requirements of your work, because when accessibility is considered first, everyone wins.</p>
<p>Are you participating in Global Accessibility Awareness Day? Check out their website for more information- <a href="https://globalaccessibilityawarenessday.org/">https://globalaccessibilityawarenessday.org/</a>!</p>]]></description><link>https://blog.emberjs.com/global-accessibility-awareness-day</link><guid isPermaLink="true">https://blog.emberjs.com/global-accessibility-awareness-day</guid><pubDate>Thu, 21 May 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Hacktoberfest 2020]]></title><description><![CDATA[<p>Have you ever spotted something in Ember code or documentation that needed fixing?
Did you want to get involved in contributing to open source, but you have no idea where to start?</p>
<!--alex ignore special-->
<p>Good news! It's Hacktoberfest 2020, and you are invited to participate in Ember-focused special events and mentorship opportunities through the month of October.
You can make some commits, meet some new people, and maybe get some free stuff!</p>
<h2 id="whatishacktoberfest">What is Hacktoberfest?</h2>
<p><a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest</a> is an annual, worldwide celebration organized by DigitalOcean and sponsored by many companies that use open source software.</p>
<p>Here is the premise:</p>
<ul>
<li>Sign up anytime between October 1 and October 31.</li>
<li>Make 4 valid Pull Requests to <span style="font-style: italic;">any</span> public repositories on GitHub.</li>
<li>If you are among the first 70,000 developers who complete the challenge, you get a prize. This year, you can select between a T-shirt and a tree planted in your name.</li>
</ul>
<!--alex ignore easy-->
<p>Many open source project maintainers put in some extra effort during Hacktoberfest to make it easy and fun to participate in open source.</p>
<h2 id="whatishappeningintheembercommunity">What is happening in the Ember community?</h2>
<p>Here's what you can expect this year!</p>
<ul>
<li><strong>On Saturday, October 10th,</strong> past contributors will be available to pair with anyone who wants to help out! If you have questions or need some help finding an issue to work on, this is a great place to start. <strong>Mentors are available <a href="https://meetingzone.app/utc/saturday/1300">9am-10am ET</a>, and <a href="https://meetingzone.app/utc/sunday/0100">9pm-10pm ET</a></strong>. Click the links to see times in your own time zone.</li>
<li><strong>On Friday, October 16th,</strong> there will be an Ember Contributors Workshop! Tickets are sold out but you can read more about the event on the <a href="http://emberfest.eu/">EmberFest website</a>.</li>
<li><strong>At any time,</strong> join the <code>#hacktoberfest</code> channel in the <a href="https://discord.gg/emberjs">Ember Community Discord</a> to connect with other developers. You can find a buddy to pair with, a mentor to guide you, or toss around ideas.</li>
</ul>
<p>If you are someone who is willing to help mentor new contributors, please let us know in <code>#hacktoberfest</code> on Discord. Addon maintainers are welcome to post issues they need help with too!</p>
<!--alex ignore gal-guy -->
<p>Additionally, there are several more groups within the Ember Community Discord where you can find others to collaborate with. There are Discord channels for women, LGBTQ+, and people of color. If you belong to one of those groups, you can ask to join in the <code>#discord-server-admin</code> channel.</p>
<h2 id="howdoichoosewhattoworkon">How do I choose what to work on?</h2>
<p>It all depends on your interests! One of the best ways to get involved in open source is to pick up a teeny tiny issue so you can learn the flow and what to expect. Then, consider making an improvement to something you regularly use; for example, a feature, test, or fix to API documentation.</p>
<p>For ideas, you can visit <a href="https://help-wanted.emberjs.com/">Ember's Help Wanted</a>. The Ember Learning Team and others are curating some super beginner-friendly issues. In Help Wanted, you can find these issues, along with more intermediate and advanced issues. If you want to help, comment on an issue to let others know that you are working on it. If the issue you want to work on is taken, try asking if the other volunteers would like to collaborate!</p>
<h2 id="caniparticipateifiamnotworkingonemberthings">Can I participate if I am not working on Ember things?</h2>
<!--alex ignore just-->
<p>Absolutely! Hacktoberfest is a celebration for all open source projects. Ember is just one of many.</p>]]></description><link>https://blog.emberjs.com/hacktoberfest</link><guid isPermaLink="true">https://blog.emberjs.com/hacktoberfest</guid><pubDate>Thu, 01 Oct 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Handlebars Version Compatibility]]></title><description><![CDATA[<p>Handlebars 2.0 was released a few weeks ago, and since its release we have received many
requests to update Ember to allow the use of the latest version.  Handlebars 2.0 contains
a number of changes the list below represents a few that are likely to affect your
Ember application:</p>
<!-- alex disable whitespace -->
<ul>
<li>Precompiler output has changed, which breaks compatibility with prior versions of the
runtime and precompiled output.</li>
<li>A JSON polyfill is required to run the compiler in IE8 and below. It's recommended
that the precompiler be used in lieu of running the compiler on these legacy environments.</li>
<li>Lines containing only block statements and whitespace are now removed. This matches the
Mustache spec but may cause issues with code that expects whitespace to exist but would
not otherwise.</li>
</ul>
<!-- alex enable whitespace -->
<p>For more information about the changes please review the <a href="https://github.com/wycats/handlebars.js/blob/master/release-notes.md">release notes</a>.</p>
<p>Since the release of Ember 1.0.0, Ember has required Handlebars 1.x. As each new version of
Handlebars has been released we have needed to update our version requirement to allow the
latest and greatest. Thankfully, throughout this process we have been able to maintain backwards
compatibility with all versions of Handlebars since 1.0.0.</p>
<p>Unfortunately, Ember will not be able to maintain backwards compatibility to 1.x versions of Handlebars while
supporting 2.0. In Ember 1.9.0 (which will be released to beta on October 24th and stable on December 5th)
support for Handlebars 1.x will be removed, and support for Handlebars 2.0 introduced.</p>
<p>In order to facilitate users of our 1.9.0 builds we have published alpha versions of the
following template precompiler packages:</p>
<ul>
<li>ember-template-compiler (published to NPM as 1.9.0-alpha)</li>
<li>ember-source (published to Rubygems as 1.9.0.alpha)</li>
</ul>
<h3 id="upgrading">Upgrading</h3>
<p>To upgrade please use the following rough steps as a guide:</p>
<ul>
<li>Update Handlebars version to 2.X.</li>
<li>Update template precompiler version to 1.9.0-alpha or later.</li>
<li>Report any issues you have on our <a href="https://github.com/emberjs/ember.js/issues">issue tracker</a>.</li>
</ul>
<h4 id="emberclisteps">Ember CLI Steps</h4>
<p>If you happen to be using Ember CLI the following steps should work properly:</p>
<ul>
<li><code>npm uninstall --save-dev broccoli-ember-hbs-template-compiler</code></li>
<li><code>npm install --save-dev ember-cli-htmlbars@0.6.0</code></li>
<li><code>rm -rf bower_components</code></li>
<li><code>bower install --save handlebars#2.0.0</code></li>
<li><code>bower install --save ember#1.9.1</code></li>
<li><code>bower install</code></li>
</ul>]]></description><link>https://blog.emberjs.com/handlebars-update</link><guid isPermaLink="true">https://blog.emberjs.com/handlebars-update</guid><pubDate>Thu, 16 Oct 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[How To Todo In Ember Template Lint]]></title><description><![CDATA[<h2 id="introduction">Introduction</h2>
<p><strong>At the time of this writing, this feature is available in <code>ember-template-lint@3.0.0-beta.3</code>.</strong></p>
<p>The new <code>todo</code> feature in the <code>ember-template-lint</code> addon provides a new option to the existing states for linting rules.</p>
<p>With this new functionality, linting issues can be converted into a <code>todo</code> and developers can strategically plan the work to resolve issues in existing code. A <code>todo</code> can be set to automatically become a <code>warning</code>, then an <code>error</code> with the use of a supporting feature called decay days.</p>
<p><img src="/images/blog/how-to-todo-in-ember-template-lint/todo-warning-error-graphic.png" alt="todo, warning, error"></p>
<p>Previously, running the  <code>lint:hbs</code> script (default in an Ember app) would cause <code>ember-template-lint</code> to run on all of the <code>.hbs</code> files, and return a result that included number of <code>warnings</code> and number of <code>errors</code> found.
<img src="/images/blog/how-to-todo-in-ember-template-lint/terminal-without-todo.png" alt="a terminal showing results that include 2 errors and 0 warnings" /></p>
<p>Now, however, we have a new option—we can also include number of <code>todos</code>. First, update the <code>lint:hbs</code> script in the <code>package.json</code> file to use the <code>--include-todo</code> flag (we want to be reminded that we have todos!):</p>
<pre><code class="json language-json">"lint:hbs": "ember-template-lint . --include-todo",
</code></pre>
<p>Next, run the command <code>yarn lint:hbs</code> again:
<img src="/images/blog/how-to-todo-in-ember-template-lint/terminal-with-todo.png" alt="a terminal showing 2 errors, 0 warnings, and 0 todos" /></p>
<p>Note: <code>ember-template-lint</code> also takes a <code>--quiet</code> flag, which won't print any warnings or todos—only errors.</p>
<p>Along with the ability to create todos out of currently failing rules, some options can be set to decide the number of days before the <code>todo</code> turns into a <code>warning</code> and then into an <code>error</code>.</p>
<h3 id="whythough">Why, though?</h3>
<p>This new feature is intended to help apps at a large scale. It can be tricky to update a dependency like <code>ember-template-lint</code> when it includes a new rule, due to a number of factors involved. Taking in a new version of the linter can mean communication and coordination about the new rule(s). The larger your app is and the more developers you have, the more work this can be. For global companies that use Ember, there might even be a committee whose sole focus is to make decisions about linting rules!</p>
<p>While the <code>pending</code> feature gave us <em>some</em> of the desired functionality, it didn't ensure that teams would have support to fix existing issues. Issues could stay "pending" forever. The <code>todo</code> feature replaces the <code>pending</code> feature so that, when we introduce new linting rules, teams can remind one another to dedicate time to fix issues.</p>
<p>Perhaps a visualization would also be useful:
<img src="/images/blog/how-to-todo-in-ember-template-lint/value-visualization.png" alt="a chart that shows how existing code receives a todo, while new code must follow the linting rules."></p>
<p>All new code is immediately supported by new linting rules; existing code can have a timeline to provide a fix.</p>
<p>We can even take a step further and customize the number of days to fix on a rule-by-rule basis. Super useful!</p>
<h2 id="step1strategize">Step 1: Strategize</h2>
<p>You'll want to think about how you want to approach all of the linting rules. Do you want all rules to be treated the same way, or do you want to apply decay days by rule? The linter gives you options for both.</p>
<h3 id="allrulesgenericsetting">All rules (generic setting)</h3>
<p>It's possible that you don't care what the error is; all todos should have 15 days before they turn into a warning, and 30 days before they turn into an error. To do this, add this to the <code>package.json</code> file:</p>
<pre><code class="json language-json">{
  "lintTodo": {
    "decayDays": {
      "warn": 15,
      "error": 30
    }
  }
}
</code></pre>
<p>The default values will vary from team to team. In essence, the values should be reasonable for teams to methodically work on past issues, but not too large that the issues will be forgotten. <em><em>It should feel like a little bit of a stretch, but not stressful.</em></em></p>
<p>Once the generic settings are in the <code>package.json</code> file, run <code>yarn ember-template-lint . --update-todo</code> (or, <code>yarn lint:hbs --update-todo</code>) and any linting issue that is found will have a <code>todo</code> created for it.</p>
<h3 id="increasingspecificitybyrule">Increasing specificity by rule</h3>
<p>It's also possible that you'd want to specify that a particular rule needs to be fix with more immediacy. In that case, you'd want to run that rule by itself. Let's use the <code>no-nested-interactive</code> rule as an example:</p>
<pre><code class="bash language-bash">yarn ember-template-lint app/ --no-config-path --no-inline-config --rule 'no-nested-interactive:error' --update-todo --todo-days-to-warn=7 --todo-days-to-error=14
</code></pre>
<p>Let's break down what this command does:</p>
<ul>
<li><code>yarn ember-template-lint app/</code> : "run the linter on the app folder"</li>
<li><code>--no-config-path</code> : "ignore the <code>.template-lintrc.js</code> file"</li>
<li><code>--no-inline-config</code> : "also, ignore instances where the rule has been supressed inline"</li>
<li><code>--rule 'no-nested-interactive:error'</code> : "specifically, only run the <code>no-nested-interactive</code> rule and throw an error if it finds these issues"</li>
<li><code>--update-todo</code> : "create a todo if this issue is found"</li>
<li><code>--todo-days-to-warn=7</code> : "in the created todo, automatically change the todo to a warning after 7 days"</li>
<li><code>--todo-days-to-error=14</code> : "in the created todo, automatically change the warning to an error after 14 days"</li>
</ul>
<div class="cta-note" style="max-width:100%">
  <div class="cta-note-content">
    <div class="cta-note-body p-2">
      <div class="text-lg mb-1 hide-in-percy" data-test-es-note-heading="">Zoey says...accessibility!</div>
      <div class="cta-note-message">
        <p>If your company has decided to make more inclusive products, you may want to set the decay days based on the rule itself.</p>
        <p>Typically, accessibility (a11y) bugs are divided up into categories based on impact to the user: blocker, critical, major and minor (results may vary).</p>
        <p>Looking at the documentation for each the <a href="https://github.com/ember-template-lint/ember-template-lint/blob/master/lib/config/a11y.js">a11y-related rules</a> in <code>ember-template-lint</code>, you could then determine the rule's category, and determine the number of days to warn/error accordingly.</p>
        <p>For more ideas about how this could work, ping the #topic-a11y channel in the <a href="https://discord.gg/emberjs">Ember Discord community chat</a>.</p>
      </div>
    </div>
    <img src="/images/mascots/zoey.png" role="presentation" alt="" class="hide-in-percy cta-mascot m-2" style="max-height:100px" />
  </div>
</div>
<h2 id="step2planforaccountability">Step 2: Plan For Accountability</h2>
<p>After running the linter and creating all of the todos, a <code>.lint-todo</code> folder will appear in the root directory of the project. This is where you'll find the specifics about which file is failing which rule so that you can fix the issues.</p>
<p>If you run the linter after an issue is fixed, the linter will tell you that an issue has been resolved. To remove the resolved todo, use the <code>--fix</code> flag:</p>
<pre><code class="bash language-bash">yarn lint:hbs --fix
</code></pre>
<p>Note: using <code>--fix</code> will also fix any items that are automatically fixable, which may cause an unwanted result. For example, the <code>require-button-type</code> rule may add a default <code>type="button"</code> to the <code>&lt;button&gt;</code> elements, but may not automatically respect the prettier or beautify configuration of the project.</p>
<p>The <code>.lint-todo</code> folder should get checked in to the project's version control system, and teams should do a periodic review to ensure that they are fixing the todos and not changing the due dates. Have a professional agreement with the other members of your team, and stay committed to fixing those todos.</p>
<h2 id="step3enjoyimprovedcode">Step 3: Enjoy Improved Code!</h2>
<p>By taking advantage of the new todo feature, dev teams are setting themselves up for success and higher quality code. If you have any questions about this new feature, check out the #e-template-lint channel in the <a href="https://discord.gg/emberjs">Ember Discord community chat</a>, or <a href="https://github.com/ember-template-lint/ember-template-lint/issues">file an issue</a> on the project's repo.</p>]]></description><link>https://blog.emberjs.com/how-to-todo-in-ember-template-lint</link><guid isPermaLink="true">https://blog.emberjs.com/how-to-todo-in-ember-template-lint</guid><pubDate>Tue, 02 Feb 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[Internet Explorer 8 Support Will Be Removed in Ember 2.0]]></title><description><![CDATA[<p>After reviewing <a href="https://github.com/emberjs/rfcs/pull/45">this thread</a>, it seems clear that the vast majority of
Ember users who have responded, including people working at large
corporations, are comfortable with dropping IE8 support in Ember 2.0.
On the other hand, while there is enormous support for dropping IE9
support as well, a number of people still rely on support for IE9, and
the benefits of dropping IE9 in Ember 2.0 are not as strong.</p>
<p>After reviewing discussion on the RFC proposal, many in-person conversations with Ember
users in large companies, and reviewing the private data sent to us via
email, we have decided that Ember 2.0 will support IE9+.</p>
<p>So how are we going to manage this transition, and what should you do
if your business still requires IE8 support for the time being?</p>
<h2 id="113withextendedbrowsersupport">1.13 with Extended Browser Support</h2>
<p>The core team will continue to periodically release point releases in
the 1.13 series to patch security bugs and browser compatibility
issues, including issues in IE8.</p>
<p>No new features will be added, and we should be clear that we do not
intend people to stay on this release unless they must support IE8. Our
Semantic Version guarantees mean that the vast majority of the
community should migrate to the 2.x series as soon as possible.</p>
<p>It is important to note that Ember 1.13 will come with deprecation
warnings for everything that we will break in Ember 2.0. As a result,
if you are running Ember 1.13 without any deprecation warnings, you
should be able to upgrade to Ember 2.0. And because of the
Semantic Versioning guarantees in the Ember 2.x series, you may only have
few issues when upgrading from Ember 1.13 to the most recent version
of Ember 2.x when you are able to drop IE8 support.</p>
<p>For example, imagine you build the Ember app for Big Widget Enterprise
Co. that requires IE8 support. You upgrade to 1.13 (the last release in
the 1.x series) and, over time, refactor code to eliminate all
deprecation warnings. Periodically, you apply 1.13 patch releases to
maintain browser compatibility and to fix potential security issues.</p>
<p>Then, in April of 2016, management decides that enough customers have
moved off IE8 that you no longer need to support it. At that time,
Ember 2.6 will be the most recent stable release. Because 1.13 without
deprecation warnings is forwards-compatible with Ember 2.6, you can
upgrade from 1.13 to 2.6 with little hassle.</p>
<p>With the integration of Ember CLI and Ember Data into the Semantic
Versioning guarantees, many of your dependencies will follow a similar
upgrade path.</p>
<h2 id="ecosystem">Ecosystem</h2>
<p>The above guarantees only apply to Ember, Ember Data, Ember
CLI, and the rest of the core-supported packages. Addon authors are
free to define their own support matrices. We encourage those who
depend on older browsers to contribute back by submitting PRs to the
addons they use with compatibility patches. Likewise, we encourage
authors of existing addons to work with users to offer a browser
compatibility matrix as close to the core projects as possible.</p>
<p>If you require support for IE8 (and as a result, Ember 1.13), make sure
to make your voice heard across the addon ecosystem.</p>
<p>That said, you should expect that new addons that come out after Ember
2.0 will not target Ember 1.13, and you should factor that into your
decision to remain on the 1.13 Extended Browser Support release of
Ember.</p>
<h2 id="fastboot">FastBoot</h2>
<p>FastBoot, our effort to bring server-side rendering to all Ember apps,
is designed to offer even users with slow, low-feature browsers a fast
experience. While most people think of this as a benefit to mobile
users, IE8 certainly qualifies as a slow, low-feature browser.</p>
<p>Because Ember applications are written "route first", any idiomatic
Ember content app that uses links as the primary mode of navigation
will be able to provide a passable experience for users with an
unsupported version of JavaScript, or no JavaScript at all.</p>
<p>It is worth noting that FastBoot, in the medium term, will have good
support for read-only content sites. However, while it is possible to
support forms, forms without JavaScript (using cookie
authentication) introduce the prospect of CSRF attacks. A good solution
for FastBoot forms that is also secure is probably a longer-term
project. We would encourage the community to experiment with a secure
approach to forms that works with FastBoot.</p>
<h2 id="jquerycompatibility">jQuery Compatibility</h2>
<p>In our RFC, we mentioned that dropping IE8 will give us the opportunity
to remove jQuery as a strict dependency. We should have been clearer
that we have no intent to remove the Ember APIs that delegate to jQuery
(such a Ember.$ and this.$() inside components).</p>
<p>Because these APIs will remain in 2.0, both for ease of upgrade and
because we have not yet made the jQuery dependency optional, Semantic
Versioning prohibits us from removing them until at least Ember 3.0.</p>
<p>On a personal note, we rely on jQuery heavily in our own apps. We think
it's a great library that remains hugely valuable to smooth over clunky
DOM APIs and browser quirks (even in modern browsers). For those users
who need the absolute smallest payload size, we don't want to saddle
you with a dependency that you don't need. But we expect the majority
of users to continue using jQuery, and we have no plans to remove the
Ember/jQuery integration at this time.</p>
<p>Thank you again for everyone who took the time to help us make this
decision, and thank you so much for being a part of the Ember
community.</p>]]></description><link>https://blog.emberjs.com/ie8-support-update</link><guid isPermaLink="true">https://blog.emberjs.com/ie8-support-update</guid><pubDate>Mon, 20 Apr 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Igor Terzic Joins the Core Team]]></title><description><![CDATA[<p>Today I'm happy to announce that Igor Terzic is joining the Ember.js
core team.</p>
<p>Igor has been instrumental in the development of Ember Data. He has both
fixed bugs relentlessly and landed major new features, such as the
recent work on modelling relationships as entities with a single source
of truth.</p>
<p>Thanks to his hard work, Ember Data is rapidly approaching a stable
release, and it's no exaggeration to say that we couldn't have done it
without him.</p>
<p>Igor has been maintaining Ember Data diligently for some time now, and
we are overdue in recognizing his efforts via membership to the core
team. As Ember Data is more than ever a core part of the Ember
experience, we're looking forward to even tighter coordination between
the two projects.</p>
<p>You can <a href="https://twitter.com/terzicigor">follow Igor on Twitter</a> if
you'd like to keep tabs as he travels the world. Thank you, Igor, for
all of your hard work, and welcome to the core team!</p>]]></description><link>https://blog.emberjs.com/igor-terzic-joins-the-core-team</link><guid isPermaLink="true">https://blog.emberjs.com/igor-terzic-joins-the-core-team</guid><pubDate>Sun, 16 Nov 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Improved RFC Process]]></title><description><![CDATA[<p>The Ember project is pleased to announce that an improved RFC ("request for comments") process has been implemented.</p>
<p>As proposed in <a href="https://rfcs.emberjs.com/id/0617-rfc-stages/">RFC #617 "RFC Stages"</a>, RFCs will now progress through several stages that now include tracking implementation, release, and completeness of features, as well as design:</p>
<h2 id="0proposed">0 - Proposed</h2>
<p>A new proposal for a change to Ember or its processes that is offered for community and team evaluation. In practical terms, this is an open pull request on the <a href="https://github.com/emberjs/rfcs">emberjs/rfcs</a> repo.</p>
<h2 id="1exploring">1 - Exploring</h2>
<p>An RFC deemed worth pursuing but in need of refinement. This stage is marked by labeling the opened PR as 'Exploring'.</p>
<h2 id="2accepted">2 - Accepted</h2>
<p>A fully specified RFC. Waiting for or in the process of implementation. An FCP is required to advance to this stage. This stage is marked by updated frontmatter in the text of the RFC and by being merged to the main branch of the <a href="https://github.com/emberjs/rfcs">emberjs/rfcs</a> repo. When the RFC is merged, a PR to advance to the next stage is automatically opened on the repo to provide a coordination point for implementation.</p>
<h2 id="3readyforrelease">3 - Ready for Release</h2>
<p>The implementation of the RFC is complete, including learning materials. An FCP is required to advance to this stage. The advancement to this stage is the merging, upon successful FCP, of a pull request updating the stage to 'Ready for Release'. Upon merge, a new PR to advance to 'Released' is automatically opened for the RFC.</p>
<h2 id="4released">4 - Released</h2>
<p>The work is published. If it is codebase-related work, it is in a stable version of the relevant package(s). The stage is again updated by a PR changing the stage in the frontmatter. Upon merge, a new PR to advance to 'Recommended' is automatically opened for the RFC.</p>
<h2 id="5recommended">5 - Recommended</h2>
<p>The feature/resource is recommended for general use. An FCP is required to advance to this stage. Upon successfully FCP, the PR to advance will be merged by the team. At this point, the RFC process is complete.</p>
<hr />
<p>Each stage is a checkpoint in the progress of a feature or change. The RFC repository now has automation to open a pull request to the next stage, where appropriate. These pull requests will be used to track implementation and the work necessary for a feature to reach Recommended status.</p>
<p>The RFC process is way we design, implement, and shepherd changes and features added to the Ember Project. It affects the entire community. Please familiarize yourself with the new process by consulting the <a href="https://github.com/emberjs/rfcs/#ember-rfcs">revamped and updated README</a> for the <code>emberjs/rfcs</code> repo.</p>
<p>The revised process streamlines and unifies our existing process by bringing it all to one system. It also increases transparency by moving previously closed process to the open on Github.</p>
<p>Learn more about the motivation and detailed specification of this new process by consulting <a href="https://rfcs.emberjs.com/id/0617-rfc-stages/">RFC #617</a>. See an example of the new process as we tried it out to implement this very RFC: <a href="https://github.com/emberjs/rfcs/pull/836">Pull Request to advance RFC #617 to Stage Ready for Release</a>, <a href="https://github.com/emberjs/rfcs/pull/862">Pull request to advance #617 to Stage Released</a>, <a href="https://github.com/emberjs/rfcs/pull/863">Pull Request to advance #617 to Recommended</a>.</p>
<p>We are working to back-fill stages to earlier merged RFCs, and that work is one of the criteria for RFC #617 to achieve the Recommended stage.</p>]]></description><link>https://blog.emberjs.com/improved-rfc-process</link><guid isPermaLink="true">https://blog.emberjs.com/improved-rfc-process</guid><pubDate>Tue, 22 Nov 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Inside FastBoot: Faking the DOM in Node]]></title><description><![CDATA[<p>As we <a href="/blog/2014/12/22/inside-fastboot-the-road-to-server-side-rendering.html">announced in the inaugural blog post in our Inside FastBoot
series</a>, we
have begun working on giving Ember.js developers the ability to run
their apps in Node.js. Once complete, this feature will allow your users
to see HTML and CSS right away, with the JavaScript downloading
in the background and taking over once it has fully loaded.</p>
<p>Before the holidays, we had already succeeded in getting the Ember.js
framework loading in Node.js (where it cannot rely on things like the
DOM) without throwing any exceptions. We also were able to get Ember
apps booting, parsing URLs, and completing most of the functionality
necessary to start the app, including loading controllers, routes and
models, etc.</p>
<p>This week, we've made good progress on the next major piece of
functionality: allowing HTMLbars templates to render in Node.js where,
again, there is no native DOM available.</p>
<p>So how does HTMLbars, a DOM-based templating library, work in an
environment without a DOM?</p>
<p>As it turns out, we can introduce a "virtual DOM" into the server-side
environment, implemented in pure JavaScript. That's exactly what we've
done, thanks to the work of Kris Selden and his <a href="https://github.com/krisselden/simple-dom">simple-dom</a>
library.</p>
<p>Importantly, <code>simple-dom</code> implements a very, very small subset of the WHATWG
DOM specification, optimized for performance, and for the requirements
of the Ember view layer. For example, it does not implement any part of
the DOM that would require the use of accessors; it only attempts to
faithfully represent the DOM as a <strong>data structure</strong>, not its complete
API surface. (If you need the whole enchilada, check out something like
<a href="https://github.com/tmpvar/jsdom">jsdom</a>, which is much more complete.)</p>
<p>While working on FastBoot, we have created a series of integration tests
we run in Node.js that verify everything is working correctly. In those
tests, we swap out the code that accesses the DOM (encapsulated inside
an object we call a <code>DOMHelper</code>) with a version that uses a <code>Document</code>
provided by <code>simple-dom</code> rather than relying on the global <code>document</code>.</p>
<p>This week, with our implementation of "the little DOM that could," we were
able to get more and more sophisticated templates rendering to a string.</p>
<p>First, we started with a template that only printed a string:
<code>&lt;h1&gt;Hello&lt;/h1&gt;</code>.</p>
<p>Then we moved on to bound expressions, so <code>&lt;h1&gt;Hello {{location}}&lt;/h1&gt;</code>
became <code>&lt;h1&gt;Hello World&lt;/h1&gt;</code>.</p>
<!-- alex ignore just -->
<p>Yesterday, we got <code>{{#if}}</code> helpers and nested components working as
well. (Other helpers likely work; we just have not written tests for
them yet.)</p>
<p>Now that we have bare-bones rendering in place, we are theoretically
able to start booting Ember apps in Node.js, connecting their router
with a server-side routing library like Express, and serving up requests
as they come in.</p>
<p>Next week, we'll begin working on giving Ember CLI the ability to
compile Ember apps to be consumed by Node.js. Once that's in place, our
plan is to start updating all of the tests in Ember's test suite that
flex the templating and view layers, ensuring that they pass in a
DOM-less environment.</p>
<p>Our goal is to have something alpha quality but useable as soon as
possible, so those with simpler apps can start taking advantage and
helping us test right away. As people run into incompatibilities in the
real world, we can incorporate fixes into the codebase and our test
suite and rapidly increase the number of compatible apps.</p>
<p>If you're interested in following along at home, you may want to star
these repos on GitHub to watch our progress:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js">https://github.com/emberjs/ember.js</a></li>
<li><a href="https://github.com/krisselden/simple-dom">https://github.com/krisselden/simple-dom</a></li>
<li><a href="https://github.com/tildeio/htmlbars">https://github.com/tildeio/htmlbars</a></li>
</ul>
<p>We'll have more for you in future posts in the Inside FastBoot series,
cataloging implementation challenges and successes, so stay tuned for
more.</p>]]></description><link>https://blog.emberjs.com/inside-fastboot-faking-the-dom-in-node</link><guid isPermaLink="true">https://blog.emberjs.com/inside-fastboot-faking-the-dom-in-node</guid><pubDate>Thu, 08 Jan 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Inside FastBoot: The Road to Server-Side Rendering]]></title><description><![CDATA[<p>Using JavaScript to write fast, interactive web applications has exploded in popularity over the past few years. JavaScript apps offer many strengths over traditional server-rendered applications. Most notably, rich interactions and lightning-fast responses to user clicks allow for UIs that previously were only the domain of native apps.</p>
<p>The first JavaScript-heavy applications were productivity apps, and the experience of loading an app on the web, even with a spinner, was far better than the equivalent experience of downloading and installing a native app.</p>
<p>Increasingly, though, content-rich destinations such as news or video sites are starting to move to JavaScript to gain the benefits of improved interactivity. Unlike productivity apps, where the user logs in once at the beginning of the day and stays logged in, content sites are loaded many times per day, often via search engines or social sharing.</p>
<p>In this context, where the JavaScript app looks like a "normal" web page, loading spinners or long delays feel out-of-place and not very web-like. Indeed, this is the reason that <a href="https://blog.twitter.com/2012/improving-performance-on-twittercom">Twitter migrated from a client-side JavaScript approach back to server-rendered content</a>.</p>
<p>Being able to boot JavaScript apps on the server and "rehydrate" in the browser has been considered a Holy Grail for some time. However, most  attempts have focused solely on rendering the view layer on the server into HTML. This is an important step, but this alone does not sufficiently solve the problem.</p>
<p>Solving the whole problem involves not only the view layer, but also the entire lifecycle of booting an application: routing, fetching models, and rendering. By leaning heavily on Ember's conventional application structure, we can move this complexity out of each application and into the framework.</p>
<p>We are building this feature into Ember.js, <strong>and we're calling it FastBoot</strong>.</p>
<p>FastBoot will allow you to deliver the HTML and CSS for a page in your Ember app right away, then allow the JavaScript to take over once it has finished loading. Your Ember app will behave no differently than server-rendered apps when it comes to search engines, mobile users, cURL, or users who turned off JavaScript.</p>
<p>For everyone else, you'll still have the responsiveness and interactivity users have come to expect from Ember apps.</p>
<!-- alex ignore simple -->
<p>Because of the Ember community's strong focus on conventional app structure, we believe that we can make server rendering so simple to enable and deploy that, in the long run, very few Ember apps would choose not to use it.</p>
<p>In this series of blog posts, we will demystify our efforts, and talk about implementation details. We will also give you a sense of our progress. Like every Ember feature, FastBoot will be landing a bit at a time, so every new release will unlock more capabilities. As features land, we will talk about how you can take advantage of them in your own apps.</p>
<h2 id="thejourneysofar">The Journey So Far</h2>
<p>From the beginning, we knew that we would eventually want to tackle running JavaScript apps on the server, but we didn't want to bet Ember on a boil-the-ocean effort to solve every aspect of client-side development at once.</p>
<p>That being said, we have always kept this feature in mind as we were architecting the framework. We carefully isolated all parts of the system that depend on a full-fledged browser environment.</p>
<p>Even during the most recent HTMLBars effort, which is inherently a DOM-based rendering engine, we made sure to use an <a href="https://github.com/tildeio/htmlbars/blob/master/packages/morph/lib/dom-helper.js">abstraction</a> whenever we touched the DOM, so that we could swap it out for something else on the server. Similarly, when we designed the router, all communication with the URL went through a "<a href="https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/location/api.js">location</a>" abstraction, instead of touching the URL bar directly. The routing microlibraries we built (<a href="https://github.com/tildeio/router.js">router.js</a> and <a href="https://github.com/tildeio/route-recognizer">route-recognizer</a>) were designed from the beginning to be decoupled from the DOM.</p>
<p>Because of this, we were able to get the Ember framework executing in Node in one day, and were able to get an app completely booted and routing in under a week.</p>
<h2 id="abstractingfeaturedetection">Abstracting Feature Detection</h2>
<p>One of the first problems we encountered when trying to execute Ember in node was top-level feature detection. Because Ember previously assumed it was running inside a browser, it inadvertently relied on the existence of basic DOM APIs, like <code>window</code>, the <code>document</code> and <code>navigator</code>.</p>
<p>While the vast majority of the subsequent code was resilient to environments without a DOM, the feature detection and helpful assertion messages ("you're using an old version of jQuery") was sloppy because it historically wasn't expecting to run in Node.</p>
<p>To address this issue, we moved all top-level assumptions into <a href="https://github.com/emberjs/ember.js/blob/master/packages/ember-metal/lib/environment.js">an <code>environment</code> abstraction</a>. If you look at it, it's really boring; it lets top-level code throughout the framework quickly short-circuit if basic DOM facilities are missing.</p>
<h2 id="thecontainerandsession">The Container and Session</h2>
<p>Ember's powerful dependency injection ("DI") system has been a boon for managing application state, supporting the transition from globals to modules, and ensuring tests are fast and robust.</p>
<p>Rather than storing application state globally (either in a global variable or as a property on a global object like <code>App</code>), all state in an idiomatic Ember app is stored inside an object called the "container". As a result, state can be thrown away between each automated test, ensuring you're testing what you think you're testing and not the side-effects of a previous test. It also improves the speed of tests, allowing you to run your test suite as you develop instead of waiting hours for a CI server.</p>
<p>The container also serves as a registry of your application code, and its "resolver" paved the way for Ember to move from globals-based code to <a href="http://jsmodules.io/">JavaScript modules</a> by abstracting lookups (e.g. Ember asking for a controller named "users") from the actual location of code.</p>
<p>The good news is that this means that the internals of Ember always look up (and create) objects through the container.</p>
<p>Unfortunately, we made a minor mistake in our original design. Currently, every application has only a single container. This assumption works fine when running your application in the browser, since you only load and run the application once per browser page load.</p>
<p>This also works fine in tests, with the exception that we are doing more work than absolutely necessary between each test run. In essence, we conflated the "code registry" and "application state" responsibilities into the same container object. Between test runs, we throw away the container to reset application state, but by also throwing out the code registry, which doesn't change between tests, we are throwing the baby out with the bath water.</p>
<p><img src="/images/blog/2014-12-22-inside-fastboot-the-road-to-server-side-rendering/old-school.png" alt="Architecture diagram showing state and code registry inside same Application object" /></p>
<p>When running on the server, however, we realized that a single Ember application needs to be able to continue serving requests even if a previous request is waiting for an async operation (such as fetching a model) to complete.</p>
<!-- alex ignore host-hostess -->
<p>This means that we needed to tweak our approach and allow applications to host multiple of what we call "sessions" at a time. Sessions allow us to separate the code registry (which doesn't change once the app is booted) from the application state.</p>
<p><img src="/images/blog/2014-12-22-inside-fastboot-the-road-to-server-side-rendering/new-school.png" alt="Architecture diagram showing state extracted into Session objects" /></p>
<p>This approach also has a side-benefit for testing: it allows us to reduce the amount of work we need to do between each test.</p>
<p>Both of these efforts (breaking out an environment and the design of the session) are incremental pieces that provide value on their own, and <a href="https://github.com/emberjs/ember.js/pull/9981">have already landed on <code>master</code> branch</a> thanks to the tireless work of <a href="https://twitter.com/dgeb">Dan Gebhardt</a>. Working with <a href="https://www.linkedin.com">LinkedIn</a> and <a href="http://www.bustle.com">Bustle</a> closely has helped us to work through the initial requirements, and identify steps that we could take that would help enterprising teams make progress while we take the next steps.</p>
<h2 id="nextsteps">Next Steps</h2>
<p>In the coming weeks, we are going to dive head-first into HTMLbars, getting it ready for its new life running inside a Node.js environment. We'll start by making sure that the <a href="https://github.com/tildeio/htmlbars/blob/master/packages/morph/lib/dom-helper.js"><code>DOMHelper</code></a> abstraction is used everywhere that interacts with the DOM, providing us a chokepoint to implement a fake DOM on the server that builds up strings of HTML instead of interacting with a real DOM.</p>
<p>We plan on keeping you updated with more posts in the Inside FastBoot series as we continue to make progress, so please stay tuned for more!</p>]]></description><link>https://blog.emberjs.com/inside-fastboot-the-road-to-server-side-rendering</link><guid isPermaLink="true">https://blog.emberjs.com/inside-fastboot-the-road-to-server-side-rendering</guid><pubDate>Mon, 22 Dec 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Introducing Subteams]]></title><description><![CDATA[<p>I'm very happy to share with you our plan to scale Ember's day-to-day
decision-making and coordination—something we're calling Subteams. We mentioned
some of this in this year's EmberConf keynote, and wanted to expand on the
specific details.</p>
<p>Ember.js was once only a view layer for rendering templates in the
browser, but has grown to become a complete SDK for the web. With one
<code>npm install</code>, you get everything you need to create a modern web
application.</p>
<!-- alex ignore simple -->
<p>Making things simple for developers often means a lot of coordination
and decision-making behind the scenes. As the number of pieces making up
Ember has grown—encompassing not only Ember.js but Ember CLI, Ember
Data, the Ember Inspector, documentation, and more—we want to ensure
that the Core Team does not become a bottleneck for progress.</p>
<p>At the same time, we believe that having a strong vision that everyone
can rally behind is critical to building software that feels cohesive.
So how do we ensure that everyone is pulling their cart in the same
direction, without losing momentum?</p>
<p>We're taking a page from <a href="https://internals.rust-lang.org/t/announcing-the-subteams/2042">Rust's
playbook</a>
and adopting the idea of Subteams. While we've often had informal teams
tackle specific tasks, this change formalizes that process and
officially recognizes the hard work of these contributors.</p>
<h2 id="coreteam">Core Team</h2>
<p>The Core Team serves as the leadership for the Ember project as a whole.
Its responsibilities include:</p>
<ul>
<li><strong>Setting the overall direction and vision for the project.</strong> This means
setting the core values that are used when making decisions about
technical tradeoffs. The core team also leads the writing of RFCs around new
initiatives.</li>
<li><strong>Setting priorities and the release schedule.</strong> Design bandwidth is limited,
and it's dangerous to try to grow the framework too quickly; the core
team makes some difficult decisions about which areas to prioritize for
new design, based on the core values and target use cases.
The regular release cycle, being one of the project's core values,
applies to subteams as well.</li>
<li><strong>Focusing on broad, cross-cutting concerns.</strong> The Core Team is specifically
designed to take a global view of the project, to make sure the pieces
are fitting together in a coherent way.</li>
<li><strong>Spinning up or shutting down subteams.</strong> Over time, we may want to expand the
set of subteams, and it may make sense to have temporary "strike
teams" that focus on a particular, limited task.</li>
<li><strong>Going/no-going features</strong>. While the subteams make decisions on RFCs,
the Core Team is responsible for pulling the trigger that moves a
feature from canary to beta. This provides an extra check that
features have adequately addressed cross-cutting concerns and that the
implementation quality is high enough.</li>
</ul>
<p>Each subteam is led by a Core Team liaison. This member is responsible for
keeping the Core Team apprised of progress on important initiatives,
identifying potential areas of concern early, and escalating cross-cutting
issues when needed.</p>
<h2 id="embercli">Ember CLI</h2>
<p><strong>Slack channel</strong>: #dev-ember-cli<br />
<strong>Discourse category</strong>: <a href="http://discuss.emberjs.com/c/ember-cli">Ember CLI</a></p>
<p><strong>Core Team Liaisons</strong>: Stefan Penner &amp; Robert Jackson  </p>
<p><strong>Members</strong>:</p>
<ul>
<li>Katie Gengler</li>
<li>Chad Hietala</li>
<li>Jake Bixby</li>
<li>Nathan Hammond</li>
<li>Kelly Selden</li>
<li>Tobias Bieniek</li>
</ul>
<h2 id="emberdata">Ember Data</h2>
<p><strong>Slack channel</strong>: #dev-ember-data<br />
<strong>Discourse category</strong>: <a href="http://discuss.emberjs.com/c/ember-data">Ember
Data</a>  </p>
<p><strong>Core Team Liaison</strong>: Igor Terzic  </p>
<p><strong>Members</strong>:</p>
<ul>
<li>Clemens Müller</li>
<li>Christoffer Persson</li>
<li>Stanley Stuart</li>
<li>Brendan McLoughlin</li>
</ul>
<h2 id="learning">Learning</h2>
<p><strong>Slack channel</strong>: #-learning<br />
<strong>Discourse category</strong>: <a href="http://discuss.emberjs.com/c/learning">Learning</a></p>
<p>While the Ember CLI and Ember Data subteams should be self-explanatory,
this one is the newest and may require some explanation.</p>
<p>We intentionally did not call this subteam <em>Documentation</em>,
because documentation is only one part of how new users learn to use
Ember. People start learning the second they land on the website
homepage, or when they see a presentation at their local user group.</p>
<p>We want to make holistic learning a central part of Ember. In addition to good
guides and API documentation, this means thinking about how members of
the community interact, how they get help, and how we introduce them to
new features added via the RFC process.</p>
<p>The Learning Subteam is responsible for the website, the guides, the API
docs and making sure the Core Team is aware of common pitfalls people
hit, like confusing error messages or APIs. We will take this
information and feed it back into the framework itself.</p>
<p>The best documentation is the documentation you never have to write. By
reducing complexity, making errors clearer, and smoothing the learning
curve, we can help Ember reach an entirely new audience.</p>
<p><strong>Core Team Liaison</strong>: Leah Silber</p>
<p><strong>Members</strong>:</p>
<ul>
<li>David Baker</li>
<li>Ricardo Mendes</li>
<li>Todd Jordan</li>
</ul>
<h2 id="thankyou">Thank You</h2>
<p>You can find information on the subteams and their members at
<a href="http://emberjs.com/team/">http://emberjs.com/team/</a>. We will keep this page up-to-date as people
come and go.</p>
<p>A big thank you to the members of these teams, who donate their time and
energy to make the web a better place. If you're interested in helping,
please reach out to one of the above team members for the best way to
get started.</p>
<p>We are excited at the pace at which Ember has grown, and we think it
uniquely solves the challenge of building modern web applications in a
way that doesn't push all of the complexity to the app developer. We
could not build as ambitiously without the dedication of these people.
Please join me in welcoming the new subteams, and in thanking for them
all of their hard work!</p>
<p><em>Many thanks to the Rust Core Team and particularly Aaron Turon's <a href="https://github.com/aturon/rfcs/blob/rust-governance/text/0000-rust-governance.md">Governance
RFC</a>,
and <a href="https://internals.rust-lang.org/t/announcing-the-subteams/2042">subteam
announcement</a>,
from which parts of this post are adapted.</em></p>]]></description><link>https://blog.emberjs.com/introducing-subteams</link><guid isPermaLink="true">https://blog.emberjs.com/introducing-subteams</guid><pubDate>Thu, 19 May 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Introducing Zoey]]></title><description><![CDATA[<p>Over the last few years the Ember project and community have grown, and along with it, the Ember brand. We took care and caution to craft an experience and <em>feel</em> that while exciting and ambitious, stayed friendly and approachable. A big part of that is thanks to our friendly neighborhood mascot, the Tomster.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/xsG0gDkvDPw?rel=0&start=221" frameborder="0" allowfullscreen></iframe>
<p>The time has come to expand the family. Introducing Zoey.</p>
<p><img src="/images/blog/2016-03/ember-zoey-all-sm.png" class="no-background" alt="Zoey"></p>
<!-- alex ignore dad-mom -->
<p>When chatting about the origins of the Tomster for an EmberConf talk last year, <a href="https://twitter.com/jgwhite">Jamie White</a> and Tomster illustrator <a href="http://lindsey.io/">Lindsey Wilson</a> had chuckled about how a mascot needed to be a little bit like the perfect pop song. Distinct, but just generic enough that all different sorts of people could see themselves in it, just like the one right lyric in the song makes it the anthem of a million different emotions and situations.</p>
<p>Tomster's done a great job of that until now, and with the addition of Zoey, even more amazing Ember developers will be able to see themselves in Ember.</p>
<!-- alex ignore dad-mom -->
<p>While Tomster will always be the <em>original</em> friendly face of Ember, you'll start seeing Zoey pop up around town too. Stay tuned for some special Zoey swag at EmberConf, and help us welcome her to the family.</p>]]></description><link>https://blog.emberjs.com/introducing-zoey</link><guid isPermaLink="true">https://blog.emberjs.com/introducing-zoey</guid><pubDate>Wed, 23 Mar 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Making Ember.js Easier]]></title><description><![CDATA[<p>We frequently receive feedback from new developers about how frustrating
it can be to get started with Ember. Yesterday, one of the <a href="https://news.ycombinator.com/item?id=5406857">most active
comment threads on Hacker
News</a> was largely about that.</p>
<!-- alex ignore easy -->
<p>We hear you loud and clear. Ember.js is not easy to get started with, and we take that very seriously. We are all working nights and weekends to make the framework as approachable as humanly possible.</p>
<p>One of the Hacker News commenters, kanja, nailed it. In response to another commenter who felt like the negative reaction was strong:</p>
<blockquote>
  <p>It's incredibly out of proportion - but people really want to use ember (because it promises all these great things!) and they're frustrated by the docs (because they're not really good for first time users) so this is kind of a flash point.</p>
</blockquote>
<!-- alex ignore easy -->
<p>Absolutely right. Ember promises—and, we think, delivers—tremendous value. But ramping up to that point is not easy, and we received this feedback repeatedly and take it very seriously.</p>
<p>There was another common sentiment that we'd like to address:</p>
<blockquote>
  <p>I have seen this sort of attitude from quite a few domain experts - if you didn't get it, you aren't smart enough and "don't deserve to be in our group."</p>
</blockquote>
<p>That does not reflect our feelings at all. If people find it difficult to use the tools we've created, that's a failure on our part. Period.</p>
<p>To keep things in perspective, we froze the Ember 1.0 API a mere month ago, when we released the first 1.0 RC. Before that, we were focused on iterating the API based on feedback we received from our early adopters. We believe that our willingness to change the API allowed us to build a better product than our competitors that locked in their first attempts. But that also means that much of the effort that people put into writing tutorials and documentation, including our own, quickly became obsolete.</p>
<p>Thankfully, that period is over. As we said in our <a href="https://www.youtube.com/watch?feature=player_detailpage&v=RYAD2arvysU#t=229s">EmberCamp keynote</a>, our focus now is on stability and building the ecosystem.</p>
<p>Since EmberCamp, momentum has been incredible. We've seen the amount of material helping new users grow quickly.</p>
<p>To call out a few of the big ones:</p>
<ul>
<li><a href="https://peepcode.com/products/emberjs">Fire Up Ember.js PeepCode</a></li>
<li><a href="http://railscasts.com/episodes/408-ember-part-1">Ember RailsCast</a> (and <a href="http://railscasts.com/episodes/410-ember-part-2">Part 2</a>)</li>
<li><a href="http://www.toranbillups.com/blog/archive/2013/03/02/emberjs-rc1-introduction-screencast/">RC1 Introduction Screencast</a> by Toran Billups</li>
<li><a href="http://net.tutsplus.com/tutorials/javascript-ajax/getting-into-ember-js/">NetTuts' Getting into Ember.js series</a> by Rey Bango</li>
<li>The guides on the Ember.js website have been dramatically expanded</li>
</ul>
<p>Additionally, great open source examples built on top of RC1 are out in the wild, like <a href="https://github.com/addyosmani/todomvc/tree/gh-pages/examples/emberjs">TodoMVC</a> and the "Big Kahuna," <a href="https://github.com/discourse/discourse">Discourse</a>.</p>
<p>We've also been working on tooling to make the process of developing Ember.js apps easier. For example, <a href="https://github.com/rpflorence/ember-tools">Ryan Florence's ember-tools</a> significantly improves bootstrapping a new project, and the <a href="https://github.com/tildeio/ember-extension">Ember Inspector plugin for Chrome</a> (which we <a href="https://www.youtube.com/watch?feature=player_detailpage&v=RYAD2arvysU#t=1924s">demoed at EmberCamp</a>) should make debugging and understanding apps much easier.</p>
<p>But we know that these things aren't enough. Here are the specific steps we will be taking to improve the experience for developers getting started:</p>
<ul>
<li>We're actively working on a Getting Started Guide with live examples that walks the user through building a new application from scratch</li>
<li>We're writing the script for a short screencast introducing the framework and illustrating how it works that will be prominently displayed on the homepage.</li>
<li>We're continuing to improve our guides to talk through areas, like the naming conventions we use in Ember, that might be confusing for new developers.</li>
<li>The Starter Kit will return, giving developers a one-click way to try out Ember. (We removed it temporarily to bring it up to date with the most recent idioms, but it will be coming back very soon. This was a hard decision, but leaving around an out of date starter kit seemed worse than removing it.)</li>
</ul>
<p>We also understand that there are some features in Ember.js that consistently trip up developers new to the framework. The Handlebars <code>{{bindAttr}}</code> helper is a good example. We focus relentlessly on identifying and fixing these issues; you can see the start of an effort to improve this in the work that Yehuda has been doing on <a href="http://github.com/tildeio/htmlbars">htmlbars</a>, which will hopefully land in Ember 1.1.</p>
<p>We'd like to give a big thank you to all of the contributors who have helped make Ember so successful. We believe that a truly community-backed open source project is important. Although it takes time to build that community, versus being able to hire a full-time staff, we believe that in the long run it leads to a stronger, more robust project that can't be "Google Reader'd." Immunity to any one company going under or pulling support is baked right in.</p>
<p>Lastly, we'd love your help. If you think there's something we're missing, or if you'd like to volunteer to help, please let us know in <a href="http://discuss.emberjs.com/t/ideas-for-improving-the-getting-started-experience/666">this Discourse thread</a>.</p>
<p>All the best,<br />
Yehuda Katz &amp; Tom Dale</p>]]></description><link>https://blog.emberjs.com/making-ember-easier</link><guid isPermaLink="true">https://blog.emberjs.com/making-ember-easier</guid><pubDate>Thu, 21 Mar 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Introducing the new Ember Mentorship Program]]></title><description><![CDATA[<p>We're pleased to announce the creation of the new <a href="https://emberconf.com/mentorship-program.html">Ember Mentorship Program</a>!</p>
<p>Mentorship has been a strong theme throughout Ember’s existence. We started with our first core team members pairing together at the creation of Ember, and today it’s one of the foundational parts of our DNA. Now we’re formalizing many of the things we already do, into a more structured, community-wide initiative, so we can do an even better job.</p>
<p>Mentorship is a responsibility shared by our entire community, and we’re excited to help it grow. It’s a celebration and elevation of the work that many, many people have contributed to, and a public statement that this is something we care about, prioritize, and intend to keep on doing.</p>
<h2 id="establishedinitiatives">Established Initiatives</h2>
<p>In addition to some fun new plans, the Ember Mentorship Program umbrella captures and unifies a bunch of existing efforts. Some are face-to-face events, others are remote, and some combine the two.</p>
<!--alex disable gals-men-->
<!--alex disable women-->
<p>Some of the things we've already been doing:</p>
<ul>
<li>The annual Mentorship Workshop and Mixer, an event at <a href="https://emberconf.com">EmberConf</a> that matches mentors with mentees, giving them time to get to know each other both ahead of and during the conference.</li>
<li>The <a href="https://emberconf.com/mentorship-program.html#women-helping-women">Women Helping Women</a> program, which helps support women who want to speak, lead, and contribute both within and outside of the Ember community. The program specifies an inclusive use of the term women, and is welcoming and respectful of trans women and any others who identify as women in a way that is significant to them, as well as to non-binary folk.</li>
<li>New Contributor Mentorship, the (currently informal) process where experienced contributors in the Ember ecosystem pair up with those who are learning and exploring.</li>
<li>Meetup Support, where organizers of groups around the world support each other and share ideas about the things that are and aren’t working for their groups. Meetup organizers also get together at EmberConf to share ideas and tips.</li>
</ul>
<p>There wasn't a central online listing of or hub for all these initiatives, and unifying them under the new single umbrella will help with organizing and sharing that information. (For now, the largest collection of details is on <a href="https://emberconf.com/mentorship-program.html">the EmberConf site</a>, but new pages are in the works to port all this content to the Ember website soon.)</p>
<h2 id="whatsnew">What’s New?</h2>
<p>EmberConf 2019 will be an annual opportunity to explore new areas for the program(s) to grow. One of the new areas of focus in 2019, for example, will be the first gathering for People of Color in the Ember Community. This Ember POC Connect initiative will be led by Ashlen Price and Elrick Ryan, who you may have met at past EmberConfs!</p>
<!-- alex disable hang -->
<p>More details are coming soon, and when registration for EmberConf opens, folks will be able to sign up for the first <a href="https://emberconf.com/inclusiveness-at-emberconf.html">POC Connect Breakfast</a>. There's also a new channel is Discord, <code>#poc-connect</code>, so people can get to know each other well before they get to hang out at EmberConf.</p>
<p>The Mentorship Program also embraces the idea that opportunities should be available to anyone in the community — not just those who can make it to EmberConf.</p>
<p>Here are some of the ways in the works:</p>
<ol>
<li>An <a href="https://github.com/ember-learn/mentorship-workshop">event kit</a> that anyone can use to run mentorship workshops in their local meetups or conferences, with guidance and support from past leaders.</li>
<li>Online events open to all participants around the world, at varying times to accommodate many time zones.</li>
<li>Adding content to the awesome <a href="https://help-wanted.emberjs.com/">Help Wanted</a> app to give new contributors more specific directions on how to get involved and who to ask for help.</li>
<li>Raising awareness of efforts like the <em>Women Helping Women</em> initiative and <em>POC Connect</em>, so new members can join and benefit from afar as well.</li>
<li>The <em>Ember Public Speaker Program</em>, which previously existed under the Women Helping Women program, and is now growing to be a general purpose effort open to all (<a href="https://emberconf.com/mentorship-program.html#evangelism">with an in-person EmberConf component too</a>!). It will help match speakers who want to improve their skills or practice, with others who can give guidance and feedback.</li>
</ol>
<h2 id="whythisfocuswhenwillthesethingshappen">Why this focus? When will these things happen?</h2>
<p>The reality of open source communities is that we have to choose where to spend energy carefully (though in the best case scenarios, we don’t have to choose because the goals align!). Focusing on organizing and improving work that’s already being done means there’s minimal overhead to the improvements around the edges.</p>
<p>If you don’t see your own ideas on these lists, get in touch! Everything we’ve done so far were grew from community volunteers and interest, and our we hope that more of you will come forward to help us build this up even more.</p>
<p>Mentorship-type efforts are really about the one-on-one connections we’re able to help foster along the way, which means every single participant makes a difference &hearts;</p>
<h2 id="howtogetinvolved">How to get involved</h2>
<ul>
<li>Do you want to be an EmberConf 2019 mentor or mentee? <a href="https://tilde.wufoo.com/forms/k13gtb5o0x2afmw/">Apply here</a> to participate in the in-person events.</li>
<li>Request to join the <code>#poc-connect</code> and/or <code>#women-in-ember</code> (Women Helping Women) channels on <a href="https://discordapp.com/invite/zT3asNS">Ember Discord</a>. To get access, ask about it in <code>#discord-server-admin</code>. These channels are year-round, not just for conference attendees.</li>
<li>For all other projects and events, including online-only opportunities, stay tuned for more announcements in the <a href="https://twitter.com/emberjs">EmberJS Twitter</a> and the <a href="https://the-emberjs-times.ongoodbits.com/">Ember Times</a> newsletter</li>
</ul>
<p>P.S. If you want to help lead, organize, or sponsor these efforts, please get in touch with Jen Weber (@jenweber) via the Ember Community Discord. Jen is leading the overall program coordination, and will connect you to the right people for the various projects. Thanks for your support and interest!</p>]]></description><link>https://blog.emberjs.com/mentorship-program</link><guid isPermaLink="true">https://blog.emberjs.com/mentorship-program</guid><pubDate>Mon, 17 Dec 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Post-1.0 Release Cycle]]></title><description><![CDATA[<p>Now that we've shipped Ember 1.0 final, it's time to look forward to future
releases.</p>
<p>The plan moving forward is to adopt a Chrome-like release cycle: more frequent releases with more clarity about where features are in the pipeline.</p>
<!-- READMORE -->
<h3 id="tldr">TL;DR</h3>
<p>The Ember.js 1.x Schedule:</p>
<ul>
<li>Every six weeks: A new stable version of Ember.js.</li>
<li>Every week: A new beta of the next version of Ember.js. When
Ember 1.1 is released, the first beta of Ember 1.2 will be released
at the same time.</li>
<li>Every day: A new "canary" build, which is the last successful build of
the day.</li>
<li>Every successful build: The <code>ember-latest.js</code> build is updated</li>
</ul>
<p>All builds will be available on the new <a href="/builds/">Ember.js Builds</a> section of the
Ember website.</p>
<p>All new features will start out on the <code>master</code> branch behind a feature flag. Canary
and <code>latest</code> builds will ship with all experimental features, enable-able
at runtime.</p>
<p>Beta and Stable releases will only ship with features that the core team
believes are stable.</p>
<p>Read on for more details about how we plan to organize new features. If
you plan to contribute features to Ember.js, or are interested in
the full nitty-gritty, you should check out the <a href="/guides/contributing/adding-new-features">Adding New
Features</a> guide, which lays
out all of the mechanics for the process going forward.</p>
<h3 id="featureflags">Feature Flags</h3>
<p>Starting today, all new features on <code>master</code> that introduce new public APIs
will be wrapped in a feature flag. This will help the core
team and the community to see which features are in development and how far
along they are.</p>
<pre><code class="javascript language-javascript">if (Ember.FEATURES.isEnabled('link-to')) {
  // implementation here
}
</code></pre>
<h3 id="crossbrowserbuilds">Cross Browser Builds</h3>
<p>Moving forward, builds will be tested (via Travis and SauceLabs) against
every supported browser. This means that we'll know whether a commit broke
the build on any browser we support.</p>
<h3 id="emberlatest">Ember Latest</h3>
<p>Every time the build passes across all browsers, the <code>ember-latest</code> build
will be updated. This is the most bleeding of bleeding-edge builds.</p>
<p>You can get all of the latest builds at <a href="/builds/#/canary/latest">http://emberjs.com/builds/#/canary/latest</a>.</p>
<h3 id="canarybuilds">Canary Builds</h3>
<p>At the end of every day, <code>ember-latest</code> will be saved off to a canary build
for that day. That means that the last successful build of a given day will
be saved for posterity.</p>
<p>This is a bleeding-edge build with no manual testing applied, so use at
your own peril.</p>
<p>On the latest or canary builds, you can enable any experimental feature
using a flag:</p>
<pre><code class="javascript language-javascript">Ember.FEATURES['link-to'] = true;
Ember.FEATURES['router-facelift'] = true;
</code></pre>
<p>This means that latest and canary ship with all experimental features,
and will be bigger in byte-size than using beta or released builds.</p>
<h3 id="betabuilds">Beta Builds</h3>
<p>Every six weeks, we will:</p>
<h4 id="branchbetatorelease">Branch Beta to Release</h4>
<p>See more on the release branch below.</p>
<!-- alex disable master -->
<h4 id="branchmastertobeta">Branch Master to Beta</h4>
<!-- alex enable master -->
<p>First, the core team will review all feature flags on <code>master</code>, and make
a Go/No-Go decision for each of them.</p>
<p>Any feature that is not ready to go will be stripped from the beta build.</p>
<p>Feature development will continue on <code>master</code>, and get another shot at the
next departing train, six weeks hence.</p>
<h4 id="thebetabranch">The Beta Branch</h4>
<p>The <code>beta</code> branch is designed to get more eyeballs on new features that
look ready to go.</p>
<p>The only changes to the <code>beta</code> branch should be bug fixes and removing
features that looked ready originally but which aren't going to make the
cut for the next stable build.</p>
<p>You can get the latest successful build off of the beta branch at
<a href="/builds/#/beta/latest">http://emberjs.com/builds/#/beta/latest</a>.</p>
<h3 id="releasebuild">Release Build</h3>
<p>Once the <code>beta</code> branch has gone through its paces, there will be another
Go/No-Go decision for each new feature still remaining on the branch.</p>
<p>This decision is made every six weeks, and the features that make the cut
will end up in the next release of Ember.js!</p>
<h3 id="newreleasemanagementteam">New Release Management Team</h3>
<p>A number of Ember contributors have really stepped up to automate the
process and build out tooling: Stanley Stuart (fivetanley), Robert
Jackson (rwjblue), Alex Navasardyan (twokul) and Thomas Boyt (tboyt).</p>
<p>They are now the (drumroll please) Ember.js release management team!</p>
<p>Thanks for all your hard work in making the new release process
possible.</p>]]></description><link>https://blog.emberjs.com/new-ember-release-process</link><guid isPermaLink="true">https://blog.emberjs.com/new-ember-release-process</guid><pubDate>Fri, 06 Sep 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Community Update: Octane Documentation]]></title><description><![CDATA[<p>The preview of the Octane edition of Ember is coming soon, and with all these fantastic new features comes a lot of documentation. Since this requires coordination of many moving parts, we want to outline the approach we're taking, and outlining some ways that the community can contribute.</p>
<h2 id="preparation">Preparation</h2>
<p>In order to prepare for the new edition, the Learning Core Team spent time figuring out how to best transition the existing docs in such a way that was consistent with iterative innovation.</p>
<p>One of the goals of improving the guides in general was to improve the learning flow in the guides (see <a href="https://github.com/emberjs/rfcs/pull/431">RFC #431</a>). As such, we determined that a change to the table of contents was in order.</p>
<h2 id="updatingtheguides">Updating the guides</h2>
<p>As per the usual standard, we have planned out this work to be able to complete it in an iterative fashion. This was particularly important because we are updating guides as new features for the Octane release are merged into Ember.</p>
<h3 id="phases">Phases</h3>
<p>This is roughly the planned phases of the documentation work for the Octane edition of the guides.</p>
<p>Phase 1, MVP: (see <a href="https://github.com/ember-learn/guides-source/issues/394">Tracking issue</a>)</p>
<ol>
<li>Create octane branch of the <a href="https://github.com/ember-learn/guides-source/">guides repo</a> for this work</li>
<li>Reorder the table of contents (as per <a href="https://github.com/emberjs/rfcs/pull/431">RFC #431</a>)</li>
<li>Add in placeholders for any new sub-sections</li>
<li>Add or update content in each sub-section (prose, code samples, etc) <a href="https://github.com/ember-learn/guides-source/issues/394">https://github.com/ember-learn/guides-source/issues/394</a></li>
<li>Review, edit &amp; re-arrange sub-sections before preview launches</li>
<li>Add re-direct URLs and remove old content</li>
<li>Test/Review to make sure everything works as intended</li>
</ol>
<p>Then the Octane guides will be considered in MVP status and we will move forward to the next phase, which will include all of the sections that were identified in the table of contents RFC but were not included in the MVP.</p>
<p>Through all of these phases, a preview of the Octane edition guides will be used to ensure that the documentation is staying on track with the intended features.</p>
<p>While new content is being written and older content is being updated, <strong>no existing content will be completely deleted.</strong> Only <em>after</em> we have fully reviewed the content and added the re-directs will outdated content be removed. This means that in the interim, some content may be available if the user has the URL, but it won't be linked from the table of contents.</p>
<h3 id="challenges">Challenges</h3>
<p>As with any ambitious undertaking, there are some related challenges. Here are a few we are currently facing:</p>
<ul>
<li>Updating guides content for the Octane feature set and defaults</li>
<li>The number of sub-sections for each guide section</li>
<li>Handling redirects for old content in a way that won't break existing deprecation messages</li>
</ul>
<p>We expect to work through these challenges and have a process in place to handle them, but we should have a shared awareness that our approach may be tweaked as the next month goes on, to address these issues.</p>
<h2 id="howyoucanhelp">How you can help</h2>
<p>We expect that the community will be willing to submit PRs to help make the documentation better–from checking for spelling or grammar errors, to adding code samples, and even more ambitiously, writing some prose.</p>
<p>Thanks to our infrastructure upgrades in 2018, we are well-positioned to accept community participation in the documentation effort. Please see the open issues in the <a href="https://github.com/ember-learn/guides-source/issues">guides source repository</a> and let us know in the #dev-ember-learning channel (on Discord) if you would like to work on an issue.</p>
<p>All PRs for this should be made against the <code>octane</code> branch of the <a href="https://github.com/ember-learn/guides-source">guides repo</a> and should follow the regular standards for pull requests to documentation, the most important being one issue per pull request.</p>
<h3 id="futureofcontributing">Future of Contributing</h3>
<p>The Learning Core Team is working to make it even easier to contribute. We are planning better contributing guides than we've ever had before, and you can be part of this process! We're adding a Contributing section to the website–participate in shaping this content by helping review/comment on <a href="https://github.com/emberjs/rfcs/pull/446">RFC #446</a>.</p>]]></description><link>https://blog.emberjs.com/octane-guides</link><guid isPermaLink="true">https://blog.emberjs.com/octane-guides</guid><pubDate>Thu, 14 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Octane is Here]]></title><description><![CDATA[<p>Ember 3.15 is Octane! Curious what Octane means for web development? This blog post will get you oriented.</p>
<p>For a write up of the technical details (upgrade strategies, deprecations, new Ember Data features) see the <a href="https://blog.emberjs.com/2019/12/20/ember-3-15-released.html">Ember 3.15 Release blog post</a>.</p>
<!-- READMORE -->
<h2 id="whatisemberoctane">What is Ember Octane?</h2>
<p>Ember Octane is the best way for teams to build ambitious web applications.</p>
<!--alex ignore just-->
<p>Ember has always focused on building the best framework that people with different levels of skill can use together to build web applications. Octane updates Ember's components and reactivity system to make them more modern, easier to use, and just more fun.</p>
<h2 id="theemberprojectrecommendsoctane">The Ember Project Recommends Octane</h2>
<p>As of Ember 3.15, the Ember project recommends Octane for new applications and addons. If you create a new app using <code>ember new</code> with 3.15 or later, you will get a new Octane application.</p>
<h2 id="octaneismorefun">Octane is More Fun</h2>
<p>The Ember Octane edition is, first and foremost, about making it easier and more <em>fun</em> to build Ember applications.</p>
<p>The centerpiece of Octane's ergonomic improvements are two big changes to the core of Ember: a new component model and a new reactivity system.</p>
<blockquote>
  <p>For existing Ember users, both the new component model and the new reactivity system are fully opt-in and fully interoperable with existing code. Upgrading an Ember 3.14 app to Ember 3.15 is a compatible change, as the version number would suggest.</p>
</blockquote>
<h2 id="glimmercomponents">Glimmer Components</h2>
<p>The first big improvement in Ember Octane is Glimmer Components. Ember has had a single component system since Ember 1.0, based on JavaScript syntax that was available at the time.</p>
<h3 id="beforeclassiccomponents">Before: Classic Components</h3>
<p>The thing that jumps out at you when you look at classic components is that you configure a "root element" using a JavaScript microsyntax.</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';

export default Component.extend({
  tagName: 'p',
  classNames: ["tooltip"],
  classNameBindings: ["isEnabled:enabled", "isActive:active"],
})
</code></pre>
<h3 id="afterglimmercomponents">After: Glimmer Components</h3>
<!--alex ignore special just-->
<p>In contrast, Glimmer components allow you to treat the root element like any other element. This substantially simplifies the component model, eliminating the special cases that come from having a second API just for working with the root element of a component.</p>
<pre><code class="handlebars language-handlebars">&lt;p class="tooltip {{if @isEnabled 'enabled'}} {{if @isActive 'active'}}"&gt;
  {{yield}}
&lt;/p&gt;
</code></pre>
<!--alex ignore just-->
<p>It also means that you can create a component with no root element at all, and things like this just work.</p>
<pre><code class="handlebars language-handlebars">&lt;p&gt;{{yield}}&lt;/p&gt;
&lt;hr&gt;
</code></pre>
<h2 id="reusabledombehaviorwithmodifiers">Reusable DOM Behavior With Modifiers</h2>
<p>The second big improvement to the Ember component model is element modifiers, a feature that allows you to build reusable DOM behavior that isn't connected to any specific component.</p>
<h3 id="beforemixins">Before: Mixins</h3>
<p>In Classic Ember, if you wanted to define a piece of DOM behavior that you could reuse across your application, you would define a component mixin that implemented the appropriate lifecycle hooks.</p>
<p>For example, let's say we have a third-party library that exposes <code>activateTabs</code> and <code>deactivateTabs</code> functions, both of which take an element. In Classic Ember, you could write a mixin like this:</p>
<pre><code class="javascript language-javascript">import Mixin from '@ember/object/mixin';

export default Mixin.create({
  didInsertElement() {
    this._super();
    activateTabs(this.element);
  }

  willDestroyElement() {
    this._super();
    deactivateTabs(this.element);
  }
})
</code></pre>
<p>And then you would use it in a component like this:</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';

export default Component.extend(Tabs, {
  // ...
});
</code></pre>
<p>The drawbacks of using mixins for UI composition are well-described <a href="https://reactjs.org/blog/2016/07/13/mixins-considered-harmful.html">across</a> <a href="https://blog.logrocket.com/hooks-are-coming-to-vue/">the</a> <a href="https://github.com/sveltejs/svelte/issues/1041#issuecomment-353660981">JavaScript</a> <a href="https://github.com/emberjs/rfcs/issues/534">ecosystem</a>. The most glaring issue is naming conflicts. Any method on a mixin might conflict with a method on any other mixin, with no good way to resolve the conflicts.</p>
<p>In the context of Ember, there's another issue with using Ember Component mixins for reusable DOM behavior. If you want to use the <code>Tabs</code> mixin on an element, you need to turn that element into a component with a JavaScript class, which is pretty awkward.</p>
<blockquote>
  <p>While we do recommend you avoid mixins, you can still use them in Ember 3.15. Addons may also still provide mixins for you to use.</p>
</blockquote>
<h3 id="afterelementmodifiers">After: Element Modifiers</h3>
<p>Ember Octane provides a new way to reuse DOM behavior: element modifiers. The simplest way to write an element modifier is to write a function that takes the element and does something with it. The function can optionally return a destructor function that should run when Ember tears down the element.</p>
<p>This is what our <code>Tabs</code> mixin looks like when reimplemented as a modifier.</p>
<pre><code class="javascript language-javascript">import { modifier } from 'ember-modifier';

export default modifier(element =&gt; {
  activateTabs(element);

  return () =&gt; deactivateTabs(element);
});
</code></pre>
<p>Really straightforward!</p>
<p>You can use a modifier on any element using element modifier syntax.</p>
<pre><code class="handlebars language-handlebars">&lt;div {{tabs}}&gt;&lt;/div&gt;
</code></pre>
<p>Element modifiers work on any element, meaning that you don't need to create a whole component to create reusable DOM behavior.</p>
<p>This way of writing modifiers assumes that when the arguments to a modifier change, it's fine to run the destructor and run the modifier from scratch. If you need more granular control, the <code>ember-modifier</code> package also provides a more advanced API.</p>
<h2 id="glimmerreactivity">Glimmer Reactivity</h2>
<p>The hallmark of a modern front-end framework is its "reactivity model". A reactivity model tells you how to define and manipulate data in your program so that the output DOM will update correctly when you make changes.</p>
<p>Ember Octane exposes a drastically simpler reactivity model called "tracked properties."</p>
<blockquote>
  <p>The tracked properties reactivity model is compatible and interoperable with the classic reactivity model. This is because both APIs are implemented in terms of Ember's internal reactivity model, based on <a href="https://github.com/glimmerjs/glimmer-vm/blob/master/guides/04-references.md">References</a> and <a href="https://github.com/glimmerjs/glimmer-vm/blob/master/guides/05-validators.md">Validators</a>.</p>
</blockquote>
<h3 id="beforecomputedpropertiesandrestrictions">Before: Computed Properties and Restrictions</h3>
<p>In Classic Ember, you mutate reactive properties by using <code>set</code>, and any computations have to be described as computed properties. Computed properties must fully enumerate all dependencies.</p>
<p>Here's the computed properties example from Ember 3.14's guides:</p>
<pre><code class="javascript language-javascript">import EmberObject, { computed } from '@ember/object';

const Person = EmberObject.extend({
  firstName: null,
  lastName: null,
  age: null,
  country: null,

  fullName: computed('firstName', 'lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  }),

  description: computed('fullName', 'age', 'country', function() {
    return `${this.fullName}; Age: ${this.age}; Country: ${this.country}`;
  })
});

let captainAmerica = Person.create({
  firstName: 'Steve',
  lastName: 'Rogers',
  age: 80,
  country: 'USA'
});

captainAmerica.description; // "Steve Rogers; Age: 80; Country: USA"
captainAmerica.set('firstName', 'Christopher');
captainAmerica.description; // "Christopher Rogers; Age: 80; Country: USA"
</code></pre>
<p>This design makes it harder to break up a computed property into smaller functions, because the computed property still needs to enumerate all properties that it used, no matter where they're used. In practice, this means that, in Classic Ember, you break up computed properties into more computed properties, which works well but is somewhat restrictive.</p>
<h3 id="aftertrackedproperties">After: Tracked Properties</h3>
<p>Octane's reactivity model, tracked properties, have a much lighter footprint.</p>
<pre><code class="javascript language-javascript">class Person {
  @tracked firstName;
  @tracked lastName;
  @tracked age;
  @tracked country;

  constructor({ firstName, lastName, age, country }) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
    this.country = country;
  }

  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }),

  get description() {
    return `${this.fullName}; Age: ${this.age}; Country: ${this.country}`;
  })
}

let captainAmerica = new Person({
  firstName: 'Steve',
  lastName: 'Rogers',
  age: 80,
  country: 'USA'
});

captainAmerica.description; // "Steve Rogers; Age: 80; Country: USA"
captainAmerica.firstName = "Christopher";
captainAmerica.description; // "Christopher Rogers; Age: 80; Country: USA"
</code></pre>
<p>You start with a normal JavaScript class and annotate any fields that could affect the DOM with <code>@tracked</code>. You don't need to annotate getters or functions, so you can break up your code however you want.</p>
<blockquote>
  <p>A neat thing about the tracked properties reactivity model is that if you remove the <code>@tracked</code> annotation, the code works exactly the same. The only thing that changes if you add <code>@tracked</code> is that if you make changes to the property, any part of the DOM that used that property as part of its computation will correctly update.</p>
</blockquote>
<h2 id="afocusondocumentation">A Focus on Documentation</h2>
<!--alex ignore just-->
<p>Octane is more than just new features. It's also a focus on refreshing the documentation to show users how to build applications in the Octane way.</p>
<h3 id="fullyrefreshedtutorialandcomponentguides">Fully Refreshed Tutorial and Component Guides</h3>
<p>The tutorial is the first way that people learn how to build Ember applications. Ember 3.15 fully refreshed the <a href="https://guides.emberjs.com/v3.15.0/tutorial/">Super Rentals Tutorial</a> so that it's written in Octane style.</p>
<p>The structure of the tutorial is also clarified and refreshed.</p>
<div>
  <span style="width=50%;float:left">
    <h4>Before</h4>
    <img alt="Tutorial before Octane" src="/images/octane-is-here/Untitled.png">
  </span>
  <span style="width=50%;float:left">
    <h4>After</h4>
    <img alt="Tutorial after Octane" src="/images/octane-is-here/Untitled%201.png">
  </span>
  <div style="display: block; clear: both;"></div>
</div>
<p>The guides also underwent a major refresh, elevating components and eliminating confusing organization (like the separation between templates and components). The new guides de-emphasize controllers, which are less important in Octane. The classic object model section is now included in a section on migrating to Octane rather than as a first-class section.</p>
<div>
  <span style="width=50%;float:left">
    <h4>Before</h4>
    <img alt="Guides before Octane" src="/images/octane-is-here/Untitled%202.png">
  </span>
  <span style="width=50%;float:left">
    <h4>After</h4>
    <img alt="Guides after Octane" src="/images/octane-is-here/Untitled%203.png">
  </span>
  <div style="display: block; clear: both;"></div>
</div>
<h2 id="greattooling">Great Tooling</h2>
<p>The Ember inspector is a very important part of the way that Ember developers build Ember apps.</p>
<p>We're very proud that we've maintained a solid five-star rating on the Chrome Web Store over the years.</p>
<p><img src="/images/octane-is-here/Untitled%204.png" alt="Ember Inspector" /></p>
<p>For Octane, the Ember inspector has been updated to support Octane features in a first-class way, including tracked properties and Glimmer components.</p>
<p>The refreshed inspector eliminates duplicate concepts and outdated language (like "View Tree"). It also has numerous visual improvements, including a new component tooltip that better reflects Octane idioms. It also updates the component tooltip, which fixes a long-standing issue with physically small components.</p>
<p><img src="/images/octane-is-here/Untitled%205.png" alt="Ember Inspector view tree" /></p>
<h2 id="gettingstarted">Getting Started</h2>
<p>Whether you're a new Ember developer, coming back to Ember after many years, or an existing Ember developer, the fastest and easiest way to get learn how to build applications the Octane way is to run through <a href="https://guides.emberjs.com/release/tutorial/">the refreshed tutorial</a>.</p>
<p>Once you get through the tutorial, it's time to build something real for fun. The Ember addon ecosystem is a great part of Ember, so you'll want to reach for addons to speed up the process of building your project.</p>
<p><a href="https://emberobserver.com/">Ember Observer</a> is a directory for the Ember addon ecosystem. Each addon gets a quality score based on a human review of formal criteria like the existence of a meaningful README, whether the addon has an automated build, and whether the addon is maintained by more than one person. This week, it will also indicate whether an addon is Octane Ready.</p>
<blockquote>
  <p>Because of the details of Octane's compatibility story, most addons should be Octane Ready without any changes. Ember Observer will help the community proactively identify and fix Octane problems in maintained packages.</p>
</blockquote>
<h2 id="acloserlookatseamlessinterop">A Closer Look at Seamless Interop</h2>
<!--alex ignore special-->
<p>In addition to the elimination of computed properties, the Glimmer reactivity model also doesn't include special Ember proxies or observers. The Octane reactivity model is more powerful than the classic one, but it's much easier to use.</p>
<p>The Octane reactivity model wouldn't be very useful for existing Ember users if it was hard to use objects implemented using the classic reactivity model from objects implemented using the Octane model. For that reason, we worked hard to ensure that existing Ember applications can freely use classic objects in classes built using tracked properties.</p>
<pre><code class="javascript language-javascript">class Contact {
  @tracked person;

  constructor(person) {
    this.person = person;
  }

  get description() {
    return this.person.description;
  }
}

import EmberObject, { computed } from '@ember/object';

const Person = EmberObject.extend({
  firstName: null,
  lastName: null,
  age: null,
  country: null,

  fullName: computed('firstName', 'lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  }),

  description: computed('fullName', 'age', 'country', function() {
    return `${this.fullName}; Age: ${this.age}; Country: ${this.country}`;
  })
});

let captainAmerica = new Person({
  firstName: 'Steve',
  lastName: 'Rogers',
  age: 80,
  country: 'USA'
});

let contact = new Contact(captainAmerica);
contact.description; // "Steve Rogers; Age: 80; Country: USA"
captainAmerica.set('firstName', 'Christopher');
contact.description; // "Christopher Rogers; Age: 80; Country: USA"
</code></pre>
<p>Because these two systems are interoperable, libraries can adopt the Octane reactivity system without a breaking change to their API.</p>
<p>This work also allows existing Ember codebases to adopt Octane patterns module-by-module.</p>
<h2 id="thanksforcheckingoutoctane">Thanks for checking out Octane!</h2>
<p>Octane is a project the Ember community is excited to share with developers
both new and experienced. Octane is a modern, productive way to build web applications, and makes it possible to have both fun and stability in our work.</p>
<p>The polished, across the board refresh of Ember's APIs and help content could not have accomplished this without the effort of the community and every member of the <a href="https://emberjs.com/team/">Ember Core Teams</a>. Thank you for being a part of our community, contributing to this project, and continuing to help Ember be a great choice for building on the web.</p>]]></description><link>https://blog.emberjs.com/octane-is-here</link><guid isPermaLink="true">https://blog.emberjs.com/octane-is-here</guid><pubDate>Fri, 20 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Octane is coming in v3.14]]></title><description><![CDATA[<p>Update: The timeline has changed since the initial publishing of this post, and Octane is not 3.14.
See the <a href="https://blog.emberjs.com/2019/10/31/octane-release-update.html">Octane Release Update</a> for the latest news.</p>
<p>The Ember community is wrapping up the work for <a href="https://emberjs.com/editions/">Octane</a>, and we expect to get it over the finish line in time for v3.14!
Ember Octane describes a set of new features that, when taken together, represent a foundational improvement to the way you use Ember. It has modern, streamlined components and state management that make it fun to build web applications. With seamless interoperability for existing apps, teams can migrate at their own pace, while developers building new apps start out with the best that Ember has to offer.</p>
<p>This article will cover the release plan and how your team can prepare.</p>
<h2 id="releaseplan">Release plan</h2>
<ul>
<li>The next release of Ember is 3.12, which is an LTS (long term support) candidate. Check out the <a href="https://blog.emberjs.com">release blog posts</a> to learn which of Octane's features are already available in stable releases like this one.</li>
<li>Ember 3.13 will be feature-complete for Octane, and apps using stable Ember can opt in. At this point, we're still wrapping up polish, especially in the codemods, inspector and guides.</li>
<li>In Ember 3.14, Octane will be the primary, recommended way to use Ember. In Ember 3.14, new apps will have Octane's optional features enabled by default. The guides and tutorials will show Octane examples, and codemods will be available to help users migrate to Octane.</li>
</ul>
<p><strong>Octane features are opt-in</strong>, and this will continue to be true for the rest of the 3.x series. As <a href="https://semver.org/">SemVer</a> would suggest, all releases until 4.0 are backwards-compatible with 3.x.</p>
<p>If there are any major changes to these plans, we will update this post.</p>
<h2 id="theworkthatremains">The work that remains</h2>
<p>Since Octane was first announced, over a hundred contributors have been hard at work to test it and ship it in a stable release. Work continues at full speed on codemods, learning resources, the Ember Inspector, and our public website. Anyone who is interested in helping with these final steps is invited to join the <code>#st-octane</code> channel on <a href="https://emberjs.com/community">Ember Discord</a>.</p>
<h2 id="preparingyourappsforoctane">Preparing your apps for Octane</h2>
<p>Ember Octane is a collection of exciting features, many of which have already shipped in stable releases. If your team wants to get a head start, there are some things you can do today to prepare.</p>
<h3 id="visittheoctanemigrationchannelondiscord">Visit the Octane Migration channel on Discord</h3>
<p><a href="https://emberjs.com/community">Ember Discord</a> has a new channel called <code>#topic-octane-migration</code> where you can ask any questions you have or get help along the way. If you are new to Discord, post in <code>#discord-server-admin</code> to request permissions to post.</p>
<h3 id="updateyourappto312">Update your app to 3.12</h3>
<p>Update your app to 3.12 after it is released. <a href="https://github.com/ember-cli/ember-cli-update">ember-cli-update</a> will help you out!</p>
<h3 id="brushuponclasses">Brush up on classes</h3>
<p>Octane uses <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes">Native JavaScript Classes</a>, so we recommend that developers try them out with regular JavaScript examples to learn the basics, if they are not already familiar. Without some background knowledge of classes, it will be hard for developers to tell which pieces are specific to Ember versus native JavaScript syntax.</p>
<h3 id="tryusingoctanefeaturesthathavealreadylanded">Try using Octane features that have already landed</h3>
<p>The rest of the sections below cover optional features in Octane that you can consider using now. These features are independent of each other. You can opt into them one at a time, in any order. The best way to try them out is when you are writing new components.</p>
<p>You will be able to migrate to many of Octane's idioms automatically using codemods that we will finalize with Ember 3.14. When we say "Octane idioms," we mean the syntax, APIs, and patterns for Octane. We do not recommend trying to mass-migrate older code (like <code>@ember/component</code> Components) without those codemods.</p>
<!--alex ignore just-->
<p>Even then, many teams may want to not convert older code at all, and just start using Octane idioms moving forward. <strong>This is a valid, fully supported approach.</strong> We will have a guide to upgrading describing the options and strategy that we will finalize with Ember 3.14. At the same time, all of the Ember Guides and Tutorials will be fully migrated to Octane idioms. You can get a sneak peek of those work-in-progress learning resources <a href="https://emberjs.com/editions/octane">here</a>!</p>
<h2 id="atourofstablefeatures">A tour of stable features</h2>
<p>Here are some of the features that will play a key role in Octane. These are stable features that have already been released.</p>
<h3 id="applicationtemplatewrapper">application-template-wrapper</h3>
<p>In classic Ember, your entire application is automatically wrapped in a <code>&lt;div&gt;</code> with the class <code>ember-application</code>. Octane applications do not automatically insert this unneccessary <code>&lt;div&gt;</code>.</p>
<p>If your CSS (or JavaScript) relies on this <code>&lt;div&gt;</code>, you can explicitly add it to your <code>application.hbs</code> or refactor your code to no longer rely on it.</p>
<p>You opt in to this change by</p>
<pre><code class="bash language-bash">ember feature:disable application-template-wrapper
</code></pre>
<h3 id="jqueryintegration">jquery-integration</h3>
<p>In classic Ember, jQuery is automatically included, and <code>this.$</code> inside of component classes uses jQuery to select from the DOM. Ember Octane does not include jQuery automatically, nor does it include any direct jQuery integration in the component API.</p>
<p>Ember's internals no longer depend on jQuery. If your app still uses jQuery directly and you want to continue using it, you can add <code>@ember/jquery</code> to your <code>package.json</code> and disable this classic feature. You will still be able to use all the other features of Octane.</p>
<!--alex ignore just-->
<p>Alternatively, you could migrate away from using jQuery in your application, but it is not necessary. Octane's other features work just fine either way.</p>
<p>You opt in to this change by:</p>
<pre><code class="bash language-bash">ember feature:disable jquery-integration
</code></pre>
<p>If you still want to use jQuery in your application, make sure to add <code>@ember/jquery</code> to your <code>package.json</code>.</p>
<h3 id="templateonlyglimmercomponents">template-only-glimmer-components</h3>
<p>In classic Ember, components that have a template but no JavaScript file get assigned a default component (<code>EmberComponent.extend()</code>). This means that you can refer to properties on this implicit component using two-way bindings, and those properties will be implicitly created for you.</p>
<p>Octane does not implicitly create a component class for you, and the <code>this</code> context inside the template is <code>undefined</code>. You can still refer to passed-in arguments using <code>@name</code> and yield to blocks using <code>yield</code>, but references to properties on the component like <code>{{someProp}}</code> or <code>{{this.someProp}}</code> will not work.</p>
<p>Enabling <code>template-only-glimmer-components</code> will opt you in to the new behavior. The easiest way to migrate existing applications to this flag is to create an explicit JavaScript file for each template-only component that refers to properties on the implicit component.</p>
<p>Alternatively, you could eliminate any references to the implicit component by renaming arguments from <code>{{someArg}}</code> to <code>{{@someArg}}</code> and removing any reliance on two-way bindings on the implicit component.</p>
<p>When done, you can opt in to the new behavior:</p>
<pre><code class="bash language-bash">ember feature:enable template-only-glimmer-components
</code></pre>
<h3 id="glimmercomponentbaseclass">Glimmer Component Base Class</h3>
<p>One of the biggest changes to Ember's idioms in Octane is the recommended component base class.</p>
<p>In classic Ember, the component base class is <code>@ember/component</code> and you extend from it using <code>Component.extend()</code>.</p>
<pre><code class="javascript language-javascript">// Classic, NOT OCTANE
import Component from "@ember/component";

export default Component.extend({
  // class definition here
})
</code></pre>
<p>In Ember Octane, extend from a new base class: <code>@glimmer/component</code> and use native class syntax.</p>
<pre><code class="javascript language-javascript">import Component from '@glimmer/component';

export default class extends Component {

}
</code></pre>
<p>Glimmer components are a streamlined component base class that doesn't depend on <code>Ember.Object</code>. It also doesn't have the proliferation of APIs for configuring the root element, like <code>classNameBindings</code>, <code>this.element</code> and attaching event handlers to the root element. This is because components that inherit from <code>@glimmer/component</code> don't have a root element at all.</p>
<p>Glimmer components are fully compatible with classic components and other custom components. You can invoke Glimmer components from classic templates and vice versa. You can use Glimmer components inside of the block passed to a classic component, and you can use classic components inside of the block passed to a Glimmer component. It's completely mix and match.</p>
<h3 id="attachlifecycleeventswheretheybelong">Attach lifecycle events where they belong</h3>
<p>The <code>@ember/component</code> base class has life-cycle hooks like <code>didInsertElement</code> and <code>didUpdateElement</code>. Ember fires these hooks at appropriate times, and you can use them to manage the DOM for your component.</p>
<p>Ember Octane introduces a new way to manage the DOM directly in the template that works everywhere in combination with classic Ember and Octane.</p>
<pre><code class="handlebars language-handlebars">&lt;h1&gt;{{@title}}&lt;/h1&gt;
&lt;div {{did-insert this.fadeIn}} class="alert"&gt;
  {{yield}}
&lt;/div&gt;
</code></pre>
<pre><code class="javascript language-javascript">export default Component.extend({
  fadeIn(element) {
    element.classList.add('fade-in');
  }
});
</code></pre>
<p>This syntax is called a "modifier" because you use it to modify an element. It cuts down on bookkeeping because Ember will automatically run <code>did-insert</code> whenever the element is added into the DOM.</p>
<pre><code class="handlebars language-handlebars">{{#if this.shouldShow}}
  &lt;div {{did-insert this.fadeIn}} class="alert"&gt;
    {{yield}}
  &lt;/div&gt;
{{/if}}
</code></pre>
<p>In classic Ember, it would have been tricky to make sure that the <code>fadeIn</code> method was invoked whenever a div was inserted, even if <code>this.shouldShow</code> was toggled over and over again. Because modifiers are attached to a DOM element and not a component, Ember can invoke it at exactly the right time.</p>
<p>This is especially useful when dealing with loops.</p>
<pre><code class="handlebars language-handlebars">{{#each @todos as |todo|}}
  &lt;li {{did-insert this.inlineEditor}}&gt;{{todo.name}}&lt;/li&gt;
{{/each}}
</code></pre>
<p>In this example, we run a little bit of JavaScript code whenever a new <code>li</code> is inserted into the list, no matter how many times that happens.</p>
<p>There is also <code>did-update</code> and <code>will-destroy</code>, which behave as you'd expect.</p>
<p><strong>Modifiers work everywhere</strong>. They work inside of classic components, inside of a route's templates, and inside of template-only components.</p>
<p>One final thing: if you find yourself writing the same <code>did-insert</code> code in multiple places, you can extract the code into a <em>custom modifier</em>, which can even be packaged into addons. One cool example of a <em>custom modifier</em> that's already on npm is <a href="https://github.com/gmurphey/ember-did-resize-modifier"><code>ember-did-resize-modifer</code></a>, which allows you to attach custom logic to an element, whenever it changes size.</p>
<pre><code class="handlebars language-handlebars">&lt;div {{did-resize this.onResize}}&gt;
  Resize the window to see the modifier in action
&lt;/div&gt;
</code></pre>
<p>Custom modifiers provide a much more compositional way to package up DOM behavior than mixins, which is the typical approach in classic Ember.</p>
<h3 id="theonmodifier">The <code>{{on}}</code> Modifier</h3>
<p>In classic Ember, you can add event handlers to the root element of your component by adding methods to your class. For example, to handle clicks on your component's root element, you would add a <code>click</code> method to your class. To handle events on other methods you would use the <code>{{action}}</code> modifier where you want to handle the event, and nest the method inside of an <code>actions</code> hash.</p>
<p>When using Glimmer components, you can handle events on any element using a new <code>{{on}}</code> modifier. Since Glimmer components do not have a root element, <code>{{on}}</code> works anywhere.</p>
<pre><code class="handlebars language-handlebars">&lt;h1 {{on "click" this.toggleBody}}&gt;Hello world&lt;/h1&gt;

{{#if this.showingBody}}
  &lt;div&gt;{{yield}}&lt;/div&gt;
{{/if}}
</code></pre>
<p>For more details, see the <a href="https://api.emberjs.com/ember/3.12/classes/Ember.Templates.helpers/methods/on?anchor=on">API docs for on</a>.</p>
<h3 id="requiredthisintemplates">Required <code>{{this}}</code> in Templates</h3>
<p>In classic Ember, you can refer to properties on a component as <code>{{propertyName}}</code>. This was ambiguous with helpers and components, and was deprecated in <a href="https://emberjs.github.io/rfcs/0308-deprecate-property-lookup-fallback.html">RFC 308</a>.</p>
<p>No matter what kind of component you're using, you should start using <code>this</code> to refer to component properties in new code. The <a href="https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-implicit-this.md"><code>no-implicit-this</code></a> template lint can help you avoid using this deprecated pattern by accident.</p>
<p>Ember 3.14 will finalize a codemod that uses dynamic information from booting up your app to automatically insert <code>this</code> where needed. We recommend waiting for this codemod to be finalized before attempting to mass-migrate your codebase.</p>
<h3 id="anglebracketinvocation">Angle Bracket Invocation</h3>
<p>This one landed a while ago, and many people have already started to use it in their apps. In classic Ember, you would invoke components using curly brace syntax:</p>
<pre><code class="handlebars language-handlebars">{{input value=this.name}}
{{#link-to route=this.routeName}}Some content{{/link-to}}
</code></pre>
<p>Octane introduces a new way of invoking components using angle brackets and <code>@names</code>.</p>
<pre><code class="handlebars language-handlebars">&lt;Input @value={{this.name}} /&gt;
&lt;LinkTo @route={{this.routeName}}&gt;Some content&lt;/LinkTo&gt;
</code></pre>
<p>In addition to being easier to read, this syntax makes it possible to pass HTML attributes directly to components. This means no more having to maintain a list of <code>attributeBindings</code> in your components. It also makes it easier to attach ARIA attributes to components, including components from addons.</p>
<p>You can invoke any kind of component using angle brackets, including components that inherit from <code>@ember/component</code>.</p>
<p>See the <a href="https://guides.emberjs.com/release/reference/">Angle Bracket Syntax Conversion Guide</a> for more details!</p>
<h3 id="nativeclasssyntax">Native Class Syntax</h3>
<p>You can use native class syntax to subclass from any framework base class. This means that you can migrate your components that inherit from <code>@ember/component</code> to native class syntax.</p>
<h4 id="nativeclassgotchas">Native Class Gotchas</h4>
<p>There are a handful of gotchas when using native class syntax to subclass from <code>@ember/component</code> (many of which involve the <code>init</code> method). To help alleviate those issues, you can attach the <code>@classic</code> decorator to classes that inherit from <code>Ember.Object</code> (directly or indirectly), and use Ember lints to help catch potential problems.</p>
<pre><code class="javascript language-javascript">import Component from "@ember/component";

@classic
export default class extends Component {
  init() {
    // potential problem -- switch to using the constructor instead
  }
}
</code></pre>
<p>To help catch these bugs using the <code>@classic</code> decorator now, install <a href="https://github.com/pzuraq/ember-classic-decorator"><code>ember-classic-decorator</code></a> and enable <a href="https://github.com/pzuraq/ember-classic-decorator#installation"><code>classic-decorator-hooks</code></a> and <code>classic-decorator-no-classic-methods</code> in <code>.eslintrc.js</code></p>
<h2 id="thanksforreading">Thanks for reading!</h2>
<p>If you have more questions, please visit <a href="https://emberjs.com/community">Ember Discord</a> and the <code>#topic-octane-migration</code> channel!</p>]]></description><link>https://blog.emberjs.com/octane-release-plan</link><guid isPermaLink="true">https://blog.emberjs.com/octane-release-plan</guid><pubDate>Thu, 15 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Octane Release Update]]></title><description><![CDATA[<p>The short version: We're still learning from the community as they adopt Octane,
and won't be recommending Octane as the default Ember mode in the Ember's 3.14
release. You can continue to opt-in to Octane in Ember 3.14, and the developer
experience of doing so is continuing to improve.</p>
<h3 id="octanefeedbackhasbeenpositive">Octane Feedback has been positive</h3>
<p>Ember developers have been able to opt-in to Octane since Ember 3.13. By their
own estimation, some developers have been <a href="https://twitter.com/mixonic/status/1180494661938552832">shipping Octane apps to
production</a>!
This has, as expected, resulted in substantial feedback from the community.</p>
<p>The feedback about the new programming model has largely been positive.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Not a
new app, but <a
href="https://twitter.com/intercom?ref_src=twsrc%5Etfw">@intercom</a> has been
incrementally moving to Octane for the past few months. As of this week,
we&#39;re running Glimmer components in production. I spent this week pairing
with lots of colleagues, most coming from <a
href="https://twitter.com/reactjs?ref_src=twsrc%5Etfw">@reactjs</a>. There is
universal excitement with Octane!</p>&mdash; Gavin Joyce (@gavinjoyce) <a
href="https://twitter.com/gavinjoyce/status/1180505184524476416?ref_src=twsrc%5Etfw">October
5, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js"
charset="utf-8"></script>
<h3 id="polish">Polish</h3>
<p>Ember 3.13 is feature-complete for Octane in the core framework. 3.13 contains
all the features applications need in order to use the Octane programming model.
Most developers working with Octane can safely be crowned early adopters.</p>
<p>We expected to be ready to <em>recommend</em> Octane to <em>all</em> users by Ember 3.14,
after squashing bugs, wrapping up work on the Ember inspector, focusing a lot of
effort on documentation, finalizing codemods, and helping the addon ecosystem
provide a good experience to Octane users.</p>
<p>And Ember contributors took up the call and substantially improved the level of
polish for Octane.</p>
<p>However, there are a handful of remaining issues that mean 3.14 will fall short
of what we expect from an Octane MVP.</p>
<h3 id="decouplingjqueryremoval">Decoupling jQuery Removal</h3>
<p>One of the most consistent pieces of feedback we got from users since 3.13 is
that disabling jQuery integration was an unexpectedly hard part of their
migration.</p>
<p>Originally, we thought that the migration process would be straight forward.
Developers should have been able to adopt the <code>@ember/jquery</code> addon as a
transitioning tool.</p>
<p>For various reasons, the truth is a little bit more subtle than that, and
removing jQuery dominated the transition process for a number of users.</p>
<p>Because there is no <em>technical</em> reason to couple the removal of jQuery
integration with Octane, <strong>we decided not to require Octane apps to disable
jQuery integration.</strong> This requirement change is implemented as of the 3.14.0
release.</p>
<h3 id="finishingtheinspectorwork">Finishing the Inspector Work</h3>
<p>Ember 3.13 shipped new debugging APIs that allow the <a href="https://github.com/emberjs/ember-inspector">Ember
Inspector</a> to show
Glimmer components (and any components using a custom component manager) in the
component pane.</p>
<p>However existing code in the inspector ended up being more difficult to work
with than anticipated, and the integration work for these new debugger APIs
remains uncompleted. The inspector is a key tool for new Ember developers
learning the framework, and we consider this part of the Octane story
incomplete.</p>
<h3 id="documentation">Documentation</h3>
<p>Documentation is probably the most important part of Octane. If we don't have
clear documentation about the Octane programming model developers will struggle
as they build their own way to think about the framework.</p>
<p>Since before EmberConf (last March), we've been working on updating the
documentation with new Octane idioms. The Learning Team has led this effort,
with a lot of additional work provided by folks on the Framework Team. Both the
guides and API docs are up to date with the new idioms, from top to bottom.</p>
<p>That said, we still have a handful of things left to do.</p>
<p>First, the current API docs don't yet include the documentation for
<code>@glimmer/component</code>. The Learning Team is working on that actively, and it
should be done soon.</p>
<p>Second, while the template and component guides are updated with the latest
Octane idioms (thanks <a href="https://twitter.com/pzuraq">Chris H. Garrett</a>!), the current preview version of guides
don't fully embrace the pedagogy of the new programming model. There is an
active effort to provide a starting point that is more aligned with Octane, but
it's not quite ready yet. That, too, should be done soon.</p>
<h3 id="whatsnext">What's Next</h3>
<p>If you tried out Octane in Ember 3.13, keep on using it. The features that make
up Octane are now stable, which means they come with the Semantic Versioning
guarantees any Ember feature has.</p>
<p>If you were waiting until Ember 3.14 to try out Octane, only do so if you're
willing to accept a version of Octane that the Ember team doesn't feel is
polished enough to <em>recommend</em> to all users quite yet. Ember 3.14 is a great time
for adventurous users to try updating their production apps to Octane, and
report back any problems that you find.</p>
<h3 id="swingandamiss">Swing and a Miss</h3>
<p>We said we expected to recommend Octane for all users with 3.14.</p>
<p>Missing this goal is disappointing, <strong>but getting Octane right is the most
important thing</strong>. Had we decided to recommend Octane at Ember 3.14, or delayed
the release and committed to shipping it in a few weeks, we would have risked
having Octane be an experience somewhat less than what we aspire for it to be.
<strong>And that would have defeated the whole effort.</strong></p>
<p>Onward! Let's make the shipping version of Octane as amazing as we all know it
can be.</p>]]></description><link>https://blog.emberjs.com/octane-release-update</link><guid isPermaLink="true">https://blog.emberjs.com/octane-release-update</guid><pubDate>Thu, 31 Oct 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Organizing Our Contributors]]></title><description><![CDATA[<p>Open source project management is different than inside a typical software company. It's an example of the purest form of leadership: you’re getting a bunch of peers all moving in the same direction, despite no formal hierarchy or authority structure. It comes down to building consensus, persuasion, and setting the right examples.</p>
<p>The Ember Core Team was formed in 2011 because even decentralized open source communities need leadership and shared direction. As our community and core contributor group grew, there was too much going on to keep all the work under the direct attention of the Core Team. And so multiple other teams emerged organically; first the Ember CLI team and Ember Data, and later the Learning team.</p>
<p>The work that all these teams do is equally important. But the historical accident of Ember Core being the first team left Ember Core with numerous varied jobs. It became the coordination point for both technical leadership and overall community support.</p>
<p>As often happens, the way things naturally evolved wasn’t necessarily the best optimized. The disparate workload was hard for the Core team to manage well, because it's difficult to simultaneously optimize for the very different jobs. At times it was also unfair to other teams, who were no less important, but had less of a say in some areas. So today we’re announcing a plan to reorganize in a way that attempts to address both concerns.</p>
<p><strong>Moving forward, all the official teams will be known as Core teams:</strong> Ember.js Core, Ember CLI Core, Ember Data Core, and Ember Learning Core. The intent is to make it clear that we are all peers. In some areas this was already true, and in others we will work to make it true.</p>
<p>All that as it is, we also can’t lose our central coordination point, so along with these reorganized teams, we’re establishing the Ember Steering Committee. The Steering Committee will take the lead on community support responsibilities that were previously under the Core Team’s purview, while the newly-refined Ember.js Core sticks with the technical leadership responsibilities.</p>
<p>The Steering Committee will be responsible for things including, but not limited to:</p>
<ul>
<li>Owning the <a href="https://emberjs.com/guidelines/">Community Guidelines</a> and helping people stick to them</li>
<li>Serving as the public-facing mediator</li>
<li>Organizing events and conferences</li>
<li>Supporting local meetup organizers</li>
<li>Managing Ember's brand and visual identity</li>
<li>Facilitating cross-team coordination</li>
<li>Owning meta-level work, like making improvements to the RFC process itself</li>
<li>Establishing a framework and processes for each team to thoughtfully manage its own membership</li>
<li>Dealing with policy/legal questions</li>
</ul>
<p>The Ember.js Core Team will retain its traditional technical leadership responsibilities around the Core Ember.js and Glimmer projects, including but not limited to:</p>
<ul>
<li><p>Sorting out which RFCs have enough consensus to move forward</p></li>
<li><p>Merging PRs</p></li>
<li><p>Managing the release process</p></li>
<li><p>Promoting overall ecosystem compatibility and upgradeability</p></li>
<li><p>Handling security issues</p>
<p>The first concrete example of how the Steering Committee can serve as facilitators for community-wide projects is the EmberJS2018 road-mapping process. Everyone on Core is committed to making sure all that great feedback from the community doesn't get dropped or forgotten, and the Steering Committee is taking responsibility for making sure a clear community roadmap is synthesized. It's not the Steering Committee's job to set the items on that roadmap—that's going to emerge from work by all of the Core teams—but it's the Steering Commitee's job to make sure the work happens, by establishing helpful processes and leading the charge.</p></li>
</ul>
<p>The initial membership of the Steering Committee comes from people on Ember.js Core who were already working on community support tasks: Leah Silber, Melanie Sumner, Yehuda Katz, Tom Dale, Edward Faulkner and Katie Gengler.</p>
<p>How will this change impact the wider community? Hopefully you’ll notice both jobs being done more effectively than before. Look for more great things coming soon, including a ton of framework features landing in the 3.x series, and a refresh of the public website and messaging.</p>
<p>Lastly, Ember.js would not be what it is without a huge community of leaders: addon maintainers, strike team members, RFC authors, meetup organizers, and more. And with respect to the duties now reorganized under the steering committee, especially to Leah Silber, who has been managing most of these responsibilities on her own as part of her Ember Core Team responsibilities since first organizing the very first Ember logo and website way back in 2011.</p>
<p>We’re so thankful to all of you for your work and for this incredible opportunity to build awesome things together.</p>]]></description><link>https://blog.emberjs.com/organizing-our-contributors</link><guid isPermaLink="true">https://blog.emberjs.com/organizing-our-contributors</guid><pubDate>Sat, 30 Jun 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Plain Old Functions as Helpers]]></title><description><![CDATA[<p>Ember 4.5 introduced a long-awaited feature: the ability to use normal JavaScript functions as helpers.</p>
<p><em>Today,</em> this means two things:</p>
<ol>
<li>You can use (bound) methods on your backing class as helpers directly.</li>
<li>You can define function-based helpers without importing and using <code>helper()</code>.</li>
</ol>
<p>In the future, it will also work extra nicely with the upcoming <code>&lt;template&gt;</code> feature!</p>
<p>Let's see what each of those looks like.</p>
<h2 id="usingmethodsashelpers">Using methods as helpers</h2>
<p>Ember developers have often wanted to be able to call methods on a backing class as helpers. This often comes up in an <code>{{#each}}</code> loop where you want to calculate some value using state in the backing class for each item. You could work around this by introducing some other intermediate object via a getter, or by extracting a helper you could call with the state <em>and</em> the item from the loop… but now you can call a method exactly like you would in JS code!</p>
<p>Here's a simplified example with a component which can choose to hide items from a list passed in.</p>
<p>Backing class:</p>
<pre><code class="js language-js">import Component from '@glimmer/component';
import { TrackedSet } from 'tracked-built-ins';

export default class HideableList extends Component {
  hiddenItems = new TrackedSet();

  shouldShow = (item) =&gt; !this.hiddenItems.has(item);

  hide = (item) =&gt; {
    this.hiddenItems.add(item);
  };
}
</code></pre>
<p>Template:</p>
<pre><code class="hbs language-hbs">&lt;ul&gt;
  {{#each @items as |item|}}
    {{#if (this.shouldShow item)}}
      &lt;li&gt;
        {{item.details}}

        &lt;button type='button' {{on "click" (fn this.hide item)}}&gt;
          Hide
        &lt;/button&gt;
      &lt;/li&gt;
    {{/if}}
  {{/each}}
&lt;/ul&gt;
</code></pre>
<p>Notice here that you can do what people have always felt like you <em>should</em> be able to do: <code>{{#if (this.shouldShow item)}}</code>!</p>
<p>In this example I've used arrow functions to bind the methods. Methods <em>do</em> have to be bound, or this won't work! You could also use <code>@action</code> here, and that will do the trick—but it feels a bit weird to put <code>@action</code> on <code>shouldShow()</code>. The Ember Framework team has discussed this little corner, and I expect we will update our teaching and approach here as part of the road to Polaris. There are a lot of options here, including:</p>
<!-- alex ignore just -->
<ul>
<li>using arrow functions like this example shows</li>
<li>introducing a <code>@bound</code> decorator to replace <code>@action</code></li>
<li>introducing <em>other</em> decorators, to distinguish between “actions” and things which “read” tracked state</li>
<li>making direct <code>this.someMethod</code> access “just work”</li>
<li>combinations of some or all of the above</li>
</ul>
<p>We’ll have more to say on that in the future!</p>
<h2 id="standalonefunctionsashelpers">Standalone functions as helpers</h2>
<p>Instead of writing <code>helper(function(pos, named) { ... })</code> you can define a function normally and make it the default export from a file in your app or addon's <code>helpers</code> directory. For example, here’s how you might have defined a <code>parse-int</code> helper before:</p>
<pre><code class="js language-js">// app/helpers/parse-int.js
import { helper } from '@ember/component/helper';

export default helper(function parseInt([numberToParse], { radix = 10 }) {
  return Number.parseInt(numberToParse, radix);
});
</code></pre>
<p>Here's how we would define that now that we have the ability to use normal functions as helpers:</p>
<pre><code class="js language-js">// app/helpers/parse-int.js
export default function parseInt(numberToParse, { radix = 10 }) {
  return Number.parseInt(numberToParse, radix);
}
</code></pre>
<p>Using that in the template is exactly the same either way:</p>
<pre><code class="hbs language-hbs">{{parse-int "1234" radix=4}}
</code></pre>
<h3 id="rulesforhelpers">Rules for helpers</h3>
<p>A helper defined as a plain-old function takes all positional arguments as normal arguments, with a final named argument as its last argument:</p>
<pre><code class="js language-js">function exampleHelper(positional1, positional2, named) {
  if (named.someNamedArg) {
    // ...
  }
}
</code></pre>
<p><em>Note for migrating:</em> In traditional Ember helpers, the positional and named arguments are <em>always</em> passed to the function—if the caller did not pass them, they are present but empty. By contrast, plain-old function helpers work exactly like JavaScript functions: if you want a default value, you need to supply it in the JavaScript.</p>
<h3 id="helperswithonlypositionalargs">Helpers with only positional args</h3>
<p>For a helper with only positional args, define it like you would a normal JavaScript function with a list of parameters:</p>
<pre><code class="js language-js">export default function add(a, b) {
  return a + b;
}
</code></pre>
<h3 id="helperswithonlynamedargs">Helpers with only named args</h3>
<p>For a helper with only named args, define your function with an options object as its first argument, the same way you would in normal JavaScript:</p>
<pre><code class="js language-js">export default function onlyNamed({ someOption, anotherOption }) {
  // ...
}
</code></pre>
<h2 id="comingsoon">Coming soon</h2>
<p>When we land the <code>&lt;template&gt;</code> tag feature (check out <a href="https://rfcs.emberjs.com/id/0779-first-class-component-templates">First-Class Component Templates</a> for details), you'll also be able to define helpers locally to a module:</p>
<pre><code class="js language-js">const add = (a, b) =&gt; a + b;

&lt;template&gt;
  &lt;ul&gt;
    {{#each @numbers as |number index|}}
      &lt;li&gt;{{add number index}}&lt;/li&gt;
    {{/each}}
  &lt;/ul&gt;
&lt;/template&gt;
</code></pre>
<p>You can try that out today by installing <a href="https://github.com/ember-template-imports/ember-template-imports">ember-template-imports</a>, and we’re working on getting that into a stable version of Ember itself soon!</p>
<h2 id="questionsyoumighthave">Questions you might have</h2>
<h3 id="howdoigetstartedwiththis">How do I get started with this?</h3>
<p>If you’re on Ember 4.5 or later, you can start using this feature as shown above, no other steps required. If you’re on Ember 3.25 or higher, you can install and use the official polyfill by running <code>ember install ember-functions-as-helper-polyfill</code>. Once you’re on 4.5 or later, the polyfill uses the native implementation instead, so you can remove it separately from doing an upgrade.</p>
<p>Thanks to <a href="https://github.com/nullvoxpopuli/">@nullvoxpopuli</a> for doing the work of getting the polyfill implemented, and to both <a href="https://github.com/nullvoxpopuli/">@nullvoxpopuli</a> and <a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a> for helping get the feature landed in Ember itself!</p>
<h3 id="isthereacodemod">Is there a codemod?</h3>
<p>Not yet! This one would be pretty straightforward to write, though, so if you’re interested, let us know in <a href="https://discord.com/channels/480462759797063690/597043084588613642">#topic-codemods</a> on <a href="https://discord.gg/emberjs">the Ember Discord</a>. This would be a great place to dip your toes into contributing!</p>
<h3 id="caniusebuiltinmethodsautomatically">Can I use built-in methods automatically?</h3>
<p>In the method example above, I showed using <code>this.shouldShow</code> as a helper. In normal JS you could call <code>this.hiddenItems.has(item)</code>, the way <code>shouldShow()</code> does. It seems like this should work in templates too:</p>
<pre><code class="hbs language-hbs">{{#each @items as |item|}}
  {{#if (this.hiddenItems.has item)}}
    ...
  {{/if}}
{{/each}}
</code></pre>
<p>Unfortunately, this does not work yet, even though it feels like it should. The template language does not <em>yet</em> make sure that the binding through <code>this.hiddenItems</code> is preserved the way it would be in a JavaScript context. The Framework Core team has started exploring how to make that work, and we are <em>hoping</em> to have a good solution in place for Polaris!</p>
<h3 id="aretraditionalhelpersgoingaway">Are traditional helpers going away?</h3>
<p>No, helpers defined using the <code>helper()</code> function will continue to work exactly like they always have. We expect that over time, most of the community will move to using normal JavaScript functions this way. If or when it makes sense, we may deprecate and remove <code>helper()</code>—but <em>only</em> when it makes sense, and following Ember’s standard SemVer policies as always.</p>]]></description><link>https://blog.emberjs.com/plain-old-functions-as-helpers</link><guid isPermaLink="true">https://blog.emberjs.com/plain-old-functions-as-helpers</guid><pubDate>Thu, 04 Aug 2022 13:30:00 GMT</pubDate></item><item><title><![CDATA[Requiring two-factor authentication on our GitHub organizations]]></title><description><![CDATA[<p>As of today, we are requiring all members of Ember GitHub organizations to have <a href="https://authy.com/what-is-2fa/">two-factor authentication (2FA)</a> enabled.</p>
<p>The following are the relevant organizations:</p>
<ul>
<li><a href="https://github.com/emberjs">Ember.js</a></li>
<li><a href="https://github.com/ember-cli">ember-cli</a></li>
<li><a href="https://github.com/glimmerjs">Glimmer.js</a></li>
<li><a href="https://github.com/ember-data">ember-data</a></li>
<li><a href="https://github.com/ember-learn">Ember Learning Team</a></li>
<li><a href="https://github.com/ember-engines">ember-engines</a></li>
<li><a href="https://github.com/ember-fastboot">Ember FastBoot</a></li>
</ul>
<p>Only members of these organizations--those with potential write access--are required to have 2FA enabled. It is NOT required to open an issue, make a PR, or otherwise interact with the organizations on GitHub. However, we strongly recommend <a href="https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/">enabling 2FA</a>, especially for any account with write access to public repos.</p>
<p>When we enabled this requirement any members without 2FA enabled were automatically removed from the above organizations. If you were removed from one of those organizations today, please enable 2FA and contact <code>katie</code> in the <a href="https://ember-community-slackin.herokuapp.com/">community slack</a> or your favorite organization admin to be re-invited.  </p>
<!-- alex ignore clearly -->
<p>We have formalized this policy after self-auditing our security policies in the wake of <a href="https://blog.npmjs.org/post/175824896885/incident-report-npm-inc-operations-incident-of">yesterday's npm incident</a>. Because developers trust Ember.js to handle sensitive customer data in production, we take the security of the project extremely seriously. The Ember project maintains a <a href="https://www.emberjs.com/security/">clearly outlined security policy</a>.</p>
<p>If you discover what you believe may be a security issue in Ember.js, we ask that you follow our <a href="https://www.emberjs.com/security/#toc_disclosure-policy">responsible disclosure policy</a>.</p>
<p>If you are using Ember.js in production, please consider subscribing to our <a href="https://groups.google.com/forum/#!forum/ember-security">security announcements mailing list</a>. It is extremely low-traffic and only contains high-priority security announcements.</p>]]></description><link>https://blog.emberjs.com/requiring-2fa-for-github-org-members</link><guid isPermaLink="true">https://blog.emberjs.com/requiring-2fa-for-github-org-members</guid><pubDate>Fri, 13 Jul 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Transition to Ember 2.0 in Detail]]></title><description><![CDATA[<p>As we approach the eve of the release of Ember 1.13-beta, it's a good
time to talk about the transition plan for those of us who have Ember
1.11 and 1.12 applications.</p>
<p>The high level:</p>
<ul>
<li>Ember 1.13-beta.1 will be released early this week. It will come with the
new Glimmer engine and a series of new deprecations, preparing for
cruft removal in Ember 2.0.</li>
<li>Ember 1.13 will ship with support for <strong>angle bracket components</strong>,
which also serve as the opt-in for one-way data flow and the entirety
of the other React-inspired programming model improvements.</li>
<li>We will continue to fix regressions caused by the Glimmer engine
throughout the 1.13 beta cycle.</li>
<li>We plan to release Ember 2.0-beta.1 on June 12, as announced at
EmberConf.</li>
<li><strong>We will release a point release of Ember 1.13 (likely 1.13.1)
together with the release of Ember 2.0.</strong> This release will continue
to fix regressions caused by the Glimmer engine, and help smooth the
transition to Ember 2.0.</li>
<li><strong>We will likely release additional point releases of Ember 1.13 to
help address unexpected difficulties in the transition to Ember 2.0.</strong>
For the most part, this will likely include new deprecations with
light backporting of features needed to complete a transition away
from deprecated features in 1.13.</li>
</ul>
<p>The Glimmer engine represents the third phase of major performance work
on Ember in the past year (preceded by <code>metal-views</code> in 1.8 and HTMLBars
in 1.10). Now that it's landed, we're going to move into the next phase
of major performance improvements. Expect to see more about that once
Ember 2.0 has shipped.</p>
<h3 id="dealingwithglimmerregressions">Dealing With Glimmer Regressions</h3>
<p>We landed Glimmer in Canary, and given that it's a completely rewritten
rendering engine, we're quite happy with the results so far.</p>
<p>That said, we expect to continue seeing compatibility fallout,
especially in heavily-used private APIs, over the next several months.</p>
<p>As a result, <strong>we plan to continue releasing point releases in the 1.13
series as we learn about additional incompatibilities.</strong> We will
continue to do this after Ember 2.0, to try to make sure that everyone
who wants to upgrade to Ember 1.13 and remove deprecations (as a
precursor to an Ember 2.0 upgrade) can do so.</p>
<h3 id="addoncompatibilityandprivateapis">Add-On Compatibility and Private APIs</h3>
<p>Ember 1.x add-ons quite often use private APIs. This was necessary for
many of the most ambitious add-ons (like Liquid Fire), and these add-ons
were a boon for Ember users.</p>
<p>While Glimmer cannot maintain compatibility for every private API used
by add-ons, we are committed to helping existing add-ons find new
approaches that work post-Glimmer, ideally in the form of public APIs.</p>
<p>We know that many Ember 1.x apps (including apps by members of the core
team) will not be able to upgrade to Ember 1.13 and Glimmer until
popular existing add-ons can support 1.13. We don't plan to put the 1.13
series to bed until people with 1.12 apps who are trying to upgrade to
deprecation-free 1.13 in earnest can do so successfully.</p>
<h2 id="therolloutofnewfeatures">The Roll Out of New Features</h2>
<p>Over the past six months, we've talked about a lot of new features that
we plan to work on during this time-frame.</p>
<p>Since the 1.8.0 release (October 2014), we landed a large chunk of the
features we started to talk about as precursors to 2.0.</p>
<p><strong>In Ember 1.13, we will land the last chunk of 2.0 precursor features,
including the Glimmer rendering engine and React-style data flow.</strong></p>
<p>The Glimmer rendering engine is fully backwards compatible with the
Ember 1.12 public API, and we continue to do work to ensure
compatibility with real-world apps and addons that are using popular
private APIs.</p>
<p>The new data flow model, including one-way data flow by default,
separation of attributes from component state, opt-in mutable bindings,
and callback-style actions are all opt-in through the use of another big
new feature: <strong>angle-bracket components</strong>.</p>
<p>We do not plan to remove curly-brace components (with their legacy
semantics) in Ember 2.0, <strong>so you can take your time upgrading your
components to the new semantics and still upgrade to Ember 2.0</strong>. In the
sections that follow, I will lay out the most important changes and talk
about the transition path.</p>
<h3 id="20precursorfeaturesalreadylandedby112">2.0 Precursor Features Already Landed By 1.12</h3>
<ul>
<li><strong>elimination of metamorph tags</strong> landed in Ember 1.8.0</li>
<li><strong>metal-views</strong> landed in Ember 1.8.0, providing full support for SVG
documents, including components in SVG.</li>
<li>the <strong>HTMLBars</strong> engine landed in 1.10, which prepared the codebase
for Glimmer</li>
<li><strong>block params</strong> and <strong>chained else</strong> in templates landed in 1.10</li>
<li><strong>services</strong> landed in 1.10</li>
<li><strong>curly attributes / elimination of <code>bind-attr</code></strong> (<code>&lt;a
href="{{src}}"&gt;</code>), the first big fruits of HTMLBars, landed in 1.11</li>
<li>the <strong>dynamic {{component}} helper</strong> landed in 1.11</li>
<li><strong>instance initializers</strong>, a precursor to FastBoot, landed in 1.12</li>
</ul>
<h3 id="ember113andtheglimmerengine">Ember 1.13 and the Glimmer Engine</h3>
<p>The Glimmer engine is shorthand for a whole bunch of new features. While
most of the public discussion has focused on performance, it also
integrates many of the programming model improvements pioneered by
React.</p>
<h4 id="onewayvaluesbydefault">One-Way Values By Default</h4>
<p>First of all, starting in Ember 2.0, template bindings are one-way by
default. Because we know that it will take some time to refactor your
applications to explicitly opt-in to two-way bindings as needed, we have
decided to make this new behavior a consequence of opting in to new
angle-bracket components.</p>
<pre><code class="handlebars language-handlebars">{{!-- title is a mutable two-way binding --}}
{{my-component title=model.name}}

{{!-- title is an (immutable) value --}}
&lt;my-component title={{model.name}} /&gt;
</code></pre>
<p>At the moment, we have not yet decided when precisely to drop two-way
bindings by default, and whether to continue to include the support in a
plugin once we have dropped it. The specifics will depend largely on how
difficult the upgrade to angle-bracket components proves to be.</p>
<p>We expect angle-bracket components to land as part of Ember 1.13 on June
12.</p>
<h4 id="fastrerender">Fast Re-Render</h4>
<p>In Ember 1.12, calling <code>rerender()</code> on a component is an extremely
expensive operation, and blows away all of the existing DOM (together
with its internal state, such as selection, cursor, focus, scroll
position and more).</p>
<p>In Ember 1.13, thanks to the Glimmer engine, you can safely invoke
<code>rerender()</code> and it will only update the parts of the template that have
actually changed.</p>
<p>This allows you to replace an entire data structure with a totally new
POJO, <code>rerender</code> the component, and get highly performant updates that
preserve the DOM.</p>
<p>As in React, if you modify a property on the component that is used in
the template ("state" in React), the component will be <code>rerendered()</code>,
so the most common way to trigger a (fast) re-render is to set a
property on the component that is used by the component's template.</p>
<p>Notably, this model is quite similar to the binding model used in Ember
1.12, with some small changes that eliminate the possibility of creating
complex graphs of two-way bindings by accident.</p>
<h4 id="newlifecyclehooks">New Lifecycle Hooks</h4>
<p>Instead of having to register observers on "bindings" and try to reflect
the changes into your DOM, which can be fairly error-prone and
confusing, Ember 1.13 introduces a series of new lifecycle hooks that
execute whenever a component's attributes change.</p>
<p>Attribute changes can happen either via observation, such as when a
service has changed, or through the data-down/actions-up data flow
pattern enabled by <code>component.rerender()</code> and <code>component.set()</code>.</p>
<p>In Ember 1.12, you might write something like this:</p>
<pre><code class="javascript language-javascript">Component.extend({
  didInsertElement() {
    this.$().button({
      text: this.get('value'),
      disabled: this.get('disabled')
    });
  },
  valueDidChange: observer('value', function() {
    this.$().option('text', this.get('value'))
  }),

  disabledDidChange: observer('disabled', function() {
    this.$().option('disabled', this.get('disabled'))
  })
})
</code></pre>
<p>One problem with this code is that the observer can fire at any time,
and it executes both when the value is changed from inside the component
and when it is changed from the outside.</p>
<!-- alex ignore easy -->
<p>As we'll see in the next section, conflating changes coming from the
inside with changes coming from the outside can make it difficult to
reason about the data flow, and makes it easy for code in your
component to accidentally trigger observers that were intended for
changes coming from the <em>outside</em>.</p>
<!-- alex ignore clearly -->
<p>Starting with Ember 1.13, you will be able to express the same concept
more clearly:</p>
<pre><code class="javascript language-javascript">Component.extend({
  didInsertElement() {
    this.$().button({
      text: this.attrs.value,
      disabled: this.attrs.disabled
    });
  },

  didUpdateElement() {
    this.$().options({
      text: this.attrs.value,
      disabled: this.attrs.disabled
    });
  }
});
</code></pre>
<p>A full description of the new lifecycle hooks will be included with the
documentation of Ember 1.13, but they will allow you to perform work in
response to a change in attributes both before and after rendering has
taken place. You will also be able to do work for initial render only,
for updates only, or both.</p>
<h4 id="theattrsproperty">The <code>attrs</code> Property</h4>
<p>As described above, conflating the attributes (values provided by the
component's caller) with the component's own state can cause confusion,
especially when combined with mutable attributes.</p>
<p>In particular, a seemingly innocuous change to a piece of component
state can trigger a cascade of changes to child components, sibling
components, and even parent components.</p>
<p>Beginning with angle-bracket components in Ember 1.13, a component's
attributes will be available in <code>this.attrs</code> rather than on the
component itself.</p>
<p>So when a component is invoked this way:</p>
<pre><code class="handlebars language-handlebars">&lt;my-component title={{model.name}} /&gt;
</code></pre>
<p>The component will see <code>this.attrs.title</code> as the current value of
<code>model.name</code>. Whenever <code>model.name</code> changes via observation, or when the
parent component is re-rendered, <code>my-component</code>'s lifecycle hooks will
be triggered, and it will see a new version of <code>model.name</code>.</p>
<h4 id="themuthelper">The <code>mut</code> Helper</h4>
<p>But what if you want to allow the child component to modify the property
explicitly.</p>
<p>The <code>mut</code> helper will produce an object that contains both a <code>value</code>
property and an <code>update</code> method.</p>
<p>Imagine a component that will increment a <code>count</code> property whenever the
component is clicked.</p>
<p>You might write such a component this way in Ember 1.12:</p>
<pre><code class="handlebars language-handlebars">{{my-counter count=activatedCount}}
</code></pre>
<pre><code class="javascript language-javascript">// my-counter.js
export default Component.extend({
  click: function() {
    this.set('count', this.get('count') + 1);
  }
});
</code></pre>
<p>While this is fairly terse, the code in the component and its invocation
is fairly unclear.  While it is modifying a property in a parent
component, nothing about the JavaScript code makes that clear. And while
the code that invokes <code>my-counter</code> is allowing its <code>activatedCount</code>
property to be modified (which is rather unusual), nothing about the
invocation makes that clear.</p>
<p>Especially in larger components, and when combined with an observer on
<code>count</code>, the expected behavior can become quite obtuse and it can become
hard to follow the precise, expected data flow.</p>
<p>In Ember 1.13, you can write the same component this way:</p>
<pre><code class="handlebars language-handlebars">&lt;my-counter count={{mut activatedCount}} /&gt;
</code></pre>
<pre><code class="javascript language-javascript">// my-counter.js
export default Component.extend({
  click: function() {
    this.attrs.count.update(this.attrs.count.value + 1);
  }
});
</code></pre>
<p>The call to <code>{{mut activatedCount}}</code> packages up an object containing
both its current value and a callback that allows the receiving
component to modify it. There are only a handful of additional
characters, but the intent of the code is far clearer, both when the
component is invoked and when the component is updating the attribute.</p>
<p>In other words, <code>{{mut}}</code> produces a regular JavaScript value that
contains both the current value and a way to update it. The lifecycle
hooks will fire at the same times as well.</p>
<h4 id="theactionhelper">The <code>action</code> Helper</h4>
<p>Finally, the behavior of actions in Ember 1.12 is quite magical. You
pass an action string into a component, and <code>sendAction</code> triggers the
action in the environment that provided the string.</p>
<p>Frustratingly, it is impossible to pass a component that wants to
trigger an action an alternative function, because actions are strings,
not functions.</p>
<p>Even in Ember 1.12, you can always pass a function into a component, but
if you write something like: <code>&lt;my-component on-playing={{actions.playing}} /&gt;</code>,
the <code>this</code> in the function will be wrong (you want it to be the
component). In addition, you want a way to pass arguments into the
function (i.e. "<a href="https://en.wikipedia.org/wiki/Currying">currying</a>").</p>
<p>Starting in Ember 1.13, a new <code>action</code> helper provides you with a way to
do both of these things:</p>
<pre><code class="handlebars language-handlebars">{{!-- parent-component.hbs --}}
{{#each users as |user|}}
  &lt;big-button on-active={{action 'selectedUser' user}} /&gt;

  {{!-- equivalent --}}
  &lt;big-button on-active={{action actions.selectedUser user}} /&gt;
{{/each}}
</code></pre>
<pre><code class="javascript language-javascript">// parent-component.js
export default Component.extend({
  actions: {
    selectedUser(user) {
      // this is the component
      // user is the user from the current iteration of the loop
    }
  }
});
</code></pre>
<pre><code class="javascript language-javascript">// big-button.js
export default Component.extend({
  click: function() {
    this.attrs['on-active']();
  }
});
</code></pre>
<p>Because <code>big-button</code> is invoking a function, the invoking
component can provide whatever function it wants.</p>
<p>Another nice touch, <code>action</code> works seamlessly with <code>mut</code>. This means
that from the component's perspective, it's only calling a callback, but
the code that calls the component can pass in a callback that
updates one of its values.</p>
<pre><code class="handlebars language-handlebars">&lt;my-text on-enter={{action 'pressedEnter'}} /&gt;
&lt;my-text on-enter={{action (mut currentText)}} /&gt;
</code></pre>
<pre><code class="javascript language-javascript">// my-text.js
export default Component.extend({
  keyUp(event) {
    if (event.which === 13) {
      this.attrs['on-enter'](this.$().val());
    }
  }
});
</code></pre>
<p>In this case, <code>this.attrs['on-enter']</code> is a function. The
<code>action</code> helper packages up a method in the component's <code>actions</code> hash,
currying <code>this</code> (and other arguments). It also converts a <code>mut</code> object
into a function that can be invoked.</p>
<p>A component that wishes to support mutable bindings as actions need only
invoke the callback with a new value. Actions from the <code>actions</code> hash,
and even regular functions passed as <code>on-enter={{func}}</code> will work fine.</p>
<h3 id="routeablecomponents">Routeable Components</h3>
<p>Finally, routeable components are under active development, but there is
still some uncertainty about precisely when they will land.</p>
<p>The complete feature has two parts:</p>
<ul>
<li>The ability to fully define query parameters outside the controller
(in the route). Alex Matchneer and Trek Glowacki are actively working
on this feature.</li>
<li>The ability to have a route dispatch directly to a component, rather
than to a controller and a template. Erik Bryn is actively working on
this feature.</li>
</ul>
<p>We intend to land both of these parts in the 1.x series, but there is a
good chance that they will land in 1.13.1, which will be released in
parallel with 2.0-beta. As I said in the beginning of this post, we will
likely backport a few features to the 1.13.x series in order to ease the
transition. Because of the proximity to Ember 2.0 and the impact of this
change on the programming model, routable components are a good
candidate for backporting.</p>
<p>Whenever we land these features precisely, we are committed to making
sure that there is a clear way to upgrade to the last point release of
1.13, clear all deprecations, and then painlessly upgrade to 2.0.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Now that we have landed the Glimmer engine, we will be focusing our
energy over the next few months on the release of Ember 2.0-beta on June
12 and Ember 2.0 final on July 24.</p>
<p>The 1.13 release is the final minor version in the 1.x series. In order
to aid the transition to Ember 2.0, we plan to release several point
releases of 1.13 (1.13.1, 1.13.2, etc.) that will attempt to fix
regressions caused by Glimmer and do some light backporting of features
that will aid in the transition.</p>
<p>Note that Glimmer itself implemented the full Ember 1.x test suite, so
many of the regressions are easy-to-fix bugs, related to untested features,
or related to private APIs. Based on experience over the past week
attempting to integrate Canary into existing applications, we feel
relatively optimistic about the plan of record for Ember 2.0, and where
we are in the process.</p>
<p>Due to the recent merge of Glimmer, Ember 1.13-beta will
be an unusually unstable beta release, but we are hopeful that the
release of Ember 1.13.0 on June 12 will have shaken out the bulk of any
problems.</p>
<p><strong>If you have an app, the best thing you can do right now to help is try
to upgrade it to Canary.</strong> Not all add-ons work yet, but that gap is
closing every day, and the more information we can uncover through
real-app testing, the faster this will go.</p>
<p>I would like to thank the whole Ember community for your enthusiasm and
effort around the Ember 2.0 release. Maintaining a focus on
compatibility while making major changes is hard, but well worth it.</p>
<p>Let's make this happen!</p>]]></description><link>https://blog.emberjs.com/run-up-to-two-oh</link><guid isPermaLink="true">https://blog.emberjs.com/run-up-to-two-oh</guid><pubDate>Sun, 10 May 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Security and Bugfix Releases - Ember 1.10.1, 1.11.2, 1.11.3]]></title><description><![CDATA[<!-- alex ignore clearly -->
<p>Because developers trust Ember.js to handle sensitive customer data in
production, we take the security of the project extremely seriously. Ember
remains one of the few JavaScript projects that has a <a href="/security/">clearly
outlined security policy</a> and a
<a href="https://groups.google.com/forum/#!forum/ember-security">low-traffic mailing list exclusively for security
announcements</a>.</p>
<h2 id="securityreleasesemberjs11011112">Security Releases: Ember.js 1.10.1, 1.11.2</h2>
<p>Today we are announcing the release of Ember.js 1.10.1 and 1.11.2, which
contain an important security fix.</p>
<ul>
<li>1.10.1 -- <a href="https://github.com/emberjs/ember.js/compare/v1.10.0…v1.10.1">Compare View</a></li>
<li>1.11.2 -- <a href="https://github.com/emberjs/ember.js/compare/v1.11.1…v1.11.2">Compare View</a></li>
<li>Additionally the stable, beta, and <code>master</code> branches have all been patched</li>
</ul>
<p>These releases contain a fix for an XSS vulnerability that
you can learn more about on our security mailing list:</p>
<ul>
<li><a href="https://groups.google.com/forum/#!topic/ember-security/nbntfs2EbRU">CVE-2015-1866</a></li>
</ul>
<p>It is recommended that you update immediately. In order to ease
upgrading, the only change in each release is the security fix.</p>
<p>We would like to thank Phillip Haines of <a href="http://zestia.com/">Zestia</a>
for working with us on identifying the issue and on the advisory process.</p>
<p>If you discover what you believe may be a security issue in Ember.js, we
ask that you follow our <a href="/security/">responsible disclosure
policy</a>.</p>
<p>If you are using Ember.js in production, please consider subscribing to
our <a href="https://groups.google.com/forum/#!forum/ember-security">security announcements mailing
list</a>.  It is
extremely low-traffic and only contains announcements such as these.</p>
<h3 id="additionalreading">Additional Reading</h3>
<ul>
<li><a href="/blog/2013/04/05/announcing-the-ember-security-policy.html">Ember.js Security Policy Announcement</a></li>
<li><a href="/security/">Ember.js Security Policy</a></li>
<li><a href="https://groups.google.com/forum/#!forum/ember-security">Ember.js Security Group</a></li>
</ul>
<h2 id="emberjs1113">Ember.js 1.11.3</h2>
<p>Ember.js 1.11.3 has also been released with a fix for nested <code>{{render}}</code> helpers. This is
in addition to the security patch.</p>
<ul>
<li>1.11.3 -- <a href="https://github.com/emberjs/ember.js/compare/v1.11.2…v1.11.3">Compare View</a></li>
</ul>]]></description><link>https://blog.emberjs.com/security-and-bugfix-releases-ember-1-10-1-1-11-2-1-11-3</link><guid isPermaLink="true">https://blog.emberjs.com/security-and-bugfix-releases-ember-1-10-1-1-11-2-1-11-3</guid><pubDate>Tue, 14 Apr 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Security Incident - AWS S3 Access Key Exposure]]></title><description><![CDATA[<p>On November 29th, 2016, the Ember security team was notified that version <code>2.11.0-beta.1</code> of the <code>ember-source</code> npm package inadvertently included a file that contained an AWS access key. This access key had permissions for full read/write access to the Ember S3 buckets.</p>
<!-- alex ignore host-hostess -->
<p>These buckets are used to distribute pre-built versions of Ember.js and related libraries and host other static content:</p>
<ul>
<li>Ember.js via <code>builds.emberjs.com</code></li>
<li>Ember Data via <code>builds.emberjs.com</code></li>
<li>Backburner.js via <code>builds.emberjs.com</code></li>
<li>Handlebars.js via <code>builds.handlebarsjs.com.s3.amazonaws.com</code></li>
<li>RSVP.js via <code>rsvpjs-builds.s3.amazonaws.com</code></li>
<li>Router.js via <code>routerjs.builds.emberjs.com.s3-website-us-east-1.amazonaws.com</code></li>
<li>Ember guides and API documentation</li>
</ul>
<p>While the vast majority of Ember users retrieve new releases from Bower or npm, the builds on S3 are frequently used with online tools like JSBin and Ember Twiddle or anywhere it is more convenient to add a <code>&lt;script&gt;</code> tag.</p>
<p>After performing a full audit, we concluded that the key was <em>not</em> accessed during the timeframe of the incident, and there was no evidence of unauthorized activities. Therefore, <strong>no action is required on your part</strong>. This notice is advisory and contains an incident description as well as our mitigation plans.</p>
<h3 id="incidentreport">Incident Report</h3>
<p>At 4:13pm PST on November 29th, version <code>2.11.0-beta.1</code> of <code>ember-source</code> was published from the computer of a member of the Ember release team and inadvertently included the AWS access key.</p>
<p>At 9:25pm, a member of the Ember security team was privately notified of the key exposure. We immediately acknowledged the notification and began investigating the issue.</p>
<p>At 9:33pm, we confirmed the key exposure by installing the package from npm and examining its contents. We verified that there were no other Ember-related secrets included in the package other than the AWS access key.</p>
<p>At 10:26pm, we revoked access to the exposed access key. There was a delay between the incident verification and the key revocation because the individuals with administrator access to AWS were not at a computer when the report was received.</p>
<p>Once the access key was revoked, we began to assess if the compromised key had been used by an unauthorized user. Concurrently, we began auditing when the access key was introduced to the <code>ember-source</code> package.</p>
<p>The IAM Access Advisor in AWS indicated that the exposed access key only had permission to access S3 buckets, and that it had not been used in the past 376 days. We also verified that no previous releases contained the access key. This access key had not been used in over a year because we began publishing to S3 from our Continuous Integration server.</p>
<p>Because AWS indicates that the access key has not recently been used, and because it only had access to S3, we concluded that an unauthorized user had not been able to use the key before access was revoked. There was no indication that any files in our S3 buckets had been tampered with.</p>
<p>At this time, we decided against requesting that the affected package be yanked from npm. We know that yanked packages can cause sudden build failures and believed that any security risk had been mitigated by revoking the compromised access key.</p>
<p>We also audited the S3 access logs, which had been previously enabled. These logs did not indicate any unauthorized access. However, the logs themselves were stored in an S3 bucket that the compromised key had access to, so we did not consider them to be as reliable as the key's last accessed date, which an unauthorized user would be unable to alter.</p>
<h3 id="mitigations">Mitigations</h3>
<p>We have implemented or are planning to implement several mitigations to prevent exposures of this kind in the future.</p>
<ol>
<li>We have begun removing permissions to access S3 from all IAM accounts associated with individual team members.</li>
<li>We no longer grant access to all S3 buckets to any one account.</li>
<li>We are migrating to a CI-deployed system so we will no longer need publish to npm or Bower from an individual's computer. We will have our Continuous Integration system (and only our CI system) publish new releases, as we do with the builds that are uploaded to S3.</li>
<li>We will modify the S3 permissions to be "append only," so our CI system can only upload new objects to S3, not delete or modify existing objects. This would prevent tampering with older releases and limit the extent of an attack if the keys are exposed in the future.</li>
<li>We are examining options for increasing the logging and auditability of our AWS infrastructure, such as enabling CloudTrail.</li>
</ol>
<h3 id="conclusion">Conclusion</h3>
<p>We take the security of Ember and the applications you build with it very seriously. I sincerely apologize that we let this happen. We will work to improve our release process to prevent similar security lapses from happening in the future.</p>
<p>We are deeply appreciative that this mistake was responsibly disclosed so that we were able to revoke the access key before a malicious attacker took advantage of it.</p>
<p>I would like to extend a personal note of thanks to Marcelo Mira (@marcemira), who noticed the exposure and promptly reported the issue privately. This quick action prevented a bad situation from becoming much worse.</p>
<p>I'd also like to thank Godfrey Chan, who displayed exemplary professionalism, composure and diligence in quickly responding to the report late at night. He is a true asset to the team.</p>
<p>If you discover a security-related issue in Ember, we ask that you follow our <a href="/security/">disclosure policy</a>.</p>
<h4 id="additionalreading">Additional Reading</h4>
<ul>
<li><a href="/blog/2013/04/05/announcing-the-ember-security-policy.html">Ember.js Security Policy Announcement</a></li>
<li><a href="/security/">Ember.js Security Policy</a></li>
<li><a href="https://groups.google.com/forum/#!forum/ember-security">Ember.js Security Mailing List</a></li>
</ul>]]></description><link>https://blog.emberjs.com/security-incident-aws-s3-key-exposure</link><guid isPermaLink="true">https://blog.emberjs.com/security-incident-aws-s3-key-exposure</guid><pubDate>Wed, 14 Dec 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Security Releases - Ember 1.11.4, 1.12.2, 1.13.12, 2.0.3, 2.1.2, 2.2.1]]></title><description><![CDATA[<!-- alex ignore clearly -->
<p>Because developers trust Ember.js to handle sensitive customer data in
production, we take the security of the project seriously. The Ember
project maintains a <a href="/security/">clearly outlined security policy</a> and a
<a href="https://groups.google.com/forum/#!forum/ember-security">low-traffic mailing list exclusively for security
announcements</a>.</p>
<h2 id="securityreleasesemberjs1114112211312203212221">Security Releases: Ember.js 1.11.4, 1.12.2, 1.13.12, 2.0.3, 2.1.2, 2.2.1</h2>
<p>Today we are announcing the release of Ember.js 1.11.4, 1.12.2, 1.13.12,
2.0.3, 2.1.2 and 2.2.1, which contain an important security fix.</p>
<ul>
<li>1.11.4 -- <a href="https://github.com/emberjs/ember.js/compare/v1.11.3…v1.11.4">Compare View</a></li>
<li>1.12.2 -- <a href="https://github.com/emberjs/ember.js/compare/v1.12.1…v1.12.2">Compare View</a></li>
<li>1.13.12 -- <a href="https://github.com/emberjs/ember.js/compare/v1.13.11…v1.13.12">Compare View</a></li>
<li>2.0.3 -- <a href="https://github.com/emberjs/ember.js/compare/v2.0.2…v2.0.3">Compare View</a></li>
<li>2.1.2 -- <a href="https://github.com/emberjs/ember.js/compare/v2.1.1…v2.1.2">Compare View</a></li>
<li>2.2.1 -- <a href="https://github.com/emberjs/ember.js/compare/v2.2.0…v2.2.1">Compare View</a></li>
<li>Additionally, the stable, beta and <code>master</code> branches have been patched.</li>
</ul>
<p>These releases contain a fix for an XSS vulnerability that you can learn
more about on our security mailing list:</p>
<ul>
<li><a href="https://groups.google.com/forum/#!topic/ember-security/OfyQkoSuppY">CVE-2015-7565</a></li>
</ul>
<p>It is recommended that you update immediately. In order to ease
upgrading, the only change in each release is the security fix.</p>
<p>We would like to thank Roman Shafigullin at LinkedIn for reporting the
issue, as well as core team member Robert Jackson at Twitch for patching
the vulnerability and doing the release engineering.</p>
<p>If you discover what you believe may be a security issue in Ember.js, we
ask that you follow our <a href="/security/">responsible disclosure
policy</a>.</p>
<p>If you are using Ember.js in production, please consider subscribing to
our <a href="https://groups.google.com/forum/#!forum/ember-security">security announcements mailing
list</a>.  It is
extremely low-traffic and only contains announcements such as these.</p>
<h3 id="additionalreading">Additional Reading</h3>
<ul>
<li><a href="/blog/2013/04/05/announcing-the-ember-security-policy.html">Ember.js Security Policy Announcement</a></li>
<li><a href="/security/">Ember.js Security Policy</a></li>
<li><a href="https://groups.google.com/forum/#!forum/ember-security">Ember.js Security Group</a></li>
</ul>]]></description><link>https://blog.emberjs.com/security-releases-ember-1-11-4-1-12-2-1-13-12-2-0-3-2-1-2-2-2-1</link><guid isPermaLink="true">https://blog.emberjs.com/security-releases-ember-1-11-4-1-12-2-1-13-12-2-0-3-2-1-2-2-2-1</guid><pubDate>Thu, 14 Jan 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Stabilizing Ember Data]]></title><description><![CDATA[<p>Yesterday, we gave you an update on our progress making Ember.js easier
to use. One thing we didn't discuss was our plan for Ember Data.</p>
<p>It's no secret that, while many developers are building awesome apps
with Ember.js, Ember Data still causes lots of frustration due to bugs
and a changing, complex API. Documentation about it is also mixed in
with Ember.js documentation, making it difficult for new developers to
understand what is stable and what is not.</p>
<p>To be clear, Ember Data is not a dependency of Ember.js.
<a href="https://github.com/discourse/discourse">Discourse</a>, for example, uses
its own wrapper around
<a href="https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/models/model.js"><code>$.ajax</code></a>.</p>
<p>Even though Ember Data is not a dependency of Ember.js, loading data
from the server is an extremely important part of most web applications,
and it's a problem that every Ember.js application will have to deal
with.</p>
<p>Our long-term goal is as follows: we don't think most web developers should
have to write any custom XHR code for loading data. Strong conventions
on the client and strong conventions on the server should allow them to
communicate automatically.</p>
<p>We know we're not there yet.</p>
<p>In order for this to work, there are many necessary features that must
be rock-solid across all sorts of different persistence layers—local
storage, relational databases, and key-value stores, to name a few. To
top it off, the asynchronous environment of the browser (with an often
unreliable internet connection) adds significant complexity, and means
we have more to do besides porting solutions to these problems that have been
pioneered on the server.</p>
<p>Getting all of these features working well together is a challenging
problem, and we have not been able to deliver everything we thought we
could in a reasonable amount of time.</p>
<p>Additionally, many developers are writing web applications that need to
consume an existing JSON API that evolved organically and is not
consistently named or structured. The API we have provided so far is
suboptimal for this task.</p>
<p>To make the experience of writing an Ember Data application less
frustrating, we're doing two things:</p>
<ol>
<li>We're identifying a subset of features that already work reliably.</li>
<li>We're introducing a new, simpler API for working with remote data
that makes fewer assumptions. You still get to use the model API
in Ember Data, but can "bring your own <code>$.ajax</code>" to load and store
records.</li>
</ol>
<p>Right now, what gets documented is somewhat ad-hoc. Going forward, we
will heavily document the stable features. Finding documentation about
an Ember Data feature on the emberjs.com website will be your indication
that we consider it stable and safe to use.</p>
<p>Over time, after we have put new features through their paces and
written extensive documentation, the set of stable features will grow.
In other words, we are refocusing on a small core of practical features,
which we will slowly iterate towards our long-term, ambitious goal.</p>
<h2 id="thebasicadapter">The Basic Adapter</h2>
<p>The Ember Data adapter layer, which is responsible for finding and
saving records, is currently designed to help with building reusable
adapters, like the ones people have written for
<a href="https://github.com/clintjhill/ember-parse-adapter">Parse</a> or
<a href="https://github.com/pangratz/ember-couchdb-adapter">CouchDB</a>. It is not
well-suited for delegating out to <code>$.ajax</code> to work with an API
that is not 100% consistent.</p>
<p>To make it easier to use Ember Data with any kind of JSON data, we
are introducing the Basic Adapter, which delegates to a <code>sync</code>
object on your model.</p>
<p>Let's look at an example of using the Basic Adapter with the Twitter API.</p>
<p>First, note that the syntax for defining a model hasn't changed
(historically, this has been one of the most stable parts of Ember
Data):</p>
<pre><code class="javascript language-javascript">var attr = DS.attr, hasMany = DS.hasMany, belongsTo = DS.belongsTo;

App.User = DS.Model.extend({
  defaultProfileImage: attr('boolean'),
  description: attr('string'),
  screenName: attr('string'),
  isVerified: attr('boolean'),
  createdAt: attr('date'),

  tweets: hasMany('App.Tweet')
});

App.Tweet = DS.Model.extend({
  coordinates: attr('point'),
  createdAt: attr('date'),
  isFavorited: attr('boolean'),
  retweetCount: attr('number'),
  text: attr('string'),
  isTruncated: attr('boolean'),

  replyTo: belongsTo('App.User'),
  user: belongsTo('App.User')
});
</code></pre>
<p>Finding records also hasn't changed:</p>
<pre><code class="javascript language-javascript">// use the Promise API
App.User.find(userId).then(function(user) {
  return user.get('tweets');
}).then(function(tweets) {
  // do something with `tweets`
});
</code></pre>
<p>When you request the <code>User</code> and then its <code>tweets</code>, Ember Data will make
calls to your models' <code>sync</code> object.</p>
<pre><code class="javascript language-javascript">App.User.sync = {
  find: function(id, process) {
    $.getJSON("/users/show", { screen_name: id }).then(function(user) {        
      process(user)                 
        .primaryKey('screen_name')
        .camelizeKeys()
        .applyTransforms('twitter')
        .load();
    });
  },

  findTweets: function(user, name, process) {
    var screenName = user.get('id');

    $.getJSON("/statuses/user_timeline", { screen_name: screenName }).then(function(timeline) {
      process(timeline)
        .primaryKey('id_str')
        .camelizeKeys()
        .applyTransforms('twitter')
        .munge(function(json) {
          json.isTruncated = json.truncated;
          json.replyTo = json.inReplyToScreenName;
        })
        .load();
    });
  }
};
</code></pre>
<p>As you can see, in each of the hooks on the <code>sync</code> object, the last
argument passed in is a function called <code>process</code>. You use this function to
load JSON data returned from the XHR into the store. It also includes
several conveniences for common transformations, like camelizing
property names and transforming values like dates.</p>
<p>Note that you are not required to use these conveniences. You can write
whatever imperative code you'd like to transform the JSON returned from
the server into the form that Ember Data is expecting. Here is the above
example re-written without using the chained conveniences.</p>
<pre><code class="javascript language-javascript">findTweets: function(user, name, process) {
  var screenName = user.get('id');

  $.getJSON("/statuses/user_timeline", { screen_name: screenName }).then(function(timeline) {
    var tweets = timeline.map(function(json) {
      // Map primary key
      json.id = json.id_str;

      // Camelize property names
      for (var prop in json) {
        var value = json[prop];
        delete json[prop];
        json[camelize(prop)] = value;
      }

      // Convert string-formatted date to object
      json.createdAt = Date.parse(json.createdAt);

      // Convert hash to JavaScript object
      json.coordinates = new Twitter.Point(json.coordinates);

      // Rename properties
      json.isTruncated = json.truncated;
      json.replyTo = json.inReplyToScreenName;

      return json;
    });

    process(tweets).load();
  });
}
</code></pre>
<h2 id="timeline">Timeline</h2>
<p>We have been working on this new API part-time for the past few weeks.
You can see our progress on Ember Data's <code>master</code> branch, by looking at
<a href="https://github.com/emberjs/data/tree/master/packages/ember-data/tests/integration/adapters/basic_adapter">the tests</a> or <a href="https://github.com/emberjs/data/blob/master/packages/ember-data/lib/adapters/basic_adapter.js">the implementation</a>.</p>
<p>Over the next few weeks, we will be writing documentation that will be
available in the <a href="/guides/">Ember.js Guides</a>. Once a
few people have had the opportunity to use the Basic Adapter and
sanity-check our work, we will start cutting beta releases of Ember
Data. We think that this will be a lot easier for new developers than "make
a build from <code>master</code>."</p>
<p>Our thanks go out to <a href="http://mcdowall.info">John McDowall</a>, who has been
tracking our progress on Basic Adapter and writing documentation to go
with it.</p>
<p>Finally, we'd like to give a big thanks to
<a href="https://addepar.com/">Addepar</a> for financially supporting us
while we do this work. They are big users of and contributors to Ember
Data, and we couldn't do it without them.</p>]]></description><link>https://blog.emberjs.com/stabilizing-ember-data</link><guid isPermaLink="true">https://blog.emberjs.com/stabilizing-ember-data</guid><pubDate>Fri, 22 Mar 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[Stable TypeScript Types in Ember 5.1]]></title><description><![CDATA[<p>The headlining feature of Ember 5.1 is stable <a href="https://www.typescriptlang.org">TypeScript</a> support! 🎉 The framework now publishes TypeScript types built from Ember's own source code, with Ember's <a href="https://emberjs.com/releases/">strong Semantic Versioning commitment</a> baked in—bringing benefits for both TypeScript and JavaScript users. This dedicated blog post walks through all the details.</p>
<ul>
<li><a href="#toc_getting-started">Getting started</a><ul>
<li><a href="#toc_javascript">JavaScript</a></li>
<li><a href="#toc_typescript">TypeScript</a></li></ul></li>
<li><a href="#toc_caveats">Caveats</a></li>
<li><a href="#toc_stability">Stability</a></li>
<li><a href="#toc_migration-guide">Migration Guide</a><ul>
<li><a href="#toc_from-the-preview-types">From the preview types</a></li>
<li><a href="#toc_from-definitelytyped">From DefinitelyTyped</a></li></ul></li>
<li><a href="#toc_background">Background</a></li>
<li><a href="#toc_onward">Onward</a></li>
</ul>
<h2 id="gettingstarted">Getting started</h2>
<p>Both JavaScript and TypeScript developers can benefit from using these new type definitions. If you are JavaScript developer, this will make automatic imports, in-editor framework documentation, and other features work much better for you in your Ember app or addon. If you are a TypeScript user, you will get all of those benefits as well as the strong type safety guarantees and refactoring capabilities you are used to.</p>
<h3 id="javascript">JavaScript</h3>
<p>In your <code>app/app.js</code>, add this single doc comment to the bottom of the file:</p>
<pre><code class="js language-js">/**
 * @typedef {import('ember-source/types')} EmberTypes
 */
</code></pre>
<!-- alex ignore just-->
<p>This is all that is necessary to unlock autocomplete and in-editor documentation for all the <code>@ember/*</code> packages which ship with Ember with no other adjustment required! Any editor configured to use the TypeScript language server for JavaScript support will "just work" once you make this change—including VS Code, where this works in a default installation.</p>
<h3 id="typescript">TypeScript</h3>
<p>Using the stable types in a new TypeScript projects is similar to setting it up for JavaScript, but has a few additional steps. To provide maximum backward compatibility with the rest of the Ember ecosystem, the default TypeScript blueprint still uses the <code>@types</code> packages, and configures those packages to use Array prototype extensions. Both of these are incompatible with the stable types, so we need to remove them! In the future, once we can switch to defaulting to using the stable types in the default blueprint, these extra steps will not be necessary.</p>
<p>(For details on migrating <em>existing</em> Ember TypeScript projects, see the <a href="#toc_migration-guide">Migration Guide</a> below as well.)</p>
<p>First, in <code>types/&lt;your-app&gt;/index.d.ts</code>, you will likely have something like this:</p>
<pre><code class="ts language-ts">import Ember from 'ember';

declare global {
  // Prevents ESLint from "fixing" this via its auto-fix to turn it into a type
  // alias (e.g. after running any Ember CLI generator)
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
  interface Array&lt;T&gt; extends Ember.ArrayPrototypeExtensions&lt;T&gt; {}
  // interface Function extends Ember.FunctionPrototypeExtensions {}
}

export {};
</code></pre>
<!-- alex ignore just-->
<p>You can replace that whole gnarly mess with just this:</p>
<pre><code class="ts language-ts">import 'ember-source/types';
</code></pre>
<p>Second, you may need to update to recent versions of <code>ember-qunit</code>, <code>ember-resolver</code>, and <code>@ember/test-helpers</code>, which have themselves been updated to use Ember's native types.</p>
<p>Finally, you will need to remove the following packages from your <code>package.json</code> file and reinstall your package manager's installation command to update your <code>node_modules</code>:</p>
<ul>
<li><code>@types/ember</code></li>
<li><code>@types/ember__application</code></li>
<li><code>@types/ember__array</code></li>
<li><code>@types/ember__component</code></li>
<li><code>@types/ember__controller</code></li>
<li><code>@types/ember__debug</code></li>
<li><code>@types/ember__destroyable</code></li>
<li><code>@types/ember__engine</code></li>
<li><code>@types/ember__error</code></li>
<li><code>@types/ember__helper</code></li>
<li><code>@types/ember__modifier</code></li>
<li><code>@types/ember__object</code></li>
<li><code>@types/ember__owner</code></li>
<li><code>@types/ember__polyfills</code></li>
<li><code>@types/ember__routing</code></li>
<li><code>@types/ember__runloop</code></li>
<li><code>@types/ember__service</code></li>
<li><code>@types/ember__string</code></li>
<li><code>@types/ember__template</code></li>
<li><code>@types/ember__test</code></li>
<li><code>@types/ember__utils</code></li>
</ul>
<p>That's all you need to do to enjoy the new TypeScript support! However, there are a couple important caveats you should know about.</p>
<h2 id="caveats">Caveats</h2>
<p><strong>First, and most importantly, these new types are not compatible with the existing <code>@types</code> definitions for Ember Data.</strong> Unfortunately, Ember Data's hand-written type definitions rely in a number of key areas on some of the mistakes in the <code>@types</code> packages for Ember—mistakes that are fixed by using types published from Ember's own source code. So far, the Ember Data team has had too few contributors to make fixing this a top priority. We made the choice to go ahead and publish these stable types from Ember anyway for two reasons:</p>
<ul>
<li><p>While many Ember users <em>do</em> rely on Ember Data, not all do, and this makes the best possible types for Ember available to anyone who is not blocked in this way.</p></li>
<li><p>Ember Data itself can now take advantage of the Ember types! This was a long-standing chicken-or-egg problem: Ember Data could not really publish its own stable types while relying on the hand-written <code>@types</code> packages for Ember!</p></li>
</ul>
<p>Happily, the two newest members of the Ember TypeScript team, Peter Wagenet and Krystan HuffMenne, are both actively interested in tackling this problem, so there will hopefully be good progress in this space in the rest of 2023. (This is a great place to chip in and help, by the way!)</p>
<p><strong>Second, Ember's stable types do not have full support for the Ember Classic programming model.</strong> If you rely heavily on the Ember Classic programming model, we encourage you to update your code to the Ember Octane programming model—for <em>many</em> reasons! For details on absorbing these changes in particular, see the <a href="#toc_migration-guide">Migration Guide</a> below.</p>
<h2 id="stability">Stability</h2>
<p>Because of the interop challenge with Ember Data, our TypeScript support is <em>Released</em> but not yet <em>Recommended</em>. This is one of the first major features to land in Ember which leans on this distinction in a way that matters to end users, so here is a quick explainer. Since <a href="https://rfcs.emberjs.com/id/0617-rfc-stages">RFC 0617: RFC Stages</a>, features go through up to six stages on the way to being “done”:</p>
<ol start="0">
<li><strong>Proposed:</strong> A proposal for a change to Ember or its processes that is offered for community and team evaluation.</li>
<li><strong>Exploring:</strong> An RFC deemed worth pursuing but in need of refinement.</li>
<li><strong>Accepted:</strong> A fully specified RFC. Waiting for or in the process of implementation.</li>
<li><strong>Ready for Release:</strong> The implementation of the RFC is complete, including learning materials.</li>
<li><strong>Released:</strong> The work is published. If it is codebase-related work, it is in a stable version of the relevant package(s).</li>
<li><strong>Recommended:</strong> The feature/resource is recommended for general use.</li>
</ol>
<p>Since TypeScript is <em>Released</em>, you can rely on all of our normal SemVer guarantees. Ember's types are now part of our public contract with you as a user, and they have to be maintained with the exact same care as any other part of the framework. Additionally, Chris Krycho and the rest of the Ember TypeScript team developed <a href="https://www.semver-ts.org">a spec for Semantic Versioning for TypeScript Types</a>, which allows Ember (and any other framework or library) to define how it manages supported TypeScript versions and absorb breaking changes from TypeScript. That means it is totally safe for you to rely on these types if you are not impacted by the caveats described above!</p>
<p>One specific point: as described on our <a href="https://emberjs.com/releases/">Releases</a> page, the Ember framework itself uses a “rolling window” support policy for TypeScript versions. This means Ember can bump its minimum supported TypeScript version in an Ember minor release, the same as it can for Node.js versions—but the supported range of TypeScript versions across two Ember LTS releases must always overlap. So if Ember 5.4 LTS supports TypeScript 4.9–5.3, Ember 5.8 LTS <em>could</em> drop support for TypeScript versions earlier than TypeScript 5.3, but must include at least TypeScript 5.3. That guarantees that users can always upgrade their TypeScript and Ember versions separately. In practice, we expect to maintain a fairly wide TypeScript version support window to minimize the impact on the ecosystem—likely (though not guaranteed to be) 4 to 6 recent TypeScript versions at any given time.</p>
<p>Ember's initial supported TypeScript version range is TypeScript 4.9, 5.0, and 5.1.</p>
<p>The only other things that will change once Ember Data publishes types which are compatible with these and we can thus move to “Recommended” are:</p>
<ul>
<li><p>We will include the relevant doc comments or type imports automatically when creating new projects so everyone is opted into getting these types by default, whereas today you must opt in explicitly.</p></li>
<li><p>We will eventually <em>remove</em> the <code>@types</code> packages entirely, to avoid any possible confusion about what should be installed.</p></li>
</ul>
<h2 id="migrationguide">Migration Guide</h2>
<p>For existing Ember TypeScript users, there are a few additional changes you should make for adopting the stable types.</p>
<h3 id="fromthepreviewtypes">From the preview types</h3>
<p>If you are using the preview types we published starting in Ember 4.8, there is nothing you <em>have</em> to do! Everything should keep working. However, you can feel free to delete the preview type import from your <code>types/&lt;your-app&gt;/index.d.ts</code> file:</p>
<pre><code class="diff language-diff"> import 'ember-source/types';
-import 'ember-source/types/preview';
</code></pre>
<h3 id="fromdefinitelytyped">From DefinitelyTyped</h3>
<p><strong><em>Note:</strong> this section is very similar to the migration guide for the preview period, but has been updated to account for the changes and improvements we made throughout that period. Thank you to everyone who contributed bug reports and fixes to help make this final product as good as it could be!</em></p>
<p>If you are switching to the stable types from the <code>@types</code> packages from DefinitelyTyped, and you have <em>not</em> already been using the preview types, you may have additional work to do to account for the differences between the preview types and the definitions on DefinitelyTyped. These differences all fall into one of these broad categories:</p>
<ul>
<li>Fixes to problems in the existing definitions.</li>
<li>Removal of our (poor!) support for Ember Classic class features in favor of native classes.</li>
<li>Changes to type registry handling</li>
<li>Removal of legacy (private) routing APIs</li>
</ul>
<h4 id="fixestoproblemsintheexistingdefinitions">Fixes to problems in the existing definitions</h4>
<!-- alex ignore simply -->
<p>During the preview period, we identified and fixed a number of type errors in Ember's internals, as well as many places the <code>@types</code> packages were simply wrong. As a result, you may find some differences when you switch over. In every case, these represent <em>bug fixes</em>, but we recognize they may involve some work!</p>
<h4 id="removingsupportforarrayprototypeextensions">Removing support for <code>Array</code> prototype extensions</h4>
<p>This work also exposed a number of errors in the existing types, especially around <code>Array</code> prototype extensions. As a result, these types <em>do not support</em> <code>Array</code> prototype extensions, and it is unlikely that future work will be able to add that support. (The support provided via the types on DefinitelyTyped only worked because the types were defined incorrectly, resulting in a variety of kinds of unsafety.)</p>
<p>Notably, Array prototype extensions are <a href="https://github.com/emberjs/rfcs/pull/848">deprecated and slated for removal</a>, so moving off of them is work you will need to do <em>anyway</em>.</p>
<h4 id="emberclassicsupport">Ember Classic support</h4>
<p>As specified in <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan">RFC 0800</a>, there are also a number of breaking changes from the types in DefinitelyTyped regarding support for Ember Classic features:</p>
<blockquote>
  <p>Per the edition support policy, we will provide minimal support for Ember Classic features:</p>
  <ul>
  <li><p><strong>Ember's classic class system</strong>: we will provide minimal definitions for the <code>.create()</code>, <code>.extend()</code>, <code>.reopen()</code>, <code>.reopenClass()</code>, methods, which make no attempt to use them to actually update the types of the items they modify.…</p></li>
  <li><p><strong>Ember’s <code>get</code> and <code>set</code> helpers:</strong> we will not provide types to make <code>get</code> and <code>set</code> type-safe beyond property lookups on objects—i.e. no support for nested path lookups.…</p></li>
  <li><p><strong>Classic computed property handling:</strong> we will not provide “safe” types for the classic form of computed properties.</p></li>
  </ul>
</blockquote>
<p>The definitions on DefinitelyTyped attempted to make <code>.create()</code> and <code>.extend()</code> actually create updated types, and tried to make <code>.create()</code>, <code>.extend()</code>, <code>.reopen()</code>, and <code>.reopenClass()</code> have the correct type for <code>this</code> within their bodies. These were always extremely fragile and mostly did not work. Since Ember 3.6, Ember users have been able to use native classes instead of Ember’s classic class system, and this has been the recommended way of writing Ember code since the release of the Octane edition in Ember 3.15.</p>
<p>In the preview types, these methods are present and are safe to use since they are still part of Ember’s public API. However, <code>.create()</code> and <code>.extend()</code> do not create new types. The <code>.create()</code> method <em>does</em> still check that the values you pass match those defined on the class body, but the types do not attempt to make <code>this</code> have the right type within the bodies of <code>.create()</code>, <code>.extend()</code>, <code>.reopen()</code>, or <code>.reopenClass()</code>.</p>
<p>To migrate, you should:</p>
<ul>
<li>Convert all your own classic classes to native classes.</li>
<li>Eliminate your use of mixins.</li>
</ul>
<p>(Most Ember TypeScript users have already done this, because these worked so poorly with TypeScript.)</p>
<p>The <code>.create()</code> call can always be replaced with a normal <code>class</code> definition in JavaScript. For each of the others, you can also use <a href="http://www.typescriptlang.org/docs/handbook/declaration-merging.html">declaration merging</a> to represent the <em>behavior</em> of the method in question.</p>
<h5 id="extend"><code>.extend()</code></h5>
<p>For the case where you are only defining a new class, convert to a native class instead. However, if you have code which still relies on mixins like <code>Evented</code>, you can represent it using interface merging like this:</p>
<pre><code class="ts language-ts">import EmberObject from '@ember/object';
import Evented from '@ember/object/evented';
import type Owner from '@ember/owner';

// A native class which still applies the Evented mixin
class ExtendsDemo extends EmberObject.extend(Evented) {
  moreStuff = true;

  constructor(owner: Owner) {
    super(owner);
    this.on('custom', this, 'boundMethod');
  }

  willDestroy(): void {
    this.off('custom', this, 'boundMethod');
  }

  boundMethod = () =&gt; {
    alert('do something');
  };
}

// Make that work for the *type* by merging the type of the class
// (`interface ExtendsDemo`) with the type of the mixin (`Evented`)
interface ExtendsDemo extends Evented {}

const instance = ExtendsDemo.create({
  moreStuff: false,
});

instance.trigger('custom');
</code></pre>
<p>Note: you will have to disable the <code>@typescript-eslint/no-empty-interface</code> ESLint rule for this.</p>
<p>You can do the same for your own mixins while transitioning by defining an interface which represents the type of the mixin:</p>
<pre><code class="ts language-ts">import Mixin from '@ember/object/mixin';

// Creates the runtime mixin code
const Alertable = Mixin.create({
  alert(value: string) {
    alert(`The value is ${value}`);
  }
})

// Creates the type for TypeScript to see.
interface Alertable extends Mixin {
  alert(value: string): void;
}

// Exports them as a single name in both value and type space.
export default Alertable;
</code></pre>
<h5 id="reopen"><code>.reopen()</code></h5>
<p>In general, <code>.reopen()</code> is an antipattern, because it makes it very hard to understand where a given part of a class’ state or behavior lives, and you should move away from it! You should prefer to <em>delegate</em> to a class instead of dynamically adding behavior to it, both for maintainability and for performance. However, for the transition, you can represent it using interface merging.</p>
<pre><code class="ts language-ts">import EmberObject from '@ember/object';

class Foo extends EmberObject {
  someProp = 123;
}

// This is what makes the change work at runtime...
Foo.reopen({
  extra: 'hello',
});

// ...while this is what makes it visible to the type system.
interface Foo {
  extra: string;
}

// Now when calling `Foo.create`, or when working with an instance of the
// class, both `someProp` and `extra` will be checked.
const instance = Foo.create({
  someProp: 456,
  extra: 'goodbye',
});
</code></pre>
<h5 id="reopenclass"><code>.reopenClass()</code></h5>
<p>As with <code>.reopen()</code>, the use of <code>.reopenClass()</code> is an antipattern you should move away from over time, preferring to use regular functions in module scope or normal static methods on native classes. In the meantime, you can use <em>namespace merging</em> to represent how it works:</p>
<pre><code class="ts language-ts">import EmberObject from '@ember/object';

class Foo extends EmberObject {
  static someStatic = true;
}

// This adds the method to the Foo class at runtime...
Foo.reopenClass({
  anotherStatic(): string {
    return 'hello';
  },
});

// ...and this makes it visible to TypeScript as a static method.
declare namespace Foo {
  export function anotherStatic(): string;
}

if (Foo.someStatic) {
  Foo.anotherStatic().length;
}
</code></pre>
<p>Note: you will have to disable the <code>@typescript-eslint/no-namespace</code> ESLint rule for this.</p>
<h4 id="legacyroutingtypelocations">Legacy routing type locations</h4>
<p>In line with [RFC 0821: Public API for Type-Only Imports][0821], this PR also removes support for importing the types for <code>Transition</code>, <code>RouteInfo</code>, and <code>RouteInfoWithMetadata</code> from the private locations that DefinitelyTyped presently supports for backwards compatibility. Users will need to migrate to using the correct import paths when switching to use these imports.</p>
<ul>
<li><code>import Transition from '@ember/routing/-private/transition'</code> → <code>import Transition from '@ember/routing/transition'</code></li>
<li><code>import RouteInfo from '@ember/routing/-private/route-info'</code> → <code>import RouteInfo from '@ember/routing/route-info'</code></li>
<li><code>import { RouteInfoWithMetadata } from '@ember/routing/-private/route-info-with-metadata'</code> → <code>import { RouteInfoWithMetadata } from '@ember/routing/route-info'</code></li>
</ul>
<h2 id="background">Background</h2>
<p>Since 2017, Ember has had TypeScript support via the <code>@types</code> packages published from DefinitelyTyped. In Ember 4.8, we began publishing <a href="https://blog.emberjs.com/announcing-official-typescript-types-public-preview">a preview</a> of types published with Ember itself. Those type definitions were written by hand, so they were sometimes wrong. We always did our best to match them up to the reality of Ember’s source code, but it was never perfect. With this release, we no longer publish <em>any</em> hand-authored types for Ember itself. Instead, the type come straight from Ember’s own TypeScript source. This means they are <em>always</em> in sync with Ember itself—they <em>cannot</em> be accidentally wrong.</p>
<p>Given that Ember’s source has been written in TypeScript for years, why did it take us so long to get here? For one thing, we needed to <a href="https://rfcs.emberjs.com/id/0724-road-to-typescript">decide to make TypeScript a first-class language</a> and <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan">come up with a plan for shipping it</a>. For another, Ember’s internals needed a <em>lot</em> of polish to be ready to publish. Like many TypeScript code bases, Ember started off as a JavaScript-only code base, and its conversion happend in fits and starts over many years. Some parts of it were still entirely in JavaScript even only a year ago. Finally, we needed to build some custom build infrastructure to make the types usable, since you depend on <code>ember-source</code> in your <code>package.json</code> file, but import from packages like <code>@ember/owner</code>.</p>
<p>If you're curious about the nitty-gritty details, you can check out <a href="https://github.com/emberjs/ember.js/blob/3fa9068831b1e3cf8e594647a880adc0809861f3/types/publish.mjs">the build script</a> used to generate types from Ember's source. Additionally, this YouTube video includes a detailed walkthrough of the mechanics of publishing our types:</p>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/VuF3GY-Ho-s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<h2 id="onward">Onward</h2>
<p>This is a huge step for Ember’s TypeScript support. Along with <a href="https://blog.emberjs.com/glint-1-0-released">Glint 1.0</a>, Ember CLI 4.12's <code>--typescript</code> support, improvements to our testing story, and making <code>&lt;template&gt;</code> viable, we now have completed all the key work required for Ember itself to have top-notch TypeScript support. Up next: getting Ember Data across the line!</p>
<p>Thank you to everyone who has contributed to this enormous milestone, and to AuditBoard, LinkedIn, Salsify, and Tilde for sponsoring engineering time to get this mammoth task done.</p>]]></description><link>https://blog.emberjs.com/stable-typescript-types-in-ember-5-1</link><guid isPermaLink="true">https://blog.emberjs.com/stable-typescript-types-in-ember-5-1</guid><pubDate>Sat, 08 Jul 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[Try out the Template Tag Codemod]]></title><description><![CDATA[<p>One of the pillars of Ember's upcoming Polaris edition is <a href="https://guides.emberjs.com/release/components/template-tag-format/">Template Tag</a>. Many teams are already writing their components this way and enjoying the improved developer experience. The Template Tag RFC is currently in the "Released" status, and will reach "Recommended" <a href="https://github.com/emberjs/rfcs/pull/1059">once we're satisfied that we have sufficient documentation and polish</a>.</p>
<p>To make it easier for all teams to adopt Template Tag, we've created <code>@embroider/template-tag-codemod</code>. The goal of the codemod is fully-reliable conversion to the new format.</p>
<p>This blog post is a call to <strong>try out the codemod</strong>. Even if you're not ready to commit yet to using Template Tag in your app, you can try running the codemod on your app to see what results you get and report bugs that get in your way.</p>
<p>The super-short version of the instructions if you just want to give it a try are:</p>
<ol>
<li>Make sure you don't have any uncommitted changes, because we're about to start mutating all your files!</li>
<li>Run <code>npx @embroider/template-tag-codemod</code>.</li>
<li>(Optional but highly recommended) Use <code>prettier</code> (with GJS support enabled) to make the results pretty.</li>
<li>(Optional but highly recommended) use <code>npx @embroider/template-tag-codemod merge-history --help</code></li>
</ol>
<p>The default behavior will attempt to convert <em>everything</em> in your app, and it will target the most forward-looking output format.</p>
<p>Read the <code>--help</code> and the complete instructions <a href="https://github.com/embroider-build/embroider/tree/main/packages/template-tag-codemod">in the README</a> to:</p>
<ul>
<li>limit which files will be converted all at once:</li>
</ul>
<pre><code class="sh language-sh">  --renderTests false --routeTemplates false --components app/components/only-these-ones/**/*.hbs
</code></pre>
<ul>
<li>get output that is more compatible with Ember &lt; 6.3.0:</li>
</ul>
<pre><code class="sh language-sh">  --nativeRouteTemplates false --nativeLexicalThis false
</code></pre>
<ul>
<li>get output that uses imports from the app's module namespace instead of relative paths <code>import Bar from 'my-app/utils/bar';</code>; this is required in the classic builds:</li>
</ul>
<pre><code class="sh language-sh">  --relativeLocalPaths false
</code></pre>
<ul>
<li>produce TypeScript GTS files rather than JavaScript GJS files in cases that are ambiguous between those two choices:</li>
</ul>
<pre><code class="sh language-sh">  --defaultFormat gts
</code></pre>
<ul>
<li>customize the naming choices for imported components/helpers/modifiers:</li>
</ul>
<pre><code class="sh language-sh">  --renamingRules ./your-rules-here.mjs
</code></pre>
<p><em>Why is this codemod under the <code>@embroider</code> namespace?</em></p>
<p>Because Template Tag Codemod is powered by the same backward-compatibility infrastructure that we created in Embroider to allow you to adopt modern build tooling. When you build an app with Embroider, Embroider needs to identify, locate, and synthesize import statements for all the components, helpers, and modifiers that you use in your traditional handlebars templates. The Template Tag Codemod does exactly the same thing, except instead of repeating that process every time you do a build, we can do it once-and-for-all and commit the resulting GJS (or GTS for TypeScript users) files directly into your project. As a result, switching to Template Tag can result in improved build performance for apps that have already adopted Embroider.</p>
<p>Please <a href="https://github.com/embroider-build/embroider/issues">report issues here</a> and ask questions in the #dev-embroider channel on the community Discord.</p>]]></description><link>https://blog.emberjs.com/template-tag-codemod</link><guid isPermaLink="true">https://blog.emberjs.com/template-tag-codemod</guid><pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 100]]></title><description><![CDATA[<p>Happy 🎉 100th 🥳 Ember Times, Emberistas! 🐹</p>
<p>This week:
how to conditionally wrap components 💝,
check out the Ember Sinon 4.0.0 release 💯,
Ember CLI Mirage 1.0.0 release 🎉,
Ember File Upload 2.7.0 release 🆙,
ES6 Class Syntax Codemod 🤖,
and last, but not least,
mythical <code>null</code> and error handling with True Myth 3.0 🔮!</p>
<!-- READMORE -->
<hr />
<h2 id="conditionallywrappingcomponentswithemberjshttpsdockyardcomblog20190521conditionallywrappingcomponentswithemberjs"><a href="https://dockyard.com/blog/2019/05/21/conditionally-wrapping-components-with-ember-js">Conditionally Wrapping Components with Ember.js 💝</a></h2>
<p>Last year, we learned <a href="https://dockyard.com/blog/2018/11/26/how-to-yield-an-ember-component-in-multiple-places">how to yield an Ember component in multiple places</a>.</p>
<p>This month, <a href="https://github.com/baroquon">@baroquon</a> shares <strong>step-by-step instructions</strong> on how to extend this work so that <a href="https://dockyard.com/blog/2019/05/21/conditionally-wrapping-components-with-ember-js">we can conditionally wrap components</a>.</p>
<p>The best news? With <a href="https://guides.emberjs.com/release/reference/syntax-conversion-guide/#toc_angle-bracket-syntax">angle bracket syntax</a>, we can dramatically simplify our template! 💯</p>
<p><a href="https://dockyard.com/blog/2019/05/21/conditionally-wrapping-components-with-ember-js">Find out how today</a>!</p>
<hr />
<h2 id="embersinon400releasehttpstwittercomjordanhawkerstatus1131293493492457472"><a href="https://twitter.com/JordanHawker/status/1131293493492457472">Ember Sinon 4.0.0 Release! 💯</a></h2>
<p>Ember Sinon, an Ember CLI addon adding support for Sinon.JS, released a breaking change in <a href="https://github.com/csantero/ember-sinon/releases/tag/4.0.0">version 4.0.0</a> which includes the latest Sinon.JS release – <a href="https://github.com/sinonjs/sinon/releases/tag/v7.3.2">Sinon 7.3.2</a>, <a href="https://blog.emberjs.com/2019/05/21/ember-3-10-released.html">EmberJS 3.10</a>, and drops Node 6 support to match the latest <a href="https://github.com/ember-cli/ember-cli/pull/8563">Ember CLI blueprints</a>.</p>
<!-- alex ignore easy -->
<p><a href="https://sinonjs.org/">Sinon.JS</a> provides standalone test spies, stubs, and mocks for JavaScript. It works for any unit testing framework, with <a href="https://github.com/csantero/ember-sinon">Ember Sinon</a> providing an easy to integration with Sinon.JS.</p>
<p>Try out <a href="https://github.com/csantero/ember-sinon">Ember Sinon</a> today with <code>ember install ember-sinon</code>!</p>
<hr />
<h2 id="emberclimirage100releasehttpstwittercomsamselikoffstatus1131306153764380673"><a href="https://twitter.com/samselikoff/status/1131306153764380673">Ember CLI Mirage 1.0.0 Release 🎉</a></h2>
<p>After over four years and 1,442 commits from 174 contributors, <a href="https://www.ember-cli-mirage.com/">Ember CLI Mirage</a> has met its milestone 1.0.0 release! Big congratulations to <a href="https://github.com/samselikoff">@samselikoff</a> and everyone who helped create one of our favorite addons. 🙌</p>
<p>With 1.0.0 (or should we say 💯?), you will find updated documentation and <a href="https://www.ember-cli-mirage.com/docs/getting-started/upgrade-guide">instructions on how to upgrade</a>. If you haven't tried out Mirage to mock your backend APIs, we encourage you to today!</p>
<hr />
<h2 id="emberfileupload270releasehttpstwittercomalonskistatus1128582603894923264"><a href="https://twitter.com/Alonski/status/1128582603894923264">Ember File Upload 2.7.0 Release 🆙</a></h2>
<p><a href="https://github.com/adopted-ember-addons/ember-file-upload">Ember File Upload</a>, which allows <strong>file uploads that continue over a route transition</strong>, announced its 2.7.0 release! You will see updated README (examples using angle bracket) and stability from updated dependencies and bug fixes. 🧡</p>
<p>Please thank <a href="https://github.com/Alonski">@Alonski</a>, <a href="https://github.com/maxwondercorn">@maxwondercorn</a>, <a href="https://github.com/raido">@raido</a>, <a href="https://github.com/bendemboski">@bendemboski</a>, <a href="https://github.com/hakilebara">@hakilebara</a>, and <a href="https://github.com/andreyfel">@andreyfel</a> for their work on this version! In addition, a big thanks to <a href="https://github.com/tim-evans">@tim-evans</a> for the original authoring of the addon before it was <a href="https://github.com/adopted-ember-addons/program-guidelines">adopted</a>! 💯</p>
<hr />
<h2 id="codemodfores6classsyntaxincludingdecoratorshttpsgithubcomembercodemodsemberes6classcodemod"><a href="https://github.com/ember-codemods/ember-es6-class-codemod">Codemod for ES6 Class Syntax Including Decorators 🤖</a></h2>
<p>Excited about the chance to try out the ✨<strong>native decorator support</strong>✨ announced as part of the <a href="https://blog.emberjs.com/2019/05/21/ember-3-10-released.html">release of Ember.js 3.10</a>? The good news is there's a <a href="https://github.com/ember-codemods/ember-es6-class-codemod">codemod</a> to help you out with that!</p>
<p>Note that this part of the codemod is a configurable option in the transforms. If set to true, it will transform an object's properties to decorators wherever required. Also note that, unless turned off, this codemod will by default handle transforming object properties to class fields.</p>
<p>If you're interested in learning more about the motivation for this adoption of native decorator support in <strong>Ember.js</strong> <strong>3.10</strong> <a href="https://emberjs.github.io/rfcs/0440-decorator-support.html#motivation">check out the RFC</a>.</p>
<hr />
<h2 id="morerobustnullanderrorhandlingwithtruemyth30httpstwittercomchriskrychostatus1129485575621230592"><a href="https://twitter.com/chriskrycho/status/1129485575621230592">More Robust Null and Error Handling with True Myth 3.0 🔮</a></h2>
<p><a href="https://true-myth.js.org/"><strong>True Myth</strong></a> - your go-to library for handling <code>null</code> values and errors in your app in a type-safe fashion - is out with the brand-new <strong>3.0.0 release</strong>!</p>
<p>Check out which helper functions and methods are new in the latest release, by reviewing the <a href="https://github.com/true-myth/true-myth/releases/tag/v3.0.0">3.0 release page</a> and <strong>maybe.ify today</strong>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/ghislaineguerin" target="gh-user">@ghislaineguerin</a>, <a href="https://github.com/vasind" target="gh-user">@vasind</a>, <a href="https://github.com/shakirjames" target="gh-user">@shakirjames</a>, <a href="https://github.com/maxwondercorn" target="gh-user">@maxwondercorn</a>, <a href="https://github.com/villander" target="gh-user">@villander</a>, <a href="https://github.com/tendermario" target="gh-user">@tendermario</a> and <a href="https://github.com/konstankinollc" target="gh-user">@konstankinollc</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jared Galanis, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-100</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-100</guid><pubDate>Fri, 31 May 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 101]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>This week:
put your thoughts to paper for the #EmberJS2019 Roadmap RFC 🛣🗺,
a new addition to the Learning Team 👏,
a sneak preview of ember-query-params-service ❓,
and a retro of 💯 Ember Times. 🎉</p>
<!-- READMORE -->
<hr />
<h2 id="emberjs2019httpsblogemberjscom20190520ember2019roadmapcallforpostshtml"><a href="https://blog.emberjs.com/2019/05/20/ember-2019-roadmap-call-for-posts.html">#EmberJS2019 🛣🗺</a></h2>
<p>Blog posts wanted! 🚨 We would like you to write a blog post to propose <strong>goals and direction</strong> for Ember for the next year. The content of these posts will help the Core Team to draft their <strong>next Roadmap RFC</strong>. Don't have a blog? <strong>#EmberJS2019</strong> tweets or GitHub Gists are a-ok! Please share your posts by <strong>Monday, June 17th</strong>.</p>
<p><a class="ember-button ember-button--centered" href="https://blog.emberjs.com/2019/05/20/ember-2019-roadmap-call-for-posts.html">Read the Roadmap RFC</a></p>
<p>Looking to see what's already out there? Posts are being gathered at <a href="https://github.com/abhilashlr/emberjs2019-posts">this community repo</a> - thanks <a href="https://github.com/abhilashlr">@abhilashlr</a>! We wanted to share some highlights with you from posts we've read this week.</p>
<hr />
<p><a href="https://github.com/ijlee2">@ijlee2</a> wants Ember to <a href="https://crunchingnumbers.live/2019/05/26/emberjs2019-build-a-larger-community/">Build a Larger Community</a>.</p>
<blockquote>
  <p>Our community, while <a href="https://blog.emberjs.com/2019/04/12/the-ember-times-issue-93.html">truly amazing and supportive</a>, is yet small. To flourish, we need <strong>support from developers who don’t work with Ember daily</strong>. These developers may professionally work with React, Angular, or Vue. They may be self-taught or attending school, looking to enter tech with minimal risk in career trajectory and minimal time to create showcase projects.</p>
</blockquote>
<p>He shares three concrete ideas to make growing Ember a reality:</p>
<ol>
<li>Publish a better <a href="https://emberjs.com/">website</a> - address design and content</li>
<li>Promote <a href="https://emberjs.com/editions/octane/">Octane</a> heavily</li>
<li>Teach Ember at local and remote <a href="https://emberjs.com/community/meetups">Meetups</a></li>
</ol>
<hr />
<p><a href="https://github.com/robclancy">@robclancy</a> on <a href="https://twitter.com/robboclancy/status/1133411097279696902">query params</a>:</p>
<blockquote>
  <p>I hope query params get some love in #EmberJS2019. Biggest pain point of the framework right now imo. At least as development goes.</p>
</blockquote>
<hr />
<p><a href="https://github.com/sbatson5">@sbatson5</a> addresses <a href="https://imposter-syndrome.lol/posts/a-few-thoughts-on-ember/">lower employability when using Ember</a>:</p>
<blockquote>
  <p>My hope is that Ember keeps leaning into the conventions that the rest of the JavaScript world have adopted and that those with experience in Vue or React can jump into an Ember project and not feel lost.</p>
</blockquote>
<hr />
<p><a href="https://github.com/rwjblue">@rwjblue</a> had two blog posts, so far, on what we can improve on in the coming year. His first blog was around [packaging improvements](https://www.rwjblue.com/2019/05/30/ember-js-2019-roadmap-wishes-packaging-improvements/
), namely <a href="https://github.com/embroider-build/embroider">Embroider</a>, and his second blog was around [policy changes](https://www.rwjblue.com/2019/05/31/ember-js-2019-roadmap-wishes-policy-changes/
) on how “we can iteratively move forward into the future that can actually happen.”</p>
<!-- alex ignore clearly -->
<blockquote>
  <p>Having a great packaging system is critical to Ember's success. This wish list is not long, but very important to land and 'get right'. […] We really need to adopt Embroider!</p>
  <p>The Ember project as a whole needs to get much better about closing the loop on these dead ends, and communicate more clearly with the community so that they can avoid known future pitfalls when developing their ambitious applications.</p>
</blockquote>
<hr />
<p><a href="https://github.com/gokatz">@gokatz</a> examines <a href="https://gokatz.me/blog/emberjs-2019-roadmap/">six areas where Ember can improve</a>.</p>
<blockquote>
  <p>Experimenting with existing popular toolkits like Webpack with Embroider is so cool and the features that other framework users are enjoying for a long time such as HMR, Code Splitting at various levels (route, component, etc.,) can be brought into the ember ecosystem with Embroider. I love to see embroider being the default built tool in 2019.</p>
</blockquote>
<hr />
<p><a href="https://github.com/astronomersiva">@astronomersiva</a> suggests <a href="https://siva.dev/ember-2019/">several ideas for increasing developer experience</a>.</p>
<!-- alex ignore simple -->
<blockquote>
  <p>What I would like to see in this year's edition of Ember is developer friendliness. There are certain simple things that are annoyingly difficult to accomplish on EmberJS or are confusing to developers.</p>
</blockquote>
<hr />
<p><a href="https://github.com/pzuraq">@pzuraq</a> proposes a [build-centric edition](https://www.pzuraq.com/ember-2019-the-next-edition/
) to follow up on Octane's runtime-centric features.</p>
<blockquote>
  <p>The goal should be that new Ember apps don't need to pay the cost at all, and existing apps can slowly remove these features over the next couple of major versions.</p>
</blockquote>
<hr />
<p><a href="https://github.com/jenweber">@jenweber</a> encourages <a href="https://jenweber.netlify.com/the-ember-experience/">focusing on documentation, learning, and teaching accessibility through code examples</a>.</p>
<!-- alex ignore easy -->
<blockquote>
  <p>The ideal Ember Experience is that things work as they should out-of-the-box, following modern web development patterns. It's easy to get ramped up using real-world code examples that teach the recommended practices used by experienced Ember developers, from day one.</p>
</blockquote>
<hr />
<p><a href="https://github.com/andrewcallahan">@andrewcallahan</a> analyzes why Ember lost popular adoption and <a href="http://andrewcallahan.com/to-have-a-future-ember-must-kill-its-past/">shares a solution to using components first and foremost</a>.</p>
<blockquote>
  <p>Instead of asking "what do we need to <em>add</em> to Ember to make it better" we should instead be asking "what do we need to <em>remove</em> from Ember to make it better". <strong>Specifically I believe that Ember 4.0 should eliminate the concepts of Routes, Controllers, and Templates in favor of Components.</strong></p>
</blockquote>
<hr />
<p><a href="https://github.com/chrisrng">@chrisrng</a> asks Ember to focus on <a href="https://www.linkedin.com/pulse/my-hopes-ember-2019-better-javascript-community-visibility-chris-ng/">increasing visibility in the JavaScript community</a>.</p>
<blockquote>
  <p>As I pondered on what my hopes for Ember in 2019 would be, I realized that – for the most part – we are already working on them. […] I believe a lot of the work that we have done to make Ember Octane a reality would attract a wider rate of adoption for Ember. <em>If developers knew about it.</em></p>
</blockquote>
<hr />
<p><a href="https://github.com/snewcomer">@snewcomer</a> encourages Ember to <a href="https://twitter.com/puekey/status/1135693033729454080">continue with its iterative improvements</a>:</p>
<blockquote>
  <p>With Octane coming out, I have recently upgraded an old app to 3.9 with no huge issues. That is so cool. So 💯 on continuous improvement to the framework and ecosystem. […] Iterative ease on the learning curve, iterative ease integrating new features and iterative ease in helping you avoid pitfalls.</p>
</blockquote>
<hr />
<p><a href="https://github.com/chadhietala">@chadhietala</a> examines <a href="https://gist.github.com/chadhietala/50b977a7d3476069892d351c65af418c">routing, single file format, and shipping features that are due</a>.</p>
<!--alex ignore nuts-->
<blockquote>
  <p>I believe it's time to re-think the routing layer and make it feel more cohesive with the rest of the framework. While there is a large portion of the API that is nice there are noticable warts around the mental model of the router, routes, controllers and templates, query params, redirects/aborts.</p>
</blockquote>
<hr />
<h2 id="welcomerobertwagnerhttpstwittercomemberjsstatus1135585111817236492"><a href="https://twitter.com/emberjs/status/1135585111817236492">Welcome Robert Wagner 👏</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Robert Wagner" title="Robert Wagner - Ember Core Learning Team" src="/images/blog/emberjstimes/robertwagner.jpeg" />
</div>
<p>We are excited to announce that <a href="https://github.com/rwwagner90">@rwwagner90</a> has joined the <a href="https://emberjs.com/team/">Learning Core Team</a> and will continue to champion the work on <strong><a href="https://github.com/emberjs/ember-inspector">Ember Inspector</a></strong>!</p>
<p>You may recall that <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-robert-wagner/16143">we featured Robert</a> in a past issue as part of our <a href="https://discuss.emberjs.com/c/community">"I contribute to Ember"</a> series, where we interview members of our open source community. Congrats! 🎉</p>
<hr />
<h2 id="previewversionofemberqueryparamsservicehttpsgithubcomnullvoxpopuliemberqueryparamsservice"><a href="https://github.com/NullVoxPopuli/ember-query-params-service">Preview Version of ember-query-params-service 🧪</a></h2>
<p>This is an experiment to see if using decorators and a separate service to manage query params is a feasible alternative to the existing query params implementation. It's a <strong>very early</strong> preview and is expected to have bugs. Should you <a href="https://github.com/NullVoxPopuli/ember-query-params-service">choose to go on an adventure with this</a>, please feel free to report weird, unexpected behavior. There is an <a href="https://github.com/NullVoxPopuli/rfcs/blob/router-computed-query-params/text/0000-router-service-computed-query-params.md">older RFC</a> (it proposed to add query params to the router service) that has been updated based on development of the ember-query-params-service addon. All feedback welcome! 😊</p>
<hr />
<h2 id="onehundredandoneeditionsoftheembertimeshttpstwittercomsearchftweetsverticaldefaultq23100embertimes"><a href="https://twitter.com/search?f=tweets&vertical=default&q=%23100EmberTimes">One Hundred (and One) Editions of The Ember Times 📰 🎉</a></h2>
<p><strong>The Ember Times</strong>, one of your favourite news outlets about what's going on with Ember and its ecosystem, has shipped its <strong>one hundredth (and first) edition</strong>! 🎉 The Ember Times now looks back at a long journey that started out over more than three years ago:</p>
<p>In its <a href="https://the-emberjs-times.ongoodbits.com/2016/05/03/issue-1">first release on May 2nd 2016</a>, Ember Learning and Framework Core team member <strong>Ricardo Mendes</strong>, also known as <a href="https://github.com/locks">@locks</a> 🔒, wrote - among many other topics - about the motivation of the newsletter, the recent issue triaging work by <a href="https://github.com/pixelhandler">@pixelhandler</a> and the <a href="https://github.com/emberjs/ember.js/pull/13316">recent implementation efforts</a> to get <strong>Glimmer 2</strong>, Ember's super-fast rendering engine, over the finish line. 🏁</p>
<p>Since the first issue The Ember Times gained over 1300 additional subscribers for the e-mail format delivered by <a href="https://the-emberjs-times.ongoodbits.com/">Goodbits</a> and many more readers on the official <a href="https://blog.emberjs.com/tags/newsletter.html">Ember blog</a> and we'd like to thank all our interested readers who read, engage with and provide feedback for the news that we published so far.</p>
<p>Most importantly, we'd also like to thank all the <strong>amazing contributors</strong> (in no particular order) who wrote for The Ember Times in the past three years:</p>
<blockquote>
  <p>Danielle Adams, Tobias Bieniek, Alon Bukai, Edward Faulkner, Jared Galanis, Chris Garrett, Katie Gengler, Miguel Braga Gomes, Oli Griffiths, Bill Heaton, Anne-Greeth van Herwijnen, Lisa Huang-North, Robert Jackson, Jessica Jordan, Todd Jordan, Sivakumar Kailasam, Amy Lam, Kenneth Larsen, Braden Lawrence, Isaac Lee, Bradley Leftley, Chris Manson, Ryan Mark, Ricardo Mendes, Gaurav Munjal, Chris Ng, Niels Rasmussen, Brian Runnells, Michael Schinis, Nick Schot, Preston Sego, Frédéric Soumaré, Melanie Sumner, Ryan Toronto, Robert Wagner, Jen Weber</p>
</blockquote>
<p>We're grateful for all the hard work that community members put in to keep The Ember Times going for the past 100 editions. And we're already looking forward to another 100 issues for the future! <strong>Let us know</strong> what you <strong>enjoyed reading about the most</strong> in the past 100 issues of The Ember Times using the <a href="https://twitter.com/search?f=tweets&vertical=default&q=%23100EmberTimes">#100EmberTimes hashtag on Twitter</a> or chat with us on the <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> Discord channel!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/noslouch" target="gh-user">@noslouch</a>, <a href="https://github.com/danwenzel" target="gh-user">@danwenzel</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/dbendaou" target="gh-user">@dbendaou</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/vasind" target="gh-user">@vasind</a>, <a href="https://github.com/shermango" target="gh-user">@shermango</a>, <a href="https://github.com/rajasegar" target="gh-user">@rajasegar</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/teddyzeenny" target="gh-user">@teddyzeenny</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/abhilashlr" target="gh-user">@abhilashlr</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/thoov" target="gh-user">@thoov</a>, <a href="https://github.com/benblank" target="gh-user">@benblank</a> and <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Amy Lam, Isaac Lee, Preston Sego, Jessica Jordan, Chris Ng, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-101</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-101</guid><pubDate>Fri, 07 Jun 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 102]]></title><description><![CDATA[<p>добры дзень Emberistas! 🐹</p>
<p>This week: more <strong>#EmberJS2019 posts</strong> wanted! ✏️, RFC for an <strong>alternative</strong> to Controllers 🎛, and tips for adding <strong>TypeScript</strong> 🌟!</p>
<!-- READMORE -->
<hr />
<h2 id="moreemberjs2019postswantedhttpsblogemberjscom20190520ember2019roadmapcallforpostshtml"><a href="https://blog.emberjs.com/2019/05/20/ember-2019-roadmap-call-for-posts.html">More #EmberJS2019 Posts Wanted! ✏️</a></h2>
<p>Don't forget. This Monday, <strong>June 17th</strong> is the deadline for your #EmberJS2019 post to be a part of Roadmap RFC! Please write a blog post, GitHub Gist, or tweet, then share it with <strong><a href="mailto:roadmap@emberjs.com">roadmap@emberjs.com</a></strong> and Discord community. 🧡</p>
<p><a class="ember-button ember-button--centered" href="https://blog.emberjs.com/2019/05/20/ember-2019-roadmap-call-for-posts.html">Read the Roadmap RFC</a></p>
<p>For ideas and inspiration, you can check out all #EmberJS2019 posts at our <a href="https://github.com/abhilashlr/emberjs2019-posts">community repo</a>. If time's not on your side, feel free to write and share your post even after the deadline.</p>
<p>Here are the highlights from this week's posts:</p>
<hr />
<p><a href="https://github.com/Turbo87">@Turbo87</a> focused on Ember being able to <a href="https://twitter.com/TobiasBieniek/status/1135790015177469952">support existing technologies</a>:</p>
<blockquote>
  <p>@yarnpkg PnP is a fantastic way to reclaim some/a lot of disk space. I started some work last year to support it in Ember CLI, but couldn't finish it in time. We should revisit this!</p>
</blockquote>
<hr />
<p><a href="https://github.com/efx">@efx</a> shared <a href="https://www.typedspace.com/2019-ember-js-roadmap/">thoughts on existing posts</a>.</p>
<!-- alex ignore just -->
<blockquote>
  <p>I think we should treat learning as important as the technical ideas that distinguish ember.js. […] My fabulous colleagues have often asked spot-on, difficult questions about the guide's admonitions to do something a particular way. I too often resort to shallow "that is just the way it is" answers.</p>
</blockquote>
<hr />
<p><a href="https://github.com/dgeb">@dgeb</a> suggests to <a href="https://www.cerebris.com/blog/2019/06/04/emberjs-2019/">focus on modularity and packaging, both at the framework and application levels</a>.</p>
<blockquote>
  <p>[With Ember Octane] it's time for us to focus on how we structure and bind and package those modules, both at the framework and application levels.</p>
</blockquote>
<hr />
<p><a href="https://github.com/jacojoubert">@jacojoubert</a> shared <a href="https://gist.github.com/jacojoubert/abfb45bdc8c4a2a5efdab3b37ed0d060">four things Ember can improve for even better developer experience</a>.</p>
<blockquote>
  <p>Ember needs a way for a component to have direct knowledge of its children, […] clearer about where they want to end up with the file system layout, […] spread <code>...attributes</code> on multiple elements, […] and public API and get a full suite of documentation (for AST transforms).</p>
</blockquote>
<hr />
<p><a href="https://github.com/lifeart">@lifeart</a> asks for a visible roadmap where features being worked on can be moved around <a href="https://gist.github.com/lifeart/71c4aa33fc85874d3cc9cdedd2a22684">"backlog" or "need discussion" lists</a>.</p>
<blockquote>
  <p>I see a lot of work around but it's not written in roadmap anywhere. […] it will be great to have kinda "likes" for non important features, to prioritize them.</p>
</blockquote>
<hr />
<p><a href="https://github.com/gossi">@gossi</a> covered <a href="https://gos.si/blog/ember-2019-reduce-complexity/">reducing complexity, making things explicit, and using Embroider to improve app performance</a>.</p>
<blockquote>
  <p>My wishes for Ember (in 2019) is to slim down the framework is to throw old ballast over board to improve <strong>learning, developer ergonomics</strong> and <strong>align more with the javascript ecosystem</strong>.</p>
</blockquote>
<hr />
<p>In a follow-up post, <a href="http://github.com/melsumner">@melsumner</a> encouraged the community to <a href="http://www.melsumner.com/blog/ember/emberjs2019-take-2/">examine areas of improvement with a sense of calmness</a>:</p>
<blockquote>
  <p>The Community as a whole must remember that each and every single one of us are the only ones who will excite others about using Ember. We are the only ones who can pique curiosity of others.</p>
</blockquote>
<hr />
<p><a href="https://github.com/mehulkar">@mehulkar</a> explained <a href="https://mehulkar.com/blog/2019/06/emberjs2019-roadmap-response/">several reasons that make Ember difficult to learn</a> and how we can address them.</p>
<!-- alex ignore obvious -->
<blockquote>
  <p>The Octane edition will be great for performance and developer ergonomics, but it doesn’t fundamentally bolster (or change) the selling points of Ember. I think we need to aggressively reduce the API surface area at every level from core classes to CLI tooling, converge into the JS ecosystem and “the platform”, and make the application’s inner workings more explicit by both providing low level primitives and using them in an obvious way.</p>
</blockquote>
<hr />
<p><a href="https://github.com/chancancode">@chancancode</a> examined a few ways to <a href="https://gist.github.com/chancancode/ec56a0addf45380853a385694ff0e52b">modernize Ember's templating language</a>.</p>
<blockquote>
  <p>I would like us to address some of the long standing issues and missing features, as well as bring in some of the nice things from the JSX world, while staying true to what makes templates feel so productive in Ember today.</p>
</blockquote>
<hr />
<p><a href="https://github.com/dfreeman">@dfreeman</a> encourages us to make an <a href="https://www.salsify.com/blog/engineering/ember-in-2019-tearing-down-us-and-them">active effort to tear down the Us and Them mentality</a>.</p>
<blockquote>
  <p>The Ember community makes up only a fraction of Web development as a whole, and that necessarily means a lot of the innovation going on is happening outside our figurative walls. […] Conversely, if we do develop something novel and valuable but it's only possible to use it in the context of an Ember project, that's a missed opportunity for the rest of the world.</p>
</blockquote>
<hr />
<p><a href="https://gist.github.com/frank06">@frank06</a> is looking forward to increase efforts to <a href="https://gist.github.com/frank06/eda33de8858e02ea1bfa4ed8e49766af">communicate the value of Ember in the wider tech community</a>:</p>
<blockquote>
  <p>Ember has fallen off the radar. Pretty much any article about front-end talks about React/Angular/Vue and that's the end of it. They are taking such a big market share that Ember will struggle despite its technical merits. […] I noticed several Ember developers going out in the wild to talk about Ember. This is great. We need more and better marketing and PR.</p>
</blockquote>
<hr />
<p>In his post <a href="https://medium.com/@gauravmunjal_86037/ember-testing-in-2019-e5f5fac0c023">"Ember Testing in 2019"</a> <a href="https://github.com/Gaurav0">@Gaurav0</a> highlights the importance of making Ember's testing solution easier to adopt:</p>
<blockquote>
  <p>Testing has always been a strength of Ember. […] Yet, it is still too hard for some organizations to start testing. […] It is important, that as we go forward as a community, we don’t give up our lead in this area and address these pain points that continue to make testing difficult.</p>
</blockquote>
<hr />
<p><a href="https://github.com/jrjohnson">@jrjohnson</a> on the other hand wishes for <a href="https://www.jrjohnson.dev/posts/2019-05-26-ember-2019">an approachable guide for migrating classic to single page apps</a> to help with bringing new developers of JavaScript applications into the Ember community:</p>
<!--alex ignore special-->
<blockquote>
  <p>A special section in the guides on integrating Ember.js into a classic app could help interested developers become comfortable with both the technical process and with the idea that the Ember.js community supported this use case.</p>
</blockquote>
<hr />
<p>Last but not least, <a href="https://github.com/abhilashlr">@abhilashlr</a> covered <a href="https://medium.com/@abhilashlr/emberjs2019-my-wish-list-c64a99547bff">five areas that we can work on in 2019</a>:</p>
<blockquote>
  <p>[O]n-boarding new and fresh minds from a different background of frameworks into teams that use Ember, has been quite a challenge. Not because the framework is difficult to learn, but the dots around the documentation need a bit more connectivity.</p>
</blockquote>
<p>Many more #EmberJS2019 posts to be covered in the next issue! 💜</p>
<hr />
<h2 id="rfcforanalternativetocontrollershttpsgithubcomemberjsrfcspull499"><a href="https://github.com/emberjs/rfcs/pull/499">RFC for an Alternative to Controllers 🎛</a></h2>
<p><a href="https://github.com/NullVoxPopuli">@NullVoxPopuli</a> proposed <strong>two</strong> RFCs to outline how we can eventually remove controllers from Ember.</p>
<ul>
<li><a href="https://github.com/emberjs/rfcs/pull/499">RFC 499</a> proposes an alternative way of rendering templates for a particular route. (If some of you remember routable components, this isn't that. 😉)</li>
<li><a href="https://github.com/emberjs/rfcs/pull/380">RFC 380</a> proposes adding a <code>queryParams</code> property to the <code>RouterService</code> for accessing query parameters anywhere in your app: Routes, Components, etc. 🎉</li>
</ul>
<p>If both these RFCs were accepted, it would help pave the way to being able to deprecate controllers. So if that’s something you care about, be sure to comment! 🖊️</p>
<hr />
<h2 id="statictypesinemberjshttpsdevtojamesbyrnestatictypesinemberjs26b7"><a href="https://dev.to/jamesbyrne/static-types-in-emberjs-26b7">Static Types in EmberJs? 🌟</a></h2>
<p>If you are new to adding TypeScript to your Ember project, <a href="https://github.com/James-Byrne">@James-Byrne</a> has got you covered!</p>
<p>From <a href="https://dev.to/jamesbyrne/static-types-in-emberjs-26b7">James' blog post</a>, you can learn how types help you catch errors at compile time and keep your documentation up-to-date. You can also find common problems to watch out for when you introduce types to your app.</p>
<p>Have a look and add types today!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/sdebarros" target="gh-user">@sdebarros</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/demersaj" target="gh-user">@demersaj</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/wycats" target="gh-user">@wycats</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/bmac" target="gh-user">@bmac</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/qpowell" target="gh-user">@qpowell</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/dnalagatla" target="gh-user">@dnalagatla</a>, <a href="https://github.com/DPK101" target="gh-user">@DPK101</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/rajasegar" target="gh-user">@rajasegar</a>, <a href="https://github.com/haochuan" target="gh-user">@haochuan</a>, <a href="https://github.com/thoov" target="gh-user">@thoov</a>, <a href="https://github.com/lougreenwood" target="gh-user">@lougreenwood</a> and <a href="https://github.com/lifeart" target="gh-user">@lifeart</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Preston Sego, Isaac Lee, Chris Ng, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-102</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-102</guid><pubDate>Fri, 14 Jun 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 103]]></title><description><![CDATA[<p>हॅलो Emberistas! 🐹</p>
<!-- alex disable easy -->
<p>This week:
submit to the Ember Camp Chicago CfP 🌭,
celebration of 55 posts for #EmberJS2019 🎉,
unravel the mystery of Ember testing syntax 💡,
examine alternatives to the input helper 🤔,
watch the Visual Regression Testing Made Easy talk video 📺,
more expressive dependency injection ⬅️,
and clean out unused components from your 🐹 app!</p>
<!-- alex enable easy -->
<!-- READMORE -->
<hr />
<h2 id="embercampchicagoonseptember16thhttpembercampcom"><a href="http://embercamp.com/">EmberCamp Chicago on September 16th! 🌭</a></h2>
<p>The <a href="https://cfp.emberconf.com/events/embercamp-chicago-2019">EmberCamp Chicago CfP</a> is open until <strong>June 30th</strong>. If you are interested in doing a talk, mini-talk, activity, workshop, or keynote, please submit soon!</p>
<p><a href="https://www.eventbrite.com/e/embercamp-chicago-2019-registration-63595006376">Tickets are on sale now</a>, with an <strong>Early Bird sale of $99 until July 8</strong>! If you want to receive announcements about EmberCamp, sign up on <a href="http://embercamp.com/">embercamp.com</a>.</p>
<p>Also, last year's sessions have all been published <a href="https://www.youtube.com/playlist?list=PL4eq2DPpyBbm-vTgHMdBjUi1Qd5GiRIfW">as a playlist</a>. If you only want to see Trek's awesome intros, there's a <a href="https://www.youtube.com/playlist?list=PL4eq2DPpyBbmrQSORHoiTBNapQX2Hqu0C">separate playlist for that</a>. 🥁</p>
<hr />
<h2 id="thankyouforparticipatinginemberjs2019httpsblogemberjscom20190520ember2019roadmapcallforpostshtml"><a href="https://blog.emberjs.com/2019/05/20/ember-2019-roadmap-call-for-posts.html">Thank You for Participating in #EmberJS2019! 🎉</a></h2>
<p>Over the last few weeks, we saw <a href="https://github.com/abhilashlr/emberjs2019-posts">55 blog posts, GitHub Gists, and tweets</a> that described how Ember can continue to innovate in 2019. We <strong>thank everyone</strong> for participating, by writing a post, replying to one, and discussing it online or on podcasts. Please feel free to continue to write your #EmberJS2019 post even after the deadline. 💖</p>
<p>This week's authors include <a href="https://twitter.com/ondrejsevcik/status/1138778957178974209">@ondrejsevcik</a>, <a href="https://gist.github.com/michaelrkn/249666be12de3374d1f8e49af1ddfdc5">@michaelrkn</a>, <a href="https://chris.manson.ie/ember-2019-sell-what-we-have-and-fix-papercuts/">@mansona</a>, <a href="https://twitter.com/amatchneer/status/1139242398134018048">@machty</a>, <a href="https://medium.com/@sarbbottam/emberjs2019-wishlist-ba11a6a3e012">@sarbbottam</a>, <a href="https://dev.to/tschoartschi/send-ember-on-a-diet-and-thrive-innovation-2aef">@tschoartschi</a>, <a href="https://dcyriller.github.io/ember-call-for-blog-posts/">@dcyriller</a>, <a href="http://hangaroundtheweb.com/2019/06/ember-into-futurity/">@rajasegar</a>, <a href="https://alonbukaiblog.netlify.com/ember-2019-more-tooling/">@Alonski</a>, <a href="https://josemarluedke.com/blog/emberjs-2019-roadmap/">@josemarluedke</a>, <a href="https://twitter.com/JordanHawker/status/1139811888953319424">@elwayman02</a>, <a href="https://twitter.com/acorncom/status/1140456701318987776">@acorncom</a>, <a href="https://gist.github.com/kenigbolo/3503d158858660e2d90fbb6726db2caf">@kenigbolo</a>, <a href="https://shipshape.io/blog/ember-2019/">@rwwagner90</a>, <a href="http://presentationtier.com/emberjs2019/">@toddjordan</a>, <a href="https://www.linkedin.com/pulse/managing-migrations-ember-steve-calvert">@scalvert</a>, <a href="https://dev.to/dustinsoftware/the-case-for-embeddable-ember-4120">@dustinsoftware</a>, <a href="https://ilyaradchenko.com/fragmentation-over-obsalecence/">@knownasilya</a>, <a href="https://runspired.com/2019/06/17/emberdata2019/">@runspired</a>, <a href="https://0xadada.pub/2019/06/17/essential-ember-addons/">@0xadada</a>, <a href="https://www.chriskrycho.com/2019/emberjs2019-part-1.html">@chriskrycho</a>, and <a href="https://gist.github.com/neojp/d7b2cdc38a04776cf3e41a6e698fb07e">@neojp</a>.</p>
<p>As always, you can find <a href="https://github.com/abhilashlr/emberjs2019-posts">all #EmberJS2019 posts at our community repo</a>. (Thanks again, <a href="https://github.com/abhilashlr/">@abhilashlr</a>!)</p>
<hr />
<h2 id="theemberjstestingguideimadeformyselfhttpsmediumcomsarbbottamtheemberjstestingguideimadeformyselfc9a073a0c718"><a href="https://medium.com/@sarbbottam/the-ember-js-testing-guide-i-made-for-myself-c9a073a0c718">The Ember.js Testing Guide, I Made for Myself 💡</a></h2>
<p><a href="https://github.com/sarbbottam">@sarbbottam</a> recalls how the <a href="https://guides.emberjs.com/release/testing/">new testing syntax</a> had improved his productivity remarkably. Sarbbottam, who has been making notes on testing since, <a href="https://medium.com/@sarbbottam/the-ember-js-testing-guide-i-made-for-myself-c9a073a0c718">graciously shared them with the whole community last week</a>. 💯</p>
<p>Learn more today about:</p>
<ul>
<li>Writing different types of tests (unit, integration, and acceptance)</li>
<li>Running tests</li>
<li>Stubbing dependencies</li>
</ul>
<p>We encourage you to <strong>check out Sarbbottam's guide</strong> and <strong>share</strong> it with developers that you know! 💛</p>
<hr />
<h2 id="dowestillneedtheinputhelperhttpswwwyoutubecomwatchvc0rl6o9wlx0"><a href="https://www.youtube.com/watch?v=c0Rl6o9wLX0">Do We Still Need the Input Helper? 🤔</a></h2>
<p>As Ember aligns with native JavaScript more each day, we get to reexamine the framework choices that we had made. For example, how should we handle events for <strong>input elements</strong>? <a href="https://github.com/rwjblue">@rwjblue</a> and <a href="https://github.com/stefanpenner">@stefanpenner</a> met to <strong>discuss</strong> the historical context and alternatives to using the <code>{{input}}</code> helper.</p>
<p>You can learn more from their <a href="https://www.youtube.com/watch?v=c0Rl6o9wLX0">recorded interview</a> and <a href="https://github.com/balinterdi">@balinterdi</a>'s <a href="http://www.balinterdi.com/blog/built-in-input-helpers-in-ember-js-when-and-whether-they-should-be-used/">notes and thoughts</a>.</p>
<hr />
<!-- alex disable easy -->
<h2 id="talkvideovisualregressiontestingmadeeasyhttpswwwyoutubecomwatchvd0zcjneybbs"><a href="https://www.youtube.com/watch?v=d0ZCJNeybbs">Talk Video: Visual Regression Testing Made Easy 📺</a></h2>
<p><a href="https://github.com/patocallaghan">@patocallaghan</a> gave a lightning talk on <strong>“Visual Regression Testing Made Easy”</strong> at the April 2019 <a href="https://www.meetup.com/DublinJS/">DublinJS Meetup</a>. In his talk, Pat used <a href="https://percy.io/">Percy</a> to scale visual regression testing from a manual to an automated workflow. You can catch potential CSS bugs, remove certain types of tests, and deal with large refactors and migrations. <em>“Styles can sometimes make bad things happen.”</em> Percy gives you confidence when you make big changes.</p>
<p>Check out the <a href="https://www.youtube.com/watch?v=d0ZCJNeybbs">full lightning talk video</a> just published this week!</p>
<!-- alex enable easy -->
<hr />
<h2 id="moreexplicitdependencyinjectioninyouremberappshttpsgithubcomemberjsrfcspull502"><a href="https://github.com/emberjs/rfcs/pull/502">More Explicit Dependency Injection in Your Ember Apps 🐹</a></h2>
<p>The <a href="https://github.com/emberjs/rfcs/pull/502"><strong>recent Request for Comments (RFC)</strong></a>, titled "Explicit Service Injection," proposes an update to the way <strong>services and other dependencies</strong> are registered, looked up and <strong>injected</strong> in Ember apps. The proposal argues that a class-based syntax for <a href="https://guides.emberjs.com/v3.10.0/applications/dependency-injection/">dependency injection</a> is more explicit than the current string-based API and therefore preferable.</p>
<p>If you'd like to learn more about the <strong>new API design</strong> that is proposed in the RFC, be sure to <a href="https://github.com/nullvoxpopuli/rfcs/blob/explicit-dependency-injection/text/0000-explicit-dependency-injection.md">read the original proposal</a> and do not forget to <strong>join the discussion</strong> in the comments!</p>
<hr />
<h2 id="pruneyourappwithemberunusedcomponentshttpsgithubcomvastecemberunusedcomponents"><a href="https://github.com/vastec/ember-unused-components">Prune Your App with Ember Unused Components ♻️</a></h2>
<p>Finding <strong>components</strong> that aren't used in your application anymore can be tough. Due to different ways to invoke components (with curly braces or <a href="https://guides.emberjs.com/release/reference/syntax-conversion-guide/">angle brackets</a>) and the syntactical ambiguity between invoking helpers and components, it takes some time to prune your app from redundant components manually.</p>
<p>But now you can use the brand-new addon <a href="https://github.com/vastec/ember-unused-components">Ember Unused Components</a> to <strong>clean up</strong> your <strong>codebase automatically</strong>. Use the <code>--stats</code> flag to get <strong>useful reports</strong> on the impact of your app optimization efforts as you go. <a href="https://github.com/vastec/ember-unused-components">Check it out today!</a></p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/loganrosen" target="gh-user">@loganrosen</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/sdebarros" target="gh-user">@sdebarros</a>, <a href="https://github.com/buschtoens" target="gh-user">@buschtoens</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a> and <a href="https://github.com/muziejus" target="gh-user">@muziejus</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Sean Massa, Amy Lam, Isaac Lee, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-103</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-103</guid><pubDate>Fri, 21 Jun 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 104]]></title><description><![CDATA[<p>Halò Emberistas! 🐹</p>
<p>This week is all about <strong>Embroider</strong>:
Readers' Questions: What is Embroider? 🤔,
live Embroider Demo by Edward Faulkner 🖥️, and an
RFC for Embroider v2 Addon Format 💬. Also, help out in the Prettier Glimmer Quest Issue 🎀✨!</p>
<!-- READMORE -->
<hr />
<h2 id="readersquestionswhatisembroiderhttpsdiscussemberjscomtreadersquestionswhatisembroider16722"><a href="https://discuss.emberjs.com/t/readers-questions-what-is-embroider/16722">Readers' Questions: What is Embroider?</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>In this week's <strong>brand new</strong> Readers’ Question it's all about <strong>Embroider</strong>: What is it about and should you use it in your Ember app?</p>
  <p>In her write-up <a href="https://github.com/jessica-jordan">@jessica-jordan</a> will give a high-level overview of the motivation for the project, its benefits and where to learn more about it. Read the <strong>full answer</strong>
  on the <a href="https://discuss.emberjs.com/t/readers-questions-what-is-embroider/16722">offical Ember forum</a>.</p>
</div>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/readers-questions-what-is-embroider/16722">Read more</a></p>
<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
<hr />
<h2 id="liveembroiderdemobyedwardfaulknerhttpswwwyoutubecomwatchv2r1vs7_sltm"><a href="https://www.youtube.com/watch?v=2R1vS7_sLTM">Live Embroider Demo by Edward Faulkner 🖥️</a></h2>
<p>You might be wondering next, how do I start using <a href="https://github.com/embroider-build/embroider">Embroider</a> in my app? How exactly do Embroider options affect my build? 🙋‍♂️🙋‍♀️</p>
<p>At EmberATX, <a href="https://github.com/ef4">Edward Faulkner</a> showed how you can build the familiar <a href="https://guides.emberjs.com/release/tutorial/ember-cli/">Super Rentals app</a> using Embroider. He also taught important <a href="https://github.com/embroider-build/embroider#options">core and compatibility options</a> and explained how they affect the first two build stages.</p>
<p>We encourage you to <strong><a href="https://www.youtube.com/watch?v=2R1vS7_sLTM">learn more about Embroider today</a></strong>! If you are short on time, feel free to watch these highlights:</p>
<ul>
<li><em><a href="https://www.youtube.com/watch?v=2R1vS7_sLTM&feature=youtu.be&t=500">08:20</a> (24 min)</em> How to build Super Rentals 🏠</li>
<li><em><a href="https://www.youtube.com/watch?v=2R1vS7_sLTM&feature=youtu.be&t=2845">47:25</a> (25 min)</em> How the options affect first stage 1️⃣</li>
<li><em><a href="https://www.youtube.com/watch?v=2R1vS7_sLTM&feature=youtu.be&t=3745">1:02:25</a> (15 min)</em> How the options affect second stage 2️⃣</li>
</ul>
<hr />
<h2 id="rfcforembroiderv2addonformathttpsgithubcomemberjsrfcspull507"><a href="https://github.com/emberjs/rfcs/pull/507">RFC for Embroider v2 Addon Format 💬</a></h2>
<p>Now is your opportunity to help shape Embroider!</p>
<p><a href="https://github.com/ef4">@ef4</a> has opened the first <a href="https://github.com/emberjs/rfcs/pull/507">Embroider RFC</a> to discuss the <strong>v2 spec</strong> of Ember packages. Please note, there will be additional RFCs to address what addons can currently do in v1.</p>
<p>Find out more about Embroider, share the news, and <a href="https://github.com/emberjs/rfcs/pull/507">give your feedback today</a>!</p>
<hr />
<h2 id="questprettierglimmerhttpsgithubcomjgwhiteprettierissues1"><a href="https://github.com/jgwhite/prettier/issues/1">Quest: Prettier Glimmer 🎀✨</a></h2>
<p><a href="https://github.com/jgwhite">@jgwhite</a> started a <a href="https://github.com/jgwhite/prettier/issues/1">quest issue</a> to track the outstanding work required to have <strong>full <a href="https://prettier.io/">Prettier</a> support for Ember templates</strong>.</p>
<p>Prettier is an opinionated code formatter that ensures that all <a href="https://jlongster.com/A-Prettier-Formatter">outputted code conforms to a consistent style</a> in order to avoid <a href="https://en.wiktionary.org/wiki/bikeshedding">bikeshedding</a> about styling rules or nit picks. It does this by parsing your code into an Abstract Syntax Tree (AST) and reprinting it from scratch disregarding all original styling. Today, Prettier already works for JavaScript including <a href="https://github.com/tc39/proposals/blob/master/finished-proposals.md">ES2017</a> so this work revolves around supporting Ember templates.</p>
<p>Check out what parts you can contribute in the <a href="https://github.com/jgwhite/prettier/issues/1">quest issue</a> on GitHub!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/paddyobrien" target="gh-user">@paddyobrien</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/abel-n" target="gh-user">@abel-n</a>, <a href="https://github.com/Gorzas" target="gh-user">@Gorzas</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/villander" target="gh-user">@villander</a>, <a href="https://github.com/billybonks" target="gh-user">@billybonks</a>, <a href="https://github.com/geopopos" target="gh-user">@geopopos</a>, <a href="https://github.com/kmiyashiro" target="gh-user">@kmiyashiro</a>, <a href="https://github.com/newyork-anthonyng" target="gh-user">@newyork-anthonyng</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/pgengler" target="gh-user">@pgengler</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/ef4" target="gh-user">@ef4</a> and <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <strong><a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a></strong> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jessica Jordan, Chris Ng, Isaac Lee, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-104</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-104</guid><pubDate>Fri, 28 Jun 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 105]]></title><description><![CDATA[<p>Hoi Emberistas! 🐹</p>
<p>This week:
help design the Ember skill tree 🌱,
observers going async ⏱,
RFC to support populating head tag ⛑️,
RFC to add <code>load</code> hook to Route 🎣,
an update on Ember Inspector 🕵️‍♀️,
submit your EmberFest 2019 talk today 🎤, and an
EmberWeekend episode featuring Luke Melia 🔈!</p>
<!-- READMORE -->
<hr />
<h2 id="helpdesigntheemberskilltreehttpsdiscussemberjscomtlearningemberemberskilltree16725"><a href="https://discuss.emberjs.com/t/learning-ember-ember-skill-tree/16725">Help Design the Ember Skill Tree 🌱</a></h2>
<p>Recall your first day as an Ember developer (or mentor). Did you feel overwhelmed by the sheer amount of things that you felt you needed to learn (teach)?</p>
<ul>
<li>What skills do I need to learn now? 😕</li>
<li>What skills do I learn next? 🤯</li>
<li>What resources are available to me? 🥺</li>
</ul>
<p>Enter <strong>Ember skill tree</strong>. It helps you visualize important skills and the steps to acquire them. It aligns with the <a href="https://guides.emberjs.com/release/">Ember guides</a> too.</p>
<p>The only problem? <a href="https://discuss.emberjs.com/t/learning-ember-ember-skill-tree/16725">The tree doesn't exist yet</a>.</p>
<p><a href="https://github.com/gossi">@gossi</a> and the Ember Learning Team would like your <a href="https://discuss.emberjs.com/t/learning-ember-ember-skill-tree/16725">help with creating the Ember skill tree</a>. We encourage you to participate today! Please share your experiences of learning and teaching Ember. 💞</p>
<hr />
<h2 id="rfctoaddloadhooktoroutehttpsgithubcomemberjsrfcspull510"><a href="https://github.com/emberjs/rfcs/pull/510">RFC to Add <code>load</code> Hook to Route 🎣</a></h2>
<p>A new RFC has been created by <a href="https://github.com/michaelrkn">@michaelrkn</a> to get feedback on the idea of <strong>adding a <code>load</code> hook to the Route</strong>. The motivation for this is that the term <code>model()</code> can be confusing "because it implies that only one piece of data will be fetched, and it uses the term <code>model</code> that is more typically associated with backend development".</p>
<p>Feel free to <a href="https://github.com/michaelrkn/rfcs/blob/route-data/text/0000-route-data-loading.md">read the RFC</a> and share your thoughts in the comment section.</p>
<hr />
<h2 id="tosyncornottosyncobservers20httpsemberjsgithubiorfcs0494asyncobservershtml"><a href="https://emberjs.github.io/rfcs/0494-async-observers.html">To Sync or Not to Sync: Observers 2.0 ⏱</a></h2>
<p>In an effort to remove legacy code from Ember, promote better programming practices in apps and lay the foundation for clearer code paths, a <a href="https://github.com/emberjs/rfcs/pull/494">recently accepted RFC (Request for Comments)</a> proposes an important change to the <strong>observer</strong> APIs: the <a href="http://api.emberjs.com/ember/release/functions/@ember%2Fobject%2Fobservers/addObserver"><code>addObserver</code></a>, <a href="http://api.emberjs.com/ember/release/functions/@ember%2Fobject%2Fobservers/removeObserver"><code>removeObserver</code></a> and the <a href="http://api.emberjs.com/ember/release/functions/@ember%2Fobject/observer"><code>observer</code></a> functions shall be configurable to operate either synchronously (the way observers always used to work in Ember apps since the pre-v1.0 days) or asynchronously.</p>
<p>In Ember apps today, observers will be called immediately after any of the properties they are tracking have changed. Async observers as proposed in the RFC would instead be scheduled for the next runloop.</p>
<p>The RFC highlights how we can use the <code>sync</code> option (a Boolean) to make our observers asynchronous, one by one. After the community has had sufficient time to migrate their code, the RFC argues that Ember would be able to deprecate synchronous observers.</p>
<p>Find out more about the how and why behind <strong>async observers</strong> by giving the <a href="https://emberjs.github.io/rfcs/0494-async-observers.html">full proposal a read!</a></p>
<hr />
<h2 id="rfctosupportpopulatingheadtaghttpsgithubcomemberjsrfcspull506"><a href="https://github.com/emberjs/rfcs/pull/506">RFC to Support Populating Head Tag ⛑️</a></h2>
<p>The <code>&lt;head&gt;</code> tag does more than setting the title and favicon of a page. It also plays an <strong>integral role in SEO and unfurling links</strong>. Currently, we can use the <a href="https://github.com/ronco/ember-cli-head">ember-cli-head</a> addon to modify the <code>&lt;head&gt;</code> tag. 💛</p>
<p>In the RFC, <a href="https://github.com/rwwagner90">@rwwagner90</a> proposed that Ember gives developers the ability to modify the tag, using a <strong>route hook</strong> or <strong>service</strong>.</p>
<p>What are your thoughts? Please <a href="https://github.com/emberjs/rfcs/pull/506">take a look at the RFC</a> and share your ideas and use cases of <code>&lt;head&gt;</code> tag!</p>
<hr />
<h2 id="emberinspectorupdatehttpsgithubcomemberjsemberinspector"><a href="https://github.com/emberjs/ember-inspector">Ember Inspector Update 🕵️‍♀️</a></h2>
<p><strong>Ember Inspector</strong> recently dropped support for Ember versions &lt; 3.4. This has freed us up to
remove a lot of cruft that has existed for supporting older Ember versions, and start to clean
up and modernize the code. We are continuing to design the features for the future and work
towards delivering the features we promised in the past.</p>
<p><a href="https://emberjs.com/editions/octane/">Ember Octane</a> is still not currently supported, but we are working closely with the framework team to
get the APIs we need to map components to DOM elements and enable us to show the arguments
passed to the component, and manipulate them inline. This will allow Inspector users to <strong>debug</strong> component behavior <strong>even better</strong>.</p>
<p>We are always looking for more people to <strong>help out</strong> with the considerable efforts required to keep
Ember Inspector running, so if you would be interested in helping out, please reach out in the
<a href="https://discordapp.com/channels/480462759797063690/486243207072710656"><code>dev-ember-inspector</code> channel</a> on <a href="https://discordapp.com/invite/emberjs">Discord</a>, we would love to have you!</p>
<hr />
<h2 id="reminderemberfestcfpdeadlineaugust1sthttpscfpemberfesteueventsemberfest2019"><a href="https://cfp.emberfest.eu/events/emberfest-2019">Reminder: EmberFest CFP Deadline August 1st 🎤</a></h2>
<p>A quick reminder that the <a href="https://emberfest.eu/">EmberFest</a> <strong>CFP deadline</strong> is fast approaching. We are only a month away from the <strong>August 1st</strong> deadline, so get your talk in today!</p>
<p>Talks are <strong>30 minutes long</strong> and can range from in-depth technical talks to broader talks covering other aspects of software development.</p>
<p>If you’re looking for some inspiration, here are the <a href="https://www.youtube.com/watch?v=oRzmDobMZ_Q&list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9">2018 EmberFest Talks on YouTube</a>!</p>
<hr />
<h2 id="emberweekendepisodewithlukemeliahttpstwittercomemberweekendstatus1134498179544702977"><a href="https://twitter.com/emberweekend/status/1134498179544702977">EmberWeekend Episode With Luke Melia 🔈</a></h2>
<p>A few episodes back the EmberWeekend podcast featured a <strong>great interview</strong> with long-time Ember contributor and former organizer of the Ember NYC Meetup, <a href="https://github.com/lukemelia">@lukemelia</a>. The episode covers the origin story of the NYC meetup and some detail on the origins of Ember.js itself.</p>
<p>Luke has transitioned out of his role as organizer of the NYC Meetup, and he will be missed, but the well-attended and organized meetup is in good hands and is now being organized by <a href="https://github.com/mixonic">@mixonic</a>.</p>
<p>Bonus topics of the episode include Luke's experience using Ember Cordova for building mobile applications and Orbit.js!</p>
<p>Checkout the full episode
<a href="https://emberweekend.com/episodes/out-of-memory">here</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/vaidehijoshi" target="gh-user">@vaidehijoshi</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/ijlee2" target="gh-user">@ijlee2</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/astronomersiva" target="gh-user">@astronomersiva</a>, <a href="https://github.com/CvX" target="gh-user">@CvX</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a> and <a href="https://github.com/Draggha" target="gh-user">@Draggha</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jessica Jordan, Isaac Lee, Kenneth Larsen, Robert Wagner, Chris Ng, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-105</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-105</guid><pubDate>Fri, 05 Jul 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 106]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>This week: find out how Ember Data has been repackaged in 3.11 📦,
a tutorial to learn how to build an Ember Octane PWA from scratch 👨‍💻,
see EmberJS powered blogging in action at DublinJS 🎥,
checkout updated Ember Igniter articles 🔥,
and last, but not least, an exclusive <strong>"I contribute to Ember"</strong> interview with @st-h 🎙!</p>
<!-- READMORE -->
<hr />
<h2 id="emberdatarepackagedin311httpsemberjsgithubiorfcs0395emberdatapackageshtml"><a href="https://emberjs.github.io/rfcs/0395-ember-data-packages.html">Ember Data Repackaged in 3.11 📦</a></h2>
<p>Starting with Ember 3.11, Ember Data will be shipped as a <strong>collection of small packages</strong> under the namespace <code>@ember-data</code>. This helps you import only the packages that you need, identify the API that you can replace, and know where to start if you want to contribute to Ember Data. 🎉</p>
<p>Say hello to the new import syntax:</p>
<pre><code class="javascript language-javascript">import Model, { attr, belongsTo, hasMany } from '@ember-data/model';
</code></pre>
<p>Previous styles of import will be deprecated in a future release. Don't worry. Before that happens, a codemod and lint rules will be available to help you migrate your code.</p>
<p>We encourage you to learn today about <a href="https://emberjs.github.io/rfcs/0395-ember-data-packages.html">Ember Data packages in 3.11</a> and the exciting plan to <a href="https://github.com/emberjs/data/issues/6166">use Embroider to tree-shake Ember Data</a>.</p>
<hr />
<h2 id="tutorialemberoctanefundamentalshttpstwittercommichaellnorthstatus1148631049141751813"><a href="https://twitter.com/michaellnorth/status/1148631049141751813">Tutorial: Ember Octane Fundamentals 🐹</a></h2>
<!-- alex disable masters -->
<p><a href="https://github.com/mike-north">@mike-north</a> published a <a href="https://frontendmasters.com/courses/ember-octane/">new training video series on Frontend Masters</a> on <strong>Ember Octane Fundamentals</strong>. If you are not a subscriber to Frontend Masters or prefer written instructions, there are <a href="https://github.com/mike-north/ember-octane-workshop/tree/master/notes">detailed written instructions hosted in GitHub</a>!</p>
<!-- alex enable masters -->
<p>Starting with regular HTML and CSS and going through hands-on experience working with glimmer components, tracked properties, actions, and modifiers – the Ember Octane Fundamentals training provides detailed steps in creating your own server-rendered chat application.</p>
<p>What’s even better is that since this is licensed under the BSD-2-Clause, you can feel free to use this material to conduct workshops in your own groups! Make sure to give some feedback to <a href="https://github.com/mike-north">@mike-north</a>!</p>
<hr />
<h2 id="updatestoemberigniterarticleshttpsemberignitercomarticles"><a href="https://emberigniter.com/articles/">Updates To Ember Igniter Articles 🔥</a></h2>
<p><a href="https://github.com/frank06">@frank06</a> has recently been updating his <strong>awesome series of articles</strong> regarding a variety of Ember.js subjects on his blog, <strong>Ember Igniter</strong>.</p>
<p>Many of the updates are aimed at brining the articles inline with newer versions of Ember.js. The articles are now applicable to Ember 3, and in many cases they even apply to Ember Octane!</p>
<p>If you haven't had a chance to checkout Ember Igniter before, be sure to checkout all the articles <a href="https://emberigniter.com/articles/">here</a>.</p>
<hr />
<h2 id="seeemberjspoweredblogginginactionatdublinjshttpswwwyoutubecomwatchv431ap3p1os"><a href="https://www.youtube.com/watch?v=4-31AP3p1os">See EmberJS Powered Blogging in Action at DublinJS 📝</a></h2>
<!-- alex ignore king-queen -->
<p>Wanna start blogging? Not sure which platform to use to get started? Why not try <a href="https://github.com/empress/empress-blog">Empress Blog</a> - a SEO-friendly, <strong>EmberJS powered blog system</strong>. Using this system, you can benefit from the themes and styles that are used for the <a href="https://ghost.org/">Ghost CMS</a> right from the start.</p>
<!-- alex ignore king-queen -->
<p>In his <strong><a href="https://www.youtube.com/watch?v=4-31AP3p1os">recent talk</a></strong> at <a href="https://www.meetup.com/DublinJS/">DublinJS</a>, Ember Learning Core team member <a href="https://github.com/mansona">@mansona</a> highlights how you get started writing posts, easily switch themes and publish your blog to the World Wide Web using Empress Blog. Check out the prezzi over on <a href="https://www.youtube.com/watch?v=4-31AP3p1os">Youtube</a>. 🎥</p>
<hr />
<h2 id="icontributetoemberwithstefanhuberhttpsdiscussemberjscomticontributetoemberwithstefanhuber16821"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-stefan-huber/16821">"I contribute to Ember" with Stefan Huber 🎙</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Stefan Huber" title="Stefan Huber - Contributor to Ember" src="/images/blog/emberjstimes/stefanhuber.jpeg" />
</div>
<!-- alex ignore dads-moms -->
<p>In our eleventh edition of the contributor interview series, community member <strong>Stefan Huber</strong>, also known as <strong><a href="https://github.com/st-h">@st-h</a></strong>, talks about his web app for musicians 🎸, building a recording studio when he was 20 in the basement of his mother's house 🎧, maintaining various Ember addons 👨‍💻, and more!</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-stefan-huber/16821">the Ember Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-stefan-huber/16821">Read more</a></p>
<p style="font-style: italic;">The idea behind these interviews is to provide community members with more information and insight into open source contributions, learning resources and community events. Contributors to the community gain a platform to share their thoughts on their own experiences and learnings as they were contributing to Ember. Our hope is that it gives first-time and advancing contributors a better sense of the fact that everyone starts out small, and that anyone can have a big impact on the community.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/SinS3i" target="gh-user">@SinS3i</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/ghislaineguerin" target="gh-user">@ghislaineguerin</a>, <a href="https://github.com/knownasilya" target="gh-user">@knownasilya</a>, <a href="https://github.com/newyork-anthonyng" target="gh-user">@newyork-anthonyng</a>, <a href="https://github.com/krainboltgreene" target="gh-user">@krainboltgreene</a>, <a href="https://github.com/backspace" target="gh-user">@backspace</a>, <a href="https://github.com/zubeir68" target="gh-user">@zubeir68</a>, <a href="https://github.com/tzellman" target="gh-user">@tzellman</a>, <a href="https://github.com/Prady220" target="gh-user">@Prady220</a> and <a href="https://github.com/locks" target="gh-user">@locks</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Isaac Lee, Chris Ng, Jessica Jordan, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-106</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-106</guid><pubDate>Fri, 12 Jul 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 107]]></title><description><![CDATA[<p>What's happening, Emberistas? 🐹</p>
<p>This week:
read the new <strong>RFC on Deprecation Removal Policies</strong> 📋,
<strong>Ember 3.11</strong> is out! 🚀
flexible imports with <strong>Ember Auto Import</strong> ⏬,
learn how to make an <strong>Electron</strong> app with Ember 🖥️,
and last, but not least, improving your <strong>DX</strong> on Ember 💯!</p>
<!-- READMORE -->
<hr />
<h2 id="rfcmajorversionreleaseforalldeprecationremovalhttpsgithubcomemberjsrfcspull512"><a href="https://github.com/emberjs/rfcs/pull/512">RFC: Major Version Release for All Deprecation Removal 📋</a></h2>
<p>An RFC was proposed by <a href="https://github.com/Kerrick">@kerrick</a> to have a major version release for all deprecation removals. The main issue revolves around the <a href="https://twitter.com/wycats/status/918644693759488005">Intimate API</a> policy which can catch some developers off guard when upgrading Ember versions.</p>
<p>Certain private APIs are considered "Intimate API" because there are addons and consumers who use them despite being private. We sometimes have issues when deprecating these private APIs. This is because not all private APIs would warrant a deprecation warning (and therefore a major version change). The RFC proposes to have a major version release for all deprecation removals.</p>
<p>Read, comment, and discuss the <a href="https://github.com/emberjs/rfcs/pull/512">full RFC on GitHub</a>!</p>
<hr />
<h2 id="ember311isouthttpsblogemberjscom20190715ember311releasedhtml"><a href="https://blog.emberjs.com/2019/07/15/ember-3-11-released.html">Ember 3.11 is Out 🚀</a></h2>
<p>A lot of <strong>cool new features</strong> have been released as part of Ember 3.11. With Ember.js 3.11 you now have access to features like the <code>on</code> modifier, the <code>fn</code> helper and much more. With 3.11 there's also a deprecation of <code>Function.prototype.observes</code>.</p>
<p>Furthermore, Ember Data 3.11 contains the <a href="https://emberjs.github.io/rfcs/0395-ember-data-packages.html">much awaited <code>Packages feature</code></a> which allows you to use a new import syntax.</p>
<p>If you decide to upgrade then please have a look at <a href="https://blog.emberjs.com/2019/07/15/ember-3-11-released.html">the release post</a> since Ember Data 3.11 <strong>currently contains a known bug</strong> with the <code>model</code> blueprint.</p>
<hr />
<h2 id="customconfigurationofemberautoimportforyourprojecthttpsgithubcomef4emberautoimporttreev130customizingbuildbehavior"><a href="https://github.com/ef4/ember-auto-import/tree/v1.3.0#customizing-build-behavior">Custom Configuration of Ember Auto Import for Your Project ⏬</a></h2>
<!-- alex ignore easy -->
<p><a href="https://emberobserver.com/addons/ember-auto-import">Ember Auto Import</a>, a very useful addon, helps you easily <strong>import</strong> and use third-party JavaScript libraries from <strong>npm</strong> in your Ember app.</p>
<p>You can <a href="https://github.com/ef4/ember-auto-import#customizing-build-behavior">configure the addon to fit your project's specific needs</a>. By providing the <code>autoImport</code> configuration object in your app options defined in <code>ember-cli-build.js</code>, you can, for example, change the name of the packages to import from or exclude packages to be imported with Ember Auto Import, which you might have already provided to your app in another way.</p>
<p>If you're already an avid user of Ember Auto Import (or plan to become one), be aware that from version 1.4.0+ the addon will <strong>no longer include</strong> Webpack's polyfills for a set of Node.js globals and modules automatically.</p>
<p><a href="https://github.com/ef4/ember-auto-import#i-upgraded-my-ember-auto-import-version-and-now-things-dont-import-what-changed">When upgrading to a version of the addon beyond 1.4.0</a>, you might see errors such as <code>global is not defined</code> in your app or test suite. This might indicate that some of your packages—even though they run in a browser environment—still rely on globals (these are usually only available in a Node environment) and may require a polyfill to work correctly. You can check <a href="https://github.com/ef4/ember-auto-import/issues/218">this issue on the Ember Auto Import repo</a> for more context.</p>
<p>If you want to opt-in to these Node polyfills using Ember Auto Import, you can <a href="https://github.com/ef4/ember-auto-import/issues/224#issuecomment-503400386">configure them accordingly</a> via the <code>autoImport</code> options in your <code>ember-cli-build.js</code>:</p>
<pre><code class="javascript language-javascript">// ember-cli-build.js
let app = new EmberApp(defaults, {
  autoImport: {
    webpack: {
      node: {
        Buffer: false,
        global: true,
        process: true,
      },
    }
  }
});
</code></pre>
<p>You can review the configuration defaults for the Node.js polyfill over at <a href="https://webpack.js.org/configuration/node/#node">the documentation for Webpack itself</a>.</p>
<hr />
<h2 id="makinganelectronappwithemberjshttpsdevtomitchartemismakinganelectronappwithemberjspart1initialsetup11c0"><a href="https://dev.to/mitchartemis/making-an-electron-app-with-ember-js-part-1-initial-setup-11c0">Making an Electron App with Ember JS 🖥️</a></h2>
<p><a href="https://ember-electron.js.org/">Ember Electron</a> is an addon that helps you create <strong>ambitious cross-platform desktop apps</strong>. Currently, its documentation resides in <a href="https://github.com/adopted-ember-addons/ember-electron/tree/master/docs">the GitHub repo</a>.</p>
<p>To help you understand how to use the addon—in particular, <strong>how to configure the addon for Mac, Linux, and Windows</strong>—<a href="https://dev.to/mitchartemis">@mitchartemis</a> published 2 blog posts, with a few more to come. 🎉</p>
<p>We encourage you to <a href="https://dev.to/mitchartemis/making-an-electron-app-with-ember-js-part-1-initial-setup-11c0">read them today</a>! You can also find Mitch's <a href="https://github.com/snipline/shopper">demo app and configuration files on GitHub</a>.</p>
<hr />
<h2 id="improvingyourdxonemberhttpsdockyardcomblog20190610improvingyourdxonemberpartiquickwins"><a href="https://dockyard.com/blog/2019/06/10/improving-your-dx-on-ember-part-i-quick-wins">Improving Your DX on Ember 💯</a></h2>
<p><a href="https://github.com/Serabe">@Serabe</a> has a series on the DockYard blog about how to improve your <strong>Developer Experience (DX)</strong>. Check it out for happier Ember-ing!</p>
<ul>
<li><a href="https://dockyard.com/blog/2019/06/10/improving-your-dx-on-ember-part-i-quick-wins">Part 1: Quick Wins</a>: tips and tricks</li>
<li><a href="https://dockyard.com/blog/2019/06/18/improving-the-ember-dx-part-2-changing-our-toolbelt">Part 2: Changing Our Toolbelt</a>: goes through some major changes to their project that brought bigger improvements</li>
<li><a href="https://dockyard.com/blog/2019/06/25/improving-dx-in-ember-part-3-ember-suave-2-0">Part 3: Ember Suave 2.0</a>: announcing the new and improved <a href="https://github.com/DockYard/eslint-plugin-ember-suave">eslint-plugin-ember-suave</a></li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kratiahuja" target="gh-user">@kratiahuja</a>, <a href="https://github.com/dnalagatla" target="gh-user">@dnalagatla</a>, <a href="https://github.com/kiwiupover" target="gh-user">@kiwiupover</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/elwayman02" target="gh-user">@elwayman02</a>, <a href="https://github.com/ursm" target="gh-user">@ursm</a>, <a href="https://github.com/pete-the-pete" target="gh-user">@pete-the-pete</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/loganrosen" target="gh-user">@loganrosen</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/choheekim" target="gh-user">@choheekim</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a> and <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Kenneth Larsen, Isaac Lee, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-107</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-107</guid><pubDate>Fri, 19 Jul 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 108]]></title><description><![CDATA[<p>🤙 Emberistas! 🐹</p>
<p>This week:
learn how to use Sentry to track production errors 📈,
get your new hires off to the best start 📚,
learn about the newest – and hopefully last! – way to handle events in Ember with the {{on}} Modifier 🔛,
a cheat sheet for modern Ember components ✨, and last, but not least,
find out how to create static sites with Prember and Ember Data 🔥!</p>
<!-- READMORE -->
<hr />
<h2 id="sentryerrorreportingforemberjshttpssimplabscomblog20190715sentryandember"><a href="https://simplabs.com/blog/2019/07/15/sentry-and-ember/">Sentry Error Reporting for Ember.js 📈</a></h2>
<p><a href="https://sentry.io/for/ember/">Sentry</a> is an open-source error tracking tool that helps you monitor and fix production errors in your Ember app. In 2018, Sentry announced a new SDK for browsers, called <code>@sentry/browser</code>.</p>
<p>To help you get started, <a href="https://github.com/Turbo87">@Turbo87</a> published a blog post. 🧡 In particular, you can learn how to:</p>
<ul>
<li>migrate from <code>ember-cli-sentry</code> addon to the official <code>@sentry/browser</code></li>
<li>report messages and exceptions to Sentry at will</li>
<li>filter out errors that aren't critical</li>
<li>add metadata to errors</li>
</ul>
<p>We encourage you to <a href="https://simplabs.com/blog/2019/07/15/sentry-and-ember/">deliver high-quality Ember apps today</a>!</p>
<hr />
<h2 id="howtohireandtraindeveloperswhenyoudontusereacthttpsmediumcomfrontendweeklyhowtohireandtraindeveloperswhenyoudontusereact42762e6b1a57"><a href="https://medium.com/front-end-weekly/how-to-hire-and-train-developers-when-you-dont-use-react-42762e6b1a57">How to Hire and Train Developers when You Don’t Use React 📚</a></h2>
<p><a href="https://github.com/jenweber">@jenweber</a> wrote an awesome <a href="https://medium.com/front-end-weekly/how-to-hire-and-train-developers-when-you-dont-use-react-42762e6b1a57">blog post</a> on how to hire and train new developers.
She provided 10 great tips on how you can help solve the pain points of hiring and training for your company.
If you are in charge of hiring new people or if you have a new colleague in your team, this is definitely a nice piece to get some new ideas about your onboarding process.</p>
<p>If you have started a new job, this post is also for you! We encourage you to think about how you want to be trained and how you can contribute to your team's onboarding process.</p>
<hr />
<h2 id="embermaponmodifiertutorialhttpsembermapcomvideoonmodifierafirstlook"><a href="https://embermap.com/video/on-modifier-a-first-look">EmberMap: {{on}} Modifier Tutorial 🔛</a></h2>
<p>The <a href="https://guides.emberjs.com/release/templates/actions/">action modifier</a> is the original way events were handled in Ember. The new <code>{{on}}</code> modifier that was <a href="https://github.com/emberjs/rfcs/pull/471">introduced this year</a> to address some shortcomings of the action modifier such as being explicit, working consistently for all events, and works well in SSR.</p>
<p>One way the <code>{{on}}</code> modifier deviates from the action helper is that it will only be responsible for adding (and removing) event listeners using the addEventListener API. The action helper is still needed to bind context, see below.</p>
<pre><code class="handlebars language-handlebars">&lt;button {{on 'click' (action 'addOne')}}&gt;
  Add one!
&lt;/button&gt;
</code></pre>
<p>Check out this <a href="https://twitter.com/ember_map/status/1152260614452142081">free</a> tutorial video on the <code>{{on}}</code> modifier on <a href="https://embermap.com/video/on-modifier-a-first-look">EmberMap</a>!</p>
<hr />
<h2 id="acheatsheetformodernembercomponentshttpstwittercomcodingitwrongstatus1153625389627072513"><a href="https://twitter.com/CodingItWrong/status/1153625389627072513">A Cheat Sheet for Modern Ember Components ✨</a></h2>
<p>On the road to the <a href="https://emberjs.com/editions/octane/">release of Ember Octane</a>, lots of <strong>modern
component features</strong> are already available with recent Ember releases.
If you want to keep track of which features are already available with a particular 3.x version of Ember,
check out the <a href="https://codingitwrong.com/2019/07/23/ember-component-cheat-sheet.html">ultimate Ember Component Cheat Sheet</a>.</p>
<p>Also if you want to learn more about how these new component API's work, be sure to check out <a href="https://jenweber.github.io/the-ember-components-museum/versions/master/">the Ember Component Museum</a> by <a href="https://github.com/jenweber">@jenweber</a>. ✨</p>
<p>Kudos to <a href="https://github.com/CodingItWrong">@CodingItWrong</a> who created the cheat sheet and thank you for sharing it with the community!</p>
<hr />
<h2 id="usingpremberforastaticsitewithemberdatahttpsmediumcomgauravmunjal_86037usingpremberforastaticsitewithemberdata780344e34c47"><a href="https://medium.com/@gauravmunjal_86037/using-prember-for-a-static-site-with-ember-data-780344e34c47">Using Prember for a Static Site with Ember Data 🔥</a></h2>
<p><a href="https://github.com/ef4/prember">Prember</a> is an addon that works in tandem with <a href="https://ember-fastboot.com/">Fastboot</a>. It allows you to serve your app statically and reap the benefits of fast first-paint and SEO!</p>
<p><a href="https://github.com/Gaurav0">@Gaurav0</a> recently published his <a href="https://medium.com/@gauravmunjal_86037/using-prember-for-a-static-site-with-ember-data-780344e34c47">notes on using Prember with Ember Data</a>. You will find how to set up Prember and Fastboot shoebox, as well as some data challenges that you may encounter along the way. See how Prember can help you today!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/sdhull" target="gh-user">@sdhull</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/bantic" target="gh-user">@bantic</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a> and <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Anne-Greeth van Herwijnen, Chris Ng, Isaac Lee, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-108</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-108</guid><pubDate>Fri, 26 Jul 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 109]]></title><description><![CDATA[<p>🙌 Emberistas!</p>
<p>Read the newly published Ember 2019-2020 Roadmap RFC 🐹,
tune in to learn about GraphQL and Ember 👨‍💻,
join EmberCamp Chicago (Sept 16th) 🍕,
learn why you shouldn't use observers 🙋‍♀️🙋‍♂️,
small things matter ✏️,
and Super Rentals tutorial in Octane 🚀!</p>
<!-- READMORE -->
<hr />
<h2 id="ember20192020roadmaprfchttpstwittercomtomdalestatus1155909868907311110"><a href="https://twitter.com/tomdale/status/1155909868907311110">Ember 2019-2020 Roadmap RFC 🐹</a></h2>
<p><a href="https://github.com/tomdale">@tomdale</a> posted the first draft of the <a href="https://github.com/emberjs/rfcs/pull/519">Ember 2019-2020 Roadmap RFC</a>. This document is a distillation of multiple sources ranging from the blogs from the <a href="https://blog.emberjs.com/2019/05/20/ember-2019-roadmap-call-for-posts.html">Call For Blog Posts</a>, the <a href="https://emberjs.com/ember-community-survey-2019/">Community Survey</a>, discussions on <a href="https://discordapp.com/invite/emberjs">Discord</a>, <a href="https://twitter.com/hashtag/emberjs2019">Twitter</a>, <a href="https://discuss.emberjs.com/">Ember Discuss</a>, and more!</p>
<p>The <strong>high level goals</strong> for 2019-2020 are:</p>
<ul>
<li>Reducing the size and conceptual complexity of Ember.</li>
<li>Improving ease of adoption.</li>
</ul>
<p>This will be done by continuing to simplify Ember, modernizing our build system, enabling better accessibility (a11y) by default, and optimizing for growth by sharing how Ember Octane is modern, productive, and <em>fun</em>.</p>
<p>Check out the <a href="https://github.com/emberjs/rfcs/pull/519">full RFC on GitHub</a>!</p>
<hr />
<h2 id="tuneinforthisjavascriptgraphqlhttpswwwthisdotcoeventsgraphqlcontributordaysframeworksedition"><a href="https://www.thisdot.co/events/graphql-contributor-days-frameworks-edition">Tune in for This.JavaScript: GraphQL👨‍💻</a></h2>
<p>Mark your calendars! In partnership with Hasura, This.JavaScript is gathering the GraphQL community to discuss current advanced problems in GraphQL in frontend frameworks on <strong>Thursday, August 8th</strong>. <a href="https://www.thisdot.co/events/graphql-contributor-days-frameworks-edition">RSVP</a> to attend the event online or check out the recording afterward.</p>
<p><a href="https://github.com/jneurock">@jneurock</a> and <a href="https://github.com/chadian">@chadian</a> will be representing the Ember community as a part of the event! You may remember their <a href="https://www.youtube.com/watch?v=kgfBexYbM68">talk from EmberFest</a>.</p>
<hr />
<h2 id="getreadyforembercampchicagohttpembercampcom"><a href="http://embercamp.com/">Get Ready for EmberCamp Chicago 🍕</a></h2>
<p>This year's edition of <a href="http://embercamp.com/">EmberCamp Chicago</a> is taking place on <strong>September 16th</strong>, and you should <strong>not miss it</strong>!</p>
<p>You can already check out the <a href="http://embercamp.com/speakers">full talk schedule</a>, which includes insights into Ember and modern best practices presented by <a href="https://twitter.com/jwwweber">Jen Weber</a>, <a href="https://twitter.com/eaf4">Edward Faulkner</a>, <a href="https://twitter.com/oliravi">Olivia Liddell</a>, <a href="https://twitter.com/dgeb">Dan Gebhardt</a>, and many other amazing speakers! ✨</p>
<p><a href="https://www.eventbrite.com/e/embercamp-chicago-2019-registration-63595006376">Get your ticket today</a> before they run out! If you or your company would be interested in being a sponsor of EmberCamp Chicago, please reach out via <a href="mailto:embercamp.chicago@gmail.com">embercamp.chicago@gmail.com</a>.</p>
<p>See you all in Chicago, Emberistas!</p>
<hr />
<h2 id="whyshouldinotuseobserversinmyemberapplicationhttpsdiscussemberjscomtwhyshouldinotuseobserversinmyemberapplication168683"><a href="https://discuss.emberjs.com/t/why-should-i-not-use-observers-in-my-ember-application/16868/3">Why Should I Not Use Observers in My Ember Application? 🙋‍♀️🙋‍♂️</a></h2>
<p>In case you missed it on <a href="https://discuss.emberjs.com/">Ember Discuss</a>, <a href="https://github.com/ef4">@ef4</a> gave a <a href="https://discuss.emberjs.com/t/why-should-i-not-use-observers-in-my-ember-application/16868/3">beginner-friendly, comprehensive answer</a> to why we discourage the use of observers. (Thank you for asking, <a href="https://github.com/efx">@efx</a>!)</p>
<p>As your application grows, a change to data can trigger your observers in unexpected ways. The chain of dependencies grows and can form a cycle — a circular dependency — without your knowing. Observer A calls observer B, which calls A again, which then… 😨</p>
<p>What we need is a <strong>rule that we can enforce locally</strong> to prevent cycles from forming at the global level. You've likely heard of this rule already: <strong>Data Down, Action Up (DDAU)</strong>. 💡</p>
<p>To learn more about exactly how DDAU prevents circular dependencies, we encourage you to <a href="https://discuss.emberjs.com/t/why-should-i-not-use-observers-in-my-ember-application/16868/3">check out the answer on Ember Discuss</a>. If you have questions about Ember at any point, please feel free to ask them on <a href="https://discordapp.com/invite/zT3asNS">Discord</a>, <a href="https://discuss.emberjs.com/">Ember Discuss</a>, and our very own <a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Readers' Questions</a>!</p>
<hr />
<h2 id="togetherwemakeemberjsabetterplacehttpsgithubcomemberlearnemberwebsitepull373"><a href="https://github.com/ember-learn/ember-website/pull/373">Together we make EmberJS a better place ✏️</a></h2>
<p>We often feature awesome blogposts, intricate RFCs and helpful addons in the Times. But in such a large ecosystem and community, the <strong>small things</strong> also matter. <a href="https://github.com/backspace">@backspace</a> and <a href="https://github.com/Imon-Haque">@Imon-Haque</a> both contributed by changing one file on the Ember website. <a href="https://github.com/ember-learn/guides-source/pull/919">Fixing a typo</a> or a <a href="https://github.com/ember-learn/ember-website/pull/373">broken link</a> that you stumble upon might seem really small, but it is valuable because it makes everyone's Ember experience better. So if you find something small, feel free to fix it by clicking the ✏️ on GitHub and creating a PR.</p>
<hr />
<h2 id="superrentalsinoctanehttpsgithubcomemberlearnsuperrentalspull127"><a href="https://github.com/ember-learn/super-rentals/pull/127">Super Rentals in Octane 🚀</a></h2>
<p>If you've been looking for an example of what an app written in <strong>Ember Octane</strong> looks like, look no further than the rewrite of the Super Rentals Tutorial that's been a part of the Ember.js guides for quite a while now.</p>
<p>The original rewrite PR was opened by <a href="https://github.com/vaidehijoshi">@vaidehijoshi</a>, author of the amazing ✨ <a href="https://github.com/vaidehijoshi/basecs-series">basecs</a> and <a href="https://github.com/vaidehijoshi/baseds-series">baseds</a> series.</p>
<p><a href="https://github.com/tomdale">@tomdale</a> also followed up with contributions to get the Octane vesion of Super Rentals over the line.</p>
<p>The new Super Rentals tutorial will become a part of the guides when Ember Octane is released. For a sneak preview, you can check out the PR's <a href="https://github.com/ember-learn/super-rentals/pull/127">here</a> and <a href="https://github.com/ember-learn/super-rentals/pull/129">here</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/bantic" target="gh-user">@bantic</a>, <a href="https://github.com/alexmaingot-sf" target="gh-user">@alexmaingot-sf</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/stopfstedt" target="gh-user">@stopfstedt</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/dgeb" target="gh-user">@dgeb</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/backspace" target="gh-user">@backspace</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a> and <a href="https://github.com/aspala" target="gh-user">@aspala</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Isaac Lee, Jessica Jordan, Anne-Greeth van Herwijnen, Jared Galanis, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-109</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-109</guid><pubDate>Fri, 02 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 110]]></title><description><![CDATA[<p>Aloha Emberistas! 🐹</p>
<!-- alex ignore king-queen -->
<p>This week:
{{on}} &amp; {{fn}} in Octane Guides 🔥,
Foreign Key Attrs Blog Post 🔑,
watch This.JavaScript: State of Frameworks on Tuesday 📜,
build JAMstack websites with Empress 🍓,
versioned Ember API links added to the Guides 🔢,
and last, but not least,
an Update for Co-Located Templates in the Guides ☝️!</p>
<!-- READMORE -->
<hr />
<h2 id="onfninoctaneguideshttpsgithubcomemberlearnguidessourcepull912"><a href="https://github.com/ember-learn/guides-source/pull/912">{{on}} & {{fn}} in Octane Guides 🔥</a></h2>
<p><strong>Many thanks</strong> 👏 to <a href="https://github.com/NullVoxPopuli">@NullVoxPopuli</a> and all the other contributors that worked on the <strong>awesome</strong> <a href="https://github.com/ember-learn/guides-source/pull/912">PR</a> updating the preview of the <a href="https://octane-guides-preview.emberjs.com/release/templates/actions/">Ember Octane Guides</a> section dealing with <code>@action</code>, the <code>{{on}}</code> modifier &amp; <code>{{fn}}</code> helper!</p>
<p>These updates to the Guides relate to event handling, binding of context and partial application of functions, and affect the way that actions are used in Ember Octane.</p>
<p>Check out the PR <a href="https://github.com/ember-learn/guides-source/pull/912">here</a>. For more context, see the <a href="https://www.pzuraq.com/ember-octane-update-action/">blog post</a> from <a href="https://github.com/pzuraq">@pzuraq</a>.</p>
<hr />
<h2 id="foreignkeyattrsblogposthttpsdavidtangio20190802handlingforeignkeyattributesinanapiwithemberdatahtml"><a href="https://davidtang.io/2019/08/02/handling-foreign-key-attributes-in-an-api-with-ember-data.html">Foreign Key Attrs Blog Post 🔑</a></h2>
<p>Ever have issues handling foreign key attributes in Ember Data?</p>
<p>Check out the <strong>clear and concise</strong> <a href="https://davidtang.io/2019/08/02/handling-foreign-key-attributes-in-an-api-with-ember-data.html">blog post</a> by <a href="https://github.com/skaterdav85">@skaterdav85</a> that continues his work on Ember Data.</p>
<p>The post includes good patterns that leverage the use of <code>belongsTo</code> in Ember Data and the necessary setups for serializers and adapters.</p>
<p>For a deeper dive you can also check out <a href="https://github.com/skaterdav85">@skaterdav85</a>'s <a href="https://leanpub.com/emberdatainthewild">book on Ember Data</a> and <a href="https://davidtang.io/2019/07/21/embedded-records-in-ember-data-with-json-api.html">other blog posts</a>.</p>
<hr />
<h2 id="thisjavascriptstateofframeworkshttpswwwthisdotcoeventsthisjavascriptstateofframeworks082019"><a href="https://www.thisdot.co/events/this-javascript-state-of-frameworks-08-2019">This.JavaScript: State of Frameworks 📜</a></h2>
<p>This.JavaScript is an online livestreamed event on <strong>Tuesday, August 13th</strong> - <a href="https://www.thisdot.co/events/this-javascript-state-of-frameworks-08-2019">RSVP to attend</a> and watch it with your teams at work!</p>
<p>The State of Frameworks event is an opportunity for folks in the JS community from different frameworks and libraries to learn from each other and connect. You'll learn about upcoming releases, latest improvements, and community initiatives. <a href="https://github.com/jenweber">@jenweber</a> will be representing Ember and speaking about Octane! She'll be joined by <a href="https://github.com/yyx990803">@yyx990803</a> of Vue, <a href="https://github.com/mhdawson">@mhdawson</a> of Node.js, <a href="https://github.com/marvinhagemeister">@marvinhagemeister</a> of Preact, <a href="https://github.com/mhartington">@mhartington</a> of Ionic, and <a href="https://github.com/mgechev">@mgechev</a> of Angular!</p>
<hr />
<h2 id="learnallaboutjamstackspoweredbyemberhttpswwwyoutubecomwatchvwl66d0br0rqfeatureyoutubet780"><a href="https://www.youtube.com/watch?v=WL66D0bR0RQ&feature=youtu.be&t=780">Learn All About JAM Stacks Powered By Ember 🍓</a></h2>
<p>There are many different roads that lead developers to building fast, secure and performant websites. And one of them is by the means of the <strong>JAM Stack</strong>.</p>
<p>A site built on the JAMstack is often consisting of a mix of <strong>J</strong>avaScript, reusable and/or third-party <strong>A</strong>PIs as well as static, ready-to-render <strong>M</strong>arkup. The one obligatory feature of a JAMstack site, is that it is can be run without a dedicated web server. Common examples of tools that allow you build JAMstack sites are static site generators like Jekyll, Hugo, GatsbyJS among many others.</p>
<!-- alex ignore king-queen -->
<p>In his talk <strong>Empress - JAM Stack Templates for Human Beings</strong> at <a href="https://leedsjs.com/">LeedsJS</a> - <a href="https://github.com/mansona">@mansona</a> presents static site generation solutions that empower developers and designers alike to create fast and beautiful sites on the web. And surely enough: Empress' site generators are <strong>powered by Ember</strong>! 🐹</p>
<p>Be sure to check out the talk over on <a href="https://www.youtube.com/watch?v=WL66D0bR0RQ&feature=youtu.be&t=780">YouTube</a>, give a 👍 and your thoughts in the comments below!</p>
<hr />
<h2 id="versionedemberapilinksaddedtoemberguideshttpsgithubcomemberlearnguidessourcepull952"><a href="https://github.com/ember-learn/guides-source/pull/952">Versioned Ember API Links Added to Ember Guides 🔢</a></h2>
<p>In the 3.x series, the <a href="https://guides.emberjs.com/">Ember Guides</a> would send you to the <code>release</code> version of the Ember API documentation. Due to changes in Ember and Ember Data, often these redirects would lead you to nowhere.</p>
<p>To fix this issue, <a href="https://github.com/sivakumar-kailasam">@sivakumar-kailasam</a> took on the massive task of updating the links so that <strong>the version of Ember API matches that of Ember Guides when redirected</strong>. (Thank you!) 💖</p>
<p>The next steps are to fix remaining issues with 3.11 links and introduce tests to check for broken links. We appreciate you for your patience. If you notice additional broken links, please let the Ember Learning Team know in the <code>#dev-ember-learning</code> channel on <a href="https://discordapp.com/invite/emberjs">Discord</a>.</p>
<hr />
<h2 id="emberguidesupdateforcolocatedtemplateshttpsgithubcomemberlearnguidessourcepull977"><a href="https://github.com/ember-learn/guides-source/pull/977">Ember Guides Update for Co-Located Templates ☝️</a></h2>
<p><a href="https://github.com/chancancode">@chancancode</a> made an update for co-located templates in the <a href="https://guides.emberjs.com/release/getting-started/quick-start/">Quick Start</a> and <a href="https://guides.emberjs.com/release/getting-started/core-concepts/">Core Concepts</a> subsections of the <a href="https://guides.emberjs.com/release/getting-started/">Getting Started</a> section of the <a href="https://guides.emberjs.com/">Ember Guides</a>.</p>
<p>These changes are part of the work for updating Octane documentation. If you are interested in helping out check out the <a href="https://github.com/ember-learn/guides-source/issues/669">Quest Issue for Releasing the Octane Guides</a> on GitHub!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/ghislaineguerin" target="gh-user">@ghislaineguerin</a>, <a href="https://github.com/yohanmishkin" target="gh-user">@yohanmishkin</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/antydemant" target="gh-user">@antydemant</a>, <a href="https://github.com/muziejus" target="gh-user">@muziejus</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/Exelord" target="gh-user">@Exelord</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/lolmaus" target="gh-user">@lolmaus</a>, <a href="https://github.com/makepanic" target="gh-user">@makepanic</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a> and <a href="https://github.com/aklkv" target="gh-user">@aklkv</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Jared Galanis, Isaac Lee, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-110</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-110</guid><pubDate>Fri, 09 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 111]]></title><description><![CDATA[<p>Здраво Emberistas! 🐹</p>
<!--alex ignore crash-->
<p>This week:
learn how to write async-aware tests 🕰️,
there's a new Zoey on the block 📷,
outer HTML semantics on the Crash Log Podcast 🎙,
and last, but not least,
the release of Ember Table 2.0 🎉!</p>
<!-- READMORE -->
<hr />
<h2 id="settledownemberstestframeworkhasyourasynccoveredhttpswwwlinkedincompulsesettledownemberstestframeworkhasyourasynccoveredcalvert"><a href="https://www.linkedin.com/pulse/settle-down-embers-test-framework-has-your-async-covered-calvert/">Settle Down; Ember's Test Framework Has Your Async Covered 🕰️</a></h2>
<!-- alex ignore easy -->
<p>"The Ember community has spent a lot of time thinking about how to make your tests easy to write, dependable, and most importantly, <strong>async aware</strong>." It's easy in Ember to ensure that your synchronous tests wait for asynchronous actions to complete. 💎</p>
<p><a href="https://github.com/scalvert">@scalvert</a> gives a great overview of how the <a href="https://github.com/emberjs/ember-test-helpers/blob/master/addon-test-support/@ember/test-helpers/settled.ts"><code>settled</code></a> helper plays a pivotal role. Thanks to <code>settled</code>, the test helpers that we use every day⁠—<code>render</code>, <code>click</code>, <code>visit</code>, and <code>triggerEvent</code>⁠—know when async operations have completed. We can also use <code>settled</code> directly to complete an async operation that <a href="https://github.com/emberjs/ember-test-helpers"><code>@ember/test-helpers</code></a> doesn't manage.</p>
<p>The author also covers 2 additional tools that help us write async-aware tests:</p>
<ul>
<li><a href="https://github.com/rwjblue/ember-test-waiters">ember-test-waiters</a>, to mark the start and end of an async operation that <code>@ember/test-helpers</code> doesn't manage</li>
<li><a href="https://github.com/emberjs/ember-qunit/blob/master/docs/TEST_ISOLATION_VALIDATION.md">test isolation validation</a>, to detect async leakage in tests</li>
</ul>
<p>So what are you <em>waiting</em> for? Learn how you can write async-aware tests in Ember today!</p>
<hr />
<h2 id="newempresszoeyhttpstwittercommelaniersumnerstatus1156652744092069888"><a href="https://twitter.com/melaniersumner/status/1156652744092069888">New Empress Zoey 📷</a></h2>
<div class="blog-row">
  <img class="float-right extra-small transparent padded" alt="Empress Zoey" title="Empress Zoey" src="/images/tomsters/empress.png" />

  <p>You might recall that we wrote about <a href="https://github.com/mansona">@mansona</a>'s talk on <a href="https://www.youtube.com/watch?v=WL66D0bR0RQ&feature=youtu.be&t=780">Empress</a>,
  Ember's static site/JAMStack product, <a href="https://the-emberjs-times.ongoodbits.com/2019/08/09/issue-110">last week</a>.
  Hopefully, you'll be inspired to build your own <a href="https://github.com/empress/empress-blog">empress-blog</a> template even if you only know HTML and CSS.
  <strong>But wait, there's more!</strong></p>

  <p>Empress now has a <a href="https://emberjs.com/mascots/">Zoey mascot</a> of its own, joining a fabulous crowd of Zoeys and Tomsters. Check out <a href="https://github.com/empress">Empress on GitHub</a>.</p>
  <!--alex enable king-queen-->  
</div>
<hr />
<h2 id="embertable20releasehttpsmediumcombuildaddeparembertable20release5b91903f3e34"><a href="https://medium.com/build-addepar/ember-table-2-0-release-5b91903f3e34">Ember Table 2.0 Release 🎉</a></h2>
<p><a href="https://github.com/Addepar/ember-table">Ember Table 2.0</a> (“ET2”) has been rewritten from the ground up to be even more performant and flexible to use cases and was officially launched! <a href="https://github.com/Addepar/ember-table-legacy">Ember Table 1.0</a> has been renamed to “ember-table-legacy” to avoid confusion.</p>
<p>Some key features that ET2 provides:</p>
<ul>
<li>fixed headers, footers, and columns</li>
<li>column resizing and reordering</li>
<li>ability to render thousands of rows performantly via occlusion rendering (leveraging <a href="https://github.com/html-next/vertical-collection">vertical-collection</a>)</li>
<li>compatibility with Ember versions 1.13 through 3.10, with a progressively improved API</li>
</ul>
<p>Questions or comments? Read the <a href="https://opensource.addepar.com/ember-table/docs/">Ember Table docs</a>, file an issue on <a href="https://github.com/Addepar/ember-table">GitHub</a>, or join us in the #topic-tables channel in the <a href="https://discordapp.com/invite/zT3asNS">community Discord</a>!</p>
<hr />
<!-- alex ignore crash -->
<h2 id="learnabouthtmlscopesandfastbootcomplexitywiththecrashlogpodcasthttpscrashlogtransistorfmepisodesepisode6"><a href="https://crashlog.transistor.fm/episodes/episode-6">Learn about HTML Scopes and Fastboot Complexity with the Crash Log Podcast 🎙</a></h2>
<p>One of Ember Octane's most prominent and exciting features - <a href="https://emberjs.github.io/rfcs/0416-glimmer-components.html">Glimmer Components</a> - approaches HTML semantics of components in a new way: In contrast to traditional components, Glimmer components default to <strong>outer HTML semantics</strong>, meaning, whichever root HTML element you see declared in your component's template file, is what you're going to get rendered in the DOM.</p>
<!-- alex ignore crash -->
<p>In the latest <a href="https://crashlog.transistor.fm/episodes/episode-6">episode on the Crash Log Podcast</a> you can now tune into an interesting discussion about the meaning of outer HTML semantics in Glimmer Components and how it affects developer ergonomics. Your podcast presenters <a href="https://twitter.com/knownasilya">@knownasilya</a> and <a href="https://twitter.com/davewasmer">@davewasmer</a> will also chat about <a href="https://emberjs.github.io/rfcs/0435-modifier-splattributes.html">Splatattributes</a> and how you can measure and investigate your app's performance when using <strong>Fasboot</strong>.</p>
<!-- alex ignore crash -->
<p>Listen to the full episode on <a href="https://crashlog.transistor.fm/episodes/episode-6">the Crash Log Podcast website</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/jrowlingson" target="gh-user">@jrowlingson</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/NullVoxPopuli" target="gh-user">@NullVoxPopuli</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/llunn" target="gh-user">@llunn</a>, <a href="https://github.com/dnalagatla" target="gh-user">@dnalagatla</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/ryanolsonx" target="gh-user">@ryanolsonx</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/sdebarros" target="gh-user">@sdebarros</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/CvX" target="gh-user">@CvX</a>, <a href="https://github.com/dgeb" target="gh-user">@dgeb</a>, <a href="https://github.com/makepanic" target="gh-user">@makepanic</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/chiragpat" target="gh-user">@chiragpat</a> and <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Jessica Jordan, Isaac Lee and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-111</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-111</guid><pubDate>Fri, 16 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 112]]></title><description><![CDATA[<p>Gi suilon Emberistas! 🐹</p>
<p>This week:
announcing the official Ember Octane release plan 🏎🐹,
watch talks from the first Chennai EmberJS Meetup 🇮🇳,
read up on fun state management using Microstates 💡,
get your tickets to EmberCamp Chicago 🍕,
and last, but not least,
help improve the <code>EmberArray</code> documentation 👩‍💻👨‍💻!</p>
<!-- READMORE -->
<hr />
<h2 id="emberoctaneiscominghttpsblogemberjscom20190815octanereleaseplanhtml"><a href="https://blog.emberjs.com/2019/08/15/octane-release-plan.html">Ember Octane Is Coming 🏎🐹</a></h2>
<p>The time has come: <a href="https://emberjs.com/editions/">Ember Octane</a> is coming to your Ember application very soon!
As <a href="https://blog.emberjs.com/2019/08/15/octane-release-plan.html">recently announced in the official Ember Octane release plan</a>, the very first edition of Ember is going to be released at the same time as the planned release date of Ember v3.14.</p>
<p>But what does it mean? By the time Ember 3.14 is published, the framework will include all Octane-related features and enable them by default. Additionally, the "Octane way" will be the primary and recommended way to build Ember apps. This will also be reflected in Ember's official documentation (<a href="https://api.emberjs.com/ember/release">API Docs</a> and <a href="https://octane-guides-preview.emberjs.com/release/upgrading/editions/">Guides</a>) and migration tools.</p>
<p>Wanna learn more about what is going to happen between now and the time Ember Octane lands? Looking for support for migrating and testing your apps with the Octane feature set? Be sure to give the <a href="https://blog.emberjs.com/2019/08/15/octane-release-plan.html">official release plan a read</a>, join the discussion on the <a href="https://discordapp.com/channels/480462759797063690/608346628163633192">#topic-octane-migration</a> channel on the <a href="https://discordapp.com/invite/zT3asNS">Ember Discord</a> and <strong>get ready for Octane</strong>!</p>
<hr />
<h2 id="firstchennaiemberjsmeetuphttpswwwyoutubecomplaylistlistplh_rf0qob_sx79ydqa4945ebouly3axx1"><a href="https://www.youtube.com/playlist?list=PLh_rF0Qob_sx79YDqa4945EbOuly3AXX1">First Chennai EmberJS Meetup 🇮🇳</a></h2>
<p>On August 3, Chennai EmberJS featured 6 speakers at their inaugural Meetup: <a href="https://github.com/gokatz">@gokatz</a>, <a href="https://github.com/g13n">@g13n</a>, <a href="https://github.com/kandhavivekraj">@kandhavivekraj</a>, <a href="https://github.com/astronomersiva">@astronomersiva</a>, <a href="https://twitter.com/pranith024">@pranith024</a>, and <a href="https://github.com/rajasegar">@rajasegar</a>! They covered various topics, including Ember Octane, tuning web performance, accessibility, differential bundling, JAM stack, and how ASTs (abstract syntax trees) fuel codemods and help us <a href="https://github.com/rajasegar/ember-docgen">auto-document Ember components</a>. 💖</p>
<p>You can <a href="https://www.youtube.com/playlist?list=PLh_rF0Qob_sx79YDqa4945EbOuly3AXX1">watch all six talks today on YouTube</a>. To learn more about Chennai EmberJS, you can visit their <a href="https://chennaiemberjs.in/">website</a> and follow them on <a href="https://twitter.com/EmberChennai">Twitter</a>, <a href="https://www.meetup.com/Chennai-EmberJS/">Meetup</a>, and the <a href="https://discordapp.com/channels/480462759797063690/562648585980739616"><code>#as-india</code></a> channel on <a href="https://discordapp.com/invite/zT3asNS">Discord</a>!</p>
<hr />
<h2 id="funstatemanagementwithemberandmicrostateshttpsmediumcombrandynlbennettfunstatemanagementwithemberandmicrostatese6027a9dedb9"><a href="https://medium.com/@brandynlbennett/fun-state-management-with-ember-and-microstates-e6027a9dedb9">Fun State Management with Ember and Microstates 💡</a></h2>
<p><a href="https://github.com/brandynbennett">@brandynbennett</a> details his experience using <a href="https://github.com/microstates/microstates.js">Microstates.js</a> as an alternative to <a href="https://discuss.emberjs.com/t/readers-questions-what-is-meant-by-the-term-data-down-actions-up/15311">DDAU</a>. He describes how him and his team created complex tables in their app's UI that requires a lot of state to be passed around. The DDAU strategy, in this scenario, was unwieldy due to the number of arguments needed to set and difficult to keep in sync as they had to refetch the data for each event such as a sort happens.</p>
<p><a href="https://github.com/microstates/microstates.js">Microstates.js</a> provided immutability so that any change to the state will make all the <code>didReceiveAttrs</code> hooks and computed properties update while also guarding it from being changed by child components. It also provided helpers and macros that would automatically update the component properties when the state has changed, eliminating the need to pass an action for each piece of state.</p>
<p>Read the <a href="https://medium.com/@brandynlbennett/fun-state-management-with-ember-and-microstates-e6027a9dedb9">full blog post</a> to see the tradeoffs and potential pitfalls when state management is done with Ember and Microstates.</p>
<hr />
<h2 id="learnaboutmodernemberatembercampchicagohttpembercampcom"><a href="http://embercamp.com">Learn about Modern Ember at EmberCamp Chicago 🍕</a></h2>
<p><a href="http://embercamp.com/"><strong>EmberCamp Chicago</strong></a> is around the corner! Join the community on <strong>September 16th, 2019</strong> for the second annual edition of the event, hosting 150+ of the world’s top Ember developers for a full day of Ember talks.</p>
<p>Learn all about modern Ember patterns, Embroider, insightful case studies from community leaders such as <a href="https://twitter.com/eaf4">Edward Faulkner</a>, <a href="https://twitter.com/jwwweber">Jen Weber</a>, <a href="https://twitter.com/dgeb">Dan Gebhardt</a>, <a href="https://twitter.com/mariechatfield">Marie Chatfield</a> and many others!</p>
<p>Check out the full <a href="http://embercamp.com/speakers">talk schedule</a> and get <a href="https://www.eventbrite.com/e/embercamp-chicago-2019-registration-63595006376">your tickets today before they are sold out</a>!</p>
<hr />
<h2 id="helpimprovetheemberarraydocumentationhttpsgithubcomemberjsemberjsissues18228"><a href="https://github.com/emberjs/ember.js/issues/18228">Help Improve the <code>EmberArray</code> documentation 👩‍💻👨‍💻</a></h2>
<p><a href="https://github.com/locks">@locks</a> asks for your help with improving the documentation for <a href="https://api.emberjs.com/ember/release/classes/EmberArray"><code>EmberArray</code></a>. The goal is to review each method and property of <code>EmberArray</code> and see if we can provide a better explanation and code sample.</p>
<p>If you have time to help, please <a href="https://github.com/emberjs/ember.js/issues/18228">visit the GitHub issue and create a pull request</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/hellomattio" target="gh-user">@hellomattio</a>, <a href="https://github.com/mukilane" target="gh-user">@mukilane</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/SYU15" target="gh-user">@SYU15</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/snewcomer" target="gh-user">@snewcomer</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/ansmonjol" target="gh-user">@ansmonjol</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/patricklx" target="gh-user">@patricklx</a>, <a href="https://github.com/pete-the-pete" target="gh-user">@pete-the-pete</a> and <a href="https://github.com/jenweber" target="gh-user">@jenweber</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-112</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-112</guid><pubDate>Fri, 23 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 113]]></title><description><![CDATA[<p>Tach Emberistas! 🐹</p>
<p>This week:
brand new content in the Ember Guides 🤓,
use Ember Engines and Yarn Workspaces to maximize happiness 🤗,
add visual regression testing to your Ember app using ember-backstop 🧪,
and last, but not least,
learn how Ember is organised and thrives 🌺!</p>
<!-- READMORE -->
<hr />
<h2 id="checkoutnewcontentintheofficialemberguideshttpsguidesemberjscomrelease"><a href="https://guides.emberjs.com/release/">Check Out New Content in the Official Ember Guides 🐹🤓</a></h2>
<p>The most popular learning resource for early and advanced Ember developers,
the <a href="https://guides.emberjs.com/release/">Guides</a>, is waiting up for you with some <strong>brand new content</strong>!</p>
<p>The Guides now features a <a href="https://guides.emberjs.com/release/accessibility/">new section</a> entirely dedicated to <strong>accessibility</strong>. It teaches you how to create your own accessibility strategy for your application, and how to implement keyboard accessible, screenreader accessible and overall barrier-free user interfaces with Ember. If you haven't done so, be sure to <a href="https://guides.emberjs.com/release/accessibility/">check it out today</a> and leave either feedback or support for improving this section in the <a href="https://discordapp.com/channels/480462759797063690/480523441082990612">#topic-a11y channel</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Discord</a>- and thanks to <a href="https://github.com/melsumner">@melsumner</a> for working on it!</p>
<p>Additionally, a soon-to-be-released version of the Guides will shine with <a href="https://octane-guides-preview.emberjs.com/release/testing/">a revamp of the testing guidelines</a>. In particular, the introduction to testing has been updated and a new section explaining the different types of tests in Ember apps has been <a href="https://octane-guides-preview.emberjs.com/release/testing/test-types/">added</a>. Many thanks to both <a href="https://github.com/ijlee2">@ijlee2</a> for working on the <a href="https://github.com/ember-learn/guides-source/pull/964">update</a> and <a href="https://github.com/toddjordan">@toddjordan</a> for the detailed review and suggestions!</p>
<hr />
<h2 id="howtowriteareallyreallyambitiousspain2019httpsmediumcomlukedenistonhowtowriteareallyreallyambitiousspain201960fc38de89db"><a href="https://medium.com/@lukedeniston/how-to-write-a-really-really-ambitious-spa-in-2019-60fc38de89db">How to Write a Really, Really Ambitious SPA in 2019 🤗</a></h2>
<p>When building enterprise applications with many routes, <a href="https://ember-engines.netlify.app/">Ember Engines</a> can help you <strong>lazy-load <a href="https://ember-engines.netlify.app/guide/what-are-engines">engines</a> for better user experience</strong> and <strong>encapsulate code for better developer experience</strong>.</p>
<p>Ember Engines, by itself, isn't perfect, however. <a href="https://github.com/luketheobscure">@luketheobscure</a> shared his team's experiences of having to manually update versions (making pull requests across three different repos) to fix a single bug.</p>
<p>By introducing <a href="https://yarnpkg.com/lang/en/docs/workspaces/">Yarn Workspaces</a>, Luke got to eliminate this step. Workspaces also allowed him to introduce live reload, share config files across packages, and ensure certain dependencies to be on the same version across packages.</p>
<p>To learn more about using Workspaces, please check out <a href="https://medium.com/@lukedeniston/how-to-write-a-really-really-ambitious-spa-in-2019-60fc38de89db">his blog</a> today!</p>
<hr />
<h2 id="emberbackstopvisualregressiontestingtutorialhttpswwwlinkedincompulseemberbackstopvisualregressiontestingtutorialgarrisshipon"><a href="https://www.linkedin.com/pulse/ember-backstop-visual-regression-testing-tutorial-garris-shipon/">Ember-Backstop Visual Regression Testing Tutorial 🧪</a></h2>
<p><a href="https://github.com/garris">@garris</a> published a <a href="https://www.linkedin.com/pulse/ember-backstop-visual-regression-testing-tutorial-garris-shipon/">blog post</a> on how to add visual regression tests to your Ember application in 10 minutes with the <a href="https://github.com/garris/ember-backstop">ember-backstop</a> test-helper addon.</p>
<p>You can import <code>ember-backstop</code> into your application test and await it at a point in time where you want to run the visual regression testing. It will then serialize the snapshot of your DOM at that moment in time and it will send it to the <em>Backstop-Remote</em> service. The tutorial goes through how to verify, fix, and approve visual regression tests using the Backstop commands.</p>
<p>Check out the full tutorial by following along with the <a href="https://github.com/garris/ember-backstop-tutorial/">demo repository</a> or reading through the <a href="http://backstopjs.org/">BackstopJS website</a> for more information.</p>
<hr />
<h2 id="thrivingthroughthehypecycleanemberjsstoryhttpswwwyoutubecomwatchveckbva0ic4k"><a href="https://www.youtube.com/watch?v=ECkbVa0iC4k">Thriving Through the Hype Cycle: an Ember.js Story 🌺</a></h2>
<p>In addition to amazing Ember conferences, a lot of people are promoting Ember and sharing Ember wisdom at other conferences. <a href="https://github.com/locks">@locks</a> told about <code>Thriving through the hype cycle: an Ember.js story</code> at <a href="https://commitporto.com/">CommitPorto '19</a>. This <a href="https://www.youtube.com/watch?v=ECkbVa0iC4k">talk</a> gives great insights into how Ember, as a framework, is organised. Nothing too technical, but a nice peak in the kitchen of Ember.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/jrjohnson" target="gh-user">@jrjohnson</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/jontonsoup4" target="gh-user">@jontonsoup4</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/snewcomer" target="gh-user">@snewcomer</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a> and <a href="https://github.com/melsumner" target="gh-user">@melsumner</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Anne-Greeth van Herwijnen, Isaac Lee, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-113</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-113</guid><pubDate>Fri, 30 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 114]]></title><description><![CDATA[<p>Hiya Emberistas! 🐹 This week:
read the Octane Update for the Modern Ember Tutorial 🎁,
participate in the discussion of deprecating eventing 💬,
join the crowd at EmberFest 2019 🐹🎉,
and suggest ideas for the upcoming Ember Octane issue ✍️!</p>
<!-- READMORE -->
<hr />
<!-- alex disable easy -->
<h2 id="emberoctaneupdateformodernembertutorialhttpscodingitwrongcom20180816modernemberhtml"><a href="https://codingitwrong.com/2018/08/16/modern-ember.html">Ember Octane Update for Modern Ember Tutorial 🎁</a></h2>
<p><a href="https://github.com/CodingItWrong">@CodingItWrong</a> updated his <a href="https://codingitwrong.com/2018/08/16/modern-ember.html">Modern Ember</a> tutorial to use <a href="https://github.com/ember-cli/ember-octane-blueprint">octane-app-blueprint</a>.</p>
<p>This tutorial provides an intro to:</p>
<ul>
<li>Angle bracket syntax for components</li>
<li>Easy ES6 imports of NPM modules</li>
<li>Decorators for clear and expressive component implementations</li>
<li>Tracked properties to automatically rerender components and recompute derived data</li>
<li>and Co-locating component templates and classes for easy development</li>
</ul>
<p>Try out Ember Octane today which <a href="https://github.com/CodingItWrong">@CodingItWrong</a> calls the “simplest, most straightforward, most productive frontend framework!”</p>
<!-- alex enable easy -->
<hr />
<h2 id="emberistasfromeuropeandbeyondgetreadyforemberfest2019httpsemberfesteu"><a href="https://emberfest.eu/">Emberistas from Europe and Beyond: Get Ready for EmberFest 2019 🐹🎉</a></h2>
<p>If you're using Ember, you're based in Europe or you're planning your next trip there soon, be sure to mark <strong>October 17th and 18th</strong> on your calendar and join hundreds of other Emberistas for Europe's biggest Ember conference. <strong>EmberFest 2019</strong> will take place in Copenhagen, Denmark and feature <strong>16+ talks</strong> by community members such as <a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/ef4">Edward Faulkner (@ef4)</a> and <a href="https://github.com/cbroeren">Chantal Broeren (@cbroeren)</a>! If you're looking for updates on the latest and greatest in Ember and Glimmer, this is the place to be.</p>
<p>You can check out the <a href="https://emberfest.eu/schedule/">full schedule on the conference website</a> to get an idea of the topics talked about. You can also look forward to tasty and culturally intriguing city tours on October 16th, the day before the conference. Be sure to <a href="https://emberfest.eu/">secure your ticket before they sell out</a> and tell your colleagues and Ember friends!</p>
<p>Follow <a href="https://twitter.com/emberfest">@emberfest on Twitter</a> or subscribe to the <a href="https://emberfest.eu/#mc_embed_signup">official mailing list</a> to stay up to date. See you at <a href="https://emberfest.eu/">EmberFest 2019</a> soon!</p>
<hr />
<h2 id="rfcfordeprecatingeventingfromemberhttpsgithubcomemberjsrfcspull528"><a href="https://github.com/emberjs/rfcs/pull/528">RFC for Deprecating Eventing from Ember 💬</a></h2>
<p><a href="https://github.com/ggayowsky">@ggayowsky</a> asks for your feedback for deprecating the <strong>eventing</strong> pattern from Ember. The motivation stems from the fact that Ember no longer uses eventing, thanks to the work done for <a href="https://emberjs.com/editions/octane/">Octane</a>. By deprecrating it, we can <a href="https://github.com/emberjs/rfcs/blob/2018-2019-roadmap/text/0519-2018-2019-roadmap.md#continue-simplifying-ember">simplify Ember and follow the 2019-2020 Roadmap</a>.</p>
<p>In particular, Gerald <a href="https://github.com/ggayowsky/rfcs/blob/deprecate-evented-mixin/text/0000-deprecate-evented-mixin.md">proposes that we target deprecating</a> the <a href="https://api.emberjs.com/ember/release/classes/Evented"><code>Evented</code> mixin</a> and methods from <a href="https://api.emberjs.com/ember/release/modules/@ember%2Fobject#functions-events"><code>@ember/object/events</code></a> and <a href="https://api.emberjs.com/ember/release/modules/@ember%2Fobject#functions-evented"><code>@ember/object/evented</code></a> packages. If you need to still use the eventing pattern, you could use a <a href="https://github.com/ggayowsky/rfcs/blob/deprecate-evented-mixin/text/0000-deprecate-evented-mixin.md#transition-path">well-supported, third-party library</a> instead.</p>
<p>For more information about eventing and the plan to deprecate it from Ember, please <a href="https://github.com/emberjs/rfcs/pull/528">check out the RFC</a> today. Be sure to provide your feedback and help!</p>
<hr />
<h2 id="suggestideasforanupcomingemberoctaneissuehttpsgithubcomemberlearnemberblogpull261"><a href="https://github.com/ember-learn/ember-blog/pull/261">Suggest Ideas for an Upcoming Ember Octane Issue! ✍️</a></h2>
<!--alex ignore special-->
<p>Your friendly neighborhood writers from <a href="https://blog.emberjs.com/tags/newsletter.html">The Ember Times</a> here! We would like your help with creating a special Ember Octane issue.</p>
<p>When it comes to Octane:</p>
<ul>
<li>What content would you like to see?</li>
<li>Do you have leads for coverage?</li>
<li>Any other feedback and suggestions!</li>
</ul>
<p>Feel free to chat with us today at the <a href="https://discordapp.com/channels/480462759797063690/485450546887786506"><code>#support-ember-times</code> channel</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a>, or comment on this <a href="https://github.com/ember-learn/ember-blog/pull/261">pull request on GitHub</a>.</p>
<p>Thanks, and have a great day! 💞</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/mukilane" target="gh-user">@mukilane</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/ggayowsky" target="gh-user">@ggayowsky</a>, <a href="https://github.com/bertdeblock" target="gh-user">@bertdeblock</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/ClaytonTurner" target="gh-user">@ClaytonTurner</a>, <a href="https://github.com/ppphp" target="gh-user">@ppphp</a>, <a href="https://github.com/rnegron" target="gh-user">@rnegron</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a> and <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-114</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-114</guid><pubDate>Fri, 06 Sep 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 115]]></title><description><![CDATA[<p>👋 Embereños! This week: Meet <code>@model</code> for route templates 🆕,
share your thoughts on Apple Music being an Ember app 🍎,
contribute to Octanify allthethings 📝,
a designer's &amp; developer's story of transitioning to Ember ⚛️➡️🐹,
and celebrate the 4.0 release of Ember Sinon QUnit 🎉!</p>
<!-- READMORE -->
<hr />
<h2 id="meetmodelforroutetemplateshttpsgithubcomemberjsrfcsblobac27abbd1729cd61b67465eee4c8096bb47501datext0523modelargumentforroutetemplatesmd"><a href="https://github.com/emberjs/rfcs/blob/ac27abbd1729cd61b67465eee4c8096bb47501da/text/0523-model-argument-for-route-templates.md">Meet <code>@model</code> for Route Templates 🆕</a></h2>
<p>Starting with Ember Octane (3.14), you can use a <strong>named argument</strong>, <code>@model</code>, in the route template to refer to your data from the <code>model()</code> hook. The <a href="https://octane-guides-preview.emberjs.com/">Ember Octane Guides</a> have been <a href="https://github.com/ember-learn/guides-source/pull/1044">updated</a> to show uses of <code>@model</code>.</p>
<pre><code class="handlebars language-handlebars">&lt;h2&gt;List of Scientists&lt;/h2&gt;

&lt;ul&gt;
  {{#each @model as |scientist|}}
    &lt;li&gt;{{scientist}}&lt;/li&gt;
  {{/each}}
&lt;/ul&gt;
</code></pre>
<p><a href="https://github.com/emberjs/rfcs/blob/ac27abbd1729cd61b67465eee4c8096bb47501da/text/0523-model-argument-for-route-templates.md"><code>@model</code> was introduced</a> to help new developers quickly learn templates. By avoiding <code>this.model</code>, they would not need to understand another concept—the controller—to build their first Octane app. By using a named argument, we can also reinforce the idea that <code>@</code> is used to denote things that are "passed as arguments" to the template.</p>
<p>You can <a href="https://github.com/emberjs/ember.js/pull/18363/files">try out <code>@model</code> now on canary</a>, or wait for 3.14 beta next week!</p>
<hr />
<h2 id="applemusiclaunchesanemberapphttpsdiscussemberjscomtapplemusicbetaisanemberapp17026"><a href="https://discuss.emberjs.com/t/apple-music-beta-is-an-ember-app/17026">Apple Music Launches an Ember App 🍎</a></h2>
<p>The Apple Music web application <a href="https://www.theverge.com/2019/9/5/20851576/apple-music-web-player-interface-beta-browser-streaming">was launched</a> for public beta for subscribers at <a href="https://beta.music.apple.com">beta.music.apple.com</a>. <a href="https://www.reddit.com/r/webdev/comments/d0hdeo/the_new_official_apple_music_app_for_the_web_is/?utm_source=ifttt">Through</a> <a href="https://www.reddit.com/r/emberjs/comments/d06pcn/new_apple_music_web_app_built_in_ember/">several</a> <a href="https://www.linkedin.com/feed/update/urn:li:activity:6575525024327884800/">reports</a>, it was <a href="https://www.linkedin.com/feed/update/urn:li:activity:6575756074194993152/">confirmed</a> that the new Apple Music website is an Ember application. Furthermore, the new <a href="https://tv.apple.com">tv.apple.com</a> landing and content pages are also <a href="https://twitter.com/mehulkar/status/1171579484115353605">built with Ember</a>!</p>
<p><a href="https://discuss.emberjs.com/t/apple-music-beta-is-an-ember-app/17026">Share your thoughts</a> on having more high profile examples of Ember applications!</p>
<hr />
<h2 id="apidocupdateshttpsgithubcomemberjsemberjspullsutf8qis3apris3aclosed5bdoc5d"><a href="https://github.com/emberjs/ember.js/pulls?utf8=✓&q=is%3Apr+is%3Aclosed+%5BDOC%5D">API Doc Updates 📝</a></h2>
<p>Thanks to <a href="https://github.com/locks">Ricardo Mendes (@locks)</a> and team for working on <a href="https://github.com/emberjs/ember.js/pulls?utf8=✓&q=is%3Apr+is%3Aclosed+%5BDOC%5D">Octanify-ing the API docs</a>! These documentation upgrades are part of the <a href="https://github.com/emberjs/ember.js/issues/18250">Quest Issue</a> to update the API docs to show Octane and Native Classes. <a href="https://github.com/jenweber">Jen Weber (@jenweber)</a> has provided <strong>detailed step-by-step instructions</strong>, a YUIDoc styleguide, and some examples on the <a href="https://github.com/emberjs/ember.js/issues/18250">Quest Issue</a>, encouraging interested contributors to post in <a href="https://discordapp.com/channels/480462759797063690/480777444203429888">#dev-ember-learning</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Discord</a> with any questions.</p>
<p>Another API docs issue that is gaining steam is <a href="https://github.com/emberjs/ember.js/issues/18228">Improve documentation of EmberArray</a>. Going through <a href="http://api.emberjs.com/ember/release/classes/EmberArray">http://api.emberjs.com/ember/release/classes/EmberArray</a>, you will notice that some of the entries have minimal documentation and no code sample. The goal is to review each entry, add code samples where missing, and optionally improve the prose. Comment on the thread in the <a href="https://github.com/emberjs/ember.js/issues/18228">EmberArray issue</a> to contribute.</p>
<p>For even more ways to get involved in the open source community, check out the <a href="https://help-wanted.emberjs.com/">Ember Help Wanted App</a>!</p>
<hr />
<h2 id="whatmakesthetransitiontoemberworthwhileanewcommunitymembersperspectivehttpstwittercomlenoraporter_status1170145563549061122"><a href="https://twitter.com/lenoraporter_/status/1170145563549061122">What Makes the Transition to Ember Worthwhile: A New Community Member's Perspective 🐹</a></h2>
<p>In a recent <a href="https://twitter.com/lenoraporter_/status/1170145563549061122">tweet</a>, Senior Product Designer <a href="https://twitter.com/lenoraporter_">Lenora Porter (@lenoraporter_)</a>
shared a <a href="https://www.instagram.com/tv/B2CCM60AOZG/?igshid=12ivaiobj1y8h">video</a> to pitch the <strong>most interesting learnings</strong> about Ember to those transitioning from other tech stacks.</p>
<p>Lenora, who has prior experience in React, talks about useful learning resources for those starting out Ember and what makes the transition worthwhile. In addition to Convention over Configuration and integrated tooling, she highlights how a supportive community makes learning Ember very straightforward.</p>
<p>Be sure to check out <a href="https://www.instagram.com/tv/B2CCM60AOZG/?igshid=12ivaiobj1y8h">the full video</a> and share with your JavaScript friends!</p>
<hr />
<h2 id="embersinonqunit40releasedhttpstwittercomjordanhawkerstatus1170107247118053376"><a href="https://twitter.com/JordanHawker/status/1170107247118053376">Ember Sinon QUnit 4.0 Released 🎉</a></h2>
<p><a href="https://github.com/elwayman02">Jordan Hawker (@elwayman02)</a> and <a href="https://github.com/scalvert">Steve Calvert (@scalvert)</a> teamed up to bring us the best <a href="https://sinonjs.org/">Sinon.js</a> experience possible. 💞</p>
<p>Thanks to their work, <a href="https://github.com/elwayman02/ember-sinon-qunit">ember-sinon-qunit v4</a> allows us to do a one-time setup, use the <code>sinon</code> object directly in our tests, and never worry about cleaning up mocks after the tests are run. To learn more about the motivation for change and the new syntax, you can check out <a href="https://www.jordanhawker.com/p/187541610821">Jordan's blog post</a> and the <a href="https://github.com/elwayman02/ember-sinon-qunit#usage">addon's README file</a>.</p>
<p>If you have been using Steve's <a href="https://github.com/scalvert/ember-sinon-sandbox">ember-sinon-sandbox</a> or <a href="https://github.com/scalvert/ember-sinon-sinoff">ember-sinon-sinoff</a>, please check the <a href="https://github.com/elwayman02/ember-sinon-qunit#migrating-to-ember-sinon-qunit">README file</a> to choose your migration path.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/happyvig" target="gh-user">@happyvig</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/imkathir" target="gh-user">@imkathir</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/wycats" target="gh-user">@wycats</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/bertdeblock" target="gh-user">@bertdeblock</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-115</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-115</guid><pubDate>Fri, 13 Sep 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 116]]></title><description><![CDATA[<p>🏄‍♂️ Emberistas! 🐹</p>
<p>Check out the new Octane Super Rentals Tutorial 🚀,
the 1st EmberJS Meetup in Nizhny 🥳,
and an Ember Times exclusive "I contribute to Ember" interview 📝 with Michelle Santarsiero!</p>
<!-- READMORE -->
<hr />
<h2 id="octanesuperrentalstutorialhttpsoctaneguidespreviewemberjscomreleasetutorial00part1"><a href="https://octane-guides-preview.emberjs.com/release/tutorial/00-part-1/">Octane Super Rentals Tutorial 🚀</a></h2>
<p><a href="https://github.com/chancancode">Godfrey Chan @chancancode</a> and <a href="https://github.com/vaidehijoshi">Vaidehi Joshi @vaidehijoshi</a> did some great work writing new tutorial content for Octane. You can now preview the <a href="https://octane-guides-preview.emberjs.com/release/tutorial/00-part-1/">revamped Super Rentals tutorial</a> in the <a href="https://octane-guides-preview.emberjs.com/">Octane guides</a>.</p>
<p>What’s more amazing about this <a href="https://super-rentals-tutorial--ember-super-rentals.netlify.com/">Super Rentals tutorial</a> is that it is <strong>automatically generated</strong>. It runs the commands from markdown files and edits the files the same way that the reader would. It even captures the output and screenshots for the published tutorial. This way, if any steps stopped working due to a change in Ember itself, we would know right away from a CI failure.</p>
<p>If you are looking to contribute, or if you have any feedback on the content, check out the <a href="https://github.com/ember-learn/super-rentals-tutorial">super-rentals-tutorial repo on GitHub</a>!</p>
<hr />
<h2 id="theinauguralemberjsnizhnynovgorodmeetuphttpstwittercomnatalifelstatus1159389541490417669"><a href="https://twitter.com/NataliFel/status/1159389541490417669">The Inaugural EmberJS Nizhny Novgorod Meetup 🥳</a></h2>
<div class="blog-row">
  <img class="float-right medium transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/blog/emberjstimes/nnember1.jpg" />
  <p>Recently, the Ember community of <strong>Нижний Новгород ("Nizhny Novgorod")</strong> came together
  for the first event of <a href="https://emberjs-nn.timepad.ru/events/" target="niz" rel="noopener">Nizhny's EmberJS meetup group</a>.
  The event was a huge success and featured insightful talks around JavaScript, Ember, testing best practices and much more.
  Event organiser <a href="https://twitter.com/NataliFel" target="natali" rel="noopener">Natasha Fel aka @NataliFel on Twitter</a> shared highlights from the meetup,
  including these amazing <a href="https://twitter.com/NataliFel/status/1170245679849099264" target="tomstercookies" rel="noopener">Tomster cookies</a>!</p>
</div>
<div class="blog-row">
  <img class="float-left small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/blog/emberjstimes/nnember2.jpg" />
  <p>Looking forward to see Ember events happen in your area, but don't know yet how to make this happen?
  Check out the <a href="https://emberjs.com/community/meetups/" target="meetups" rel="noopener">EmberJS meetup map</a>
  and find out if there's already a group in your town.</p>

  <p>Curious to start your own meetup group? Fantastic news — appreciate you stepping up!
  Running a solid meetup isn't all that complicated, but it can be intimidating: the Ember community would love to help you ease into it.
  Here are <a href="https://emberjs.com/community/meetups-getting-started" target="orgit" rel="noopener">some tips for first-time organisers</a>
  and you can find any <a href="https://emberjs.com/community/meetups/assets" target="asssets" rel="noopener">assets for your event over here</a>.</p>
</div>
<p>For any further questions, be sure to join the <a href="https://discordapp.com/invite/emberjs">Ember Discord chat</a> and ask for the correct role to
be added to the meetup organisers channel in <a href="https://discordapp.com/channels/480462759797063690/480499718330253342">#discord-server-admin</a>.</p>
<hr />
<h2 id="icontributetoemberwithmichellesantarsierohttpsdiscussemberjscomticontributetoemberwithmichellesantarsiero17069"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-michelle-santarsiero/17069">"I contribute to Ember" with Michelle Santarsiero 👩‍💻</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Michelle Santarsiero" title="Michelle Santarsiero - Contributor to Ember" src="/images/blog/emberjstimes/michelle_santarsiero.png" />
</div>
<p>In our <strong>twelfth edition</strong> of our contributor interview series, community member <a href="https://github.com/lonelyghost">Michelle Santarsiero @lonelyghost</a>, talks about her work on <strong>Ember Observer</strong>, her journey into open source, and her tips for making <strong>incremental progress</strong> when doing open source on the side. Thank you for your contributions to the Ember community, Michelle!</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-michelle-santarsiero/17069">the Ember Discuss Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-michelle-santarsiero/17069">Read more</a></p>
<p style="font-style: italic;">The idea behind these interviews is to provide community members with more information and insight into open source contributions, learning resources and community events. Contributors to the community gain a platform to share their thoughts on their own experiences and learnings as they were contributing to Ember. Our hope is that it gives first-time and advancing contributors a better sense of the fact that everyone starts out small, and that anyone can have a big impact on the community.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/jelhan" target="gh-user">@jelhan</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/delucks" target="gh-user">@delucks</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/maxwondercorn" target="gh-user">@maxwondercorn</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/happyvig" target="gh-user">@happyvig</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/snewcomer" target="gh-user">@snewcomer</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a> and <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-116</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-116</guid><pubDate>Fri, 20 Sep 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 117]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Celebrate the release of Ember 3.13 (Octane Preview) 🎉,
Adopted Ember Addons welcomes ember-sortable 🐣,
learn about what happened at EmberCamp 2019 🐹🏕,
read the updates to the Ember Octane Guides 🚀, and
check out the latest feature for Ember SVG Jar 📇!</p>
<!-- READMORE -->
<hr />
<h2 id="celebratethereleaseofember313octanepreviewhttpstwittercomkennethlarsenstatus1176948663861620739"><a href="https://twitter.com/kennethlarsen/status/1176948663861620739">Celebrate the Release of Ember 3.13 (Octane Preview) 🎉</a></h2>
<p><a href="https://emberjs.com/editions/octane/">Ember Octane (3.14)</a> is arriving soon! Today, in 3.13, you can try out all stable features of Octane, including 5 new features:</p>
<ul>
<li>Tracked properties (<code>@tracked</code>)</li>
<li>Component co-location (part 1)</li>
<li><code>component-class</code> generator</li>
<li>Build-time detection of edition for addon authors</li>
<li><code>updateComponent</code> hook for addon authors</li>
</ul>
<p>In addition, version 3.12 of Ember has now been promoted to LTS (Long Term Support). An LTS version of Ember will receive security updates for 9 release cycles (54 weeks) and bugfixes for 6 cycles (36 weeks).</p>
<p>We encourage you to learn more about the new features and migration path to 3.13 by <a href="https://blog.emberjs.com/2019/09/25/ember-3-13-released.html">checking out the official announcement</a>. We'd also appreciate your help with completing Octane documentation and testing 3.14 beta against your apps and addons. 💞</p>
<hr />
<h2 id="anewlyadoptedemberaddonhttpstwittercomalonskistatus1177577454711582720"><a href="https://twitter.com/Alonski/status/1177577454711582720">A newly adopted Ember Addon 🐣</a></h2>
<!--alex ignore white-->
<p><a href="https://github.com/adopted-ember-addons">Adopted Ember Addons</a> has adopted <a href="https://github.com/adopted-ember-addons/ember-sortable">ember-sortable</a>, an addon which provides Sortable UI primitives for Ember. The addon was created by <a href="https://github.com/jgwhite">Jamie White (@jgwhite)</a> over four years ago and he has been maintaining it all this time! The time has come however for the addon to get some new love ❤ under the Adopted Ember Addons umbrella.</p>
<p>The goal of Adopted Ember Addons is to give Ember addons a place to stay maintained when the original maintainer decides that they would like to pass the mantle. The <a href="https://github.com/adopted-ember-addons/program-guidelines">program guidelines</a> explain how the program works.</p>
<p>Maintaining these addons takes work by real people. The program is always on the lookout for helpful people to contribute and help maintain these addons. Ember wouldn't be where it is today without the amazing addon ecosystem. If you would like to help out in maintaining these addons, please come join us on <a href="https://discord.gg/emberjs">Discord in #adopted-ember-addons</a>. ❤</p>
<hr />
<h2 id="accessibilitycompilersecretsandmodernemberembercamphttpembercampcom"><a href="http://embercamp.com/">Accessibility, Compiler Secrets and Modern Ember @ EmberCamp 🐹</a></h2>
<p>Last week, the Ember community went on an extraordinary trip into the metropolitan wilderness of Illinois:
<a href="http://embercamp.com/"><strong>EmberCamp 2019</strong></a> took place in Chicago on September 16th and was insightful, exciting and entertaining as always!</p>
<p>With twelve, versed speakers, the schedule offered thoughtful insights into:</p>
<ul>
<li>What's new in Ember with its <a href="https://emberjs.com/editions/octane/">first edition, Octane</a></li>
<li>How <a href="https://github.com/embroider-build/embroider">Embroider</a> and Ember will literally build a future together</li>
<li>Everything you need to know to build <strong>accessible JavaScript apps</strong> in 2019</li>
<li>How to level up your app with <em>web workers</em>* and meaningful <strong>animations</strong></li>
<li>Strategies for stable and reliable test suites</li>
<li>…and many, many more topics!</li>
</ul>
<p>One particular highlight of the camping trip was the <a href="https://stackoverflow.blog/2019/09/20/meet-the-developer-who-took-stack-overflow-from-screen-to-stage/">"May I Ask a Question" live event</a>
that both <a href="https://twitter.com/jwwweber">Jen Weber (@jwwweber)</a> and <a href="https://twitter.com/nullvoxpopuli">Preston Sego (@nullvoxpopuli)</a> led and hosted, answering burning questions from the community.</p>
<p>A huge thank you to those who made this year's EmberCamp possible: kudos to the organizers <a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/EndangeredMassa">Sean Massa (@EndangeredMassa)</a>, <a href="https://github.com/trek">Trek Glowacki (@trek)</a>, <a href="https://github.com/dbollinger">Howie Bollinger (@dbollinger)</a> and all those who volunteered 🙇‍♂️</p>
<p>Missed out on the conference, but still want to catch up before the recordings are out?
Be sure to check out <a href="https://github.com/elwayman02">Jordan Hawker's (@elwayman02)</a> comprehensive <a href="https://github.com/elwayman02/embercamp/blob/master/2019.md">EmberCamp summary</a>, including talk notes and slides for the entire programme.</p>
<p>Can't wait to make it to the camping trip next year? Be sure to let the EmberCamp team know
<a href="https://twitter.com/embercamp">on Twitter</a> or via <a href="mailto:embercamp.chicago@gmail.com">old-school e-mail</a>!</p>
<hr />
<h2 id="updatestotheemberoctaneguideshttpsoctaneguidespreviewemberjscomreleaseupgradingeditionstoc_actiononandfn"><a href="https://octane-guides-preview.emberjs.com/release/upgrading/editions/#toc_action-on-and-fn">Updates to the Ember Octane Guides 🚀</a></h2>
<p><a href="http://www.github.com/pzuraq">Chris Garrett @pzuraq</a> added <code>@action</code>, <code>on</code>, and <code>fn</code> to the <a href="https://octane-guides-preview.emberjs.com/release/">Ember Octane edition guide</a> and updated it to <a href="https://github.com/ember-learn/guides-source/pull/1062">match the latest changes to the edition</a>.</p>
<p>Now the Octane Guides have documentation on how to use the new conventional APIs for creating and adding event handlers and actions to your components and templates:</p>
<ul>
<li>The <code>@action</code> decorator</li>
<li>The <code>{{on}}</code> modifier</li>
<li>The <code>{{fn}}</code> helper</li>
</ul>
<p>This <a href="https://github.com/ember-learn/guides-source/pull/1066">documentation change</a> provides much needed information on the benefits and how to get used to using these new APIs.</p>
<hr />
<h2 id="newfeatureassetsviewerforembersvgjarhttpstwittercomivanvottistatus1174387037983690753"><a href="https://twitter.com/ivanvotti/status/1174387037983690753">New Feature: Assets Viewer for Ember SVG Jar 📇</a></h2>
<!--alex ignore easy-->
<p><a href="https://svgjar.web.app/">Ember SVG Jar</a>, an addon that lets you easily add SVG images, now features the <strong>Assets Viewer</strong>. Think of Assets Viewer as a hub where you can <a href="https://svgjar-demo.web.app/">meet all SVG images available in your project</a>. You can search for the image that you need and copy the helper code to render that image in your app.</p>
<p>We encourage you to <a href="https://github.com/ivanvotti/ember-svg-jar">learn more about Ember SVG Jar</a> today. Please thank <a href="https://github.com/ivanvotti">Ivan Votti (@ivanvotti)</a> for his work!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/makepanic" target="gh-user">@makepanic</a>, <a href="https://github.com/ghislaineguerin" target="gh-user">@ghislaineguerin</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/melmerp" target="gh-user">@melmerp</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/zinyando" target="gh-user">@zinyando</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/maxwondercorn" target="gh-user">@maxwondercorn</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a> and <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Isaac Lee, Alon Bukai, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-117</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-117</guid><pubDate>Fri, 27 Sep 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 118]]></title><description><![CDATA[<p>Happy fall 🍂, Emberistas! 🐹</p>
<p>This week:
Podcast: The New Ember with Mike North 🎙️,
listen to 2 podcast episodes with Leah Silber 🎧,
celebrate Ember Madrid on stage at Codemotion 2019 🇪🇸,
EmberMap 🎥 on animating across routes with Ember Animated ✨,
ember-cli-typescript 3.0.0 release 💚, and
watch EmberCamp 2019 🍿🎥!</p>
<!-- READMORE -->
<hr />
<h2 id="podcastthenewemberwithmikenorthhttpsdevchattvjsjabberjsj395thenewemberwithmikenorth"><a href="https://devchat.tv/js-jabber/jsj-395-the-new-ember-with-mike-north/">Podcast: The New Ember with Mike North 🎙️</a></h2>
<p>A recent <a href="https://devchat.tv/js-jabber/">JavaScript Jabber</a> podcast had <a href="https://github.com/mike-north">Mike North @mike-north</a> discussing the “New Ember” and how it is a lot more approachable now. This “New Ember”, or <a href="https://emberjs.com/editions/octane/">Ember Octane</a>, brings Ember from having the steepest learning curve of the popular JavaScript frameworks to hardly having to learn anything at all.</p>
<!-- alex disable masters -->
<p>Mike also talks about how Ember provides stability for developers using them by having a long track record for providing tools and education to make the upgrade seamless and even have old components living next to brand new ones with updated syntax. As a testament to this, Mike mentions that his original Frontend Masters course – Intro to Ember – that was recorded in 2015 only required very minor changes to update it to the <a href="https://frontendmasters.com/courses/ember-octane/">version we have today</a>.</p>
<!-- alex enable masters -->
<p>Listen to the full podcast on <a href="https://devchat.tv/js-jabber/jsj-395-the-new-ember-with-mike-north/">JavaScript Jabber</a>!</p>
<hr />
<h2 id="leahsilberonopensourceprojectsandtechconferenceshttpswwwherokucompodcastscodeish35bringingopensourcetowork"><a href="https://www.heroku.com/podcasts/codeish/35-bringing-open-source-to-work">Leah Silber on Open Source Projects and Tech Conferences 🎧</a></h2>
<p><a href="https://github.com/wifelette">Leah Silber (@wifelette)</a>, the CEO of Tilde and organizer of <a href="https://emberconf.com/">EmberConf</a> and RustConf, appeared on <a href="https://www.heroku.com/podcasts/codeish">Code[ish]</a> to share her experiences with <a href="https://www.heroku.com/podcasts/codeish/35-bringing-open-source-to-work">bringing open source to work</a> and <a href="https://www.heroku.com/podcasts/codeish/37-bonus-organizing-a-memorable-tech-conference">organizing a memorable tech conference</a>. 💖</p>
<!--alex ignore just-->
<p>We highly encourage you to check out both episodes (written transcripts are available)! In just 45 minutes, you will learn about:</p>
<ul>
<li>The value of having a diverse team for open source projects</li>
<li>How to lead a team by showing respect, creating opportunities for them to meet their goals, and actively scouting for new talents</li>
<li>How to encourage a company to recognize the value of and contribute to open source projects</li>
<li>The advances made in accessibility and inclusivity in tech conferences, and how EmberConf addressed both over the past few years</li>
</ul>
<hr />
<h2 id="embermadridtakesstageatcodemotion2019httpseventscodemotioncomconferencesmadrid2019wpcontentthemeseventdetailtalkphpdetail14984"><a href="https://events.codemotion.com/conferences/madrid/2019/wp-content/themes/event/detail-talk.php?detail=14984">Ember Madrid Takes Stage at Codemotion 2019 🇪🇸</a></h2>
<p>Much thanks to <a href="https://github.com/shokmaster">Juan Antonio Gómez (@shokmaster)</a>, <a href="https://github.com/adrigzr">Adrián González Rus (@adrigzr)</a>, and <a href="https://github.com/svsalvador">Sergio del Valle Salvador (@svsalvador)</a> from <a href="https://twitter.com/embermadrid">Ember Madrid</a>, developers who attended <a href="https://events.codemotion.com/conferences/madrid/2019/">Codemotion Madrid</a> had the chance to learn Ember and possibly hear about it for the first time.</p>
<p>Their talk, "<a href="https://events.codemotion.com/conferences/madrid/2019/wp-content/themes/event/detail-talk.php?detail=14984">Lo que Ember ha hecho por el desarollo web, y tú sin saberlo</a>," covered Ember's contributions to web development and your developer experience. While the recording of their talk isn't available yet, Juan was happy to share a summary with us.</p>
<h3 id="1pasado">1. Pasado</h3>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Juan Antonio Gómez on stage at Codemotion 2019" title="Juan Antonio Gómez" src="/images/blog/2019-10-04/juan_antonio.jpg" />
  <p>I talked about what Ember is—a framework for creating ambitious web applications—and analysed the status of JS frameworks in 2013. I recounted the hard things about Ember at the time like poor documentation, a lot of elements (<code>View</code>, <code>ArrayController</code>, <code>ObjectController</code>), complicated templates (<code>render</code>, <code>bind-attr</code>), and two elements in the router (<code>route</code>, <code>resource</code>). I remembered the brilliant things too, such as implicit generation of code (e.g. empty controllers), a lot of power with less code, Ember CLI, arrival of Glimmer VM in Ember 2.0, and the great 6-week release cycle.</p>
</div>
<h3 id="2presente">2. Presente</h3>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Adrián González Rus on stage at Codemotion 2019" title="Adrián González Rus" src="/images/blog/2019-10-04/adrian_gonzalez.jpg" />
  <p>Adrián talked about the changes happening in the JavaScript world, the exciting features that Ember 3.x brought (native classes, angle brackets, no jQuery, etc.), and key differentiators between Ember and other JS frameworks (release management and deprecation policy).</p>
</div>
<h3 id="3futuro">3. Futuro</h3>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Sergio del Valle Salvador on stage at Codemotion 2019" title="Sergio del Valle Salvador" src="/images/blog/2019-10-04/sergio_del_valle.jpg" />
  <p>Sergio talked about the need to reduce the Ember skills tree, explained <a href="https://emberjs.com/editions/octane/" target="_blank" rel="noopener noreferrer">Ember Octane</a> and its new awesome features (Glimmer components, tracked properties, decorators, etc.), and shared the community's next goals (continue to <a href="https://github.com/emberjs/rfcs/pull/519" target="_blank" rel="noopener noreferrer">simplify Ember</a>, modernize the build pipeline with <a href="https://github.com/embroider-build/embroider" target="_blank" rel="noopener noreferrer">Embroider</a>, improve accessibility through <a href="https://github.com/ember-a11y" target="_blank" rel="noopener noreferrer">Ember A11y</a>, bring <a href="https://github.com/orbitjs/orbit" target="_blank" rel="noopener noreferrer">Orbit.js</a> to Ember Data, increase productivity and optimize Ember for growth).</p>
</div>
<p>Please be on the lookout for the recording online. In the meantime, you can get involved with Ember Madrid on <a href="https://twitter.com/embermadrid?lang=en">Twitter</a>, <a href="https://www.meetup.com/Ember-js-Madrid/">Meetup</a>, and <a href="https://discord.gg/emberjs">Discord</a>!</p>
<hr />
<h2 id="embermapvideoonanimatingacrossrouteswithemberanimatedhttpstwittercomsamselikoffstatus1175143786852364289"><a href="https://twitter.com/samselikoff/status/1175143786852364289">EmberMap Video on Animating Across Routes with Ember Animated ✨</a></h2>
<p>If you're interested in learning more about how to ✨<strong>animate across routes</strong> ✨ using the fantastic <a href="https://github.com/ember-animation/ember-animated">Ember Animated addon</a>, you may want to check out a new video by <strong>EmberMap</strong>, in which <a href="https://github.com/samselikoff/">Sam Selikoff @samselikoff</a> provides a great intro to the subject.</p>
<!--alex ignore easy-->
<p>While animation across routes is a somewhat advanced topic, even if you have not previously worked with <strong>Ember Animated</strong>, the explanations are clear and easy to follow, making the video a decent starting place. So if you have been waiting to check out Ember Animated, this might be a good time to do so!</p>
<p>The video is available on both <a href="https://www.youtube.com/watch?v=O4Mt-dDqkk0">YouTube</a> and the <a href="https://embermap.com/video/animating-across-routes-with-ember-animated">EmberMap site</a>.</p>
<hr />
<h2 id="releaseofemberclitypescript300httpsgithubcomtypedemberemberclitypescriptreleasestagv300"><a href="https://github.com/typed-ember/ember-cli-typescript/releases/tag/v3.0.0">Release of ember-cli-typescript 3.0.0 💚</a></h2>
<p><a href="https://www.github.com/chriskrycho">Chris Krycho @chriskrycho</a> released <a href="https://github.com/typed-ember/ember-cli-typescript">ember-cli-typescript</a> 3.0.0 which is dropping support for both Node 6 and <a href="https://blog.emberjs.com/2019/03/11/update-on-module-unification-and-octane.html">Module Unification</a>, and eliminating a lot of noise about Babel from people's consoles!</p>
<p>Check out the <a href="https://github.com/typed-ember/ember-cli-typescript/releases/tag/v3.0.0">release notes on GitHub!</a></p>
<hr />
<h2 id="rewatchallofembercamp2019httpstwittercomembercampstatus1179758083150626816"><a href="https://twitter.com/embercamp/status/1179758083150626816">(Re)Watch All of EmberCamp 2019 🍿</a></h2>
<p>No matter if you have been able to make it to this year's <a href="http://embercamp.com/">camping trip to Chicago</a> or not -
now's your time to catch up on <a href="https://twitter.com/embercamp/status/1179758083150626816"><strong>11 excellent sessions</strong></a> about modern Ember and best practices;
<strong>watch</strong> (or re-watch) the conference's entire programme from the comfort of your home cinema 🍿🎥.
And be sure to share the <a href="https://www.youtube.com/playlist?list=PL4eq2DPpyBbmSKZLCqzMqdtpedlGrDQuc">list of talk recordings</a> with your colleagues and Ember friends!</p>
<p>Don't forget to make use of <a href="https://github.com/elwayman02">Jordan Hawker's (@elwayman02)</a> full summary of <a href="https://github.com/elwayman02/embercamp/blob/master/2019.md">talk slides and summaries</a> to learn even more. And if you enjoyed the content,
be sure to let the team behind EmberCamp know via <a href="https://twitter.com/embercamp">Twitter (@EmberCamp)</a> or via <a href="mailto:embercamp.chicago@gmail.com">retro DM</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/GreatWizard" target="gh-user">@GreatWizard</a>, <a href="https://github.com/ijlee2" target="gh-user">@ijlee2</a>, <a href="https://github.com/muziejus" target="gh-user">@muziejus</a>, <a href="https://github.com/chiangs" target="gh-user">@chiangs</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/beegan" target="gh-user">@beegan</a>, <a href="https://github.com/astronomersiva" target="gh-user">@astronomersiva</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/pete-the-pete" target="gh-user">@pete-the-pete</a>, <a href="https://github.com/camerondubas" target="gh-user">@camerondubas</a> and <a href="https://github.com/nummi" target="gh-user">@nummi</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are meant for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jared Galanis, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-118</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-118</guid><pubDate>Fri, 04 Oct 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 119]]></title><description><![CDATA[<p>✌️ Emberistas! 🐹</p>
<p>Read the blog post on handling Promises and UI states with Ember.js 🔄,
learn how Ember has helped Intercom evolve since 2014 📖,
a mutable future with Ember Octane 🐹🏎,
and Ember and GraphQL: a quick example 📹.</p>
<!-- READMORE -->
<hr />
<h2 id="promisesanduistatesinemberjshttpsemberstepscompromisesanduistatesinemberjs"><a href="https://embersteps.com/promises-and-ui-states-in-ember-js/">Promises and UI States in Ember.js 🔄</a></h2>
<p><a href="https://github.com/herzzanu">Sabin Hertanu @herzzanu</a> wrote a <a href="https://embersteps.com/promises-and-ui-states-in-ember-js/">blog post</a> on handling promises and UI states with Ember. Examples of this range from providing loading states when sending a post request to enabling complicated behaviour such as a backoff period before being able to interact with the UI again.</p>
<p>The idea was to write promise-based operations as <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*">generator functions</a> using the provided <a href="http://ember-concurrency.com">ember-concurrency</a> APIs.</p>
<p>Read the <a href="https://embersteps.com/promises-and-ui-states-in-ember-js/">full blog post</a> for more details!</p>
<hr />
<h2 id="emberandgraphqlaquickexamplehttpswwwyoutubecomwatchvyxrvxgdihw8"><a href="https://www.youtube.com/watch?v=YxRvXgDIHW8">Ember and GraphQL: A Quick Example 📹</a></h2>
<p>Watch an introduction to using <strong>GraphQL with Ember.js</strong> in <a href="https://github.com/jneurock">Rocky Neurock @jneurock</a>'s new video! The YouTube video ⚡️quickly ⚡️ demonstrates how to get up and running with Ember.js, GraphQL, Apollo and EmberCLI Mirage.</p>
<!--alex ignore just-->
<p>If you've been interested in learning how to set up an application with GraphQL and Ember.js, or are just looking to learn a little more about GraphQL and Apollo and the relevant syntax, this video is a super nice resource. Plus, you get to see how EmberCLI Mirage can handle GraphQL queries! ✨</p>
<p>You can <a href="https://www.youtube.com/watch?v=YxRvXgDIHW8">watch the video in full here</a>.</p>
<hr />
<h2 id="theevolutionofemberjsatintercomhttpswwwyoutubecomwatchvnocxhtxpmsq"><a href="https://www.youtube.com/watch?v=NoCxHTxpmSQ">The Evolution of Ember.js at Intercom 📖</a></h2>
<p>At <a href="https://www.jsday.org/">JSDayIE 2019</a>, <a href="https://github.com/GavinJoyce">Gavin Joyce (@GavinJoyce)</a> presented a talk on how the adoption of Ember has helped <a href="https://www.intercom.com/">Intercom</a> grow over the years since 2014.</p>
<p>In particular, Gavin attributed these four keys to success:</p>
<ul>
<li>Shared core values with Ember</li>
<li>Ability to empower new devs to ship soon meaningful features</li>
<li>Confidence in upgrades thanks to Ember's stability without stagnation</li>
<li>Ember's commitment to continuous improvement (case study in rendering engine)</li>
</ul>
<p>He closed the talk by giving a preview of <a href="https://emberjs.com/editions/octane">Ember Octane</a>'s native JS approach: "I don't know what you would remove from that. […] Everything has a purpose, and it's beautifully minimal and clean." 💙</p>
<p>Please <a href="https://www.youtube.com/watch?v=NoCxHTxpmSQ">have a look at Gavin's talk</a> and share!</p>
<hr />
<h2 id="amutableoctanepoweredfuturehttpswwwpzuraqcomonmutand2waybinding"><a href="https://www.pzuraq.com/on-mut-and-2-way-binding/">A Mutable, Octane Powered Future 🐹🏎</a></h2>
<p>A handy <strong>helper</strong> has existed in the framework's API since the early days of Ember 1.13. It allows to specify that a certain value - which was passed down by a parent component or controller - <strong>may be mutated</strong> by a child component. This is <a href="https://api.emberjs.com/ember/release/classes/Ember.Templates.helpers/methods/mut?anchor=mut">the so-called <code>{{mut}}</code> helper</a>.</p>
<p>Most Ember developers are familiar with the usage of <code>{{mut}}</code> from scenarios as the following one:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- app/templates/components/my-component.hbs --&gt;
&lt;input
  value={{@passedDownValue}}
  oninput={{action (mut @passedDownValue) value="target.value"}}
/&gt;
</code></pre>
<p>In combination with the <code>{{action}}</code> helper, <code>{{mut}}</code> allows developers to create a useful, implicit and template-only <strong>shorthand</strong> for a setter function, that otherwise would require an explicit definition in the component class itself:</p>
<pre><code class="javascript language-javascript">// app/components/my-component.js
import Component from '@ember/component';

export default Component.extend({
  actions: {
    updateValue(newValue) {
      this.set('passedDownValue', newValue);
    },
  },
});
</code></pre>
<pre><code class="handlebars language-handlebars">&lt;!-- app/templates/components/my-component.hbs --&gt;
&lt;input
  value={{@passedDownValue}}
  oninput={{action "updateValue" value="target.value"}}
/&gt;
</code></pre>
<p>With <a href="https://blog.emberjs.com/2019/08/15/octane-release-plan.html">Ember Octane coming soon</a> and the new Glimmer Component API <a href="https://blog.emberjs.com/2019/03/14/coming-soon-in-ember-octane-part-5.html">enforcing unidirectional data flow</a>, many developers might wonder how the <code>{{mut}}</code> helper still fits into the overall picture. Are there any issues with using <code>{{mut}}</code> in future Octane apps? And are there still plans to <a href="https://github.com/emberjs/rfcs/issues/538">deprecate the helper</a> or 2-way-binding APIs from the framework in general?</p>
<!--alex ignore remain-->
<p>You will find answers to all of these questions in an <a href="https://www.pzuraq.com/on-mut-and-2-way-binding/">excellent deep-dive into <code>mut</code> and 2-way-bindings</a> by <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a>. This blog post will clarify which data-binding framework APIs will remain for the foreseeable future (including Ember Octane) and which questions are still open in regards to 2-way binding components commonly used in Ember apps today.</p>
<p>Be sure to check out <a href="https://www.pzuraq.com/on-mut-and-2-way-binding/">the article</a>, share it with your colleagues and Ember friends and join the discussion on <a href="https://discordapp.com/invite/zT3asNS">the Ember Discord</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/jacojoubert" target="gh-user">@jacojoubert</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/ghislaineguerin" target="gh-user">@ghislaineguerin</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/Frozenfire92" target="gh-user">@Frozenfire92</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/richard-viney" target="gh-user">@richard-viney</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/Panman8201" target="gh-user">@Panman8201</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a> and <a href="https://github.com/wongpeiyi" target="gh-user">@wongpeiyi</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jessica Jordan, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-119</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-119</guid><pubDate>Fri, 11 Oct 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 120]]></title><description><![CDATA[<p>🏄‍♀️ Emberistas! 🐹</p>
<p>Ember Bootstrap 3.0.0 released 🎉,
dive into Octane features with EmberMap 📚,
learn about ember-engines 📝 ,
help wanted for Ember Octane linting rules 🤖,
and greetings from the Ember Times team at Emberfest! 🐹🎉</p>
<!-- READMORE -->
<hr />
<h2 id="emberbootstrap300releasedhttpswwwemberbootstrapcom"><a href="https://www.ember-bootstrap.com">Ember Bootstrap 3.0.0 Released 🎉</a></h2>
<!--alex ignore just-->
<p>Just a few days ago, <a href="https://twitter.com/simonihmig/status/1182661298464739330">Ember Bootstrap 3.0.0 was released</a>. <a href="https://www.ember-bootstrap.com">Ember Bootstrap</a> brings the Bootstrap library to Ember without requiring any of the Bootstrap JavaScript. Instead, it rebuilds the dynamic features of Bootstrap with native Ember Components.</p>
<p>The UI library enters the Octane-era with this new major version: It introduces full support of angle bracket component invocation syntax and an updated documentation. All components have been refactored to native classes.</p>
<p>Ember Bootstrap v3 drops support for some very old versions of Ember, but still supports 2.18+ to ease the migration path. The commitment to backwards compatibility introduced some technical challenges because Ember 2.18 isn't supported by <a href="https://github.com/pzuraq/ember-native-class-polyfill">native class polyfill</a>.</p>
<p>In addition, consumers should be able to extend components provided by the addon to customize them for their specific needs. This introduced another challenge since <a href="https://discordapp.com/channels/480462759797063690/486553598436573206/618527893009465349">a class field cannot be overwritten by a computed property</a>. A <a href="https://github.com/kaliber5/ember-bootstrap/blob/v3.0.0/addon/utils/default-decorator.js"><code>defaultValue</code> decorator</a> was used to prevent a <code>Cannot set property foo ... which has only a getter</code> error.</p>
<p>In the end, Ember Bootstrap saw six release candidates and three and a half months until its new major release has been proven to be stable.</p>
<p>Besides dropping support for Ember &lt;= 2.17 and Node 6, Ember Bootstrap v3 comes with some minor breaking changes affecting defaults. Please refer to <a href="https://www.ember-bootstrap.com/#/changelog">the changelog</a> for a full list of all changes.</p>
<hr />
<h2 id="anewembermapserieswhatsnewinemberhttpsembermapcomtopicswhatsnewinember"><a href="https://embermap.com/topics/what-s-new-in-ember/">A New EmberMap Series: What's New in Ember 📚</a></h2>
<p>This year, Ember released many new features that will all be a part of Ember Octane. While the <a href="https://blog.emberjs.com/tags/releases.html">release notes</a> summarize the features well, you may have wondered still how to use them in your app.</p>
<p>To help you understand better, EmberMap started a series called <a href="https://embermap.com/topics/what-s-new-in-ember/">What's New in Ember</a>. Each episode will cover 1 new feature, starting with Ember 3.8.</p>
<p>In the first episode, <a href="https://github.com/samselikoff">Sam Selikoff (@samselikoff)</a> shows how you can write a <strong>modifier</strong>. In particular, you will learn how to use Ember's <strong>modifier manager</strong> (this provides low-level, public APIs for customization) and dedicated <strong>addons</strong> (for high-level abstraction).</p>
<p>Be sure to check out the future episodes as they are released!</p>
<hr />
<h2 id="emberenginesthewhatwhatnotandwhyhttpsmediumcomdeveloperparadiseemberenginesthewhatwhatnotandwhenpart149187c949db5"><a href="https://medium.com/developer-paradise/ember-engines-the-what-what-not-and-when-part-1-49187c949db5">Ember Engines: The What, What Not and Why? 📝</a></h2>
<p>If you have ever heard something about <strong>ember-engines</strong> but you need to refresh your knowledge, or they are completely new to you, <a href="https://github.com/abhilashlr">@abhilashlr</a> wrote a <a href="https://medium.com/developer-paradise/ember-engines-the-what-what-not-and-when-part-1-49187c949db5">blog post</a> about them. Engines allow multiple logical applications to be composed together into a single application from the user's perspective, while satisfying the <span style="font-style: italic;">separation of concerns</span> convention for the developer. This first <a href="https://medium.com/developer-paradise/ember-engines-the-what-what-not-and-when-part-1-49187c949db5">post</a> nicely establishes what an ember-engine is, and emphasizes what it is not.</p>
<p>Stay tuned for part two on how <a href="https://github.com/abhilashlr">@abhilashlr</a> used ember-engines in his app.</p>
<hr />
<h2 id="helpwantedforemberoctanelintingruleshttpsgithubcomemberclieslintpluginemberissuesutf8e29c93qis3aissueis3aopensort3aupdateddesclabel3a22helpwanted22octanerule"><a href="https://github.com/ember-cli/eslint-plugin-ember/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22Help+Wanted%22+Octane+Rule">Help Wanted For Ember Octane Linting Rules 🤖</a></h2>
<p>With Ember Octane's official release imminent, there's an effort to create new and improve existing Octane-specific linting rules. These will be used to help educate the community about the new APIs as well as help make migrating existing "Classic" code easier. A number of improvements have been proposed and issues have been cut for each of them on the <a href="https://github.com/ember-cli/eslint-plugin-ember/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22Help+Wanted%22+Octane+Rule">eslint-plugin-ember</a> and <a href="https://github.com/ember-template-lint/ember-template-lint/issues?utf8=%E2%9C%93&q=+project%3Aember-template-lint%2F1+label%3A%22help+wanted%22++sort%3Aupdated-desc">ember-template-lint</a> repos.</p>
<p>If you're interested in helping out, comment on the issue you'd like to take and submit a PR!</p>
<hr />
<h2 id="greetingsfromemberfesthttpstwittercomsearchq23emberfest"><a href="https://twitter.com/search?q=%23emberfest">Greetings from Emberfest 🐹🎉</a></h2>
<p><img class="float-left medium transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/blog/emberjstimes/embertimesteam2019.jpg" /></p>
<p>This week the Ember Times sends you <strong>greetings from Emberfest</strong> - an annual Ember conference, which took place in <a href="https://emberfest.eu/">Copenhagen on Oct 17 + 18</a> this year. With almost 200 attendees and 2 days full of talks about how to build modern Ember apps, the importance of developing with intent and effective mentorship, the event has been an amazing opportunity for the Europe-based Ember community to learn, reconnect and share ideas.</p>
<p>We'll keep you posted once the video recordings of the event are up. And in the meantime…why not gain a few Emberfest impressions by checking out the <a href="https://twitter.com/search?q=%23emberfest">#Emberfest hashtag on Twitter</a> or join an <a href="https://emberjs.com/community/meetups">Ember mini-conference in your area</a>?</p>
<p>Vi ses senere, Emberistas!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/rajasegar" target="gh-user">@rajasegar</a>, <a href="https://github.com/GavinJoyce" target="gh-user">@GavinJoyce</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/tmquinn" target="gh-user">@tmquinn</a>, <a href="https://github.com/dfreeman" target="gh-user">@dfreeman</a>, <a href="https://github.com/camerondubas" target="gh-user">@camerondubas</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/maxwondercorn" target="gh-user">@maxwondercorn</a>, <a href="https://github.com/MrChocolatine" target="gh-user">@MrChocolatine</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/wycats" target="gh-user">@wycats</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/mfeckie" target="gh-user">@mfeckie</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/kturney" target="gh-user">@kturney</a>, <a href="https://github.com/patricklx" target="gh-user">@patricklx</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/nickschot" target="gh-user">@nickschot</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Isaac Lee, Jeldrik Hanschke, Anne-Greeth van Herwijnen, Pat O'Callaghan, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-120</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-120</guid><pubDate>Fri, 18 Oct 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 121]]></title><description><![CDATA[<p>Hallöchen Emberistas! 🐹</p>
<p>The EmberConf 2020 CFP is now open! 🗣️
Watch Gavin rewrite an Ember 1.5 app in Octane 🥁
and get started with Glimmer Components ✨!</p>
<!-- READMORE -->
<hr />
<h2 id="emberconf2020cfpnowopenhttpscfpemberconfcomeventsemberconf2020"><a href="https://cfp.emberconf.com/events/emberconf-2020/">EmberConf 2020 CFP Now Open! 🗣️</a></h2>
<p>Next year’s <a href="https://emberconf.com">EmberConf</a>, which is going to be held in Portland, Oregon, USA from March 16 to 18, 2020, has opened its <strong>CFP (call for papers)</strong> for submission!</p>
<p>You can submit either a 15 or 30 minute conference talk, a workshop, a 30 minute BonusConf talk, or a 5 minute MiniTalk proposal. Remember the first several rounds of reviews in the CFP are anonymous, so please refrain from including biographical information in your talk abstract or details.</p>
<p>The deadline to submit your talk is <strong>December 1st</strong> at 11:59pm PST. EmberConf is intended to be an inclusive, welcoming conference for everyone. You can learn more about inclusiveness and diversity efforts <a href="https://emberconf.com/#/about/inclusiveness-at-emberconf">at the EmberConf website</a>.</p>
<p>Submit your talk on the <a href="https://cfp.emberconf.com/events/emberconf-2020/">CFP app</a> today!</p>
<hr />
<h2 id="emberoctanelivestreambuildadrummachinehttpswwwyoutubecomwatchv5znpeiwhpl4"><a href="https://www.youtube.com/watch?v=5znpEiwHpL4">Ember Octane Livestream: Build a Drum Machine 🥁</a></h2>
<p>If you haven't yet, we encourage you to watch <a href="https://github.com/GavinJoyce">Gavin Joyce (@GavinJoyce)</a> <a href="https://www.youtube.com/watch?v=5znpEiwHpL4">rewrite his drum machine app in Octane</a>. The <a href="http://emberbeats.gavinjoyce.com">original app</a> was <a href="https://github.com/GavinJoyce/ember-beats/tree/ember-1.5">written in Ember 1.5 six years ago</a>. Gavin prototypes the new app and gets its features working in 2.5 hours!</p>
<p>From the recording, you will also learn how to:</p>
<ul>
<li>Set up Tailwind CSS (<a href="https://youtu.be/5znpEiwHpL4?t=370">0:06:10</a>)</li>
<li>Use a 3rd party library like howler.js (<a href="https://youtu.be/5znpEiwHpL4?t=2026">0:33:46</a>)</li>
<li>Create service to refactor a component (<a href="https://youtu.be/5znpEiwHpL4?t=2344">0:39:04</a>)</li>
<li>Create <code>hasMany</code> relationships (<a href="https://youtu.be/5znpEiwHpL4?t=3005">0:50:05</a>)</li>
<li>Prototype the UI (<a href="https://youtu.be/5znpEiwHpL4?t=3336">0:55:36</a>)</li>
<li>Use Ember Concurrency to handle timing (<a href="https://youtu.be/5znpEiwHpL4?t=4258">1:10:58</a>)</li>
<li>Make sounds! (<a href="https://youtu.be/5znpEiwHpL4?t=5550">1:32:30</a>)</li>
<li>Use a helper method to create child records (<a href="https://youtu.be/5znpEiwHpL4?t=6508">1:48:28</a>)</li>
</ul>
<hr />
<h2 id="makeyouremberappshinewithglimmercomponentshttpsmfeckiedevglimmercomponentsinember"><a href="https://mfeckie.dev/glimmer-components-in-ember/">Make Your Ember App Shine with Glimmer Components ✨</a></h2>
<p>The release date of Ember's first edition - <a href="https://blog.emberjs.com/2019/08/15/octane-release-plan.html">Ember Octane</a> - is approaching and with it a new way to componentize your app: <a href="https://emberjs.github.io/rfcs/0416-glimmer-components.html">Glimmer Components</a>. They provide a new API to create reusable building blocks for your Ember application. Packed with lots of new features, including argument immutability, <a href="https://emberjs.github.io/rfcs/0410-tracked-properties.html">tracked properties</a> and Outer HTML semantics, <strong>Glimmer Components</strong> will make it easier for you to manage component state and to deliver high-performant UIs.</p>
<p>Already looking forward to use Glimmer Components in your own app, but don't know how to get started yet? Then this guide on <a href="https://mfeckie.dev/glimmer-components-in-ember/">"Getting Started with Glimmer Components in Ember.js"</a> is a must read for you. In this article, <a href="https://github.com/mfeckie">Martin Feckie (@mfeckie)</a> covers the new feature set landing with the Glimmer Components API and best practices for developing modern components with Ember Octane. <a href="https://mfeckie.dev/glimmer-components-in-ember/">Check it out today!</a></p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/rap2hpoutre" target="gh-user">@rap2hpoutre</a>, <a href="https://github.com/chriskrycho" target="gh-user">@chriskrycho</a>, <a href="https://github.com/Charizard" target="gh-user">@Charizard</a>, <a href="https://github.com/mcfiredrill" target="gh-user">@mcfiredrill</a>, <a href="https://github.com/GavinJoyce" target="gh-user">@GavinJoyce</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/Mikek2252" target="gh-user">@Mikek2252</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/dmuneras" target="gh-user">@dmuneras</a>, <a href="https://github.com/skaterdav85" target="gh-user">@skaterdav85</a>, <a href="https://github.com/patricklx" target="gh-user">@patricklx</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/nickschot" target="gh-user">@nickschot</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/pichfl" target="gh-user">@pichfl</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/ghislaineguerin" target="gh-user">@ghislaineguerin</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a> and <a href="https://github.com/jfdnc" target="gh-user">@jfdnc</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-121</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-121</guid><pubDate>Fri, 25 Oct 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 122]]></title><description><![CDATA[<p>हॅलो Emberistas! 🐹</p>
<!-- alex disable simple -->
<p>An important announcement about the Octane release 📝,
release of qunit-assertions-extra 🎉,
fine-tune validations with Ember Model Validator 3.10 🔍,
better builds for the Guides 🏗,
and the Ember Simple Auth 2.0.0 release 🛳!</p>
<!-- alex enable simple -->
<!-- READMORE -->
<hr />
<h2 id="octanereleaseupdatehttpsblogemberjscom20191031octanereleaseupdatehtml"><a href="https://blog.emberjs.com/2019/10/31/octane-release-update.html">Octane Release Update 📝</a></h2>
<p>Yesterday, the Ember team announced that <a href="https://blog.emberjs.com/2019/10/31/octane-release-update.html">the upcoming 3.14 release will not include Octane as the default mode</a>.</p>
<p>While <a href="https://twitter.com/mixonic/status/1180494661938552832">several developers are successfully using Octane in production already</a>, a few key ingredients are missing in order to make Octane <strong>a success story for everyone</strong>. The remaining tasks are:</p>
<ul>
<li>Make removal of jQuery optional to help with your migration (completed in 3.14 ✅)</li>
<li>Finish updating <a href="https://github.com/emberjs/ember-inspector">Ember Inspector</a> to support Glimmer components</li>
<li>Document the Octane programming model in the <a href="https://octane-guides-preview.emberjs.com/release/">Ember Guides</a></li>
</ul>
<p>What will this announcement mean for you?</p>
<ol>
<li>If you tried out Octane in Ember 3.13, please keep on using it. The features that make up Octane are stable and backed by semantic versioning.</li>
<li>If you were waiting for Ember 3.14 to try out Octane, please only do so if you're willing to accept a version of Octane that the Ember team doesn't feel is polished enough to recommend to all users quite yet. Ember 3.14 is a great time for adventurous users to try updating their production apps to Octane, and report back any problems that they find.</li>
</ol>
<p>Lastly, please lend encouragement and support to all contributors (that includes you!) as we make the shipping version of Octane as amazing as we all know it can be. To learn more about the announcement, <a href="https://blog.emberjs.com/2019/10/31/octane-release-update.html">visit the Ember Blog today</a>.</p>
<hr />
<h2 id="releaseofqunitassertionsextrahttpstwittercomnullvoxpopulistatus1189308094972616706"><a href="https://twitter.com/nullvoxpopuli/status/1189308094972616706">Release of qunit-assertions-extra 🎉</a></h2>
<p><a href="https://github.com/NullVoxPopuli">@NullVoxPopuli</a> made a library to help out with <a href="https://github.com/emberjs/ember-qunit">qunit</a> assertions. Inspired by the <a href="https://github.com/simplabs/qunit-dom">qunit-dom</a> project, the library aims to eliminate <code>assert.ok</code> for non-boolean comparisons and the need for the custom message argument for assertions.</p>
<p>As of now, it provides the <code>assert.contains</code> and <code>assert.matches</code> APIs for simplifying routine tests around strings. Contribute and check out <a href="https://github.com/NullVoxPopuli/qunit-assertions-extra">qunit-assertions-extra</a> on GitHub today!</p>
<hr />
<h2 id="finetunevalidationswithembermodelvalidator310httpstwittercomesbanarangostatus1189759579493679106"><a href="https://twitter.com/esbanarango/status/1189759579493679106">Fine-Tune Validations with Ember Model Validator 3.10 🔍</a></h2>
<p><a href="https://github.com/esbanarango/ember-model-validator">Ember Model Validator</a>, which lets you define validations for Ember Data models, recently celebrated its 3.10 release! 🎉</p>
<p>Thanks to <a href="https://github.com/andsmedeiros">André Medeiros (@andsmedeiros)</a>, you can now <a href="https://github.com/esbanarango/ember-model-validator#usage">pass the <code>except</code> or <code>only</code> option to Ember Model Validator</a> to run a subset of validations.</p>
<pre><code class="javascript language-javascript">// Run all validations EXCEPT name's presence and length validations
// and any email validations
myModel.validate({
  except: ['name:presence,length', 'email']
});

// Run ONLY email's presence validation
myModel.validate({
  only: ['email:presence']
});
</code></pre>
<p>To learn more about how to use Ember Model Validator in your app, we encourage you to <a href="https://esbanarango.github.io/ember-model-validator">visit its website today</a>!</p>
<hr />
<h2 id="speedybuildsfortheemberguideshttpsgithubcomemberlearnguidessourcepull1051"><a href="https://github.com/ember-learn/guides-source/pull/1051">Speedy Builds for the Ember Guides 🏎🏗</a></h2>
<p>The official <a href="https://guides.emberjs.com/release/">Ember Guides</a> are a fundamental learning resource for those who are new to Ember and those who are more familiar with the framework alike. Anytime a new <a href="https://emberjs.com/releases/">version release of Ember</a> lands, a new version of the <a href="https://github.com/ember-learn/guides-source">Guides' source</a> will be cut and made ready for release. This ensures that Ember developers can work with the most up-to-date version of documentation that matches the latest APIs that are available in their upgraded app.</p>
<p>But recently, issues in regards to the build process for the Guides bubbled up. Frequent timeouts for the build pipeline prevented contributors from working smoothly on the Guides project. A recent <a href="https://github.com/ember-learn/guides-source/pull/1051">adjustment</a> to the build configuration moved the deployment step away from Netlify and to Travis, solving the timeout issues. This code contribution also optimized the build pipeline in the process. Many thanks to Ember Learning Core team member and Devops specialist <a href="https://github.com/sivakumar-kailasam">Sivakumar Kailasam (@sivakumar-kailasam)</a> for providing this fix!</p>
<p>Curious to learn more or even contribute to build processes for Ember learning materials? <a href="https://discord.gg/emberjs">Join the community chat</a> and join the discussion on the <a href="https://discordapp.com/channels/480462759797063690/480777444203429888">#dev-ember-learning channel</a>!ß</p>
<hr />
<!-- alex disable simple -->
<h2 id="embersimpleauth200releasehttpstwittercomsimplabsstatus1189264438026747907"><a href="https://twitter.com/simplabs/status/1189264438026747907">Ember Simple Auth 2.0.0 release 🛳</a></h2>
<p>This week, the good people over at <a href="https://github.com/simplabs">@simplabs</a> released <a href="https://github.com/simplabs/ember-simple-auth/releases/tag/2.0.0">version 2.0.0</a> of the excellent authentication/authorization library <strong>Ember Simple Auth</strong>. Many thanks to Simplabs and to the people who contributed to this release, including <a href="https://github.com/ExpDev07">@ExpDev07</a>, <a href="http://github.com/josemarluedke">@josemarluedke</a>, <a href="https://github.com/marcoow">@marcoow</a>, <a href="https://github.com/muziejus">@muziejus</a>, <a href="https://github.com/mcfiredrill">@mcfiredrill</a> and <a href="https://github.com/trek">@trek</a>.</p>
<p>Version 2.0.0 drops support for Node 6 and introduces 2 new deprecations around the <code>rejectWithResponse</code> property and the DataAdapterMixin's <code>authorizer</code> property and <code>headersForRequest</code> method.</p>
<p>Version 3.0.0 of Ember Simple Auth should be released soon, so watch out for that as well!</p>
<!-- alex enable simple -->
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/dnalagatla" target="gh-user">@dnalagatla</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/dmuneras" target="gh-user">@dmuneras</a>, <a href="https://github.com/ghislaineguerin" target="gh-user">@ghislaineguerin</a>, <a href="https://github.com/pichfl" target="gh-user">@pichfl</a>, <a href="https://github.com/esbanarango" target="gh-user">@esbanarango</a>, <a href="https://github.com/Mikek2252" target="gh-user">@Mikek2252</a> and <a href="https://github.com/runspired" target="gh-user">@runspired</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jessica Jordan, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-122</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-122</guid><pubDate>Fri, 01 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 123]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>This week: join the EmberConf CFP Brainstorm 🧠⛈️, use <code>Ember Add Listener Helper</code> to pub/sub with confidence 📣, watch EmberFest from the comfort of your home cinema 🎬, and an update on getting Ember API Docs Ready for Octane 📖!</p>
<!-- READMORE -->
<hr />
<h2 id="emberconfcfpbrainstormhttpsemberconfcomcfpbrainstorm"><a href="https://emberconf.com/#/cfp-brainstorm">EmberConf CFP Brainstorm 🧠⛈️</a></h2>
<p>This coming <a href="https://everytimezone.com/s/970f2362">November 14, 2019 at 10:00am PT</a> the annual Ember CFP Brainstorm is happening over <a href="https://bluejeans.com/241628685/webrtc">BlueJeans</a>!</p>
<p>The session will go through the content of next year’s <a href="http://emberconf.com/">EmberConf</a> which is happening between March 16-18, 2020. We'll chat about the CFP, the topics we hope to see, and answer community questions about ideas and proposals. The EmberConf 2020 CFP closes on Dec 1, 2019.</p>
<p>Sign up for a reminder on the <a href="https://emberconf.com/#/cfp-brainstorm">EmberConf CFP Brainstorm website</a>!</p>
<hr />
<h2 id="emberaddlistenerhelperreleasedhttpstwittercombendemboskistatus1187068387710525440"><a href="https://twitter.com/bendemboski/status/1187068387710525440"><code>Ember Add Listener Helper</code> Released! 📣</a></h2>
<p>Thanks to <a href="https://github.com/bendemboski">Ben Demboski (@bendemboski)</a>, you can use <a href="https://github.com/bendemboski/ember-add-listener-helper">Ember Add Listener Helper</a> to pub/sub with confidence! Both classic and Glimmer components will listen to and unsubscribe from events as needed.</p>
<p>You can learn more how to use the addon from the <a href="https://github.com/bendemboski/ember-add-listener-helper#usage">README</a> and <a href="https://github.com/bendemboski/ember-add-listener-helper/blob/master/tests/integration/helpers/add-listener-test.js">tests</a>. We encourage you to try it out today!</p>
<hr />
<h2 id="thisweekshomecinemaprogramemberfest2019httpswwwyoutubecomwatchvzxbqv2peycmlistpln4spdlosvkt0e094bzhgkunf2wbf09xx"><a href="https://www.youtube.com/watch?v=zXbqv2PeYCM&list=PLN4SpDLOSVkT0e094BZhGkUnf2WBF09xx">This Week's Home Cinema Program: EmberFest 2019 🎬🍿</a></h2>
<p>This week you can finally start <strong>(re)watching</strong> all of the amazing <strong>22 presentations</strong> about modern Ember from <strong>EmberFest 2019</strong>, which took place on Oct 17 + 18 in Copenhagen, Denmark.</p>
<p>Learn more about <a href="https://www.youtube.com/watch?v=StFbdKBC94o">the future of compiling Ember apps</a>, how to build interactive and real time <a href="https://www.youtube.com/watch?v=lpljvcBUye0">UIs from Ember experts at Linkedin</a>, Orbit-powered <a href="https://www.youtube.com/watch?v=b7-VegI-WX8">Ember apps from outer space</a>, debugging secrets from <a href="https://www.youtube.com/watch?v=xIWFn05oLe8">the Browser Inspector</a> and much, much more!</p>
<p>Watch the full program over <a href="https://www.youtube.com/watch?v=zXbqv2PeYCM&list=PLN4SpDLOSVkT0e094BZhGkUnf2WBF09xx">at Youtube</a> and share your favorite talk videos with your Ember friends!</p>
<hr />
<h2 id="gettingemberapidocsreadyforoctanehttpsgithubcomcibernoxembercliyuidocpull52"><a href="https://github.com/cibernox/ember-cli-yuidoc/pull/52">Getting Ember API Docs Ready for Octane 📖</a></h2>
<p>People have been hard at work ⚒ getting the <a href="https://api.emberjs.com/ember/release">Ember API Docs</a> ready for Ember Octane! A few good examples of this are the recently merged PR's by <a href="https://github.com/pzuraq">Chris Garrett @pzuraq</a> and <a href="https://github.com/sivakumar-kailasam">Sivakumar Kailasam @sivakumar-kailasam</a> in <a href="https://github.com/cibernox/ember-cli-yuidoc">ember-cli-yuidoc</a> to allow YUIDoc to support decorators within markdown blocks.</p>
<p>For those who don't know, <a href="https://github.com/yui/yuidoc">YUIDoc</a> is a JavaScript documentation tool that the <strong>Ember API Docs</strong> use to provide the helpful documentation for the framework that we in the Ember community rely upon, so this is great news that work is being done to support Octane.  </p>
<p>It actually takes a lot of effort to maintain the Ember API Docs and keep them updated and reflecting modern JS practices, so here's a big shout out 🎉 to <a href="https://github.com/toddjordan">Todd Jordan @toddjordan</a> and <a href="https://github.com/sivakumar-kailasam">Sivakumar Kailasam @sivakumar-kailasam</a> who have led the charge, and all the other contributors who have helped along the way.</p>
<p>Also, many thanks to <a href="https://github.com/cibernox">Miguel Camba @cibernox</a> the maintainer of ember-cli-yuidoc, and <a href="https://github.com/rwjblue">Robert Jackson @rwjblue</a>, for their help in getting this valuable work across the line.</p>
<p>If you want to checkout the PR's you can find them <a href="https://github.com/cibernox/ember-cli-yuidoc/pull/52">here</a> and <a href="https://github.com/cibernox/ember-cli-yuidoc/pull/53">here</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/addamh" target="gh-user">@addamh</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/SparshithNR" target="gh-user">@SparshithNR</a>, <a href="https://github.com/abel-n" target="gh-user">@abel-n</a> and <a href="https://github.com/jenweber" target="gh-user">@jenweber</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Isaac Lee, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-123</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-123</guid><pubDate>Fri, 08 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 124]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>This week: 400 Releases on the Ember.js Repo 🎉, share your thoughts for RFCs #549 and #554 💬, learn how to use telemetry helpers to power up your codemods 📡, release of Octane Super Rentals Tutorial Part 2 🚀, enjoy the new and shiny Ember-powered Apple TV 🍏📺, and check out a new accessibility-focused ember-bootstrap release ✨!</p>
<!-- READMORE -->
<hr />
<h2 id="400releasesontheemberjsrepohttpsgithubcomemberjsemberjs"><a href="https://github.com/emberjs/ember.js">400 Releases on the Ember.js Repo 🎉</a></h2>
<p>The <a href="https://github.com/emberjs/ember.js">ember.js repo</a> hit 400 releases on GitHub this week! We’ve had over <a href="https://github.com/emberjs/ember.js/graphs/contributors">770 contributors</a> between May 2011 to November 2019. A big thank you ❤️ to the numerous efforts of all all these community members!</p>
<hr />
<h2 id="rfc549emberdevforotherplatformshttpsgithubcomemberjsrfcspull549"><a href="https://github.com/emberjs/rfcs/pull/549">RFC #549: Ember Dev for Other Platforms 💬</a></h2>
<p><a href="https://github.com/bakerac4">Adam Baker (@bakerac4)</a> has proposed the need to better advertise Ember as a cross-platform solution: Use 1 framework to create web, mobile, <em>and</em> desktop apps! The possibility of marketing Ember as cross-platform exists already, thanks to projects like <a href="http://corber.io/pages/frameworks/ember">Corber</a> and <a href="https://github.com/bakerac4/glimmer-native">Glimmer Native</a>.</p>
<p>How can we market Ember as cross-platform and support developing for other platforms? Be sure to <a href="https://github.com/emberjs/rfcs/pull/549">share your ideas with everyone</a> today!</p>
<hr />
<h2 id="rfc554deprecategetwithdefaulthttpsgithubcomemberjsrfcspull554"><a href="https://github.com/emberjs/rfcs/pull/554">RFC #554: Deprecate <code>getWithDefault</code> 💬</a></h2>
<p><a href="https://github.com/chrisrng">Chris Ng (@chrisng)</a> has proposed deprecating support for <code>getWithDefault</code>. This method, which has <a href="https://api.emberjs.com/ember/1.0/classes/Ember.Object/methods/getWithDefault?anchor=getWithDefault">existed since Ember 1.0</a>, is intended to help an Ember object return a default value.</p>
<p>The problem with <code>getWithDefault</code> lies in its behavior. It returns the default value <em>only</em> when the retrieved value of the property is <code>undefined</code>. Other falsey values, such as <code>null</code> or <code>''</code>, don't result in the default value. This behavior may or may not be what you intended.</p>
<p>To help you write code explicitly, TC39 has come up with the <a href="https://github.com/tc39/proposal-nullish-coalescing">nullish coalescing operator</a>, <code>??</code>, now in Stage 3 proposal. RFC 554 explains that it'd be better to rely on the native implementation.</p>
<p>What are your thoughts on deprecating <code>getWithDefault</code>? We encourage you to <a href="https://github.com/emberjs/rfcs/pull/554">read the RFC and participate</a> today!</p>
<hr />
<h2 id="creatingruntimeassistedcodemodsusingtelemetryhelpershttphangaroundthewebcom201910creatingruntimeassistedcodemodsusingtelemetryhelpers"><a href="http://hangaroundtheweb.com/2019/10/creating-runtime-assisted-codemods-using-telemetry-helpers/">Creating Runtime Assisted Codemods Using Telemetry Helpers 📡</a></h2>
<p>Thanks to <a href="https://github.com/rajasegar">Rajasegar Chandran (@rajasegar)</a> and <a href="https://github.com/tylerturdenpants">Ryan Mark (@tylerturdenpants)</a>, the <a href="https://github.com/ember-codemods/ember-codemods-telemetry-helpers">ember-codemods-telemetry-helpers</a> addon features a <a href="https://github.com/ember-codemods/ember-codemods-telemetry-helpers#ember-codemods-telemetry-helpers">detailed readme</a> and <a href="http://hangaroundtheweb.com/2019/10/creating-runtime-assisted-codemods-using-telemetry-helpers/">companion blog post</a>. 💞</p>
<p>Traditionally, Ember codemods have relied on <strong>static code analysis</strong> to help you (a codemod author) convert files from one version to the next. In contrast, telemetry-powered codemods can <strong>run the app</strong> to help you gather data on components, services, routes, controllers, etc.</p>
<p>To learn more about telemetry helpers, we encourage you to visit <a href="http://hangaroundtheweb.com/2019/10/creating-runtime-assisted-codemods-using-telemetry-helpers/">Rajasegar's blog</a>. You can also check out <a href="https://github.com/ember-codemods/ember-native-class-codemod">ember-native-class-codemod</a> and <a href="https://github.com/ember-codemods/ember-no-implicit-this-codemod">ember-no-implicit-this-codemod</a> to learn how codemods use telemetry helpers today!</p>
<hr />
<h2 id="octanesuperrentalstutorialpart2httpsoctaneguidespreviewemberjscomreleasetutorial10part2"><a href="https://octane-guides-preview.emberjs.com/release/tutorial/10-part-2/">Octane Super Rentals Tutorial Part 2 🚀</a></h2>
<p><a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a> and <a href="https://github.com/vaidehijoshi">Vaidehi Joshi (@vaidehijoshi)</a> further expanded the Super Rentals Tutorial for Ember Octane by releasing part 2 of the tutorial!</p>
<p>This <strong>automatically generated</strong> tutorial now <a href="https://github.com/cibernox/ember-cli-yuidoc/pull/52">supports decorators</a> thanks to <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> who had a fix to replace all <code>@</code> symbols within code blocks with a placeholder, processes them, and then switches them back after processing.</p>
<p>If you are looking to contribute check out the <a href="https://github.com/ember-learn/super-rentals-tutorial">super-rentals-tutorial repo on GitHub</a>!</p>
<hr />
<h2 id="brandnewproductreleasepoweredbyemberappletvhttpstwittercommehulkarstatus1190318959955857408"><a href="https://twitter.com/mehulkar/status/1190318959955857408">Brand-New Product Release Powered by Ember: Apple TV 🍏📺</a></h2>
<p><strong>Plenty of companies</strong> and acclaimed brands <strong>bet on Ember</strong> when building digital products for thousands or even millions of users. Heroku, Netflix, TED, Tilde, Intercom and BetterUp are a few examples of <a href="https://emberjs.com/ember-users">well-known businesses</a> who have benefitted from using Ember for years.</p>
<p>Did you also know that Apple's web platform <strong>Apple TV</strong> is <a href="https://twitter.com/mehulkar/status/1190318959955857408">built with Ember</a>? Apple TV is now based on a modern 3.12 Ember tech stack which evolved its way up from a 3.4 app earlier this year. Furthermore, the app is increasingly adopting all the latest and sparkliest ✨ from the <a href="https://emberjs.com/editions/octane/">new Ember Octane programming model</a>, making it a great showcase for modern Ember apps in the wild!</p>
<p>Do you have any feedback? Feel free to reach out to <a href="https://github.com/mehulkar">Mehul Kar (@mehulkar)</a> for any questions, suggestions or bug reports.</p>
<hr />
<h2 id="accessibilityfocusedemberbootstrapreleasehttpstwittercomsimonihmigstatus1190740590377472001"><a href="https://twitter.com/simonihmig/status/1190740590377472001">Accessibility-Focused Ember Bootstrap Release ✨</a></h2>
<p>A few weeks ago, <a href="https://github.com/simonihmig">Simon Ihmig (@simonihmig)</a> and the folks at <a href="https://github.com/kaliber5">kaliber5</a> released version 3.1.0 of the fantastic Ember addon <a href="https://github.com/kaliber5/ember-bootstrap">ember-bootstrap</a>.</p>
<!-- alex ignore trap -->
<p>This version focuses on <strong>improving accessibility</strong> by using <a href="https://github.com/josemarluedke/ember-focus-trap">ember-focus-trap</a> to implement focus trap for modals and keyboard navigation of dropdowns. It also adds <a href="https://github.com/ember-a11y/ember-a11y-testing">ember a11y tests</a> to the test suite! 🔥🔥🔥</p>
<p>Many thanks to all those that contributed to this release and the accessiblity concerns addressed by it 😄, including <a href="https://github.com/simonihmig">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/Techn1x">Brad Overton (@techn1x)</a>, <a href="https://github.com/rwachtler">Ramiz Wachtler (@rwachtler)</a> and <a href="https://github.com/jelhan">Jeldrik Hanschke (@jelhan)</a>.</p>
<p>You can find the release notes on <a href="https://github.com/kaliber5/ember-bootstrap/blob/master/CHANGELOG.md#310-2019-11-02">GitHub</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/pichfl" target="gh-user">@pichfl</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/thejonrichmond" target="gh-user">@thejonrichmond</a>, <a href="https://github.com/rictic" target="gh-user">@rictic</a>, <a href="https://github.com/raycohen" target="gh-user">@raycohen</a>, <a href="https://github.com/lolmaus" target="gh-user">@lolmaus</a>, <a href="https://github.com/vladucu" target="gh-user">@vladucu</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/bertdeblock" target="gh-user">@bertdeblock</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/ursm" target="gh-user">@ursm</a>, <a href="https://github.com/Mikek2252" target="gh-user">@Mikek2252</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/dmuneras" target="gh-user">@dmuneras</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/bendemboski" target="gh-user">@bendemboski</a> and <a href="https://github.com/patricklx" target="gh-user">@patricklx</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jessica Jordan, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-124</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-124</guid><pubDate>Fri, 15 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 125]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Check out the Ember 3.14 release 🐹✨,
"I Contribute to Ember" with Ryan Mark 👨‍💻,
submit your EmberConf 2020 proposal today 🎤,
VS Code Plugins for Octane 🤖,
beta releases for Ember Basic Dropdown and Ember Power Select ⭐,
listen to a new episode of Ember Weekend 🎧,
and a brand-new Readers' Question about the future of DDAU 🤓!</p>
<!-- READMORE -->
<hr />
<h2 id="ember314isouthttpsblogemberjscom20191118ember314releasedhtml"><a href="https://blog.emberjs.com/2019/11/18/ember-3-14-released.html">Ember 3.14 is Out! 🐹✨</a></h2>
<p>The latest release of Ember is out! <strong>Ember 3.14</strong> brings many new features, bug fixes and improvements for the Ember.js library, Ember Data and Ember CLI.</p>
<p>The release includes performance improvements for fetching relationships via <code>links</code> and the new <code>@model</code> syntax in Route templates as described in <a href="https://emberjs.github.io/rfcs/0523-model-argument-for-route-templates.html">Request for Comments (RFC) No. 523</a>, among other updates. Additionally, the <a href="https://emberjs.com/editions/octane/">Octane Preview</a> continues in the latest version of Ember - allowing you to try out Ember Octane in your app today!</p>
<p>Learn all about the new and shiny Ember 3.14 release and how to opt-in into Octane by reading <a href="https://blog.emberjs.com/2019/11/18/ember-3-14-released.html">the official release announcement</a>.</p>
<hr />
<h2 id="icontributetoemberwithryanmarkhttpsdiscussemberjscomticontributetoemberwithryanmark17242"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-ryan-mark/17242">"I contribute to Ember" with Ryan Mark 👨‍💻</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Ryan Mark" title="Ryan Mark - Contributor to Ember" src="/images/blog/emberjstimes/ryan_mark.jpeg" />
</div>
<p>In our <strong>thirteenth edition</strong> of our contributor interview series, community member <a href="https://github.com/tylerturdenpants">Ryan Mark @tylerturdenpants</a>, talks about his work on codemods. Ryan was an early contributor to The Ember Times in its nascent days! He did a lot of work with Puppeteer on <a href="https://github.com/ember-learn/ember-times-tools">ember-times-tools</a>, a tool to convert Times blog posts to Goodbits, our email provider. Puppeteer is also what <a href="https://github.com/ember-codemods/ember-codemods-telemetry-helpers">ember-codemods-telemetry-helpers</a> uses. 🔗</p>
<p>We’d like to thank Ryan for his contributions to the Ember community, in addition to his financial contribution to cover the Ember Times Goodbits subscription for the last year! 👏 Check out the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-ryan-mark/17242">the Ember Discuss forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-ryan-mark/17242">Read more</a></p>
<p style="font-style: italic;">The idea behind these interviews is to provide community members with more information and insight into open source contributions, learning resources and community events. Contributors to the community gain a platform to share their thoughts on their own experiences and learnings as they were contributing to Ember. Our hope is that it gives first-time and advancing contributors a better sense of the fact that everyone starts out small, and that anyone can have a big impact on the community.</p>
<hr />
<h2 id="reminderemberconf2020cfpduedecember1httpscfpemberconfcomeventsemberconf2020"><a href="https://cfp.emberconf.com/events/emberconf-2020/">Reminder: EmberConf 2020 CFP, Due December 1 🎤</a></h2>
<p>Each year, <a href="https://emberconf.com/">EmberConf</a> gets to feature wonderful, <em>ambitious</em> talks and workshops. We encourage you to take the stage in 2020 and <a href="https://cfp.emberconf.com/events/emberconf-2020/">share what you learned (or want to learn) with the world</a>! You can give a 5, 15, or 30-min talk, or a 3-hour workshop. You can also submit more than 1 proposal.</p>
<p>Not sure what to talk about or need a gentle push? Feel free to check out the <a href="https://emberconf.com/#/cfp-brainstorm">recording of CFP brainstorm meeting</a> and ask for help on <a href="https://discordapp.com/channels/480462759797063690/480502413917421570"><code>#ember-conf</code> channel</a> on <a href="https://discordapp.com/invite/emberjs">Discord</a>.</p>
<hr />
<h2 id="vscodepluginsforoctanehttpsmarketplacevisualstudiocomitemsitemnamelifeartvscodeemberunstable"><a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-ember-unstable">VS Code Plugins for Octane 🤖</a></h2>
<p>If you are a VS Code fan you may want to check out the latest releases of <strong>two great</strong> VS Code plugins by <a href="https://github.com/lifeart">Alex Kanunnikov @lifeart</a> that provide support for Octane features in VS Code! ✨</p>
<p>The <a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-ember-unstable">Unstable Ember Language Server</a> plugin now provides support for autocompletion of component arguments in templates, <code>LinkTo</code> route argument autocompletion and improved scope autocompletion.</p>
<p>And, the recently released <a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-glimmer-syntax">Glimmer Templates Syntax for VS Code</a> plugin provides support for formatting of Glimmer template files!</p>
<hr />
<h2 id="betareleasesforemberbasicdropdownandemberpowerselecthttpstwittercommiguelcambastatus1196520042948628480"><a href="https://twitter.com/MiguelCamba/status/1196520042948628480">Beta Releases for Ember Basic Dropdown and Ember Power Select ⭐</a></h2>
<p><a href="https://github.com/cibernox">Miguel Camba @cibernox</a> released beta versions of <a href="https://github.com/cibernox/ember-basic-dropdown">ember-basic-dropdown</a> (3.0.0-beta.2) and <a href="https://github.com/cibernox/ember-power-select">ember-power-select</a> (4.0.0-beta.3) which are now glimmer components!</p>
<p>Both beta versions require <a href="https://blog.emberjs.com/2019/09/25/ember-3-13-released.html">Ember 3.13</a> or greater. Try them out today!</p>
<hr />
<h2 id="emberweekendepisode133bringyourownbabelhttpsemberweekendcomepisodesbringyourownbabel"><a href="https://emberweekend.com/episodes/bring-your-own-babel/">Ember Weekend Episode 133: Bring Your Own Babel 🎧</a></h2>
<p>Following a <em>hiatus</em> 😉, <a href="https://twitter.com/rondale_sc">Jonathan Jackson</a>, <a href="https://twitter.com/rwjblue">Robert Jackson</a>, and <a href="https://twitter.com/code0100fun">Chase McCarthy</a> got together to record a <a href="https://emberweekend.com/episodes/bring-your-own-babel/">new Ember Weekend episode</a> and share news in the Ember ecosystem.</p>
<p>In episode 133, you will learn more about the remaining tasks for the <a href="https://emberjs.com/editions/octane">Octane</a> release, improvements made in <a href="https://github.com/ember-codemods/ember-angle-brackets-codemod">ember-angle-brackets-codemod</a> and <a href="https://github.com/ember-codemods/ember-no-implicit-this-codemod">ember-no-implicit-this-codemod</a>, and how you can join and help grow the <a href="https://github.com/ember-codemods">ember-codemods organization</a>!</p>
<hr />
<h2 id="readersquestionsanyplanstoimprovetheddauexperienceinthefuturehttpsdiscussemberjscomtreadersquestionsarethereplanstoimprovetheexperienceforusingdatadownactionsupinthefuture17239"><a href="https://discuss.emberjs.com/t/readers-questions-are-there-plans-to-improve-the-experience-for-using-data-down-actions-up-in-the-future/17239">Readers' Questions: "Any plans to improve the DDAU experience in the future?" 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>This week's Readers' Question focusses on a common pattern for managing state in Ember apps: <strong>Data Down, Actions Up (DDAU)</strong>. Even though DDAU is the <i>Ember way</i> to build applications, it at times doesn't seem to come intuitively to those who use the framework. Are there any plans to <strong>improve the developer experience</strong> for DDAU in Ember apps for the future?</p>

  <p>You can find out in this week's Readers' Question! Read all about the future of DDAU and how Ember will help you to apply this useful pattern on <a href="https://github.com/jessica-jordan" target="jj">Jessica Jordan's (@jessica-jordan)</a> answer on <a href="https://discuss.emberjs.com/t/readers-questions-are-there-plans-to-improve-the-experience-for-using-data-down-actions-up-in-the-future/17239" target="discuss">the official Ember forum</a>!</p>

  <p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/readers-questions-are-there-plans-to-improve-the-experience-for-using-data-down-actions-up-in-the-future/17239">Read more</a></p>
</div>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/patricklx" target="gh-user">@patricklx</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/SergeAstapov" target="gh-user">@SergeAstapov</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/pichfl" target="gh-user">@pichfl</a>, <a href="https://github.com/pradeepcep" target="gh-user">@pradeepcep</a>, <a href="https://github.com/sly7-7" target="gh-user">@sly7-7</a> and <a href="https://github.com/jenweber" target="gh-user">@jenweber</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jared Galanis, Isaac Lee, Chris Ng, Amy Lam, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-125</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-125</guid><pubDate>Fri, 22 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 126]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>More Improvements Coming to Ember Inspector Soon 🚀,
represent Ember in the State of JavaScript 2019 survey 📃,
give thanks to Octane Guides contributors 🙏,
Ember got more real with RealWorld 🌟,
the EmberConf CfP closing on Dec 1st 📆,
and Ember + Tailwind CSS tips and tricks 🎨!</p>
<!-- READMORE -->
<hr />
<h2 id="moreimprovementscomingtoemberinspectorsoonhttpsgithubcomemberjsemberinspectorpull1088"><a href="https://github.com/emberjs/ember-inspector/pull/1088">More Improvements Coming to Ember Inspector Soon 🚀</a></h2>
<p>A huge shoutout and thank you are owed to <a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a> and <a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a>, the maintainers of the Ember Inspector, and everyone else involved for all their amazing work in getting the new and improved <strong>Ember Inspector</strong> ready for Octane! 🔥🔥🔥</p>
<p>With the release of Octane coming it is welcomed news that Octane's Glimmer components work in Ember Inspector now, in both the component tree and the object inspector. Other improvements include revamping the component hover inspection tool to match Chrome's inspection style, many bug fixes and a complete rewrite of the component tree logic that is more future proof.</p>
<p><a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a>, in particular, is owed a big thanks for helping design the <code>captureRenderTree</code> API in Ember that was needed to provide the Inspector with the information it needs and for providing a polyfill, so it works seamlessly across versions.</p>
<p>Also many thanks to <a href="https://github.com/patricklx">Patrick (@patricklx)</a> for a lot of recent work in getting inspector ready for Octane, including compatibility with Octane's tracked properties.</p>
<p>If you'd like to help test out all the new functionality, there is an open <a href="https://github.com/emberjs/ember-inspector/pull/1088">PR with the changes</a>. Please let <a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a> and the Inspector team know on the PR if you encounter any issues! And here's a preview:</p>
<p><img src="/images/blog/emberjstimes/inspector.gif" alt="Ember Inspector preview"></p>
<hr />
<h2 id="stateofjavascript2019surveyhttpsstateofjscom"><a href="https://stateofjs.com/">State of JavaScript 2019 Survey 📃</a></h2>
<p>It’s that time of year again! Please make sure to fill out the <a href="https://stateofjs.com/">State of JavaScript Survey</a> and represent <strong>Ember</strong>!</p>
<p>In 2018 the survey collected over 20,000 responses from developers to identify current and upcoming trends. This year, the survey is once again looking for how developers use JavaScript with regards to syntax, browser APIs, and mobile vs desktop web.</p>
<p>All questions are optional and reaching 100% completion is not required so give it a try and answer the <a href="https://stateofjs.com/">State of JavaScript Survey</a> today! Hint: The survey asks about <strong>Ember</strong> under "Front-end Frameworks."</p>
<hr />
<h2 id="latestupdatestooctaneguideshttpsoctaneguidespreviewemberjscom"><a href="https://octane-guides-preview.emberjs.com/">Latest Updates to Octane Guides 🙏</a></h2>
<p>Documentation is integral to helping us understand how to use open source projects like Ember and its addons. Documentation is so common in our lives that we tend to overlook how much work is involved in creating and maintaining one.</p>
<p>Today, we extend our hearty thanks to <a href="https://github.com/sly7-7">@sly7-7</a> and <a href="https://github.com/venusang">@venusang</a>. @sly7-7 proofread and updated several code examples in the <a href="https://octane-guides-preview.emberjs.com/">Octane Guides</a>, while @venusang added instructions for using element modifiers in the <a href="https://ember-learn.github.io/ember-octane-vs-classic-cheat-sheet/">Ember.js Octane vs. Classic Cheat Sheet</a> (we highly recommend bookmarking this page!).</p>
<p>If you can contribute to everyone's learning today, we ask that you help <strong>update the readme of your favorite addon</strong> to provide code examples in Octane.</p>
<hr />
<h2 id="emberrealworldappisfeaturecompletehttpsgithubcomgothinksteremberrealworld"><a href="https://github.com/gothinkster/ember-realworld">Ember RealWorld App is Feature Complete 🌠</a></h2>
<!-- alex ignore dad-mom -->
<p><a href="https://github.com/gothinkster/realworld">RealWorld</a>, "the mother of all demo apps", is an open source initiative to showcase a full stack app built using any frontend or backend framework/library. It provides a spec for both the API and the frontend. The idea is to show how a "real world" app can be built using different frameworks/libraries.</p>
<p>The Ember RealWorld implementation is finally complete! It was started over two years ago by <a href="https://github.com/Alonski">Alon Bukai (@Alonski)</a> and after all this time is finally feature complete. A large number of contributors helped out along the way: <a href="https://github.com/jonnii">Jonathan Goldman (@jonnii)</a>, <a href="https://github.com/alexlafroscia">Alex LaFroscia (@alexlafroscia)</a>, <a href="https://github.com/delusioninabox">Laura Kajpust (@delusioninabox)</a>, <a href="https://github.com/patocallaghan">Pat O'Callaghan (@patocallaghan)</a>, <a href="https://github.com/GCheung55">Garrick Cheung (@GCheung55)</a>, <a href="https://github.com/mansona">Chris Manson (@mansona)</a>, and <a href="https://github.com/johpol">John (@johpol)</a>.</p>
<p>The implementation showcases a classic Ember.js app using the most idiomatic Ember patterns to serve as an example for the wider community. Feel free to look through the codebase and even offer suggestions, PRs or comments regarding how the app is built. There is always room for improvements. We are, for example, looking for performance improvements, so if that's your cup of tea ☕, please contribute.</p>
<p>The RealWorld project has a rating system based on GitHub stars. Currently Ember RealWorld has been starred by community members 60 times, but we believe there could be so many more! To make the repo reflect the real world usage of Ember on the web, <a href="https://github.com/gothinkster/ember-realworld">go and vote with your stars</a> 🌟!</p>
<p>P.S. Look out for an Octane implementation coming soon to a GitHub repo near you 🍿.</p>
<hr />
<h2 id="getyourtalkproposalsreadyforemberconfbydec1sthttpsemberconfcombecomeaspeaker"><a href="https://emberconf.com/#/become-a-speaker">Get Your Talk Proposals Ready for EmberConf by Dec 1st 🎙</a></h2>
<p>EmberConf, the biggest, annual conference about Ember taking place in Portland, US from March 16 - 18, 2020, is accepting talk proposals from the community - but only until <strong>Dec 1st, 12am MST</strong> (= Dec 1st, 7am UTC). This means, in case you haven't done so already, it's about time to <a href="https://emberconf.com/#/become-a-speaker">get your amazing conference proposal submitted</a>!</p>
<p>The EmberConf Call for Papers (CfP) is public, starts out anonymous, and features a collaborative process to help applicants improve their proposals.</p>
<p>Why should you become a speaker? Because this is a unique opportunity to share your knowledge, opinion and experience with the wider community! No matter if you are a first time speaker or an experienced presenter, this is your chance to present your ideas in the form of a <strong>30 min</strong> session or a <strong>15min</strong> mini talk.</p>
<p><a href="https://emberconf.com/#/become-a-speaker">Be sure to submit your talk idea this weekend</a> and in case you still need some inspiration: be sure to checkout <a href="https://emberconf.com/#/cfp-brainstorm">this year's EmberConf CfP brainstorm</a> for feedback from the programme committee! Fingers crossed!</p>
<hr />
<h2 id="allthingsemberandtailwindhttpswwwbalinterdicomblogpurgingcssinemberpostcsspurgecss"><a href="https://www.balinterdi.com/blog/purging-css-in-ember-postcss-purgecss/">All Things Ember and Tailwind 🎨</a></h2>
<p>Are you on the functional CSS train 🚂? Tailwind CSS is a highly customizable, low-level CSS framework that gives you all of the building blocks you need to build bespoke designs without any annoying opinionated styles you have to fight to override. <a href="https://github.com/balinterdi">Balint Erdi (@balinterdi)</a> recently blogged about Ember, Tailwind and PostCSS. In <a href="https://www.balinterdi.com/blog/ember-tailwind-css-postcss-import/">his first post</a>, Balint explains how with <a href="https://github.com/ef4/ember-auto-import">ember-auto-import</a>, you can use <a href="https://tailwindcss.com/">Tailwind</a> directly versus relying on the Ember-specific integrator package. (ember-cli-tailwind was deprecated, because this worked so well!) However, to make your Ember app integrate nicely with Post CSS, Balint suggests sticking with the integrator add-on <a href="https://github.com/jeffjewiss/ember-cli-postcss">ember-cli-postcss</a>. Check out <a href="https://github.com/postcss/postcss-import">post-css-import</a> to be able to import styles from other files.</p>
<!-- alex disable masters -->
<p>In his <a href="https://www.balinterdi.com/blog/purging-css-in-ember-postcss-purgecss/">second post</a>, Balint details how he added Purgecss to the mix. <a href="https://www.purgecss.com/">Purgecss</a> is a library that removes unused CSS, thus reducing the bundle size. Be sure to check out <a href="https://github.com/chrism">Chris Masters (@chrism)</a>'s working example in his detailed <strong><a href="https://github.com/chrism/emberjs-tailwind-purgecss">emberjs-tailwind-purgecss README</a></strong>. Balint also touches on using Purgecss only in production, which has its pros and cons. We definitely enjoyed the discussion about these blog posts on the <a href="https://twitter.com/baaz/status/1198982126860935168">Twitter thread</a>. Happy Tailwind-ing!</p>
<!-- alex enable masters -->
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/tniezurawski" target="gh-user">@tniezurawski</a>, <a href="https://github.com/pichfl" target="gh-user">@pichfl</a>, <a href="https://github.com/kanongil" target="gh-user">@kanongil</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/MarcoUmpierrez" target="gh-user">@MarcoUmpierrez</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a> and <a href="https://github.com/dmuneras" target="gh-user">@dmuneras</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jared Galanis, Alon Bukai, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-126</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-126</guid><pubDate>Fri, 29 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 127]]></title><description><![CDATA[<p>Happy DecEmber Emberistas! 🐹</p>
<p>"I contribute to Ember" with Ben Demboski" 👨‍💻,
become an Ember author in DecEmber ✍️🎄,
a reminder to help test the new Inspector 🔬,
release v3.0.0 of ember-test-selectors 🎉,
and try out Ember Electron v3 beta today 🖥️!</p>
<!-- READMORE -->
<hr />
<h2 id="icontributetoemberwithbendemboskihttpsdiscussemberjscomticontributetoemberwithbendemboski17294"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-ben-demboski/17294">"I contribute to Ember" with Ben Demboski 👨‍💻</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Ben Demboski" title="Ben Demboski - Contributor to Ember" src="/images/blog/emberjstimes/ben_demboski.jpg" />
</div>
<p>In our <strong>fourteenth edition</strong> of our contributor interview series, community member <a href="https://github.com/bendemboski">Ben Demboski (@bendemboski)</a> talks about his work on <a href="https://github.com/adopted-ember-addons/ember-electron">ember-electron</a>.</p>
<p>We’d like to thank Ben for his contributions to the Ember community, and for all of his help keeping ember-electron up and running!</p>
<p>Check out the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-ben-demboski/17294">the Ember Discuss forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-ben-demboski/17294">Read more</a></p>
<p style="font-style: italic;">The idea behind these interviews is to provide community members with more information and insight into open source contributions, learning resources and community events. Contributors to the community gain a platform to share their thoughts on their own experiences and learnings as they were contributing to Ember. Our hope is that it gives first-time and advancing contributors a better sense of the fact that everyone starts out small, and that anyone can have a big impact on the community.</p>
<hr />
<h2 id="becomeanemberauthorforthecountdowntothenewyearblogserieshttpsdiscussemberjscomtwriterswantedcountdowntothenewyearblogseries17273"><a href="https://discuss.emberjs.com/t/writers-wanted-countdown-to-the-new-year-blog-series/17273">Become an Ember Author for the Countdown to the New Year Blog Series ✍️🎄</a></h2>
<p>This month, the Ember Blog will feature <strong>one</strong> fun, useful and interesting <strong>Ember addon each day</strong>. And we are still looking for writers to make the official <strong>Countdown to the New Year</strong> blog post series a reality!</p>
<p>If you are interested in contributing to the series, you only need experience with Markdown and Git to get started - that's it! If you would like to write a short article for the Ember blog in <em>DecEmber</em> yourself, feel free to <a href="https://github.com/ember-learn/ember-blog/labels/decEmber">sign up for any of the issues with the DecEmber label</a> and take a look <a href="https://github.com/ember-learn/ember-blog/blob/main/post-templates/december-2019-template.md">at our contribution guide</a>. If you have questions or need feedback, reach out to us on the <strong>#dev-ember-learning</strong> channel on the <a href="https://discordapp.com/invite/emberjs">Ember Discord</a> or ping <a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/jenweber">Jen Weber (@jenweber)</a> or <a href="https://github.com/jessica-jordan">Jessica Jordan (@jessica-jordan)</a>.</p>
<p>Don't forget to check out these great posts for DecEmber by previous Ember authors if you need some inspiration:</p>
<ul>
<li><a href="https://blog.emberjs.com/2019/12/01/countdown-to-the-new-year-ember-sortable.html">Day 1: Ember Sortable</a></li>
<li><a href="https://blog.emberjs.com/2019/12/02/countdown-to-the-new-year-ember-cli-mirage.html">Day 2: Ember CLI Mirage</a></li>
<li><a href="https://blog.emberjs.com/2019/12/03/countdown-to-the-new-year-ember-modifier.html">Day 3: Ember Modifier</a></li>
<li><a href="https://blog.emberjs.com/2019/12/04/countdown-to-the-new-year-ember-tether.html">Day 4: Ember Tether</a></li>
<li><a href="https://blog.emberjs.com/2019/12/05/countdown-to-the-new-year-ember-concurrency.html">Day 5: Ember Concurrency</a></li>
</ul>
<hr />
<h2 id="aremindertohelptestthenewinspectorhttpsgithubcomemberjsemberinspectorpull1088"><a href="https://github.com/emberjs/ember-inspector/pull/1088">A Reminder to Help Test the New Inspector 🔬</a></h2>
<p>Following last week's announcement about the awesome new work being done on <strong>Ember Inspector</strong> to support Octane 🔥, please don't forget to help test the new changes and let the Inspector team know about your experiences (positive or negative).</p>
<p>The Inspector changes in question are currently still in a <a href="https://github.com/emberjs/ember-inspector/pull/1088">pull request</a>, so if you're interested in taking it for a spin, you'll have to follow the instructions in the PR's description. Note: These instructions are not the same as installing Inspector in the usual manner for your browser.</p>
<p>Please feel free to report any success stories or issues either in the PR or in the <code>#st-octane</code> channel of Discord.</p>
<p>While the new changes relate primarly to suppport of Octane, it would be very helpful to test this particular build of the Inspector on older versions of Ember as well! 😊</p>
<hr />
<h2 id="releasev300ofembertestselectorshttpstwittercomsimplabsstatus1197882267944792064"><a href="https://twitter.com/simplabs/status/1197882267944792064">Release v3.0.0 of ember-test-selectors 🎉</a></h2>
<p><a href="https://github.com/simplabs/ember-test-selectors">ember-test-selectors</a> - the addon that provides better element selectors in Ember.js tests - released <a href="https://github.com/simplabs/ember-test-selectors/releases/tag/v3.0.0">v3.0.0</a>. The main breaking changes in this major release are dropping support for older Ember.js, Ember CLI and Node.js versions (Ember.js 2.16 or above, Ember CLI 2.14 or above, Node.js 8 or above).</p>
<p>The release also comes with some improvements that might decrease your build times, so update your dependency today!</p>
<hr />
<h2 id="tryoutemberelectronv3betatodayhttpstwittercombendemboskistatus1199741719102668800"><a href="https://twitter.com/bendemboski/status/1199741719102668800">Try Out Ember Electron v3 beta Today! 🖥️</a></h2>
<p><a href="https://adopted-ember-addons.github.io/ember-electron/versions/v3.0.0-beta.0/">Ember Electron</a>, the addon to help you create ambitious <strong>cross-platform desktop apps</strong>, is getting ready for its v3 release! Key improvements include supporting the latest <a href="https://www.electronforge.io/">Electron Forge</a>, faster build pipeline, and improved developer ergonomics.</p>
<p>We extend our thanks to contributors <a href="https://github.com/bendemboski">Ben Demboski (@bendemboski)</a> and <a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a>. They ask that you try it out and give feedback. To learn how to upgrade from v2, please check out the <a href="https://adopted-ember-addons.github.io/ember-electron/versions/v3.0.0-beta.0/docs/guides/upgrading">Ember Electron documentation</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/tniezurawski" target="gh-user">@tniezurawski</a>, <a href="https://github.com/buschtoens" target="gh-user">@buschtoens</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/thec0keman" target="gh-user">@thec0keman</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a> and <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jessica Jordan, Robert Wagner, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-127</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-127</guid><pubDate>Fri, 06 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 128]]></title><description><![CDATA[<p>Happy Friday the 13th 👻, Emberistas! 🐹</p>
<p>Updates for the Octane/Classic Ember Cheat Sheet 🎮,
check out the new accessible controls for ember-sortable 🎛️,
introduce adaptive loading to your app with Ember Device 📶,
a new testing codemod from Freshworks 🎉,
and more DecEmber 📆 updates!</p>
<!-- READMORE -->
<hr />
<h2 id="newreleaseoftheoctanevsclassiccheatsheethttpsemberlearngithubioemberoctanevsclassiccheatsheet"><a href="https://ember-learn.github.io/ember-octane-vs-classic-cheat-sheet/">New Release of the Octane vs Classic Cheat Sheet 🎮</a></h2>
<p>Ember's first edition, <a href="https://emberjs.com/editions/octane/">Ember Octane</a>, is around the corner. And did you already know that you can find all the cheat codes you will ever need to move classic Ember apps to Octane ones in <a href="https://ember-learn.github.io/ember-octane-vs-classic-cheat-sheet/">this official cheat sheet</a>? It compares many of the APIs, patterns and best practices that you might already be familiar with from the classic Ember world to the new paradigms used in Octane applications.</p>
<p>In the past weeks plenty of community members worked on getting the cheat sheet ready for the upcoming launch of Ember Octane. Recently, they added information on how <a href="https://discuss.emberjs.com/t/readers-questions-what-is-meant-by-the-term-data-down-actions-up/15311">the Data Down, Actions Up pattern</a> compares between classic and Octane apps, <a href="https://emberjs.github.io/rfcs/0481-component-templates-co-location.html">template co-location</a>, how to migrate <a href="https://api.emberjs.com/ember/3.14/classes/Mixin">when using Mixins</a> and much more. <a href="https://ember-learn.github.io/ember-octane-vs-classic-cheat-sheet/">Check out the cheat sheet today</a>!</p>
<p>Last, but not least, we would like to not only thank those who worked <a href="https://github.com/ember-learn/ember-octane-vs-classic-cheat-sheet/pull/19">on the latest update of the Ember Octane vs Classic Cheat Sheet</a>, but also everyone else who made this valuable learning resource a reality previously: a huge thank you 💖 goes to the contributors <a href="https://github.com/jenweber">Jen Weber (@jenweber)</a>, <a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/venusang">Venus Ang (@venusang)</a>, <a href="https://github.com/rajasegar-c">Rajasegar Chandran (@rajasegar-c)</a>, <a href="https://github.com/acorncom">David Baker (@acorncom)</a>, <a href="https://github.com/wagenet">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/efx">Eli Flanagan (@efx)</a> and <a href="https://github.com/NullVoxPopuli">L. Preston Sego III (@NullVoxPopuli)</a>!</p>
<p>Want to contribute to the cheat sheet yourself? Check out <a href="https://github.com/ember-learn/ember-octane-vs-classic-cheat-sheet">the project on Github</a> and chat with other contributors on the <strong>#dev-ember-learning</strong> channel on <a href="https://discordapp.com/invite/emberjs">the Ember Discord</a>!</p>
<hr />
<h2 id="accessiblecontrolsforembersortablehttpswwwlinkedincompulseopensourcea11ydeepdiveembersortableyichengjerrygong"><a href="https://www.linkedin.com/pulse/open-source-a11y-deep-dive-ember-sortable-yicheng-jerry-gong/">Accessible Controls for ember-sortable 🎛️</a></h2>
<p><a href="https://github.com/ygongdev">Yicheng (Jerry) Gong (@ygongdev)</a> wrote a <a href="https://www.linkedin.com/pulse/open-source-a11y-deep-dive-ember-sortable-yicheng-jerry-gong/">blog post</a> that documented the process on how we now have <a href="https://github.com/adopted-ember-addons/ember-sortable/issues/269">accessible controls</a> for <a href="https://github.com/adopted-ember-addons/ember-sortable">ember-sortable</a>, an open source drag and drop list sort Ember addon.</p>
<p>Unfortunately there was not a well-defined standard for making accessible drag and drop controls from organizations such as the <a href="https://www.w3.org/WAI/standards-guidelines/wcag/">WCAG</a>. He turned to <a href="https://github.com/drewlee">Andrew A Lee (@drewlee)</a> who created a comprehensive list on what accessible features should be expected on a drag and drop utility and even a <a href="https://codepen.io/drewlee/project/full/XWNLeE">CodePen demo</a>. These accessible controls have now landed as part of the <a href="https://github.com/adopted-ember-addons/ember-sortable/releases/tag/v2.0.0">2.0.0 release</a> of the <a href="https://github.com/adopted-ember-addons/ember-sortable">ember-sortable</a> addon. Check out the accessible controls at the <a href="https://adopted-ember-addons.github.io/ember-sortable/demo/">demo page</a> today!</p>
<p>As part of this work, <a href="https://github.com/adopted-ember-addons/ember-sortable">ember-sortable</a> is now part of <a href="https://github.com/adopted-ember-addons">adopted-ember-addons</a>, which is a GitHub org where community members can find a <a href="https://github.com/adopted-ember-addons/program-guidelines/blob/master/README.md">new home</a> for their Ember addon. Moreover, ember-sortable was also highlighted on <a href="https://blog.emberjs.com/2019/12/01/countdown-to-the-new-year-ember-sortable.html">DecEmber Day 1</a>!</p>
<hr />
<h2 id="introduceadaptiveloadingtoyourappwithemberdevicehttpstwittercom_gokatzstatus1201534724696494081"><a href="https://twitter.com/_gokatz/status/1201534724696494081">Introduce Adaptive Loading to Your App with Ember Device 📶</a></h2>
<p>With <a href="https://github.com/gokatz/ember-device">Ember Device</a>, you can <strong>progressively deliver rich content and powerful web experiences</strong>. Thanks to <a href="https://github.com/gokatz">Gokul Kathirvel (@gokatz)</a>, you can <strong>provide as much value to users with low-end devices</strong> as to users with high-end devices. 💯</p>
<p>Ember Device provides a <code>device</code> service so that you can gauge a user's device and network to decide what content to show.</p>
<pre><code class="handlebars language-handlebars">{{#let this.device.networkStatus.effectiveConnectionType as |effectiveType|}}
  {{#if (eq effectiveType "slow-2g")}}
    &lt;ImageLoader @resolution="low" /&gt;

  {{else if (eq effectiveType "2g")}}
    &lt;ImageLoader @resolution="mid" /&gt;

  {{else if (eq effectiveType "3g")}}
    &lt;ImageLoader @resolution="high" /&gt;

  {{else if (eq effectiveType "4g")}}
    &lt;VideoLoader /&gt;

  &lt;!-- Fallback --&gt;
  {{else}}
    &lt;ImageLoader @resolution="mid" /&gt;

  {{/if}}
{{/let}}
</code></pre>
<p>To learn more about <strong>adaptive loading</strong>, we encourage you to check out <a href="https://ember-device.netlify.com/">Ember Device's documentation</a> and <a href="https://siva.dev/adaptive-fetching/">Sivasubramanyam A (@astronomersiva)'s blog post</a>!</p>
<hr />
<h2 id="anewtestingcodemodfromfreshworkshttpstwittercomshibulijackstatus1202280332663214080"><a href="https://twitter.com/shibulijack/status/1202280332663214080">A New Testing Codemod from Freshworks 🎉</a></h2>
<p><a href="https://github.com/freshdesk/ember-freshdesk-codemods/blob/master/transforms/mocha-to-qunit/README.md"><code>mocha-to-qunit</code></a>, the latest codemod from Freshworks, helps you migrate a production test suite from Mocha to QUnit. We encourage you to try it out and contribute back to the project!</p>
<p>You can find all codemods by Freshworks on their <a href="https://github.com/freshdesk/ember-freshdesk-codemods">GitHub repo</a>.</p>
<hr />
<h2 id="decemberanaddonadayhttpsblogemberjscomtagsdecemberhtml"><a href="https://blog.emberjs.com/tags/december.html">DecEmber: An Addon a Day 📆</a></h2>
<p>DecEmber is going strong, highlighting a new addon each day until the calendar turns! Check out the <a href="https://blog.emberjs.com/tags/december.html">latest DecEmber posts</a>, covering addons such as <a href="https://blog.emberjs.com/2019/12/06/countdown-to-the-new-year-ember-auto-import.html"><code>ember-auto-import</code></a>, <a href="https://blog.emberjs.com/2019/12/08/countdown-to-the-new-year-ember-cli-sass.html"><code>ember-cli-sass</code></a>, and <a href="https://blog.emberjs.com/2019/12/13/countdown-to-the-new-year-ember-simple-auth.html"><code>ember-simple-auth</code></a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/dmuneras" target="gh-user">@dmuneras</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/psbanka" target="gh-user">@psbanka</a>, <a href="https://github.com/ctjhoa" target="gh-user">@ctjhoa</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/abel-n" target="gh-user">@abel-n</a>, <a href="https://github.com/lolmaus" target="gh-user">@lolmaus</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-128</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-128</guid><pubDate>Fri, 13 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 129]]></title><description><![CDATA[<p>Happy Holidays, Emberistas! 🐹🌲⛄️</p>
<p>Ember Octane is here 🐹🎉,
new ember-autofocus-modifier 💡,
3 new RFCs for template helpers 3️⃣,
ember-apollo-client v2 released 🎉
and join us for the last 11 days of DecEmber 1️⃣1️⃣!</p>
<!-- READMORE -->
<hr />
<h2 id="octaneisherehttpsblogemberjscom20191220octaneisherehtml"><a href="https://blog.emberjs.com/2019/12/20/octane-is-here.html">Octane Is Here 🎉</a></h2>
<p><a href="https://blog.emberjs.com/2019/12/20/ember-3-15-released.html">Ember 3.15</a> was released this week. In addition to the usual new features, improvements and bug fixes, this release also marks the official release of Ember's first edition - <strong>Ember Octane</strong>!</p>
<p>But what is Ember Octane? Ember Octane is the <strong>new, recommended way</strong> for developers <strong>to build Ember applications</strong> and <strong>addons</strong>.</p>
<!--alex ignore easy-->
<p>Octane features a new reactivity model, a renewed practice of building components and a stronger focus on HTML driven web development than ever before. It aims to make the development of performant Ember apps not only more easy and productive, but also <strong>more fun</strong> right from the start. And on top of that, Ember Octane is <strong>fully opt-in</strong> and <strong>interoperable</strong> for existing Ember apps - which means you can try out the new way of building modern Ember Octane apps gradually, without having to rewrite your entire app today.</p>
<p>Want to know all about Ember Octane? Learn more about what's new in Octane and how to get started <a href="https://blog.emberjs.com/2019/12/20/octane-is-here.html">in the official Ember Octane release announcement</a> by <a href="https://github.com/wycats">Yehuda Katz (@wycats)</a>! Need help? Check out the <strong>#topic-octane-migration</strong> channel on the <a href="https://discordapp.com/invite/emberjs">Ember Discord</a>!</p>
<hr />
<h2 id="newemberautofocusmodifierhttpsmediumcomqontoengineeringautofocusmodifierimprovingourcomponentapisfd589b98f4e"><a href="https://medium.com/qonto-engineering/autofocus-modifier-improving-our-component-apis-fd589b98f4e">New ember-autofocus-modifier 💡</a></h2>
<p>While building an autofocus feature for their components, Qonto engineers were also able to improve their APIs. <a href="https://github.com/dcyriller">Cyrille David (@dcyriller)</a> and team wanted to add autofocus to several components across two apps. For example, both their one-time-password input and their email input component needed autofocus. Since mixins are no longer recommended in the Ember ecosystem, Cyrille went with modifiers. <a href="https://medium.com/qonto-engineering/autofocus-modifier-improving-our-component-apis-fd589b98f4e">And they blogged about their experience here!</a></p>
<p>Modifiers are a new feature in <a href="https://blog.emberjs.com/2019/12/20/octane-is-here.html">the recently released Ember Octane edition</a>. They allow for <strong>sharing code between components</strong>, similar to directives in Vue or Angular. We revisited <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a>'s blog <a href="https://blog.emberjs.com/2019/03/06/coming-soon-in-ember-octane-part-4.html">Coming Soon in Ember Octane - Part 4: Modifiers</a> and the <a href="https://guides.emberjs.com/release/components/template-lifecycle-dom-and-modifiers/#toc_out-of-component-modifications">new Octane Guides: Out-of-Component-Modifications</a> to learn more!</p>
<p>Qonto wrapped up the code in a small addon, <a href="https://github.com/qonto/ember-autofocus-modifier"><code>ember-autofocus-modifier</code></a>. You can use the code as-is, or copy the <a href="https://github.com/qonto/ember-autofocus-modifier/blob/v0.0.1/addon/modifiers/autofocus.js">snippet code</a> and experiment with creating your own modifier.</p>
<hr />
<h2 id="threenewrfcstoaddnewtemplatehelpers3httpsgithubcomemberjsrfcspullsutf8e29c93qis3aopenis3aprauthor3acibernoxtemplates"><a href="https://github.com/emberjs/rfcs/pulls?utf8=%E2%9C%93&q=is%3Aopen+is%3Apr+author%3Acibernox+templates">Three New RFCs to Add New Template Helpers 3️⃣</a></h2>
<p><a href="https://github.com/cibernox">Miguel Camba @cibernox</a> opened a slew of RFCs around adding new built-in operators to Ember templates. The idea comes from functionality provided in <a href="https://github.com/jmurphyau/ember-truth-helpers">ember-truth-helpers</a> and is a subset of his <a href="https://github.com/emberjs/rfcs/pull/388">other RFC</a> to add basic helpers to Ember templates.</p>
<p>The three template helper RFCs Miguel proposed are the following:</p>
<ul>
<li><a href="https://github.com/emberjs/rfcs/pull/560">Adding Equality Operators</a> such as the <code>{{eq}}</code> and <code>{{neq}}</code> helpers</li>
<li><a href="https://github.com/emberjs/rfcs/pull/561">Adding Numeric Comparison Operators</a>, specifically the <code>{{lt}}</code> and <code>{{gt}}</code> helpers</li>
<li><a href="https://github.com/emberjs/rfcs/pull/562">Adding Logical Operators</a> which are the <code>{{and}}</code>, <code>{{or}}</code> and <code>{{not}}</code> helpers</li>
</ul>
<p>Help get this off the ground by adding your input to these changes today!</p>
<hr />
<h2 id="emberapolloclientv2releasedhttpstwittercomjosemarluedkestatus1204908862676975617"><a href="https://twitter.com/josemarluedke/status/1204908862676975617">ember-apollo-client v2 Released 🎉</a></h2>
<p>After a year in beta cycle, <a href="https://github.com/ember-graphql/ember-apollo-client/">ember-apollo-client</a> celebrates a new major release! Version 2 comes with several enhanced features and follows modern practices in Ember and the JavaScript ecosystem. To learn more about v2, please see the <a href="https://github.com/ember-graphql/ember-apollo-client/releases/tag/v2.0.0">changelog</a>.</p>
<p>We extend our thanks to all contributors: <a href="https://github.com/FabHof">@FabHof</a>, <a href="https://github.com/brunoocasali">@brunoocasali</a>, <a href="https://github.com/buschtoens">@buschtoens</a>, <a href="https://github.com/dmzza">@dmzza</a>, <a href="https://github.com/vsergiu93">@vsergiu93</a>, <a href="https://github.com/lstrzebinczyk">@lstrzebinczyk</a>, <a href="https://github.com/jasonmit">@jasonmit</a>, <a href="https://github.com/coladarci">@coladarci</a>, <a href="https://github.com/jgwhite">@jgwhite</a>, <a href="https://github.com/christophermlne">@christophermlne</a>, <a href="https://github.com/bgentry">@bgentry</a>, and <a href="https://github.com/josemarluedke">@josemarluedke</a>.</p>
<p>If you would like to build an Ember + GraphQL app, we encourage you to try out <a href="https://github.com/ember-graphql/ember-apollo-client">ember-apollo-client</a> today!</p>
<hr />
<h2 id="thefinalcountdownwithdecemberhttpsblogemberjscomtagsdecemberhtml"><a href="https://blog.emberjs.com/tags/december.html">The Final Countdown with DecEmber 📆</a></h2>
<p>With the series <strong>DecEmber series "Countdown to the New Year: 31 Days of Ember addons"</strong> the community is featuring their favorite
Ember addons on a daily basis until the end of 2019 - which means, there are <strong>only 11 more days</strong> to go! Follow the DecEmber series <a href="https://blog.emberjs.com/tags/december.html">on the Ember blog</a>!</p>
<p>This week, community members wrote about <a href="https://blog.emberjs.com/2019/12/14/countdown-to-the-new-year-ember-power-select.html">their love ❤️ for powerful select UIs</a>, the <a href="https://blog.emberjs.com/2019/12/19/countdown-to-the-new-year-ember-template-lint.html">beauty of well-formatted templates</a>, the <a href="https://blog.emberjs.com/2019/12/16/countdown-to-the-new-year-2019-ember-intl.html">joy of sharing your app beyond language barriers</a> and how amazing Ember addons help them with writing amazing web applications!</p>
<p>Do you want to share your joy for a particular addon yourself? <a href="https://github.com/ember-learn/ember-blog/labels/decEmber">Sign up for any of the open issues with the DecEmber label</a> and take a look <a href="https://github.com/ember-learn/ember-blog/blob/main/post-templates/december-2019-instructions.md">at our contribution guide</a> to get started. For questions or feedback, reach out to us on the <strong>#dev-ember-learning</strong> channel on the <a href="https://discordapp.com/invite/emberjs">Ember Discord</a> or ping <a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/jenweber">Jen Weber (@jenweber)</a> or <a href="https://github.com/jessica-jordan">Jessica Jordan (@jessica-jordan)</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/hjdivad" target="gh-user">@hjdivad</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/pichfl" target="gh-user">@pichfl</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/bartocc" target="gh-user">@bartocc</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/patricklx" target="gh-user">@patricklx</a> and <a href="https://github.com/craigteegarden" target="gh-user">@craigteegarden</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<h2 id="happyholidaysfromtheembertimesteamhttpsblogemberjscomtagsnewsletter"><a href="https://blog.emberjs.com/tags/newsletter">Happy Holidays from The Ember Times Team 🐹</a></h2>
<p>The Ember Times team wishes you a pleasant, joyful holiday season (and if you don't celebrate any big holidays this month, we wish you a pleasant and joyful time!) with your loved ones, family, friends and animal companions!🌲⛄️🎆</p>
<!--alex ignore special-->
<p>Since most us writers at The Ember Times are looking forward to the holiday season as well, we will be away for a short winter break; on <strong>January 10, 2020</strong> we are back with the next Ember Times and an <strong>exclusive special edition</strong>!</p>
<hr />
<p>Enjoy the rest of the year and see you over in the new one! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Isaac Lee, Godfrey Chan, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-129</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-129</guid><pubDate>Fri, 20 Dec 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 130]]></title><description><![CDATA[<p>Happy New Year, Emberistas! 🐹</p>
<!--alex ignore special-->
<p>This week, we have an <strong>Ember Octane Special Edition</strong> for you!</p>
<p>We've collected as much info as possible about this new Ember edition. So throughout this post, you will find useful information to help you get the most out of Ember Octane.</p>
<blockquote>
  <p>Octane is modern Ember, and I’m psyched that we got it over the finish line. Have fun building apps! ~ <em>Yehuda Katz <a href="https://github.com/wycats">(@wycats)</a></em></p>
</blockquote>
<p>This week: What is the Octane Edition? 🙋‍♀️🙋‍♂️,
where can I learn more 🤓,
how to migrate to Octane 🐹🏗️,
community feedback from Outdoorsy 👏,
conquer Octane with Ember Atlas 🗺🌍,
and Octane at EmberConf 2020 📢!</p>
<!-- READMORE -->
<hr />
<h2 id="whatistheoctaneeditionhttpsblogemberjscom20191220octaneisherehtml"><a href="https://blog.emberjs.com/2019/12/20/octane-is-here.html">What is the Octane Edition? 🙋‍♀️🙋‍♂️</a></h2>
<p>Ember Octane introduces the idea of editions. Let's look at what an edition means in Ember and what features you can find in the Octane edition.</p>
<h3 id="whatisanedition">What is an Edition?</h3>
<p>In Ember, an <a href="https://emberjs.com/editions/">edition</a> represents a <strong>cohesive programming model</strong> and can focus on a particular theme. For example, the Octane edition is focused on productivity and performance!</p>
<p>Having editions helps you and the Ember teams in many ways:</p>
<ol>
<li><p>You can see the big picture of how features work together. Before editions were introduced, you might have had to stay on top of RFCs and release notes to understand why a feature was added or removed.</p></li>
<li><p>For people who don't follow Ember closely—that may be you, or people in the wider JavaScript world—it was easy to miss the significant improvements that happen over time. Editions help us market <span style="font-style: italic;">tour de force</span> in Ember.</p></li>
<li><p>Editions mark an opportunity to update Ember documentation, idioms, addons, and tooling (Ember Inspector, blueprints, codemods, and error messages). The end result is a cohesive, polished experience for you!</p></li>
</ol>
<h3 id="whatfeaturesareintheoctaneedition">What features are in the Octane Edition?</h3>
<p>Many new features cohere to form <strong>a new component model and a new reactivity system</strong> for Ember. These two big changes are keystone to Octane's ergonomic improvements.</p>
<p>You can find the full list of features in the <a href="https://guides.emberjs.com/release/upgrading/current-edition/#toc_what-is-ember-octane">Ember Guides</a>. We'll highlight a few major ones below.</p>
<ol>
<li><p><strong>Glimmer components</strong> offer a greatly simplified API, for both template and backing class. Say hi to outer HTML semantics and namespaced arguments!</p></li>
<li><p><strong>Modifiers</strong> let you interact with the DOM—animate this element, scroll to that element, autofocus on the first form input, etc. Modifiers work on <em>any</em> element.</p></li>
<li><p><strong>Tracked properties</strong> simplify syncing the DOM with JavaScript changes. You no longer need to write and maintain dependency lists.</p></li>
</ol>
<hr />
<!--alex ignore easy-->
<blockquote>
  <p>I'm excited because I think Octane is easier to teach. That's great for both companies who hire non-Ember developers and for self-motivated beginners. With ember-auto-import in the app by default, Ember also plays nice with the broader JavaScript ecosystem. You can npm install the libraries you like, and they work without extra effort. ~ <em>Jen Weber <a href="https://github.com/jenweber">(@jenweber)</a></em></p>
</blockquote>
<h2 id="wherecanilearnmorehttpsguidesemberjscomrelease"><a href="https://guides.emberjs.com/release/">Where can I learn more? 🤓</a></h2>
<p>If you want to try out Ember Octane, you might want to learn more about the new APIs and best practices for
building modern Ember apps. We highly recommend the following learning resources to you:</p>
<h3 id="gettingstarted">Getting Started</h3>
<p>The Ember community worked hard to make the official Ember documentation consisting of the Guides, the Tutorial and the
API Docs ready for the release of Octane. Be sure to make use these learning materials your first stop for getting started with
Ember Octane.</p>
<ul>
<li><a href="https://guides.emberjs.com/release/">The official documentation - Ember.js Guides</a></li>
<li><a href="https://guides.emberjs.com/release/tutorial/part-1/">The official beginner's tutorial - Build the Super Rentals app</a></li>
<li><a href="https://api.emberjs.com/ember/release">The official API reference - Ember.js API Docs</a></li>
</ul>
<blockquote>
  <p>Octane provides a very gentle on-ramp and lets you learn and grow into the framework as the needs arise in your app. You start with HTML templates, then extract pieces into template-only components for clarity, add arguments for reusability, add a js class to add behavior, add a service for shared functionalities, install an addon for more cool stuff, etc. I’m excited to see all of these pieces coming together and finally ready to teach the version of ember we had envisioned. Check out the new tutorial to see the difference for yourself! ~ <em>Godfrey Chan <a href="https://github.com/chancancode">(@chancancode)</a></em></p>
</blockquote>
<h3 id="octanecoreconcepts">Octane Core Concepts</h3>
<p>Especially in the beginning you might want to get familiar with the core concepts behind Octane,
and how these tie in with what you already learned about JavaScript in general! Give some of these selected blog posts a read,
to learn about the principles of Ember's first edition in more detail.</p>
<!-- alex disable masters -->
<ul>
<li>Octane Core Concepts Blog Series by <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a><ul>
<li><a href="https://blog.emberjs.com/2019/02/11/coming-soon-in-ember-octane-part-1.html">Part 1: Native Classes</a></li>
<li><a href="https://blog.emberjs.com/2019/02/19/coming-soon-in-ember-octane-part-2.html">Part 2: Angle Brackets & Named Arguments</a></li>
<li><a href="https://blog.emberjs.com/2019/02/26/coming-soon-in-ember-octane-part-3.html">Part 3: Tracked Properties</a></li>
<li><a href="https://blog.emberjs.com/2019/03/06/coming-soon-in-ember-octane-part-4.html">Part 4: Modifiers</a></li>
<li><a href="https://blog.emberjs.com/2019/03/14/coming-soon-in-ember-octane-part-5.html">Part 5: Glimmer Components</a></li></ul></li>
<li><a href="https://medium.com/ember-ish/the-most-common-ember-js-octane-mistakes-and-how-to-avoid-them-c6420e1b0423">Most Common Mistakes Using Octane and How to Avoid Them</a> by <a href="https://github.com/jenweber">Jen Weber (@jenweber)</a></li>
<li><a href="https://simplabs.com/blog/2019/12/20/clarity-in-templates/">Bringing Clarity to Templates through Ember Octane</a> by <a href="https://github.com/locks">Ricardo Mendes (@locks)</a></li>
<li><a href="https://frontendmasters.com/courses/ember-octane/">Ember Octane Fundamentals Course on Frontend Masters (paid subscription)</a> by <a href="https://github.com/mike-north">Mike North (@mike-north)</a></li>
</ul>
<!-- alex enable masters -->
<blockquote>
  <p>Since the beginning, Ember has evolved alongside the JavaScript language. Ember has served as a testbed for features such as classes and modules, and for years has pushed more upstream than it has received back. With Octane, this tide has turned. Ember now feels as modern as any JavaScript framework, making the most of language features that it has helped shape. And its commitment to stable evolution means that this trend will continue for years to come. ~ <em>Dan Gebhardt <a href="https://github.com/dgeb">(@dgeb)</a></em></p>
</blockquote>
<h2 id="howtomigratetooctanehttpsguidesemberjscomreleaseupgradingcurrentedition"><a href="https://guides.emberjs.com/release/upgrading/current-edition/">How to migrate to Octane 🐹🏗️</a></h2>
<!--alex ignore nuts-->
<p>Ember Octane represents a big shift in Ember's syntax, features, and mental models. There is, however, no need for a stop-the-world migration, Octane provides an opt-in method of migration where you can apply each core feature enhancement incrementally.</p>
<p>If you are migrating an existing Ember application to Octane we have an excellent list of resources to help you out:</p>
<ul>
<li><a href="https://guides.emberjs.com/release/upgrading/current-edition/">Ember Guides: Octane Update Guide</a></li>
<li><a href="https://crunchingnumbers.live/2019/12/23/rewriting-apps-in-ember-octane/">Rewriting Apps in Ember Octane</a> by <a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a></li>
<li><a href="https://ember-learn.github.io/ember-octane-vs-classic-cheat-sheet/">The Ember Octane vs. Classic Ember Cheat Sheet</a></li>
<li><a href="https://www.notion.so/Atlas-Recommended-Migration-Order-a22f948a7cce4e01896d674f727bee74">Ember Atlas: Recommended Migration Order</a></li>
</ul>
<p>Whatever you end up doing, you won’t have to do it alone as members of the community have generously contributed <a href="https://github.com/ember-codemods">numerous codemods</a> to help us to migrate efficiently.</p>
<ul>
<li><a href="https://github.com/ember-codemods/ember-angle-brackets-codemod">Angle Brackets Codemod</a></li>
<li><a href="https://github.com/ember-codemods/ember-tracked-properties-codemod">Tracked Properties Codemod</a></li>
<li><a href="https://github.com/ember-codemods/ember-native-class-codemod">Native Class Codemod</a></li>
<li><a href="https://github.com/ember-codemods/ember-no-implicit-this-codemod">No Implicit This or {{foo}} to {{this.foo}} Codemod</a></li>
<li><a href="https://github.com/ember-codemods/es5-getter-ember-codemod">ES5 Getter Codemod</a></li>
<li><a href="https://github.com/ember-codemods/ember-component-template-colocation-migrator">Template Colocation Migrator</a></li>
</ul>
<!--alex ignore just special-->
<blockquote>
  <p>When we started working on Ember early in the 2010s, we knew we would have to adapt to ecosystem changes, but we couldn’t have predicted how big the changes to the JavaScript language and distribution would be. The thing that’s really special about Ember is that when we adapt to features like JavaScript classes or modern component syntax, we work really hard to bring along existing applications. And it’s not just that you can use old and new features side-by-side. Old syntax and framework classes freely interoperate with new syntax and framework classes. Developers of Ember applications can spend more time on innovative features for their users, and less time on the constant churn that defines the JavaScript community. Ember Octane is modern Ember, and I’m psyched that we got it over the finish line. Have fun building apps! ~ <em>Yehuda Katz <a href="https://github.com/wycats">(@wycats)</a></em></p>
</blockquote>
<p>If you need help along the way, visit the <a href="https://emberjs.com/community/">Ember Community chat and forums</a>.</p>
<hr />
<h2 id="communityfeedbackfromoutdoorsyhttpswwwoutdoorsycom"><a href="https://www.outdoorsy.com">Community feedback from Outdoorsy 👏</a></h2>
<p>Wondering about who has been using Ember Octane features in production?</p>
<p>We’ll spend some time over the next several issues focusing on projects and teams who are using Ember Octane in their apps.</p>
<p>Today’s focus is on <a href="https://www.outdoorsy.com"><strong>Outdoorsy</strong></a>, a peer-to-peer marketplace that connects RV and camper van owners with campers encouraging them to get into the great outdoors. Outdoorsy maintains three large-scale Ember apps for their flagship web product.</p>
<p>The developers at Outdoorsy have been using Octane features in production since September and have reportedly had a super enjoyable experience. <a href="https://github.com/jacojoubert">Jaco Joubert (@jacojoubert)</a>, a Front-End Engineer at Outdoorsy, says "Octane has allowed us to build highly interactive experiences that are well tested in an unbelievably short time. Leveraging Octane we rebuilt our entire <a href="https://www.outdoorsy.com/rv-search">search experience</a> from the ground up in less than five weeks, something which would have taken orders of magnitude longer before."</p>
<p>Outdoorsy's Ember app is a particularly nice highlight of what's possible in an Ember Octane upgrade experience. The app was written in classic Ember style over the last 4 years or so, and is large enough that a team of 26 developers works on it (about half of whom are focused on the frontend). The app is actually a monorepo of several Ember apps and addons and employs a rehydrated Ember Fastboot app for its public facing pages for SEO purposes.</p>
<p>As with any upgrade of an app this size, there were pain points, but the Outdoorsy team took advantage of the opportunity of being together at their fall engineering summit (the team is distributed, and many work remotely) to tackle the upgrade over the course of a week.</p>
<p>The new Octane syntax took a bit of getting used to, particularly around how to make use of tracked properties in place of computed properties, but the team is enjoying using the new auto-tracking system and class based components in many places throughout the application, and plans on incrementally updating all of their components over time.</p>
<p>Almost all new work that gets done on the application is written with Glimmer components and in a clean and idiomatic Ember Octane way.</p>
<!-- alex ignore mental -->
<p>Some of the big benefits that the Outdoorsy team experienced from Octane are a simplified mental model of how Ember works, improved code readability, and easier reasoning about what context a state is derived from. Not having to reference several files to determine where a property is initially defined was definitely a boon to developer productivity.</p>
<p>It’s great to hear that Octane is working really well in a production application at the scale and complexity of Outdoorsy’s.</p>
<p>We know there are lots of other great examples of Octane being used in the wild. If you’d like to share your experiences, please feel to reach out to the Ember Times team.</p>
<hr />
<blockquote>
  <p>Ember’s staying power comes from the energy and dedication of our community, and the Octane release is a great example of how the community can come together, agree on a plan, and execute to a high-level of polish. ~ <em>Edward Faulkner <a href="https://github.com/ef4">(@ef4)</a></em></p>
</blockquote>
<h2 id="theemberatlashttpemberatlascom"><a href="http://emberatlas.com">The Ember Atlas 🗺</a></h2>
<p>We alluded to the <a href="https://www.notion.so/Ember-Octane-b8ad64b7adf74218942fc69ead7b6892">Ember Atlas Octane Upgrade Guide</a> earlier. This section includes information to help Ember developers upgrade from Classic apps/addons to Octane ones. 🚀</p>
<p>So what <span style="font-style: italic;">is</span> Ember Atlas?</p>
<p>Ember Atlas is an unofficial resource for Ember curated by various people in the Ember Community. It includes best practices, upgrade guides and more! The Ember Atlas is built to be a curated wiki for Ember for various content that isn't in the guides yet, or won't ever make it in.</p>
<!--alex ignore easy-->
<p>Bookmark <a href="http://emberatlas.com">emberatlas.com</a> for quick reference and check out the <a href="https://www.notion.so/Introduction-d11ec02706d74eab960b3e2b11494bc7">Ember Atlas Introduction</a> to get started.</p>
<hr />
<h2 id="octaneatemberconf2020httpsemberconfcom"><a href="https://emberconf.com">Octane at EmberConf 2020 📢</a></h2>
<p>With <a href="https://blog.emberjs.com/2019/12/20/octane-is-here.html">Ember Octane</a> released, it is not a surprise that it’s also a hot topic for <a href="https://emberconf.com/#/speakers">EmberConf 2020</a>.</p>
<p>If you want to <a href="https://emberconf.com/#/speakers">listen and talk to people</a> about Octane, EmberConf in Portland, OR is the place to be! March 16th-18th will be filled with awesome talks by <a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/suchitadoshi1987">Suchita Doshi (@suchitadoshi1987)</a>, <a href="https://github.com/DanMonroe">DanMonroe (@DanMonroe)</a> and many others.</p>
<p>It’s also a nice place to meet up with your Ember-friends and learn about many more topics. For more information, check out the <a href="https://emberconf.com">EmberConf website</a> and join the <a href="https://discordapp.com/channels/480462759797063690/480502413917421570">#ember-conf</a> channel on the <a href="https://discord.gg/emberjs">Ember Discord</a>.</p>
<hr />
<blockquote>
  <p>Ember has stability and staying power, and it has for a long while. That makes it super great to work with, and a great choice for companies and teams, but it also means our time in the hype-cycle spotlight happened a while back. Octane is an amazing improvement, and it’s also a great opportunity to get folks who are overly focused on the hype to give it another look. I hope our community members use the little buzz-bump to nudge Ember even further into their companies and projects. ~ <em>Leah Silber <a href="https://github.com/wifelette">(@wifelette)</a></em></p>
</blockquote>
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/the-bionic" target="gh-user">@the-bionic</a>, <a href="https://github.com/bf4" target="gh-user">@bf4</a>, <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/bobisjan" target="gh-user">@bobisjan</a>, <a href="https://github.com/dmzza" target="gh-user">@dmzza</a>, <a href="https://github.com/efx" target="gh-user">@efx</a> and <a href="https://github.com/SYU15" target="gh-user">@SYU15</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Alon Bukai, Jessica Jordan, Anne-Greeth van Herwijnen, Isaac Lee, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-130</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-130</guid><pubDate>Fri, 10 Jan 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 131]]></title><description><![CDATA[<p>Привет, Эмберисты! <span style="font-style: italic;">Hello, Emberistas!</span> 🐹</p>
<!--alex ignore waiters-waitresses-->
<p>Help improve Ember's autotracking and reactivity system 💬, read the new test waiters RFC ⏳, optimize your app with Ember Data 📈, the Russian Ember community 🇷🇺, and learn about powerful debugging at EmberConf 💻!</p>
<!-- READMORE -->
<hr />
<h2 id="4rfcsonimprovingembersautotrackingandreactivitysystemhttpsgithubcomemberjsrfcsblobuseandresourcestext0567useandresourcesmdintroducinguseandresources"><a href="https://github.com/emberjs/rfcs/blob/use-and-resources/text/0567-use-and-resources.md#introducing-use-and-resources">4 RFCs on improving Ember's autotracking and reactivity system 💬</a></h2>
<p>Ember Octane features a <strong>new reactivity system</strong> thanks to <strong>tracked properties</strong>. They simplify syncing the DOM with JavaScript changes. Find out how autotracking works from the <a href="https://guides.emberjs.com/release/in-depth-topics/autotracking-in-depth/">Ember Guides</a>.</p>
<p>To help address some shortcomings, <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> proposed introducing the decorators and classes listed below. We encourage you to participate in RFCs and provide feedback!</p>
<h3 id="566memodecoratorhttpsgithubcomemberjsrfcspull566"><a href="https://github.com/emberjs/rfcs/pull/566">566. <code>@memo</code> decorator</a></h3>
<p>Unlike computed properties, autotracked getters don't cache their values. <code>@memo</code> will let you opt in to memoization.</p>
<h3 id="567usedecoratorhttpsgithubcomemberjsrfcspull567"><a href="https://github.com/emberjs/rfcs/pull/567">567. <code>@use</code> decorator</a></h3>
<p>The <code>@use</code> API will leverage autotracking to solve two issues:</p>
<ul>
<li>Allow Glimmer components to define a behavior with its own lifecycle, independently of the template</li>
<li>Provide a standard way to mix declarative and imperative code</li>
</ul>
<h3 id="569trackedlistclasshttpsgithubcomemberjsrfcspull569"><a href="https://github.com/emberjs/rfcs/pull/569">569. <code>TrackedList</code> class</a></h3>
<p><code>TrackedList</code> will autotrack changes to arrays. This class, designed to replace <code>EmberArray</code>, will follow the native array API closely and be performant.</p>
<h3 id="577trackedmapandtrackedsetclasseshttpsgithubcomemberjsrfcspull577"><a href="https://github.com/emberjs/rfcs/pull/577">577. <code>TrackedMap</code> and <code>TrackedSet</code> classes</a></h3>
<p><code>TrackedMap</code> and <code>TrackedSet</code>, along with their weak analogs, will autotrack changes to maps and sets (dynamic collections of values). These classes will follow the native APIs exactly.</p>
<hr />
<!--alex ignore waiters-waitresses-->
<h2 id="newtestwaitersrfchttpsgithubcomemberjsrfcspull581"><a href="https://github.com/emberjs/rfcs/pull/581">New test waiters RFC ⏳</a></h2>
<!--alex ignore waiters-waitresses-->
<p><a href="https://github.com/scalvert">Steve Calvert (@scalvert)</a> proposed replacing the existing test waiters with the <a href="https://github.com/rwjblue/ember-test-waiters">ember-test-waiters</a> in the <a href="https://github.com/emberjs/rfcs/pull/581">New Test Waiters RFC</a>.</p>
<!--alex ignore waiter-waitress-->
<p>The new test waiter system will provide a few benefits:</p>
<!--alex ignore waiter-waitress waiters-waitresses-->
<ul>
<li>A <strong>new API that removes the existing foot guns</strong> given we will be more explicit when declaring the start and end of the waiter through the waiter <code>beginAsync</code> and <code>endAsync</code> methods</li>
<li>A more robust way to gather <strong>debugging information</strong> for the test waiter since the waiter is identifiable by the name provided</li>
<li>Default test waiters with the <strong>ability to author your own, more complex test waiters</strong> through annotating the asynchronous operations in your code base that are not tracked by an <code>await settled()</code> check</li>
</ul>
<!--alex ignore waiters-waitresses-->
<p>Share your thoughts, feedback, and requests on the <a href="https://github.com/emberjs/rfcs/pull/581">New Test Waiters RFC</a>!</p>
<hr />
<h2 id="optimizingyourappwithemberdatahttpsrunspiredcom20191215optimizingyourappwithemberdata"><a href="https://runspired.com/2019/12/15/optimizing-your-app-with-ember-data/">Optimizing your app with Ember Data 📈</a></h2>
<p><a href="https://github.com/runspired">Chris Thoburn (@runspired)</a> is blogging about how to build and optimize an app with Ember Data. You'll start by building an app, Listicle. Listicle starts as a small app shell with rich content lists, but balloons in size over time. Build times slow to a crawl as a result.</p>
<p>At the beginning of the series, Listicle builds and renders in greater than 5 seconds. But as the posts progress, you'll end with an app with builds and renders in <strong>less than 1 second</strong> by optimizing only the app's data management! Then for fun, you'll optimize the render.</p>
<p>You can check out <a href="https://runspired.com/2019/12/15/optimizing-your-app-with-ember-data/">Part 1</a> and <a href="https://runspired.com/2019/12/18/optimizing-your-app-with-ember-data-part-2/">Part 2</a> now, with more posts to come! And you can follow along with the code for the series by watching the <a href="https://github.com/runspired/listicle">Listicle repository</a>.</p>
<p>For some Ember Data context, check out the <a href="https://guides.emberjs.com/release/models/">Guides</a>. You can learn about the architecture and history in Chris's EmberFest <a href="https://www.youtube.com/watch?v=zbqbsOyLM30&list=PLN4SpDLOSVkT0e094BZhGkUnf2WBF09xx&index=23&t=0s">Ember Data 2019</a> conference talk.</p>
<hr />
<h2 id="russianembercommunityhttpshabrcomrupost483630"><a href="https://habr.com/ru/post/483630/">Russian Ember community 🇷🇺</a></h2>
<p><a href="https://habr.com/">Habr.com</a> is a popular geek media site among Russian developers. It's somewhat similar to Hacker News, except that it's populated by user-submitted articles instead of links. <a href="https://github.com/chilicoder">Iaroslav Popov (@chilicoder)</a> recognized a shortage of Ember articles on Habr.com and recently started translating our very own Ember Times (<a href="https://habr.com/ru/post/482988/">Issue #129</a>, <a href="https://habr.com/ru/post/483630/">Issue #130</a>) on Habr.com, as well as <a href="https://habr.com/ru/post/482158/">Octane is Here</a> and <a href="https://habr.com/ru/post/482296/">Super Rentals tutorial - Part 1</a>!</p>
<p>@chilicoder also mentioned to check out the <a href="https://t.me/ember_js">Ember telegram channel</a>, moderated by <a href="https://github.com/lifeart">Alex Kanunnikov (@lifeart)</a>. It's one of the best ways to get help with <strong>Ember in Russian</strong>, and they welcome everyone to join! Thank you both for your help in fostering the Russian Ember community!</p>
<hr />
<h2 id="learnpowerfuldebuggingstrategiesatemberconfhttpsemberconfcomspeakerssamantadebarros"><a href="https://emberconf.com/#/speakers/samanta-de-barros">Learn powerful debugging strategies at EmberConf 💻</a></h2>
<p>You've undoubtedly heard her talk about <a href="https://www.youtube.com/watch?v=OR1Tk_bwmZo">creating progressive web applications with Ember</a>
and <a href="https://www.youtube.com/watch?v=31kVznd-zys">bulletproof addon testing</a> before, but now <a href="https://github.com/sdebarros">Samanta de Barros (@sdebarros)</a>
is ready to share more useful knowledge that is crucial for any professional JavaScript developer.</p>
<p>At <a href="https://emberconf.com/">this year's EmberConf</a> she's going to teach us about <a href="https://emberconf.com/#/speakers/samanta-de-barros"><strong>The Power of Debugging</strong></a>; which tools you can use to track down bugs swiftly in development and production environments, and how you can find your way around Ember's architecture while doing so.</p>
<p>In an exclusive interview with The Ember Times, Samanta shares with us, what makes debugging tools and strategies so powerful when developing Ember applications:</p>
<!--alex ignore fear just-->
<blockquote>
  <p>I think learning about debugging techniques is important. Mostly, because it will help you to have a better time finding bugs and even how an app works. In part I think it’s necessary because it will help you on your job!</p>
  <p>I also think that when you start looking at other people’s code it is hard at first, but after a while you lose the fear of seeing these complex frameworks, you get a better idea of everything and you start to realise - it’s just JavaScript in the end. So I think debugging techniques are good for finding bugs and demystifying frameworks.</p>
</blockquote>
<p>What's our experience like when we start to learn more about debugging strategies? Here, Samanta can share from both her own experience and from those she worked together with:</p>
<blockquote>
  <p>When you are pairing with someone or you’re trying to solve an issue, you often run into something and it makes people go like: “Oh, that’s interesting!” When I’ve seen other people’s talks or see them working, I see that they have some tips about things that I don’t know about yet and that’s cool! You realise that there are a lot of tools that make working with the frontend easier.</p>
  <p>People who learn more about debugging usually say: “Oh yeah, that’s cool, that really simplifies these tasks I need to do” or “Oh, I didn’t know you could find that information there in the app.”</p>
</blockquote>
<p>EmberConf is a unique experience, one that you and your team should definitely not miss out on. Samanta shares her perspective on what makes the conference
so outstanding:</p>
<!--alex ignore just-->
<blockquote>
  <p>I think it’s a different experience when you go to a conference as a speaker or as attendee. When you just go to listen to the talks, you get a lot of inspiration, you discover things that people are you doing that you might not do yet and it sparks something in you that makes you want to learn something new or improve something in your job. […]</p>
  <p>I would say both getting inspiration and connecting are the nicest things about EmberConf. If I had to recommend anything to an attendee, I’d say: “Just go and ask questions to the other attendees or speakers.” Just listening to the talks is good enough, but the chance to connect with others makes the conference really great.</p>
</blockquote>
<p>If you want to learn more about successfully debugging Ember apps, join more than 800 other Ember developers at <a href="https://emberconf.com/">EmberConf in Portland, OR from March 16 - 18, 2020</a>. Prices for regular attendee tickets start from $449, so don't hesitate to <a href="https://emberconf.com/#/register">register today</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/bobisjan" target="gh-user">@bobisjan</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/mjanjic01" target="gh-user">@mjanjic01</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/dmuneras" target="gh-user">@dmuneras</a>, <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/pichfl" target="gh-user">@pichfl</a>, <a href="https://github.com/skaterdav85" target="gh-user">@skaterdav85</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/mcfiredrill" target="gh-user">@mcfiredrill</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/conormag" target="gh-user">@conormag</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Isaac Lee, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-131</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-131</guid><pubDate>Fri, 17 Jan 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 132]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Get together at EmberConf meetups 🍦, learn how to use <code>RouteInfo.metadata</code> from EmberMap 🧩, try an Octane &amp; JAM sandwich at EmberConf 🏎🥪🍓, monitor Ember app performance with Tracerbench ⏱, and try out the Related Files Hopper VSCode extension 🤸!</p>
<!-- READMORE -->
<hr />
<h2 id="gettogetheratemberconfmeetupshttpsemberconfcomschedulemeetups"><a href="https://emberconf.com/#/schedule/meetups">Get together at EmberConf meetups 🍦🎲🗻</a></h2>
<p>Besides learning a lot from the talks at <a href="https://emberconf.com/">EmberConf</a>, it is also an amazing place to meet people and get to know them. One of the easiest places to do that is at the meetups that can be organised by <strong>you</strong>.</p>
<p>Last year there were a lot of <a href="https://2019.emberconf.com/meetups.html">different meetups</a>, from delicious food and drink gatherings, to a nerve-racking chess tournament, and bouldering.</p>
<p>If you have a great idea for a meetup, you can <a href="https://emberconf.com/#/schedule/meetups">sign up here</a>. Keep an eye on this page as well if you want to know about all the meetups and when they will happen.</p>
<hr />
<h2 id="learnhowtouserouteinfometadatafromembermaphttpsembermapcomtopicswhatsnewinemberrouteinfometadata310"><a href="https://embermap.com/topics/what-s-new-in-ember/routeinfo-metadata-3-10">Learn how to use <code>RouteInfo.metadata</code> from EmberMap 🧩</a></h2>
<p>Ember uses the <code>RouteInfo</code> object to send route information. These include route name, query parameters, and parent route. Since <a href="https://blog.emberjs.com/2019/05/21/ember-3-10-released.html">Ember 3.10</a>, <code>RouteInfo</code> carried an extra attribute called <code>metadata</code>, where you can store and retrieve anything you want in a route.</p>
<p>How would you use this feature then? In the latest <a href="https://embermap.com/topics/what-s-new-in-ember/routeinfo-metadata-3-10">What's New in Ember</a> video, <a href="https://github.com/samselikoff">Sam Selikoff (@samselikoff)</a> shows how you can <strong>create dynamic breadcrumbs</strong>. Along the way, you will see how you can inspect a <code>RouteInfo</code> object too.</p>
<p>We encourage you to watch the video and share your own applications of <code>metadata</code>. You can find a couple of more examples in the <a href="https://github.com/emberjs/rfcs/blob/master/text/0398-RouteInfo-Metadata.md">RouteInfo Metadata RFC</a>.</p>
<hr />
<h2 id="tryyourfirstoctanejamsandwichatemberconfhttpsemberconfcomspeakerschrismanson"><a href="https://emberconf.com/#/speakers/chris-manson">Try your first Octane & JAM sandwich at EmberConf 🏎🥪🍓</a></h2>
<p>Surely, you remember him as <a href="https://www.youtube.com/watch?v=GHbjdesHhPA">the Emberista who built a blog site with Ember & Node in 15 min</a>, you heard him talk about <a href="https://www.youtube.com/watch?v=OnDUp2AhuNo">his work on an Ember-powered blog engine</a> or you
recall him <a href="https://twitter.com/real_ate/status/1207683401446313984">say JAM 46 times</a> in his <a href="https://www.youtube.com/watch?v=eQULGb10MbQ">jammiest introduction to the JAM (JavaScript, APIs and Markup) stack for humans</a>!
This year, <a href="https://github.com/mansona">Chris Manson (@mansona)</a> has even more insights into the modern JAM stack to share with you!</p>
<p>At <a href="https://emberconf.com/">this year's EmberConf</a> he's going to teach us about <a href="https://emberconf.com/#/schedule/day-1_an-octane-powered-jam-stack"><strong>An Octane-Powered JAM Stack</strong></a>; why the JAM Stack has become so popular and how Ember Octane blends in well with this approach of web development. But that's not all: you can learn hands-on how to build your first JAM Stack site with Octane and Empress at his EmberConf workshop <a href="https://emberconf.com/#/schedule/pre-conf_build-and-publish-your-own-%60empress-blog%60-template"><strong>Build and Publish Your Own empress-blog Template</strong></a>.</p>
<p>In an exclusive interview with The Ember Times, Chris shares with us, how popular the JAM stack is and why it is so useful for building modern websites in 2020:</p>
<blockquote>
  <p>[…] My belief is that most Ember developers are already using JAM Stack concepts. It’s not a binary thing, it’s not “you use the JAM stack” or “you don’t”. Instead you can make your apps more JAM and the question of when you want to do it is answered by when you need it. If you need good SEO, or if you need faster start times, you might want to look at some of the JAM technologies.</p>
</blockquote>
<p>What will our experience building JAM stack websites with Octane be like? Chris shares from his experience as a JAM stack developer and as a workshop mentor:</p>
<!--alex ignore just-->
<blockquote>
  <p>The thing that most people like when using JAM Stack with Ember, is the fact that you can get so much by just installing 1 or 2 addons. If you had to teach somebody everything from the ground all the way up to getting it deployed, it would take much longer and it would be much more difficult. But leveraging the power of Ember, leveraging the power of Ember addons makes people experience quick wins and gets a lot done very quickly.</p>
</blockquote>
<p>Besides learning about the theory and practice of JAM stack, what makes EmberConf your go-to conference in 2020? Chris shares his perspective on what makes the event so worth being part of:</p>
<blockquote>
  <p>The thing I most like about EmberConf is meeting people, chatting in the hallway and the wild plans for the future of Ember that always seem to happen late night over dinner or between two talks.</p>
</blockquote>
<p>If you want to learn more about Ember Octane, Empress and JAM, join more than 800 other Ember developers at <a href="https://emberconf.com/">EmberConf in Portland, OR, from March 16 - 18, 2020</a>. Prices for regular attendee tickets start from $449. Get your tickets, before they are sold out, <a href="https://emberconf.com/#/register">on the EmberConf website</a>!</p>
<hr />
<h2 id="monitoremberappperformancewithtracerbenchhttpsgithubcomemberperformancemonitoringtracerbenchcompareaction"><a href="https://github.com/ember-performance-monitoring/tracerbench-compare-action">Monitor Ember app performance with Tracerbench ⏱</a></h2>
<p>What is Tracerbench? Think "Lighthouse CI" but with <strong>statistical rigor</strong> and <strong>more meaningful data</strong>. With <a href="https://github.com/ember-performance-monitoring/tracerbench-compare-action">ember-performance-monitoring/tracerbench-compare-action</a>, you can monitor your web app's performance in CI. Although the library is general enough for any web app, Tracerbench comes finely tuned for benchmarking Ember apps and addons via GitHub Actions.  </p>
<p>Tracerbench's motivation to provide clear, actionable and usable insights into performance deltas is thoroughly explained in <a href="https://github.com/TracerBench/tracerbench">Tracerbench/tracerbench</a>. There's currently a gap in performance analysis tooling for Ember apps. Developers today struggle to quickly find and analyze performance regressions which would empower them to make quick, iterative changes <strong>within their local development environment</strong>. The current approach for performance analysis is for developers to run a single trace using Chrome Developer Tools. Unfortunately, a single trace varies too much to detect regressions to a web app…unless the regression is quite large.</p>
<p>We found out about Tracerbrench from Chris Thoburn (@runspired)'s <a href="https://twitter.com/Runspired/status/1218669365182074885">tweet</a> where he gives a shoutout to <a href="https://github.com/krisselden">Kris Selden (@krisselden)</a> and LinkedIn for their work on Tracerbench! We look forward to giving it a spin!</p>
<hr />
<h2 id="relatedfileshoppervscodeextensionhttpstwittercomsuchita009status1218310260592496641"><a href="https://twitter.com/suchita009/status/1218310260592496641">Related Files Hopper VSCode Extension 🤸</a></h2>
<p>Ever needed to keep finding related files in your Ember repo using <a href="https://code.visualstudio.com/">VSCode</a>? <a href="https://github.com/suchitadoshi1987">Suchita Doshi (@suchitadoshi1987)</a> created an extension to make that leap easier!</p>
<p>The <a href="https://marketplace.visualstudio.com/items?itemName=suchitadoshi1987.file-hopper">Related Files Hopper extension</a> helps developers navigate through the multiple files that are touched when working on a feature. Within Ember for example, a person adding or removing something in <code>components/foo.js</code> would likely also touch <code>templates/foo.hbs</code> and related tests <code>integration/foo-test.js</code> or <code>acceptance/foo-test.js</code>. This extension provides hot keys for related files when you're working in <code>components/foo.js</code>.</p>
<p>Try it out today and be sure to <a href="https://twitter.com/suchita009/status/1218310260592496641">leave some feedback</a> or <a href="https://github.com/suchitadoshi1987/related-files-hopper">contribute new features</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/bobisjan" target="gh-user">@bobisjan</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/chriskrycho" target="gh-user">@chriskrycho</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/jamescdavis" target="gh-user">@jamescdavis</a>, <a href="https://github.com/skaterdav85" target="gh-user">@skaterdav85</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a> and <a href="https://github.com/jrjohnson" target="gh-user">@jrjohnson</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Anne-Greeth van Herwijnen, Chris Ng, Jessica Jordan, Isaac Lee, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-132</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-132</guid><pubDate>Fri, 24 Jan 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 133]]></title><description><![CDATA[<p>✌️ Emberistas! 🐹</p>
<p>This week:
Check out the RFC for Improved Ember Registry APIs 🗒️®️,
Octane community feedback from FlashRecruit 👏,
contributing to OSS with confidence at EmberConf 💪,
and meet two developers who write short Ember posts regularly ✏️!</p>
<!-- READMORE -->
<hr />
<h2 id="rfcimprovedemberregistryapishttpsgithubcomemberjsrfcspull585"><a href="https://github.com/emberjs/rfcs/pull/585">RFC: Improved Ember Registry APIs 🗒️®️</a></h2>
<p><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> proposed adding a new, object-based API for all registry APIs; deprecate the current string-based microsyntax registry APIs; and introduce a <code>capabilities</code> property to the resolver to safely support existing resolvers.</p>
<p>The <a href="https://github.com/emberjs/rfcs/pull/585">RFC: Improved Ember Registry APIs</a> covers the problems with the <a href="https://guides.emberjs.com/release/applications/dependency-injection/#toc_factory-registrations">microsyntax</a> and the lack of TypeScript support. The RFC recommends adding a new <code>Identifier</code> API which would contain the <code>name</code>, <code>type</code>, and optionally the <code>namespace</code> fields instead of the current microsyntax. For example:</p>
<p>From:</p>
<pre><code class="javascript language-javascript">getOwner(this).lookup('service:session');
</code></pre>
<p>To:</p>
<pre><code class="javascript language-javascript">getOwner(this).lookup({ type: 'service', name: 'session' })
</code></pre>
<p>From:</p>
<pre><code class="javascript language-javascript">class Example {
  @service('global@session')
  session;
}
</code></pre>
<p>To:</p>
<pre><code class="javascript language-javascript">class Example {
  @service({ namespace: 'global', name: 'session' })
  session;
}
</code></pre>
<p>If you would like to learn more or add your feedback please take a look at the <a href="https://github.com/emberjs/rfcs/pull/585">RFC on GitHub</a>!</p>
<hr />
<h2 id="octanecommunityfeedbackfromflashrecruithttpsflashrecruitcom"><a href="https://flashrecruit.com">Octane community feedback from FlashRecruit 👏</a></h2>
<p>At <a href="https://flashrecruit.com"><strong>FlashRecruit</strong></a>, we're building a conversational job marketplace. We've been using Ember Octane since before the official preview--don't tell anyone--to build the new version of our job board and dashboard.</p>
<p>Ember Octane allowed us to quickly prototype an application, move on to production with little tech debt, and feel well supported throughout the process.</p>
<!--alex ignore nuts-->
<p>Tracked Properties and Glimmer Components provide a wonderful mental model to work from. They also simplify our code by bringing it closer to JavaScript and HTML. We had a new hire that only had to learn the Octane way, which ended up far smoother than the classic-style onboarding.</p>
<!--alex ignore period-->
<p>We saw a few issues in the preview period, but the community was quick to help us figure out how to move past them. They were mostly fixed by the official release, as well.</p>
<!--alex ignore just-->
<p>We look forward to the enhanced tracking changes coming in RFCs like <a href="https://github.com/emberjs/rfcs/pull/577">#577</a>. Honestly, anything beyond this point is just gravy.</p>
<blockquote>
  <p>We know there are lots of other great examples of Octane being used in the wild. If you’d like to share your experiences, please feel to reach out to the Ember Times team: <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a>!</p>
</blockquote>
<hr />
<h2 id="confidentcontributingtoopensourceatemberconfhttpsemberconfcomspeakersannegreethvanherwijnen"><a href="https://emberconf.com/#/speakers/anne-greeth-van-herwijnen">Confident contributing to open-source at EmberConf 💪💻</a></h2>
<p>After her <a href="https://www.youtube.com/watch?v=GHbjdesHhPA">previous OSS pitch at EmberFest 2019</a>,
Emberista and <a href="https://blog.emberjs.com/tags/newsletter.html">Ember Times</a> editor <a href="https://github.com/MinThaMie">Anne-Greeth van Herwijnen (@MinThaMie)</a> will guide you to your next (or maybe even first!) open-source contribution!</p>
<p>With plenty of research on what makes an open-source community successful in facilitating contributions, she will demonstrate how Ember empowers contributors to give back to the project in her talk <a href="https://emberconf.com/#/schedule/day-2_why-contributing-seems-scary"><strong>Why Contributing Seems Scary</strong></a> at <a href="https://emberconf.com/">this year's EmberConf</a>.</p>
<p>In an exclusive interview with The Ember Times, Anne-Greeth shares with us, who she thinks is qualified to contribute to Ember:</p>
<!--alex ignore just-->
<blockquote>
  <p>[…] I think everyone can contribute to Ember. It just matters on your opinion of what you think contributing means. So for me contributing goes from helping out at EmberConf, to writing, reading RFCs, and everything in between. And I think as long as you want to. you can always find something for you to contribute to.</p>
</blockquote>
<p>What is something that surprises first-time contributors when working on a project like Ember? Anne-Greeth speaks from her previous experience when sharing her OSS journey with others:</p>
<!--alex ignore just easy-->
<blockquote>
  <p>From the talk about contributing I gave at EmberFest last year and also one I gave at my work, I noticed that people were surprised how easy it is to contribute. And that contributing doesn’t mean that you necessarily have to fix the problem, but that also identifying a problem is contributing to it. At my company I got the response from somebody who just two hours after my talk already created their first pull request to an open-source repository (which wasn’t Ember), but still he was like “Hey, I did this!”  In general, the feedback has been really positive, because my examples are really low-key. People feel really encouraged and inspired, that they can do it, too!</p>
</blockquote>
<p>Besides learning how to contribute with confidence, what makes EmberConf a must-visit experience this year? Anne-Greeth talks about what she is looking forward to the most:</p>
<blockquote>
  <p>I think the people. It sounds really cheesy, but for me, meeting all the people that I met years before, but also meeting new people at different meetups, but also in between talks, is, I think, really cool. And discussing with them things about Ember, but also about culture and about different countries is, I think, one of the best things about EmberConf.</p>
</blockquote>
<p>If you want to learn more about why contributing seems scary (but doesn't need to be), join more than 800 other Ember developers at <a href="https://emberconf.com/">EmberConf in Portland, OR, from March 16 - 18, 2020</a>. Prices for regular attendee tickets start from $449. Get your tickets, before they are sold out, <a href="https://emberconf.com/#/register">on the EmberConf website</a>!</p>
<hr />
<h2 id="gettingintowritingemberpostshttpsdevtotemberlatest"><a href="https://dev.to/t/ember/latest">Getting into writing Ember posts ✏️</a></h2>
<p>This week, we give a hearty shout-out to <a href="https://github.com/knownasilya">Ilya Radchenko (@knownasilya)</a> and <a href="https://github.com/MichalBryxi">Michal Bryxí (@MichalBryxi)</a>. Since January, they have been regularly sharing their learnings of Ember through short blog posts.</p>
<p>Here are some of our favorites:</p>
<ul>
<li><a href="https://ilyaradchenko.com/ember-components-at-their-simplest/">Ember Components at Their Simplest</a></li>
<li><a href="https://ilyaradchenko.com/when-components-aren't-enough/">When Components Aren't Enough</a></li>
<li><a href="https://ilyaradchenko.com/6-tips-for-transitioning-to-ember-css-modules/">6 Tips for Transitioning to Ember CSS Modules</a></li>
<li><a href="https://dev.to/michalbryxi/add-fulltext-filter-support-to-ember-cli-mirage-3nef">Add Fulltext Filter Support to ember-cli-mirage</a></li>
<li><a href="https://dev.to/michalbryxi/shining-some-light-on-timing-out-tests-35e6">Shining Some Light on Timing Out Tests</a></li>
<li><a href="https://dev.to/michalbryxi/component-arguments-vs-html-attributes-bug-hunt-1ke9">Component Arguments vs HTML Attributes Bug Hunt</a></li>
</ul>
<p>We encourage you to have a read. You may be pleasantly surprised to see that, through small steps, one can end up teaching and helping others a lot. 💞</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/salbador" target="gh-user">@salbador</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/Nippius" target="gh-user">@Nippius</a>, <a href="https://github.com/maxwondercorn" target="gh-user">@maxwondercorn</a>, <a href="https://github.com/skaterdav85" target="gh-user">@skaterdav85</a>, <a href="https://github.com/NBallaney" target="gh-user">@NBallaney</a>, <a href="https://github.com/betocantu93" target="gh-user">@betocantu93</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a> and <a href="https://github.com/efx" target="gh-user">@efx</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Sean Massa, Isaac Lee, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-133</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-133</guid><pubDate>Fri, 31 Jan 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 134]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>This week: Polyfilled ember-data packages syntax for all Ember apps 📦,
use Figma with Storybook to make your developer life easier 🎨,
QUnit DOM announces v1.0 release 🎂,
and check out the ember-changeset 3.0.0 release 🎉!</p>
<!-- READMORE -->
<hr />
<h2 id="backtothefuturewithemberdatapackagespolyfillhttpsgithubcomemberdatababelpluginemberdatapackagespolyfill"><a href="https://github.com/ember-data/babel-plugin-ember-data-packages-polyfill">Back to the future with ember-data packages polyfill 📦🚀</a></h2>
<p>The <a href="https://emberjs.github.io/rfcs/0395-ember-data-packages.html">ember-data packages API</a> allows you to import objects and methods from smaller packages in the ember-data module following guidelines similar to the ones established in the <a href="https://github.com/emberjs/rfcs/pull/176">Ember Modules RFC#176</a>. With real and resolvable package paths, many developers can directly benefit from them with improved code reference information in their IDE. The ember-data packages API is available <a href="https://blog.emberjs.com/2019/07/15/ember-3-11-released.html">since ember-data 3.11</a>.</p>
<p>There's nothing like a new, shiny API that makes your developer life easier. Even better if you can already use that API in your application without any upgrading! Users of ember-data with <strong>version 3.10 and below</strong> get to benefit
from the new way of importing with the help of the <a href="https://github.com/ember-data/babel-plugin-ember-data-packages-polyfill">ember-data packages polyfill</a>!</p>
<p>The polyfill ensures that any instances of the Packages API import statements are transformed back to the legacy "DS" EmberData import syntax. You can opt-in to using the polyfill in your app, by upgrading your ember-cli-babel dependency to <a href="https://github.com/babel/ember-cli-babel/releases/tag/v7.14.0">version 7.14</a> or higher for this <a href="https://github.com/babel/ember-cli-babel/pull/318">new feature</a>.</p>
<!-- alex ignore dad-mom -->
<p>Wanna learn more about how to use the new packages import syntax for ember-data? Be sure to give the <a href="https://blog.emberjs.com/2019/07/15/ember-3-11-released.html">Ember 3.11 release post</a> another read
for practical code examples on how to use it and pop by the <a href="https://discordapp.com/invite/emberjs">#ember-data channel on the Ember Discord</a> for more questions and discussions.</p>
<hr />
<h2 id="fromfigmatoembertostorybookwithtwoclickshttpsgossiblogfromfigmatoembertostorybookwith2clicks"><a href="https://gos.si/blog/from-figma-to-ember-to-storybook-with-2-clicks/">From Figma to Ember to Storybook…with two clicks 🎨</a></h2>
<p><a href="https://github.com/gossi">Thomas Gossmann (@gossi)</a> has started a blog post series on Figma, Ember and Storybook. <a href="https://gos.si/blog/full-featured-themes-in-figma/">Part 1: Full Featured Themes in Figma</a> has been published and will tell you all about how to organise your design in Figma.</p>
<p>Stay tuned for Part 2 on design tokens and Part 3 on documentation within the Ember Ecosystem. Follow <a href="https://twitter.com/unistyler">@unistyler</a> on Twitter to be notified when they are published.</p>
<p>You can find the design system and code on <a href="https://github.com/gossi/hokulea">GitHub</a>.</p>
<hr />
<h2 id="qunitdomcelebratesv10releasehttpstwittercomtobiasbieniekstatus1223998561605627904"><a href="https://twitter.com/TobiasBieniek/status/1223998561605627904">QUnit DOM celebrates v1.0 release! 🎂</a></h2>
<p><a href="https://github.com/simplabs/qunit-dom">QUnit DOM</a> provides <strong>readable assertions for QUnit</strong> and has been shipped with Ember since v3.1. If you haven't tried QUnit DOM yet, we recommend <a href="https://github.com/simplabs/qunit-dom/blob/master/API.md">checking out its API</a> to see how you can simplify your tests.</p>
<p>Last week, QUnit DOM <a href="https://twitter.com/TobiasBieniek/status/1223998561605627904">announced its v1.0 release</a> to mark the project's stability. We extend our thanks to <a href="https://github.com/Turbo87">Tobias Bieniek (@Turbo87)</a> and everyone who have helped with the project!</p>
<p>With version 1.0, you can use <strong>assertion chaining</strong>:</p>
<pre><code class="javascript language-javascript">assert.dom('[data-test-input="Email"]')
  .isRequired()
  .hasAttribute('type', 'email')
  .hasValue('zoey@ember.js');
</code></pre>
<p>You can also try out a new assertion, <code>hasProperty</code>, to check for DOM properties. There can be subtle differences between <code>hasAttribute</code> (to check for HTML attributes) and <code>hasProperty</code> (for DOM properties):</p>
<pre><code class="javascript language-javascript">// These two assertions are equivalent.
assert.dom('[data-test-input="I Agree"]')
  .hasAttribute('checked', '')
  .hasProperty('checked', true);

// These three assertions are equivalent.
assert.dom('[data-test-button="Delete"]')
  .hasClass('btn').hasClass('btn-red')
  .hasAttribute('class', 'btn btn-red')
  .hasProperty('className', 'btn btn-red');
</code></pre>
<p>To learn more about when you might use <code>hasAttribute</code> or <code>hasProperty</code>, please visit <a href="https://javascript.info/dom-attributes-and-properties">the tutorial by JavaScript.info</a>.</p>
<hr />
<h2 id="emberchangeset300releasehttpstwittercompuekeystatus1224340431644708864"><a href="https://twitter.com/puekey/status/1224340431644708864">ember-changeset 3.0.0 Release 🎉</a></h2>
<p>The <a href="https://github.com/poteto/ember-changeset">ember-changeset</a> addon officially released <a href="https://github.com/poteto/ember-changeset/blob/master/CHANGELOG.md#300-2020-02-02">version 3.0.0</a>. The addon provides a Changeset class that represents a set of valid changes for any Object (<code>Ember.Object</code>, <code>DS.Model</code>, POJOs, etc). The idea is only the changeset's internal values are updated until we invoke the save method which would set and save the valid changes onto the provided object.</p>
<p>This release requires Ember 3.13 and above and the use of @tracked will help ember-changeset monitor and propagate changes to the UI layer. If your app is &lt; 3.13 or you need to support IE11, then you can install the 2.0 series. Watch a <a href="https://www.emberscreencasts.com/posts/168-introduction-to-ember-changeset">free video intro</a> presented by EmberScreencasts and use ember-changeset today!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/bobisjan" target="gh-user">@bobisjan</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/lifeart" target="gh-user">@lifeart</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a> and <a href="https://github.com/pichfl" target="gh-user">@pichfl</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Anne-Greeth van Herwijnen, Isaac Lee, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-134</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-134</guid><pubDate>Fri, 07 Feb 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 135]]></title><description><![CDATA[<p>Happy Valentine's Day, Emberistas! 💌</p>
<p>Learn about Native Decorator Support from EmberMap 🐹🗺️,
review the RFC for splarguments 💖,
autotracking! a blog series on reactivity systems 🤖,
JSParty podcast with Jen and Chris 📻, and
three reasons to switch to angle bracket syntax in Ember Octane 💡!</p>
<!-- READMORE -->
<hr />
<h2 id="embermaplearnaboutnativedecoratorsupporthttpstwittercomember_mapstatus1225464396471787525"><a href="https://twitter.com/ember_map/status/1225464396471787525">EmberMap: Learn about Native Decorator Support 🐹🗺️</a></h2>
<p>Check out the latest EmberMap episode of "What's New in Ember." It talks about what the <a href="https://emberjs.github.io/rfcs/0440-decorator-support.html">Native Decorator Support</a> feature from Ember 3.10 means for you and why <a href="https://emberjs.github.io/rfcs/0408-decorators.html">Decorators</a> are important for Ember's adoption of ES classes.</p>
<p>With Ember 3.10, all the core APIs and surrounding ecosystem libraries can start adopting decorators as per the <a href="https://github.com/tc39/proposal-decorators">stage 1 or "legacy decorators" implementation</a> which would pave the way for ES classes in Ember. However, the happy path is still to wait until your app is on <a href="https://blog.emberjs.com/2019/12/20/ember-3-15-released.html">the Octane release or 3.15</a> or beyond to start using both ES classes and decorators together for all of your Ember app code.</p>
<p>To check out how to upgrade your app, check out this <a href="https://discuss.emberjs.com/t/question-about-the-native-decorator-support-feature/17474">great Discuss thread</a> on the issue but also be sure to check out the full video on <a href="https://embermap.com/topics/what-s-new-in-ember/native-decorator-support-3-10">Native Decorator Support on EmberMap</a>.</p>
<hr />
<h2 id="autotrackingablogseriesonreactivitysystemshttpswwwpzuraqcomthinkingwithautotrackingwhatmakesagoodreactivesystem"><a href="https://www.pzuraq.com/thinking-with-autotracking-what-makes-a-good-reactive-system/">Autotracking! A blog series on reactivity systems 🤖</a></h2>
<p>Interested in learning more about autotracking, Ember Octane's new reactivity system? Well then, you're in luck 🍀. <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> is starting another super interesting new blog post series on that exact subject!</p>
<p>The <a href="https://www.pzuraq.com/thinking-with-autotracking-what-makes-a-good-reactive-system/">first post</a>, which came out at the end of last month, examines what reactivity means and how it relates to declarative and imperative programming models. Even experienced Ember developers will likely get a lot of value out of reading about what these often-used, but rarely fully understood, terms mean.</p>
<p>In an approachable and conversational style, <a href="https://github.com/pzuraq">@pzuraq</a> also explains how state is used in these programming models as well as functional programming models. It’s a great intro for anyone looking to learn a bit about reactivity systems.</p>
<p>Bonus 🎉 <a href="https://github.com/pzuraq">@pzuraq’s</a> <a href="https://www.pzuraq.com/thinking-with-autotracking-what-makes-a-good-reactive-system/">second post</a> about what makes a good reactivity system came out this week!</p>
<p><a href="https://github.com/pzuraq">@pzuraq</a> dives deeper and surveys several reactivity systems:</p>
<ul>
<li>HTML/CSS (did you know they are reactive!?)</li>
<li>Push-based reactivity systems, which are often implemented with JavaScript (e.g. Ember Classic and other systems like the Observable model)</li>
<li>Pull-based reactivity systems (e.g. React and the Virtual DOM, Vue and Elm)</li>
</ul>
<p>There are helpful diagrams and clear explanations to help you better understand the finer points. If you’re looking to learn more about how these models of reactivity are similar and different, then this post is a great read for you.</p>
<p>Be sure to be on the lookout for more updates from the Ember Times team as more of these awesome blog posts are released!</p>
<hr />
<h2 id="thereisnopartylikeanoctanepartyhttpschangelogcomjsparty114"><a href="https://changelog.com/jsparty/114">There is no party like an Octane party! 🎊</a></h2>
<p>On February 6th, <a href="https://github.com/jenweber">Jen Weber (@jenweber)</a> and <a href="https://github.com/mansona">Chris Manson (@mansona)</a> were live on the <a href="https://changelog.com/jsparty/114">JS Party podcast</a>. This party describes itself as: "A community celebration of JavaScript and the web." They record on Thursdays at 1pm Eastern / 10am Pacific if you want to tune in live.</p>
<!--alex ignore hostesses-hosts ball-->
<p><a href="https://github.com/jenweber">Jen</a> and <a href="https://github.com/mansona">Chris</a> talked with the hosts, <a href="https://github.com/kball">Kevin Ball (@kball)</a> and <a href="https://nicknisi.com/">Nick Nisi</a>, about Ember Octane, how Ember operates as a framework, and the role of the community within Ember. The <a href="https://changelog.com/jsparty/114">podcast</a> got published today, so if you have missed it or want to listen to it again, you can!</p>
<!--alex ignore hostesses-hosts special-->
<p>Since the podcast reaches out to an audience in the wider JavaScript community, we got to listen to what makes Ember special. One of the hosts even tried the Ember tutorial to get a grasp of what Ember does differently.</p>
<p>All in all, a lovely podcast with two <strong>awesome</strong> representatives from the Ember core team.</p>
<hr />
<h2 id="threereasonstoswitchtoanglebracketsyntaxinemberoctanehttpsspinatomicobjectcom20200212emberanglebracketsyntax"><a href="https://spin.atomicobject.com/2020/02/12/ember-angle-bracket-syntax/">Three reasons to switch to angle bracket syntax in Ember Octane 💡</a></h2>
<p>One aspect of Ember Octane that we, at The Ember Times, enjoy is discovering feedback from developers and teams as they adopt Octane in production apps.</p>
<p>This week, <a href="https://atomicobject.com/team/bekah-cheek">Bekah Cheek at Atomic Object</a> shared how the angle bracket syntax <a href="https://spin.atomicobject.com/2020/02/12/ember-angle-bracket-syntax/">helped her team write readable code and develop new components with ease</a>. We encourage you to have a look for more details, then share your own experience on a blog, Discord, or Twitter!</p>
<p>You can visit the Ember Guides to <a href="https://guides.emberjs.com/release/upgrading/current-edition/templates/">learn more about the angle bracket syntax and its benefits</a>.</p>
<hr />
<h2 id="reviewthepotentialfutureofsplargumentshttpsgithubcomemberjsrfcspull593"><a href="https://github.com/emberjs/rfcs/pull/593">Review the potential future of splarguments 💖</a></h2>
<p>Two years ago the <a href="https://emberjs.github.io/rfcs/0311-angle-bracket-invocation.html#html-attributes">Request for Comments (RFC) #311</a> made quite a splash: Besides an entirely new invocation syntax for Ember components, it suggested a novel feature that allowed Ember users to pass <strong>HTML attributes</strong>, such as <em>class</em>, <em>width</em> or <em>tabindex</em>, from the invocation site of a component down to its content. There they can finally be accessed using the so-called <strong>splattributes</strong> syntax.</p>
<p>Here's a quick reminder of how that looks like - imagine the following markup:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- app/templates/application.hbs --&gt;
&lt;!-- invoking a component with several attributes.... --&gt;
&lt;MyImageComponent width="320" height="64" alt="My favorite snack" /&gt;
</code></pre>
<pre><code class="handlebars language-handlebars">&lt;!-- app/components/my-image-component.hbs --&gt;
&lt;!-- ...allows access to the attributes in the component's template --&gt;
&lt;img ...attributes /&gt;
</code></pre>
<p>Which will render the component in your app as follows:</p>
<pre><code class="html language-html">&lt;img width="320" height="64" alt="My favorite snacc" /&gt;
</code></pre>
<p>The efforts to allow Ember devs to write less verbose component templates and to manage deeply nested component invocations successfully continue. This week, <a href="https://github.com/Alonski">Alon Bukai (@Alonski)</a>, Ember developer, contributor and Ember Times editor, wrote down an RFC to promote the <a href="https://github.com/emberjs/rfcs/blob/1c90e48eeec9a990627a6ce1e9f70391ba95bbb7/text/0000-spreadable-arguments.md">idea of <strong>spreadable arguments</strong></a>.</p>
<p>Similar to splattributes, these would allow the forwarding of component configuration with less verbosity, but in this instance via <strong>arguments</strong> rather than attributes. You can learn more about the motivation of this feature and how it is used, in the <a href="https://github.com/emberjs/rfcs/pull/593">RFC itself</a>. And as always: feel encouraged to leave your thoughts, questions and suggestions in the comments below!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/jgwhite" target="gh-user">@jgwhite</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/mehulkar" target="gh-user">@mehulkar</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/wycats" target="gh-user">@wycats</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/skaterdav85" target="gh-user">@skaterdav85</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a> and <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Jared Galanis, Anne-Greeth van Herwijnen, Isaac Lee, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-135</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-135</guid><pubDate>Fri, 14 Feb 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 136]]></title><description><![CDATA[<p>ഹലോ Emberistas! 🐹</p>
<p>Call for videos for the EmberConf keynote 📢,
Ember 3.16 released 🚀,
Minesweeper meets Ember Octane 💣,
check out the journey to your first published addon 📅,
2020 Ember Community Survey 📝, and
learn how to forward element modifiers in &lt; 10 mins ⏰!</p>
<!-- READMORE -->
<hr />
<h2 id="callforvideosfortheemberconfkeynotehttpsairtablecomshrypeet3xtyst5gq"><a href="https://airtable.com/shrYpEeT3xtyst5Gq">Call for videos for the EmberConf keynote 📢</a></h2>
<p>Hi, Embereños! It's me, Yehuda.</p>
<p>I'm collecting some <strong>videos</strong> of people's Ember <strong>stories</strong> for possible use in this year's EmberConf keynote.</p>
<p>You can make the video as long or as short as you want, but if you're not sure, 2 minutes is probably a good target length.</p>
<p>Here are some topics you could cover to help flesh out your story:</p>
<ol>
<li>What were you doing before you were a web developer or before you became a member of the Ember community?</li>
<li>What made you try Ember?</li>
<li>Have you enjoyed your experience as a member of the Ember community?</li>
</ol>
<p>Don't feel restricted to details about Ember features. Feel free to talk about intangible details, like how it feels to be part of a community that works together, your experiences with Ember's evolution, or experiences about your own evolution as a developer.</p>
<p>Please <strong>send in your video</strong> by the end of <strong>March 1</strong>, your time at <a href="https://airtable.com/shrYpEeT3xtyst5Gq">https://airtable.com/shrYpEeT3xtyst5Gq</a>. If you have any questions, please email me at <a href="mailto:wycats@gmail.com">wycats@gmail.com</a>.</p>
<p>Thanks so much for helping out!</p>
<hr />
<h2 id="ember316releasedhttpsblogemberjscom20200212ember316releasedhtml"><a href="https://blog.emberjs.com/2020/02/12/ember-3-16-released.html">Ember 3.16 released 🚀</a></h2>
<p>A <strong>new</strong> version of Ember is here! <a href="https://blog.emberjs.com/2020/02/12/ember-3-16-released.html">Ember 3.16</a> is an incremental, backwards compatible release with bugfixes, performance improvements, and minor deprecations. Whether you're on the bleeding edge or 1.x, be sure to refer to the official <a href="https://blog.emberjs.com/tags/releases.html">Ember blog</a> when looking for release details!</p>
<hr />
<h2 id="2020embercommunitysurveyhttpstildewufoocomforms2020emberjscommunitysurvey"><a href="https://tilde.wufoo.com/forms/2020-emberjs-community-survey/">2020 Ember Community Survey 📝</a></h2>
<p>It’s that time of year again 😀, the <strong>6th annual official 2020 Ember Community Survey</strong> is here! Once again we would love your help to learn about who is in the Ember community and how they work with the framework.</p>
<p>Last year over 1200 people participated in the survey. All that participation and your participation over the years has resulted in enough input to make the process more efficient. This year the survey has been considerably slimmed down from previous years! So it should be easier than ever to make a <strong>contribution</strong> to our community by filling out the survey – let’s keep that participation going! 🎉</p>
<p>This year we’d also like to emphasize that contributions from non-Ember users are valuable as well. So if you have co-workers or friends who you think might be interested in filling out the survey, please share it with them.</p>
<p>Submissions will be accepted <strong>until March 8th</strong>, but there’s no need to wait! Go ahead and fill out the <a href="https://tilde.wufoo.com/forms/2020-emberjs-community-survey/">survey here now</a>. 🔥🔥🔥</p>
<p>We look forward to your participation! If you have any immediate questions, feel free to email the survey team via survey@emberjs.com, or ping us in #dev-ember-learning on the <a href="https://discordapp.com/invite/emberjs">Discord chat</a>.</p>
<p>But please, don't forget to help us spread the word by sharing the survey landing page on your social network feeds, at meetups and around your office and other communities. 🙌</p>
<hr />
<h2 id="tomsweeperminesweepermeetsemberoctanehttpstomsweeperscudco"><a href="https://tomsweeper.scud.co/">Tomsweeper: Minesweeper meets Ember Octane 💣</a></h2>
<p>Minesweeper is a classic logic game, probably most known through Microsoft Windows. You use the number clues to clear the mines and race against time to <a href="https://www.youtube.com/watch?v=GrZCWx0fnfc">become the world champion</a>.</p>
<p><a href="https://github.com/scudco">@scudco</a> issues a new challenge: Find all Tomsters in the game <a href="https://tomsweeper.scud.co/">Tomsweeper</a>! It's a great example of how you can <a href="https://github.com/scudco/tomsweeper">build something in Ember Octane</a> with ease and fun.</p>
<p><img alt="Tomsweeper" src="/images/blog/2020-02-21/tomsweeper.png"></p>
<p><strong>Give Tomsweeper a try</strong> and leave your feedback in the <a href="https://discordapp.com/channels/480462759797063690/487382592841187328">#games channel</a> on <a href="https://discordapp.com/invite/emberjs">Discord</a>! PRs are welcome, too.</p>
<hr />
<h2 id="learnaboutelementmodifierforwardingwithembermaphttpsembermapcomtopicswhatsnewinemberforwardingelementmodifierswithattributes311"><a href="https://embermap.com/topics/what-s-new-in-ember/forwarding-element-modifiers-with-attributes-3-11">Learn about element modifier forwarding with EmberMap 🗺</a></h2>
<p>Looking for another quick learning today and got <strong>10 minutes</strong> to spare?
Then our friends from <a href="https://embermap.com/">EmberMap</a> have the right content for you!</p>
<p>In their freely available <a href="https://embermap.com/topics/what-s-new-in-ember">"What's New in Ember?"</a> video series,
they highlight some of the latest and greatest framework features that make Ember developer lives easier.</p>
<p>In their latest episode <a href="https://embermap.com/topics/what-s-new-in-ember/forwarding-element-modifiers-with-attributes-3-11">"Forwarding Element Modifiers with …attributes"</a>, you can learn about the use cases for the handy <a href="https://emberjs.github.io/rfcs/0311-angle-bracket-invocation.html#html-attributes">splattributes feature</a>. Splattributes made their way to Ember as part of <a href="https://emberjs.github.io/rfcs/0311-angle-bracket-invocation.html">the RFC#311 angle bracket invocation feature</a>.</p>
<p>Specifically, the video demonstrates <strong>powerful composition patterns</strong> when using splattributes together with element modifiers,
a feature combination that is available since the implementation of <a href="https://emberjs.github.io/rfcs/0435-modifier-splattributes.html">RFC#435: "Forwarding Element Modifiers with Splattributes"</a> and has been released with <a href="https://blog.emberjs.com/2019/07/15/ember-3-11-released.html">Ember 3.11</a>.</p>
<p>So wanna impress yourself (or your co-workers, open-source and Ember friends) with some smart component patterns this week?
Then check out <a href="https://embermap.com/topics/what-s-new-in-ember/forwarding-element-modifiers-with-attributes-3-11">the video</a> to learn when and how to leverage element modifier forwarding and make your Ember app shine!</p>
<hr />
<h2 id="firstpublishedaddonemberfullcalendarhttpsdevtoxiwcxipublishedmyfirstemberaddon138c"><a href="https://dev.to/xiwcx/i-published-my-first-ember-addon-138c">First published addon: ember-fullcalendar 📅</a></h2>
<p><a href="https://github.com/xiwcx">i. welch canavan (@xiwcx)</a> shares the journey of building your very first Ember addon in <a href="https://dev.to/xiwcx/i-published-my-first-ember-addon-138c">this dev.to post</a>. The addon <a href="https://github.com/Mariana-Tek/ember-fullcalendar">@mariana-tek/ember-fullcalendar</a> wraps <a href="https://fullcalendar.io/">Fullcalendar (v4)</a> – a tool that provides a fully-featured scheduling calendar with minimal code – into an Ember component.</p>
<p>The process started with checking <a href="https://emberobserver.com/">Ember Observer</a> to see if there is already an addon that provides a similar service as well as checking the general addon structure that packages follow. Next, <a href="https://github.com/fullcalendar/fullcalendar-react">fullcalendar-react</a> was inspected which provided the idea to avoid explicit bindings for each property or attribute, but instead, batch updates and pass them along to Fullcalendar.</p>
<!-- alex ignore easy -->
<p>Following that, it was easy enough to use Ember component lifecycle hooks to replace the React ones such as <code>componentDidMount()</code> becoming <code>didInsertElement()</code>, while <code>componentDidUpdate()</code> became <code>didUpdateAttrs()</code>. Similarly to the other implementation, <a href="https://dockyard.com/blog/2015/10/14/best-practices-data-down-actions-up">Data Down, Actions Up</a> was followed so that was easily transferrable.</p>
<p>Try out <a href="https://github.com/Mariana-Tek/ember-fullcalendar">@mariana-tek/ember-fullcalendar</a> in your app today!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/erikmero" target="gh-user">@erikmero</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/GCheung55" target="gh-user">@GCheung55</a>, <a href="https://github.com/cloutierlp" target="gh-user">@cloutierlp</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/patricklx" target="gh-user">@patricklx</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a> and <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Isaac Lee, Jared Galanis, Yehuda Katz, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-136</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-136</guid><pubDate>Fri, 21 Feb 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 137]]></title><description><![CDATA[<p>Bonjou Emberistas! 🐹</p>
<p>Learn about how autotracking works 👣,
try out the latest ember-template-lint v2 ✅,
Ember website redesign 🔥,
2020 Ember Community Survey reminder 📝, and
beta test ember-cli 3.17 🧪!</p>
<!-- READMORE -->
<hr />
<h2 id="howautotrackingworkshttpswwwpzuraqcomhowautotrackingworks"><a href="https://www.pzuraq.com/how-autotracking-works/">How autotracking works 👣</a></h2>
<p><a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> wrote a new blog post in his <strong>autotracking blog series</strong>, previously he wrote on <a href="https://www.pzuraq.com/what-is-reactivity/">what is reactivity</a> and on <a href="https://www.pzuraq.com/what-makes-a-good-reactive-system/">what makes a good reactive system</a>.</p>
<p>In <a href="https://www.pzuraq.com/how-autotracking-works/">How Autotracking Works</a>, Chris discusses how autotracking fulfils the <strong>reactivity design principles</strong> exploring how it's implemented and why. In the blog, we go through memoization, referential equality, revisions, tags, and how they all work together to provide autotracking for Ember.</p>
<p>Memoization, a technique where we cache the previous arguments that a function was called with along with the result they produced in order to minimize excess work, is the foundation of autotracking. However, due to how equality works in JavaScript, we need to make use of referential equality to perform a faster deep-equal where we assume that if we're passed the same object as before then nothing has changed.</p>
<p>Autotracking revolves around a single number, the global revision number. This number keeps track of the version of state that the application was in. However, we don't want our memoized functions to rerun whenever the state changes, because it could have changed for a completely unrelated state. We only want to rerun whenever the tracked state within the function has changed. For that, we need tags which represent state within the application so our function only reruns when it should and unrelated changes will not affect it.</p>
<p>Autotracking is one of the <strong>core mechanisms</strong> that powers <strong>Ember.js</strong> and the <strong>Glimmer VM</strong>. It’s one of the most exciting <a href="https://guides.emberjs.com/release/in-depth-topics/autotracking-in-depth/">features to come out of Ember Octane</a> so try it out today in your Ember app and see if it helps you write faster, less error prone, and easier to understand code. Read more about <a href="https://www.pzuraq.com/how-autotracking-works/">autotracking in the full blog post</a>!</p>
<hr />
<h2 id="emberwebsiteredesignhttpsemberjscom"><a href="https://emberjs.com/">Ember website redesign 🔥</a></h2>
<p>Maybe you haven't noticed, but the <strong>primary website for Ember</strong> has been <strong>redesigned</strong> and it is <strong>now live</strong>! The redesign brings a fresh new look to the main piece of real estate for Ember on the internet and features a clean and modern look that all of us in the community can be proud of.</p>
<p>This redesign has been a long time in the making and has involved a lot of work from the people from the Ember Core teams and the Ember community. Big shout outs to everyone involved in the effort, especially <a href="https://github.com/MelSumner">Mel Sumner (@MelSumner)</a> and <a href="https://github.com/mansona">Chris Manson (@mansona)</a>! 🎉🎉🎉 It's super exciting to see this modern vision of the website come to life.</p>
<p>If you are enjoying the new website and would like to help with making all the Ember web properties have a consistent design, please let the Ember Learning Team know in the <strong>#dev-ember-learning</strong> channel on <a href="https://discordapp.com/invite/emberjs">the Discord chat</a>.</p>
<p>If you notice anything wrong with the website, please also feel free to open an issue in either the <a href="https://github.com/ember-learn/ember-website/">main website repository on Github</a> or the <a href="https://github.com/ember-learn/ember-styleguide">styleguide repo</a> where the components live.</p>
<hr />
<h2 id="embertemplatelintv2releasedhttpstwittercomrwjbluestatus1231372429286608902"><a href="https://twitter.com/rwjblue/status/1231372429286608902">ember-template-lint v2 released ✅</a></h2>
<p>In case you weren't aware, you can <strong>lint templates</strong> to follow <strong>Ember's recommended practices</strong>, avoid making common accessibility mistakes, and collaborate with your team more effectively. 💯</p>
<pre><code class="bash language-bash"># Install (or upgrade to v2)
ember install ember-cli-template-lint

# Profit!
npm run lint:hbs
</code></pre>
<p>The v2 release was <a href="https://twitter.com/rwjblue/status/1231372429286608902">recently announced</a>. The most notable change may be that you can start following recommended rules for Ember Octane:</p>
<pre><code class="javascript language-javascript">// .template-lintrc.js
'use strict';

module.exports = {
  extends: 'octane',
  rules: {
    /* Add custom rules here */
  }
};
</code></pre>
<p>You can find the full list of updates in the <a href="https://github.com/ember-template-lint/ember-template-lint/releases/tag/v2.0.0">changelog</a>. Please extend your thanks to <a href="https://github.com/lifeart">@lifeart</a>, <a href="https://github.com/bmish">@bmish</a>, <a href="https://github.com/dcyriller">@dcyriller</a>, <a href="https://github.com/rwjblue">@rwjblue</a>, <a href="https://github.com/akashdsouza">@akashdsouza</a>, <a href="https://github.com/alexlafroscia">@alexlafroscia</a>, <a href="https://github.com/buschtoens">@buschtoens</a>, <a href="https://github.com/gojefferson">@gojefferson</a>, and <a href="https://github.com/initram">@initram</a> for helping with the v2 release!</p>
<hr />
<h2 id="2020embercommunitysurveyhttpstildewufoocomforms2020emberjscommunitysurvey"><a href="https://tilde.wufoo.com/forms/2020-emberjs-community-survey/">2020 Ember Community Survey 📝</a></h2>
<p>Here's another friendly reminder that it’s that time of year again 😀, the <strong>6th annual official 2020 Ember Community Survey</strong> is here! Once again we would love your help to learn about who is in the Ember community and how they work with the framework.</p>
<p>Last year over 1200 people participated in the survey. All that participation and your participation over the years has resulted in enough input to make the process more efficient. This year the survey has been considerably slimmed down from previous years! So it should be easier than ever to make a <strong>contribution</strong> to our community by filling out the survey – let’s keep that participation going! 🎉</p>
<p>This year we’d also like to emphasize that contributions from non-Ember users are valuable as well. So if you have co-workers or friends who you think might be interested in filling out the survey, please share it with them.</p>
<p>Submissions will be accepted <strong>until March 8th</strong>, but there’s no need to wait! Go ahead and fill out the <a href="https://tilde.wufoo.com/forms/2020-emberjs-community-survey/">survey here now</a>. 🔥🔥🔥</p>
<p>We look forward to your participation! If you have any immediate questions, feel free to email the survey team via survey@emberjs.com, or ping them in #dev-ember-learning on the <a href="https://discordapp.com/invite/emberjs">Discord chat</a>.</p>
<p>But please, don't forget to help us spread the word by sharing the survey landing page on your social network feeds, at meetups and around your office and other communities.</p>
<hr />
<h2 id="cantwaituntilember317isoutbecomeabetatestertodayhttpsgithubcomembercliemberclireleasestagv3170beta1"><a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.17.0-beta.1">Can't wait until Ember 3.17 is out? Become a beta tester today 🧪</a></h2>
<p>It's not too long until <a href="https://emberjs.com/releases/">Ember 3.17 is out</a> and until you can upgrade your favourite
Ember app to the latest version of the framework. If you want to have an extra head start, you can even <strong>try out</strong> some of
<strong>the 3.17 Ember experience</strong> today!</p>
<p>A few days ago, <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.17.0-beta.1">ember-cli@3.17.0-beta.1</a> was published with lots of awesome goodies, including the removal of <a href="https://github.com/ember-cli/ember-cli/pull/9041">RSVP in favour of native promises</a>, lots of great updates to test scenarios and a linter level up with <a href="https://github.com/ember-cli/ember-cli/pull/9009">the now direct usage of eslint and ember-template-lint</a>. Your feedback from testing the ember-cli beta is greatly appreciated. Share your thoughts either on <a href="https://github.com/ember-cli/ember-cli/">the project repository on Github</a> or in the <a href="https://discordapp.com/invite/emberjs">#ember-cli channel on the Ember Discord</a>.</p>
<p>But why is <strong>beta testing important</strong> in the first place? A distributed community project such as Ember not only lives from the code contributions of developers from all over the world, but also from their feedback about current releases. Early adopters and ambitious testers of releases in the beta and canary channels can provide the insight that is necessary to cut the upcoming release of Ember efficiently: with the best possible developer experience for the entire Ember community in mind.</p>
<p>If you want to learn more about the motivation behind the release management of Ember, make sure to read the <a href="https://blog.emberjs.com/2013/09/06/new-ember-release-process.html">official post-1.0 release cycle blog post</a> and the <a href="https://blog.emberjs.com/2016/02/25/announcing-embers-first-lts.html">the LTS (Long-Term Support) release process announcement</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/mehulkar" target="gh-user">@mehulkar</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/GCheung55" target="gh-user">@GCheung55</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/hjdivad" target="gh-user">@hjdivad</a>, <a href="https://github.com/Windvis" target="gh-user">@Windvis</a>, <a href="https://github.com/patricklx" target="gh-user">@patricklx</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/knownasilya" target="gh-user">@knownasilya</a>, <a href="https://github.com/hakilebara" target="gh-user">@hakilebara</a>, <a href="https://github.com/void-mAlex" target="gh-user">@void-mAlex</a>, <a href="https://github.com/mistahenry" target="gh-user">@mistahenry</a>, <a href="https://github.com/ivandotv" target="gh-user">@ivandotv</a>, <a href="https://github.com/entendu" target="gh-user">@entendu</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/bartocc" target="gh-user">@bartocc</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chriseppstein" target="gh-user">@chriseppstein</a>, <a href="https://github.com/gokatz" target="gh-user">@gokatz</a> and <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jared Galanis, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-137</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-137</guid><pubDate>Fri, 28 Feb 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 138]]></title><description><![CDATA[<!--alex ignore womens-->
<p>Happy International Women's Day, Emberistas! 🐹</p>
<p>2020 Ember Community Survey due this Sunday 📈, the possible future of app hooks and testing directories 📂, the evolution of Ember and Intercom 🚀🐹, splitting &amp; migrating your project to a monorepo 🐘, read the blog post on modifiers 🦄, and find out how to use Ember with WebAssembly (Rust) 💡!</p>
<!-- READMORE -->
<hr />
<h2 id="2020embercommunitysurveyduemarch8thhttpstildewufoocomforms2020emberjscommunitysurvey"><a href="https://tilde.wufoo.com/forms/2020-emberjs-community-survey/">2020 Ember Community Survey due March 8th! 📈</a></h2>
<p>If you haven't yet, please take a brief moment of your day to <a href="https://tilde.wufoo.com/forms/2020-emberjs-community-survey/">fill out the annual survey</a>! Your feedback can help everyone shape Ember better. 💞</p>
<hr />
<h2 id="discussthefutureofapphooksandtestingdirectoriesinemberhttpsgithubcomemberjsrfcspullsqis3aopenis3aprauthor3amehulkar575578"><a href="https://github.com/emberjs/rfcs/pulls?q=is%3Aopen+is%3Apr+author%3Amehulkar+575+578">Discuss the future of app hooks and testing directories in Ember 📂</a></h2>
<p>Since the early days of the framework, <a href="https://ember-cli.com/">the Ember CLI</a> has been a major factor for productivity and great developer ergonomics when developing Ember apps. And a while ago <a href="https://github.com/mehulkar">Mehul Kar (@mehulkar)</a> submitted <strong>two new Requests for Comments (RFCs)</strong> to suggest even more improvements for the favorite productivity tool of any Emberista!</p>
<p>In <a href="https://github.com/emberjs/rfcs/pull/575">RFC#575: Test Directories</a> a new directory structure for testing is proposed. The change of test type names in the <a href="https://guides.emberjs.com/release/testing/test-types/">official Ember testing guides</a> that followed the implementation of <a href="https://emberjs.github.io/rfcs/0232-simplify-qunit-testing-api.html">RFC#232: Simplify QUnit Testing API</a> inspires the new directory format: f.e. files for testing component functionality used to be called <code>integration</code> tests in the former Ember QUnit testing API, and have been renamed to <code>rendering</code> tests. To reflect this change in the documentation, the new RFC suggests to move DOM-focused component tests from <code>tests/integration/**-test.js</code> to <code>tests/rendering/**-test.js</code> accordingly. You can learn more about the detailed design <a href="https://github.com/emberjs/rfcs/pull/575">by reading the original proposal</a>.</p>
<p>With <a href="https://github.com/emberjs/rfcs/pull/578">RFC#578: Ability to hook into build process without addons</a>, a suggestion for more developer flexibility for an app's build process is made. The proposal suggests that <code>treeFor</code> hooks provided by <a href="https://broccoli.build/">BroccoliJS</a> - a core library for powering the Ember CLI build pipeline - should be available via the <code>options</code> parameter of an Ember app instance. This would allow future Ember developers to leverage <code>treeFor</code> hooks in an app itself without developing a supplementary addon (which is currently the only way to use these build pipeline APIs directly). To learn more about the motivation behind this RFC, be sure to check out the <a href="https://github.com/emberjs/rfcs/pull/578">pull request on Github</a> and feel free to leave your thoughts and questions in the comments below.</p>
<hr />
<h2 id="theevolutionofemberandintercomhttpswwwintercomcomblogvideosevolutionofemberatintercom"><a href="https://www.intercom.com/blog/videos/evolution-of-ember-at-intercom/">The evolution of Ember and Intercom 🚀🐹</a></h2>
<p>If you have not had a chance to check out <a href="https://github.com/GavinJoyce">Gavin Joyce's (@GavinJoyce)</a> blog post on the evolution of Ember and Intercom, and the accompanying talk, you might want to give it a read / watch!</p>
<p>The <a href="https://www.intercom.com/blog/videos/evolution-of-ember-at-intercom/">blog post</a> covers the <strong>massive growth of Intercom over 6 years</strong>, how the company came to choose Ember and how Intercom's growth tracks with the growth of Ember over time.</p>
<p>Interestingly, many of the principles of R&amp;D, design and Engineering overlap with Ember's conventions and release cycles.</p>
<p>The blog post also provides some nice detail on the technical evolution in Ember's rendering engine and it provides a look at how Ember Octane can let us write beautiful, minimal and clean components in mostly native JavaScript.</p>
<p>It's a fascinating and encouraging read, and it's very cool to see how the stability and innovation of Ember has allowed Intercom to build the amazing product it is today!</p>
<hr />
<h2 id="splittingmigratingyouremberprojecttoamonorepohttpswwwmylittletechlifecomembermonorepo"><a href="https://www.mylittletechlife.com/ember-monorepo">Splitting & migrating your Ember project to a monorepo 🐘</a></h2>
<p><a href="https://github.com/MalayaliRobz">Robin Philip Thomas (@MalayaliRobz)</a> details his experience having worked with a huge codebase and the difficulties he and his team had faced with a massive monolith and how they split their codebase to multiple engines and add-ons. While that wasn't enough, he goes on to explain how dependencies caused problems related to version upgrades in each repository. As a result, he talks about how he arrived at using Yarn workspaces and how <a href="https://lerna.js.org/">Lerna</a> solves those problems. Check out the <a href="https://www.mylittletechlife.com/ember-monorepo">blog post</a>!</p>
<hr />
<h2 id="blogpostintroducingembermodifiershttpsgaietylifeintroducingembermodifiers"><a href="https://gaiety.life/introducing-ember-modifiers">Blog post: Introducing Ember modifiers 🦄</a></h2>
<p><a href="https://github.com/sharpshark28">Ava Gaiety Wroten (@sharpshark28)</a> wrote a blog post on the <a href="https://github.com/ember-modifier/ember-modifier">ember-modifier</a> addon which provides an API for authoring <a href="https://blog.emberjs.com/2019/03/06/coming-soon-in-ember-octane-part-4.html">element modifiers</a> in Ember.</p>
<p>We learn how to use the <a href="https://github.com/emberjs/rfcs/blob/master/text/0471-on-modifier.md"><code>{{on}}</code> modifier</a> to track the focus state of a DOM element. The blog then describes how to handle key presses by creating our very own modifier such as the example <code>{{key-down}}</code> below:</p>
<pre><code class="handlebars language-handlebars">{{!-- my-component.hbs --}}
&lt;button
  {{key-down this.handleEnter key='Enter'}}
  My Button
&lt;/button&gt;
</code></pre>
<p>Unlike attributes, element modifiers <a href="https://guides.emberjs.com/release/components/template-lifecycle-dom-and-modifiers/#toc_event-handlers">do not run on the server-side</a>, because there is no general-purpose and complete way to serialize the results of an element modifier into HTML.</p>
<p>Be sure to check out <a href="https://github.com/emberjs/ember-render-modifiers">ember-render-modifiers</a> and <a href="https://github.com/josemarluedke/ember-focus-trap">ember-focus-trap</a> as well and read the <a href="https://gaiety.life/introducing-ember-modifiers">full article</a> on Ember modifiers!</p>
<hr />
<h2 id="usingwebassemblyinemberjshttpsmfeckiedevwasminember"><a href="https://mfeckie.dev/wasm-in-ember/">Using WebAssembly in Ember.js 💡</a></h2>
<p><a href="https://developer.mozilla.org/en-US/docs/WebAssembly">WebAssembly (wasm)</a> is a technology that enables <strong>high-performance computing</strong> (traditionally achieved with C or C++) on the web.</p>
<p><a href="https://github.com/mfeckie">Martin Feckie (@mfeckie)</a> published <a href="https://mfeckie.dev/wasm-in-ember/">a guide on how you can integrate your Ember app with a Rust program</a>. Martin walks you through how to generate UUIDs and plot Mandelbrot sets. These examples represent a complex calculation that you might do in a production app.</p>
<p>We encourage you to check out the article! Along the way, you can also pick up a little bit of <strong>TypeScript + Octane</strong>, <strong>dynamic import</strong>, and <strong><code>{{ref}}</code> modifier</strong>. 🎶</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kratiahuja" target="gh-user">@kratiahuja</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/venusang" target="gh-user">@venusang</a>, <a href="https://github.com/mehulkar" target="gh-user">@mehulkar</a>, <a href="https://github.com/mwpastore" target="gh-user">@mwpastore</a>, <a href="https://github.com/MichalBryxi" target="gh-user">@MichalBryxi</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, and <a href="https://github.com/knownasilya" target="gh-user">@knownasilya</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Abhilash, Jessica Jordan, Isaac Lee, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-138</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-138</guid><pubDate>Fri, 06 Mar 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 139]]></title><description><![CDATA[<p>வணக்கம் Emberistas! 🐹</p>
<p>Join the all-virtual EmberConf 2020 📺🎉,
JHU COVID-19 dashboard - made with Ember! 🐹,
Ember Twiddle supports Octane features up to Ember 3.17 💖,
videos of the EmberJS Chennai meetup 🇮🇳,
ember-models-table v3.0.0 🌟,
QR scanning without bundle size growing 📷,
check out handy examples of tests in Ember 💡, and
a new RFC for handling destroyables 💥!</p>
<!-- READMORE -->
<hr />
<h2 id="emberconf2020isonandgoesvirtualhttpsemberconfcomemberconfupdatemarch12"><a href="https://emberconf.com/#/emberconf-update-march-12">EmberConf 2020 is on (and goes virtual) 📺🎉</a></h2>
<p>Despite the current health situation, resulting difficulties with travel and event restrictions, <strong>EmberConf 2020, March 16th-18th</strong> is around the corner and will definitely <strong>be on</strong>! As usual, you can enjoy inspiring talks about Ember, the web and open-source from community members from all around the world at <strong>EmberConf's first-ever all-virtual conference</strong>!</p>
<p>100% of the conference talks will be delivered remotely at the regularly scheduled time at <a href="https://emberconf.com/">emberconf.com</a> - ready to watch together with your colleagues and Ember friends. Hangout with other conference attendees at <a href="https://discordapp.com/channels/480462759797063690/480502413917421570">#ember-conf</a> on the <a href="https://discordapp.com/invite/emberjs">Ember Discord</a> to share your thoughts on your favorite presentations and do not miss out on your <a href="https://emberconf.com/#/streamer-swag">digital conference swag bag</a>.</p>
<p>For more details on <span style="font-style: italic;">why</span> EmberConf goes virtual this year and how you can join from home, please read <a href="https://emberconf.com/#/emberconf-update-march-12">the latest conference announcement</a>!</p>
<p>Last but not least, we would like to thank everyone involved in the setup of this amazing conference we all love; in particular, we would like to thank and also ask you to please extend a warm thank you to <a href="https://github.com/wifelette">Leah Silber (@wifelette)</a> who is making this year's awesome EmberConf possible against all odds. If you meet her virtually, be sure to send her a ❤️!</p>
<hr />
<h2 id="jhucovid19dashboardisemberhttpswwwarcgiscomappsopsdashboardindexhtmlbda7594740fd40299423467b48e9ecf6"><a href="https://www.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6">JHU COVID-19 dashboard is Ember 🐹</a></h2>
<p>Did you know that the <a href="https://www.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6">popular dashboard</a> made by the Johns Hopkins University <a href="https://systems.jhu.edu/">Center for Systems Science and Engineering</a> being used to track cases of the Corona COVID-19 virus is built in part using Ember.js?</p>
<p>As reported by the <a href="https://systems.jhu.edu/research/public-health/ncov/">CSSE blog</a>, "the dashboard, first shared publicly on January 22, illustrates the location and number of confirmed COVID-19 cases, deaths and recoveries for all affected countries. It was developed to provide researchers, public health authorities and the general public with a user-friendly tool to track the outbreak as it unfolds. Further, all the data collected and displayed is made freely available, initially as google sheets, now in a GitHub repository, along with the feature layers of the dashboard, which are now included in the ESRI Living Atlas." The data layer Github repo can be found <a href="https://github.com/CSSEGISandData/COVID-19">here</a>.</p>
<p>While the spread of the virus is concerning and has impacted and will continue to impact many lives, it is inspiring to see Ember being used as a force for good and helping to inform health care providers, researchers, policy makers and the broader public about how cases are developing across the globe.</p>
<p>Thanks to <a href="https://github.com/odoe">Rene Rubalcava (@odoe)</a> for the <a href="https://twitter.com/odoenet/status/1233439467421065216">tweet</a> that made us aware.</p>
<p>A mobile friendly version of the dashboard can be found <a href="https://www.arcgis.com/apps/opsdashboard/index.html#/85320e2ea5424dfaaa75ae62e5c06e61">here</a>.</p>
<hr />
<h2 id="embertwiddlesupportsoctanefeaturesuptoember317httpsembertwiddlecom"><a href="https://ember-twiddle.com/">Ember Twiddle supports Octane features up to Ember 3.17 💖</a></h2>
<p>In March, <a href="https://github.com/Gaurav0">Gaurav Munjal (@Gaurav0)</a> and <a href="https://github.com/knownasilya">Ilya Radchenko (@knownasilya)</a> collaborated on <a href="https://github.com/ember-cli/ember-twiddle/releases/tag/v0.17.0-4">incremental updates to Ember Twiddle</a>. It now supports Octane features up to Ember 3.17 and sports a new collapsible sidebar!</p>
<p><img src="/images/blog/2020-03-13/ember_twiddle_preview.gif" alt="Ember Twiddle preview"></p>
<p>If you haven't used <a href="https://ember-twiddle.com/">Ember Twiddle</a> before, it allows you to share and demo Ember code with other developers. You can create a sample app when filing bug issues, for example. Give it a try today!</p>
<hr />
<h2 id="februaryemberjschennaimeetuphttpswwwyoutubecomplaylistlistplh_rf0qob_sxjhg9qptlxn6ezzmmthoc"><a href="https://www.youtube.com/playlist?list=PLh_rF0Qob_sxjhg9qPTlXn-6EZzmmTHoc">February EmberJS Chennai Meetup 🇮🇳</a></h2>
<p>On February 29th, 2020, EmberJS Chennai featured seven speakers at their third Meetup. Topics included:</p>
<ul>
<li><a href="https://slides.com/jayakrishnanamburu/web-dev#/">Web development - the past and the present</a> by <a href="https://github.com/JayaKrishnaNamburu">Jaya Krishna Namburu (@JayaKrishnaNamburu)</a></li>
<li><a href="https://youtu.be/DT75xo7VXn4">Picking a framework: React vs Angular vs Vue vs Ember</a> by <a href="https://twitter.com/michaeldinesh9">Michael Dinesh (@michaeldinesh9)</a></li>
<li><a href="https://youtu.be/CU1ffqXtoR0">Ember runloop</a> by <a href="https://twitter.com/srajas02">Raja S (@srajas02)</a></li>
<li><a href="https://youtu.be/__yX29lr6og">Ember model & relationships</a> by <a href="https://github.com/ahamedalthaf">Ahamed Althaf (@ahamedalthaf)</a></li>
<li><a href="https://youtu.be/OYePMoIajQI">Frame communication with Ember</a> by <a href="https://twitter.com/Kishore01kumar">Kishore Kumar (@Kishore01kumar)</a></li>
<li><a href="https://youtu.be/vOhpdSP4Nr0">Design systems using Storybook</a> by <a href="https://twitter.com/prasanth_lpk">Prasanth Lalapeta (@prasanth_lpk)</a></li>
<li><a href="https://youtu.be/0lFNUybdWJs">Finite state machines and Ember</a> by <a href="https://twitter.com/ansankarganesh">Sankar Ganesh (@ansankarganesh)</a></li>
</ul>
<p>You can <a href="https://www.youtube.com/playlist?list=PLh_rF0Qob_sxjhg9qPTlXn-6EZzmmTHoc">watch all six talks today on YouTube</a>. To learn more about EmberJS Chennai, you can visit their <a href="https://chennaiemberjs.in/">website</a> and follow them on <a href="https://twitter.com/EmberChennai">Twitter</a>, <a href="https://www.meetup.com/EmberJS-Chennai/">Meetup</a>, and the <a href="https://discordapp.com/channels/480462759797063690/562648585980739616"><code>#as-india</code></a> channel on <a href="https://discordapp.com/invite/zT3asNS">Discord</a>!</p>
<hr />
<h2 id="embermodelstablereleasedversion300httpstwittercomoonechiporenkostatus1235571293530902531"><a href="https://twitter.com/oonechiporenko/status/1235571293530902531">ember-models-table released version 3.0.0 🌟</a></h2>
<p>After nine months of hard work, version 3.0.0 of <a href="https://github.com/onechiporenko/ember-models-table"><code>ember-models-table</code></a> has been released from beta by <a href="https://github.com/onechiporenko">Oleg Nechiporenko (@onechiporenko)</a>.</p>
<p>This major release includes some breaking changes, so please check the <a href="https://github.com/onechiporenko/ember-models-table/releases/tag/v3.0.0">release notes</a> when you update. Complementing the release are also new demo's for version 3.x with <a href="http://onechiporenko.github.io/ember-models-table/v.3/bs3/#/examples">Bootstrap 3</a>, <a href="http://onechiporenko.github.io/ember-models-table/v.3/bs4/#/examples">Bootstrap 4</a>, <a href="http://onechiporenko.github.io/ember-models-table/v.3/paper/#/examples"><code>ember-paper</code></a> and <a href="http://onechiporenko.github.io/ember-models-table/v.3/plain-html/#/examples"><code>plain-html</code></a>.</p>
<hr />
<h2 id="fastqrscanninglibraryemberjsqrreleasedhttpsnullvoxpopuligithubioemberjsqr"><a href="https://nullvoxpopuli.github.io/ember-jsqr/">Fast QR Scanning library, ember-jsqr, released! 📷</a></h2>
<p>Extracted from <a href="https://twitter.com/nullvoxpopuli">@NullVoxPopuli's</a> <a href="https://emberclear.io/">chat project</a>,
<a href="https://nullvoxpopuli.github.io/ember-jsqr/">ember-jsqr</a> is an integration with jsQR, a <span style="font-style: italic;">fast</span> QR code scanner that demonstrates how addon
developers may want to integrate with an external library using <strong>dynamic <code>import</code></strong> to avoid adding to the
initial load cost of an app. The jsQR library itself is 45kb (after min+gzip). This addon adds only <span style="font-style: italic;">bytes</span>
to the initial vendor bundle, or the cost of a single Glimmer component, a private service, and modifiers.</p>
<p>QR and barcode scanning without a growth in bundle size (thanks, <a href="https://github.com/ef4/ember-auto-import">ember-auto-import</a>!) is also available in <a href="https://github.com/evocount/ember-scanner">ember-scanner</a>.</p>
<hr />
<h2 id="embertestcaseforacrudapplicationwithmiragehttpsmediumcomsrajas02embertestcaseforacrudapplicationwithmiraged6d9836bfee2"><a href="https://medium.com/@srajas02/ember-test-case-for-a-crud-application-with-mirage-d6d9836bfee2">Ember test case for a CRUD application with Mirage 💡</a></h2>
<p><a href="https://github.com/srajas0">Raja S (@srajas0)</a>, who has worked with Ember since 2018, recalls their experience of being unable to find many examples of how to write unit, rendering, and application tests. To help others and future Ember developers, Raja has created <a href="https://github.com/srajas0/ember-test-cases">a demo app</a> that uses QUnit DOM, ember-cli-mirage, and ember-cli-code-coverage for testing.</p>
<p>We encourage you to <a href="https://medium.com/@srajas02/ember-test-case-for-a-crud-application-with-mirage-d6d9836bfee2">check out Raja's tutorial</a> and see how you can improve your tests today!</p>
<hr />
<h2 id="proposinganewapiforconfidentdestructionofobjectsinemberhttpsgithubcomemberjsrfcspull580"><a href="https://github.com/emberjs/rfcs/pull/580">Proposing a new API for confident destruction of objects in Ember 💥</a></h2>
<p>As Ember developers we benefit from the framework cleaning up after ourselves when components or routes are removed. On top of that, we can even instruct the components we build to carry out additional <strong>teardown instructions</strong>, by <a href="https://api.emberjs.com/ember/3.17/classes/Component/methods/willDestroy?anchor=willDestroy">overriding the willDestroy hook (both available in Ember and Glimmer components)</a>.</p>
<!--alex ignore host-hostess-->
<p>But even though these APIs are already sufficient to go about our lives as application developers, it is still a limiting way for addon authors to create useful community projects. What if your addon could add teardown work to host apps in a <strong>non-hierarchical</strong> manner, so it can never conflict with other addon's teardown functionalities?</p>
<p>If you want to know the answer to this question, you shouldn't miss out on reading <a href="https://github.com/pzuraq">Chris Garrett's (@pzuraq)</a> recent <strong>Request for Comments (RFC)</strong> about <a href="https://github.com/emberjs/rfcs/blob/destroyables/text/0580-destroyables.md">Destroyables</a> - an API proposal for addon authors and framework contributors. Be sure to join the discussion in the comments section of <a href="https://github.com/emberjs/rfcs/pull/580">the original RFC</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/gokatz" target="gh-user">@gokatz</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/chriskrycho" target="gh-user">@chriskrycho</a>, <a href="https://github.com/jelhan" target="gh-user">@jelhan</a>, <a href="https://github.com/hjdivad" target="gh-user">@hjdivad</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a> and <a href="https://github.com/nummi" target="gh-user">@nummi</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Abhilash LR, Anne-Greeth van Herwijnen, Preston Sego, Isaac Lee, Jared Galanis, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-139</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-139</guid><pubDate>Fri, 13 Mar 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 140]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Meet Ember 3.17 🆕,
tell us about your EmberConf experience ❤️,
read about testing best practices on the Ember Testing Guide 📗,
comment on the co-located test RFC ⛓,
embrace easier release management for your apps 📦🙌,
learn how to add CI with GitHub Actions ✅,
and respect the underscore 🙇.</p>
<!-- READMORE -->
<hr />
<h2 id="ember317releasedhttpsblogemberjscom20200316ember317releasedhtml"><a href="https://blog.emberjs.com/2020/03/16/ember-3-17-released.html">Ember 3.17 released 🆕</a></h2>
<!--alex ignore just-->
<p>On March 16—just in time for EmberConf!—<a href="https://blog.emberjs.com/2020/03/16/ember-3-17-released.html">Ember 3.17 was officially announced</a>. This release marked Ember 3.16 as an LTS and kicked off the 3.18 beta cycle.</p>
<p>Ember 3.17 introduced these changes:</p>
<ul>
<li>Ember.js<ul>
<li>Significantly updated the Glimmer rendering engine</li></ul></li>
<li>Ember CLI<ul>
<li>Removed internal usage of <code>RSVP</code> in favor of native promises</li>
<li>Removed <code>ember-cli-eslint</code> and <code>ember-cli-template-lint</code> in favor of <code>eslint</code> and <code>ember-template-lint</code></li>
<li>Ensured that <code>npm test</code> or <code>yarn test</code> fails when <code>lint:js</code> or <code>lint:hbs</code> fails</li>
<li>Ensured that <code>npm test</code> or <code>yarn test</code> in an addon fails if <code>ember-try</code> scenarios fail</li>
<li>Removed a number of older experiments (module unification and delayed transpilation)</li></ul></li>
</ul>
<p>To learn more about upgrading to Ember 3.17, please visit the <a href="https://blog.emberjs.com/2020/03/16/ember-3-17-released.html">Ember Blog</a>. We encourage you to help test 3.17 and 3.18 beta and report any bugs. Thank you!</p>
<hr />
<h2 id="wewanttohearfromyouremberconfexperiencehttpsemberconfcom"><a href="https://emberconf.com/">We want to hear from your EmberConf experience ❤️</a></h2>
<p>This year's <a href="https://emberconf.com/">EmberConf</a> featured <strong>25+ remote presentations</strong> about the latest and greatest in JavaScript and Ember with Emberistas from all around the world - and the event was a huge success! In case you haven't had a chance to tune into the livestream this week already, be sure to catch up on the recordings for <strong>day 1</strong> (<a href="https://www.youtube.com/watch?v=1vZGPJHYcOA">part 1</a> + <a href="https://www.youtube.com/watch?v=D-avY3dG2Zk">part 2</a>) and <strong>day 2</strong> (<a href="https://www.youtube.com/watch?v=kwbaPS6pIpY">part 1</a> + <a href="https://www.youtube.com/watch?v=vObogyci7m8">part 2</a>) of the conference.</p>
<p>Check out all the related resources for the talks in <a href="https://twitter.com/alex_diliberto/status/1240449629612892161">the conference notes</a> by <a href="https://github.com/alexdiliberto">Alex DiLiberto (@alexdiliberto)</a>. Also, stay tuned and follow the <a href="https://twitter.com/emberconf">EmberConf Twitter account</a> to not miss out on the exclusive BonusConf sessions, which will be released over the next couple of days!</p>
<p>Last, but not least, we have one request for those of you who attended <strong>EmberConf 2020</strong>:</p>
<blockquote>
  <p>Tell us about someone new that you got to chat with at the virtual conf!</p>
</blockquote>
<p>Let us know about your answer to this question either by <a href="https://twitter.com/embertimes">tweeting us via Twitter</a> using the <strong>hashtag #EmberConFriends</strong> or as a message on the <a href="https://discordapp.com/invite/emberjs">Ember Discord</a> in the <strong>#support-ember-times</strong> channel. We will raffle an exclusive <strong>EmberConf retro sticker set</strong> among all story writers by April 6, 2020. We're looking forward to hear from you and happy catching up on virtual EmberConf!</p>
<hr />
<h2 id="embertestingguidev1httpstwittercomposlinskinetstatus1239503392386568192"><a href="https://twitter.com/PoslinskiNet/status/1239503392386568192">Ember Testing Guide v1 📗</a></h2>
<p><a href="https://github.com/PoslinskiNet/">Dawid Pośliński (@PoslinskiNet)</a> wrote about testing best practices and which addons to use in the newly released <a href="https://selleo.com/ebook/ember">Ember Testing Guide v1</a>. The testing guide goes through why we need tests to begin with. What benefits does testing give us and what gaps are still present.</p>
<p>Following that, the testing guide discusses best practices in how we architect our testing code. It also goes through how to use the right kind of test. Should the test be unit, integration, acceptance, visual regression, or even manual? These principles are the building blocks to constructing effective tests.</p>
<p>Finally the guide goes through all the best addons available today and how to use them in testing your application with examples from <a href="https://github.com/simplabs/qunit-dom">qunit-dom</a>, <a href="https://github.com/simplabs/ember-test-selectors">ember-test-selectors</a>, <a href="https://github.com/matteodepalo/ember-cli-timecop">ember-cli-timecop</a>, <a href="https://github.com/ember-a11y/ember-a11y-testing">ember-a11y-testing</a>, <a href="https://github.com/percy/ember-percy">ember-percy</a> and many more!</p>
<p>Check it out as a <a href="https://selleo.com/ebook/ember">free eBook</a>, on <a href="https://github.com/PoslinskiNet/ember-testing-guide">GitHub</a>, or as a <a href="https://selleo.com/uploads/ebooks/ember/ember_testing_guide.pdf">PDF</a>!</p>
<hr />
<h2 id="couplingconcernswithcolocatedtestshttpsgithubcomemberjsrfcspull599"><a href="https://github.com/emberjs/rfcs/pull/599">Coupling concerns with co-located tests ⛓</a></h2>
<p>The conventional file layout of Ember apps has undergone a few changes throughout the years.
Besides the <a href="https://cli.emberjs.com/release/advanced-use/project-layouts/#classiclayout">classic file layout</a>, users have also been able to opt-in to the <a href="https://cli.emberjs.com/release/advanced-use/project-layouts/#podslayout">pods layout</a> for a while. And while pre-v3.13 Ember users were modifying component templates and <code>.js</code> files in two different directories, they recently got the chance to work on <a href="https://blog.emberjs.com/2019/09/25/ember-3-13-released.html">component files side-by-side</a> after the implementation of the <a href="https://emberjs.github.io/rfcs/0481-component-templates-co-location.html">component template co-location RFC</a>.</p>
<p>Another, <a href="https://github.com/emberjs/rfcs/pull/599">recent RFC</a> wants to take the principle of co-location even a step further: it proposes that <strong>test files</strong>, e.g. those for rendering tests of a component, should be co-located right next to the respective component class and template files. Beyond that, the proposal suggests a similar co-location pattern for unit tests of related routes and controllers, too - with the <a href="https://github.com/NullVoxPopuli/rfcs/blob/colocated-tests/text/0000-colocated-tests.md#motivation">motivation to improve the discoverability of tests</a> for application developers.</p>
<p>Ready to learn more about how this could be implemented? Be sure to read the <a href="https://github.com/NullVoxPopuli/rfcs/blob/colocated-tests/text/0000-colocated-tests.md">full proposal</a> and to leave your thoughts or questions in the <a href="https://github.com/emberjs/rfcs/pull/599">comments below</a>!</p>
<hr />
<h2 id="makeyourdreamofsmoothreleasescometruehttpsgithubcomrwjbluecreaterwjbluereleaseitsetupreleasestagv200"><a href="https://github.com/rwjblue/create-rwjblue-release-it-setup/releases/tag/v2.0.0">Make your dream of smooth releases come true 📦🙌</a></h2>
<p>Who doesn't dream of easy-peasy releases? Let straightforward publishing workflows become your new reality with <a href="https://github.com/rwjblue/create-rwjblue-release-it-setup"><strong>create-rwjblue-release-it-setup</strong></a>. Leveraging the tools from the popular library <a href="https://github.com/release-it/release-it">release-it</a>, it allows you to setup your project swiftly for automated versioning and package publishing.</p>
<p>Make your dream of easier release management come true with one single npm command:</p>
<pre><code class="bash language-bash">npm init rwjblue-release-it-setup
</code></pre>
<p>…or a yarn command for that matter:</p>
<pre><code class="bash language-bash">yarn create rwjblue-release-it-setup
</code></pre>
<p>Check out the <a href="https://github.com/rwjblue/create-rwjblue-release-it-setup/releases/tag/v2.0.0">v2 release page</a> to learn more about all the latest features and improvements and happy publishing!</p>
<hr />
<h2 id="ciwithgithubactionsforemberappshttpscrunchingnumberslive20200317ciwithgithubactionsforemberapps"><a href="https://crunchingnumbers.live/2020/03/17/ci-with-github-actions-for-ember-apps/">CI with GitHub Actions for Ember apps ✅</a></h2>
<p>Continuous integration (CI) and continuous deployment may be skills that you get to practice maybe once on a production app, depending on your job title. But the truth is, you can practice them (<em>ahem</em>) continuously at an early stage for any app, no matter who you are. 💗</p>
<p>You might then ask, where can I learn how to add CI to my Ember app? Are there cool things that I can do <em>because</em> I have an Ember app?</p>
<p>In his <a href="https://crunchingnumbers.live/2020/03/17/ci-with-github-actions-for-ember-apps/">blog post</a>, <a href="https://github.com/ijlee2/">Isaac Lee (@ijlee2)</a> shows <strong>step-by-step how you can write a GitHub Actions workflow</strong>. Thanks to Ember's addon ecosystem, you can:</p>
<ul>
<li>Cache dependencies (avoid <code>yarn/npm install</code>)</li>
<li>Lint files and dependencies</li>
<li>Run tests separately from linting</li>
<li>Split tests and run in parallel</li>
<li>Take Percy snapshots in parallel</li>
</ul>
<p>If you wanted to solve these problems or needed a reference code, <a href="https://crunchingnumbers.live/2020/03/17/ci-with-github-actions-for-ember-apps/">look no further</a>! Feedback is always welcome (you can DM <code>@ijlee2</code> on Discord).</p>
<hr />
<h2 id="respecttheunderscorehttpsmediumcomritual_stevenrespecttheunderscore331fa23e1595"><a href="https://medium.com/@ritual_steven/respect-the-underscore-331fa23e1595">Respect the underscore 🙇</a></h2>
<p><a href="https://github.com/StevenElberger">Steven Elberger (@StevenElberger)</a>'s blog post, "<a href="https://medium.com/@ritual_steven/respect-the-underscore-331fa23e1595">Respect the Underscore</a>," is a fantastic example of what you can practice as a developer: <strong>Document your bug for posterity</strong>, especially if it failed your app or test suite in a catastrophic manner.</p>
<p>Here are some questions that you and your team can address:</p>
<ul>
<li>When did you first notice the bug?</li>
<li>Which features or upgrades were recently worked on?</li>
<li>What did you think caused the bug?</li>
<li>How did you eliminate some of the possibilities?</li>
<li>What did you do to fix the bug?</li>
</ul>
<p>Because Steven's writing excellently builds suspense, we won't dare spoil the twists and ending here. Instead, we encourage you to <a href="https://medium.com/@ritual_steven/respect-the-underscore-331fa23e1595">check out the post</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kratiahuja" target="gh-user">@kratiahuja</a>, <a href="https://github.com/bobisjan" target="gh-user">@bobisjan</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/Aswathprabhu" target="gh-user">@Aswathprabhu</a>, <a href="https://github.com/skaterdav85" target="gh-user">@skaterdav85</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a> and <a href="https://github.com/laurmurclar" target="gh-user">@laurmurclar</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Isaac Lee, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-140</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-140</guid><pubDate>Fri, 20 Mar 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 141]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Yehuda's Octane Tutorial 🔥,
a quick tip for refactoring your templates 📑,
dive into angle and curly bracket invocations 🔍,
easier porting of websites with Percy ✨,
Feeder Corona Dashboard 📰,
track JavaScript's built-in classes 💯,
Ember autostash modifier 💾,
read about how to use a ember-template-lint rule from an addon ✅,
decorator positioning now enforceable ↕️,
and last, but not least, stand alone EmberConf 2020 videos are out 🎥!</p>
<!-- READMORE -->
<hr />
<h2 id="yehudasoctanetutorialhttpsyehudakatzcom20200325emberoctaneletsgo"><a href="https://yehudakatz.com/2020/03/25/ember-octane-lets-go/">Yehuda's Octane tutorial 🔥</a></h2>
<p>There's an awesome new Octane tutorial in town 🤠 and it's written by none other than our very own <a href="https://github.com/wycats">Yehuda Katz (@wycats)</a>!!!</p>
<!-- alex ignore just-->
<p>In the tutorial you'll build the schedule page for a conference like EmberConf. It feels like just the right thing to build after our amazing virtual EmberConf 💙💚💛💜🧡.</p>
<p>The first part in this tutorial, <a href="https://yehudakatz.com/2020/03/25/ember-octane-lets-go/">Let's Go</a>, begins with something that not all JavaScript tutorials cover, HTML and CSS, using CSS Grid and Flex. You'll learn how to go from mocks to a deployed app in very little time.</p>
<p>The second part of the tutorial, <a href="https://yehudakatz.com/2020/03/26/ember-octane-components/">Components</a>, is also out and it covers refactoring out some of the HTML duplication. It's a great introduction to how you can use components and lists to reduce repetition.</p>
<p>So far there are 7 posts planned:</p>
<ul>
<li><a href="https://yehudakatz.com/2020/03/25/ember-octane-lets-go/">Let's Go</a></li>
<li><a href="https://yehudakatz.com/2020/03/26/ember-octane-components/">Components</a></li>
<li>Pulling Out Data</li>
<li>Airtable Time</li>
<li>Cleaning Things Up</li>
<li>Adding More Pages</li>
<li>Polishing: Server-Side Rendering, Prerendering and Code Splitting</li>
</ul>
<p>So be on the look out 👀 for more in this very helpful new series!</p>
<hr />
<h2 id="aquicktipforrefactoringyourtemplateshttpsabhilashlrinemberrefactortemplates"><a href="https://abhilashlr.in/ember-refactor-templates">A quick tip for refactoring your templates 📑</a></h2>
<p><a href="https://github.com/abhilashlr">Abhilash L Ramesh (@abhilashlr)</a> wrote a small and clear <a href="https://abhilashlr.in/ember-refactor-templates">blog post</a> with actionable tips to make your Ember templates cleaner. So if you have complex <code>if-else</code> logic in your template that you would like to make clearer, this blog post could help you out.</p>
<p>He also added some extra bonus tips, but no <strong>spoilers</strong> here, head to the <a href="https://abhilashlr.in/ember-refactor-templates">blog post</a> to check them out!</p>
<hr />
<h2 id="embertemplatesclassicvsanglebracketsyntaxeshttps0xadadapub20200320emberemplatesclassicvsanglebracketsyntaxes"><a href="https://0xadada.pub/2020/03/20/ember-emplates-classic-vs-angle-bracket-syntaxes/">Ember templates: classic vs. angle bracket syntaxes 🔍</a></h2>
<p>From Yehuda and Abhilash's blog posts, you got to see a bit of how templates work. But we've got one additional resource for you!</p>
<p><a href="https://github.com/0xadada">@0xADADA</a> and <a href="https://github.com/dfreeman">Dan Freeman (@dfreeman)</a> did a <a href="https://0xadada.pub/2020/03/20/ember-emplates-classic-vs-angle-bracket-syntaxes/">deep-dive into classic and angle bracket invocations</a>. Please have a look to learn how these invocations handle attributes and arguments differently.</p>
<hr />
<h2 id="techstackmodernisationwithoutbreakingthingswithpercyhttpssimplabscomblog20200327portingasitetoemberwithpercy"><a href="https://simplabs.com/blog/2020/03/27/porting-a-site-to-ember-with-percy/">Tech stack modernisation without breaking things with Percy ✨</a></h2>
<!--alex ignore middleman-middlewoman-->
<p>You might already be a regular visitor of the <a href="https://guides.emberjs.com/release/">Ember Guides</a>.
But did you know, that the <strong>#1 learning site for Ember developers</strong> used to be powered <a href="https://github.com/emberjs/guides">with Ruby and Middleman</a>? After plenty of contributions by many different community members, the app <a href="https://blog.emberjs.com/2018/05/25/the-emberjs-times-issue-48.html">has been modernised with an Ember tech stack</a> to make it much easier for new contributors to work on the <a href="https://github.com/ember-learn/guides-source">project</a>!</p>
<p>You might not have noticed the switch of tech stacks under the hood of the Ember Guides, and this is exactly how it should be! Want to learn more about how this was done? Be sure to read <a href="https://github.com/mansona">Chris Manson's (@mansona)</a> latest <a href="https://simplabs.com/blog/2020/03/27/porting-a-site-to-ember-with-percy/">blog post</a> about the process behind the seamless <strong>Emberification of the Guides</strong> (and the Ember website): it highlights how the visual regression testing tool <a href="https://percy.io/">Percy</a> can help developers to bootstrap their efforts of porting a website to a new tech stack without breaking it.</p>
<p>You can read the full blog post <a href="https://simplabs.com/blog/2020/03/27/porting-a-site-to-ember-with-percy/">on the simplabs blog</a>.</p>
<hr />
<h2 id="feedercoronadashboardhttpsfeedercoreadercorona"><a href="https://feeder.co/reader/corona">Feeder Corona Dashboard 📰</a></h2>
<p><a href="https://feeder.co/">Feeder</a> built a COVID-19 aka <strong>Corona Dashboard</strong> in Ember, but for incoming news on the subject such as news media, government updates, research, social media, and travel advice. Check it out here: <a href="https://feeder.co/reader/corona">feeder.co/reader/corona</a>.</p>
<p>Feeder is a news manager that tracks any online source you choose and bundles it into an easy-to-digest reading experience. The Corona Dashboard is built using Feeder's regular stack that ingests public RSS feeds and filters on a set of keywords.</p>
<p><a href="https://github.com/erkie">Erik Rothoff Andersson (@erkie)</a> shares Feeder's experience with Ember with the Times:</p>
<blockquote>
  <p>We started at Ember 2.10 and are now at Ember 3.14 and counting. It's so cool that the upgrades help to educate us how to become better developers. One striking thing is the a11y template linting rules that promote best practices. I had no idea about those things, but now I do! So thanks Ember.</p>
  <p>We've used pods since the start, but I got tripped up by all the tabs in Atom being called <code>component.js</code>, or <code>template.hbs</code>, which is why I developed the <a href="https://atom.io/packages/ember-tabs">Atom addon Ember tabs</a>. Was really happy when scrolling through ember-cli docs one day and found it mentioned <a href="https://ember-cli.com/user-guide/#atom">here</a>. So far I haven't kept up to date with the module unification, but it seems promising!</p>
  <p>TypeScript is the single biggest innovation in many years, and the ember-cli-typescript addon has been an amazing bridge. It's great to see that a lot of <a href="https://github.com/emberjs/ember.js/tree/master/packages/@ember/-internals/glimmer">Ember internal packages</a> are now written entirely with TypeScript.</p>
  <p>We render a lot of components on screen, so performance has been something we've invested a lot of time in. Switching to Glimmer components for high volume components we were able to reduce render times on hotspots by ~20%.</p>
</blockquote>
<p>We enjoyed learning about Ember at Feeder and hope that you find the Corona Dashboard useful in these hectic times! 💛</p>
<hr />
<h2 id="trackedbuiltinsv1releasedhttpstwittercompzuraqstatus1240069037364633600"><a href="https://twitter.com/pzuraq/status/1240069037364633600">tracked-built-ins v1 released! 💯</a></h2>
<p>At his EmberConf talk, "<a href="https://www.youtube.com/watch?v=HDBSU2HCLbU&list=PL4eq2DPpyBbkC03mdzlyej6tcbEqrZK8N">Autotracking: Reactivity and State in Modern Ember</a>," <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> announced a new addon to help you track JavaScript's built-in classes.</p>
<p>With <a href="https://github.com/pzuraq/tracked-built-ins">tracked-built-ins</a>, your app can automatically react to changes in Objects, Arrays, Maps, Sets, WeakMaps, and WeakSets.</p>
<pre><code class="javascript language-javascript">import { tracked } from 'tracked-built-ins';

class Foo {
  @tracked value = 123;

  obj = tracked({});
  arr = tracked([]);
  map = tracked(Map);
  set = tracked(Set);
  weakMap = tracked(WeakMap);
  weakSet = tracked(WeakSet);
}
</code></pre>
<p><a href="https://github.com/pzuraq/tracked-built-ins">Give it a try today</a>! Your feedback will help improve autotracking in Ember. 💞</p>
<hr />
<h2 id="emberautostashmodifierhttpstwittercomnullvoxpopulistatus1239325059656933376"><a href="https://twitter.com/nullvoxpopuli/status/1239325059656933376">Ember autostash modifier 💾</a></h2>
<p>New modifier alert 🚨! <a href="https://github.com/NullVoxPopuli">Preston Sego (@NullVoxPopuli)</a> has created <a href="https://github.com/NullVoxPopuli/ember-autostash-modifier"><code>ember-autostash-modifier</code></a> that stashes changes, binds those changes to a key, and restores those changes based on that key!</p>
<p>This modifier is useful for chat apps, where you'd want to persist incomplete messages on a contact's page while the user navigates between other contacts before finishing and submitting a message, or where you want to bind component data based on the URL. Check out this <a href="https://nullvoxpopuli.github.io/ember-autostash-modifier/1">demo</a> of the modifier in action.</p>
<p>It's so nice to see the eco-system of Ember modifiers continue to grow 😀, we can't wait to see what the awesome folks in the Ember community come up with next!</p>
<hr />
<h2 id="blogpostembertemplatelintrulefromaddonhttpsmehulkarcomblog202003embertemplatelintrulefromaddon"><a href="https://mehulkar.com/blog/2020/03/ember-template-lint-rule-from-addon/">Blog post: ember-template-lint rule from addon ✅</a></h2>
<p><a href="https://github.com/mehulkar">Mehul Kar (@mehulkar)</a> wrote a <a href="https://mehulkar.com/blog/2020/03/ember-template-lint-rule-from-addon/">blog post</a> on how to ship and use an <a href="https://github.com/ember-template-lint/ember-template-lint">ember-template-lint</a> rule from an addon.</p>
<p>First up, the <a href="https://github.com/ember-template-lint/ember-template-lint/blob/v2.4.1/docs/plugins.md">Plugin API</a> provides an overview on the <code>ember-template-lint</code> plugin system including where to add them or it can be the root of the repo as the blog shows. In order to test your template lint rule, the blog post outlines how to use <a href="https://jestjs.io/">Jest</a> and configure it to run tests in the <code>node-tests</code> directory. Finally, in order to use the plugin in an app we would need to add the plugin and enable the lint rule in <code>.template-lintrc.js</code> (like the example below).</p>
<pre><code class="javascript language-javascript">module.exports = {
  plugins: ['my-addon-name/template-lint-plugin'],
  rules: {
    'the-rule-name': true
  }
}
</code></pre>
<p>To follow the detailed steps please read the <a href="https://mehulkar.com/blog/2020/03/ember-template-lint-rule-from-addon/">full blog post</a> and have a <a href="https://twitter.com/mehulkar/status/1240020900960825345">powerful way to encourage a certain way of programing</a> today!</p>
<hr />
<h2 id="achieveconsistentdecoratorpositioningwithaneweslintpluginhttpsgithubcomnullvoxpopulieslintplugindecoratorposition"><a href="https://github.com/NullVoxPopuli/eslint-plugin-decorator-position">Achieve consistent decorator positioning with a new eslint plugin ↕️</a></h2>
<p>Ever had to <strong>put up with</strong> inconsistent decorator positions in pull requests, because there wasn't a lint rule for that?
<em>Now</em> there is! 🎉 <a href="https://github.com/NullVoxPopuli/eslint-plugin-decorator-position">eslint-plugin-decorator-position</a>
provides some configuration with some recommended defaults to help your project achieve that last bit of consistency.</p>
<hr />
<h2 id="standaloneemberconf2020videosareouthttpswwwyoutubecomplaylistlistpl4eq2dppybbkc03mdzlyej6tcbeqrzk8n"><a href="https://www.youtube.com/playlist?list=PL4eq2DPpyBbkC03mdzlyej6tcbEqrZK8N">Stand alone EmberConf 2020 videos are out 🎥</a></h2>
<p>If you missed part or all of the ✨✨<strong>amazing EmberConf 2020</strong> ✨✨, now's your chance to catch up on all the great talks à la carte! While the live streams have been available since the days they were streamed, now you can watch them as stand alone talks.</p>
<p>If you want to re-live some of the best moments, or watch them for the first time, you can find the complete library of videos 📼 available for your viewing pleasure on <a href="https://www.youtube.com/playlist?list=PL4eq2DPpyBbkC03mdzlyej6tcbEqrZK8N">YouTube</a>. Be sure not to miss the BonusConf sessions which are included in this list!</p>
<p>Again, don't forget to check out all the related resources for the talks in <a href="https://twitter.com/alex_diliberto/status/1240449629612892161">the conference notes</a> by <a href="https://github.com/alexdiliberto">Alex DiLiberto (@alexdiliberto)</a>.</p>
<p>Also one more reminder! We have a request for those of you who attended <strong>EmberConf 2020</strong>:</p>
<blockquote>
  <p>Tell us about someone new that you got to chat with at the virtual conf!</p>
</blockquote>
<p>Let us know about your answer to this question either by <a href="https://twitter.com/embertimes">tweeting us via Twitter</a> using the <strong>hashtag #EmberConFriends</strong> or as a message on the <a href="https://discordapp.com/invite/emberjs">Ember Discord</a> in the <strong>#support-ember-times</strong> channel. We will raffle an exclusive <strong>EmberConf retro sticker set</strong> among all story writers by April 6, 2020. We're looking forward to hear from you and happy catching up on virtual EmberConf!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/btecu" target="gh-user">@btecu</a>, <a href="https://github.com/kratiahuja" target="gh-user">@kratiahuja</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/kturney" target="gh-user">@kturney</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/leondmello" target="gh-user">@leondmello</a>, <a href="https://github.com/zapalagrzegorz" target="gh-user">@zapalagrzegorz</a>, <a href="https://github.com/monitron" target="gh-user">@monitron</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/jtappa" target="gh-user">@jtappa</a>, <a href="https://github.com/brentzc" target="gh-user">@brentzc</a>, <a href="https://github.com/skaterdav85" target="gh-user">@skaterdav85</a>, <a href="https://github.com/NullVoxPopuli" target="gh-user">@NullVoxPopuli</a>, <a href="https://github.com/rajasegar" target="gh-user">@rajasegar</a> and <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Anne-Greeth van Herwijnen, Preston Sego, Jared Galanis, Isaac Lee, Chris Ng, Jessica Jordan, Erik Rothoff, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-141</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-141</guid><pubDate>Fri, 27 Mar 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 142]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Community support for the Ember API Docs 📓❤️,
release of <code>ember-arg-types</code> 🍎🍊,
Ember CLI improvement tips 🚀,
betas of Glimmer.js 2 🎉, and last, but not least,
watch 3 virtual talks from EmberATX 📽️!</p>
<!-- READMORE -->
<hr />
<h2 id="communitysupportfortheemberapidocshttpsgithubcomemberlearnemberapidocs"><a href="https://github.com/ember-learn/ember-api-docs">Community support for the Ember API Docs 📓❤️</a></h2>
<p>The <a href="https://api.emberjs.com/ember/release">Ember API Docs</a> have been one of the cornerstones of Ember's official learning resources since the early days of the project.</p>
<p>But did you already know that right now there are plenty of efforts underway to modernise the app? In this regard, we'd like to thank <a href="https://github.com/Gaurav0">Gaurav Munjal (@Gaurav0)</a> in particular for bringing in <a href="https://github.com/ember-learn/ember-api-docs/pulls?q=is%3Apr+is%3Aclosed+author%3AGaurav0">lots of new upgrades, awesome refactors and improvements to the API Docs</a> ❤️!</p>
<p>If you are interested in <strong>helping</strong> with modernising the Ember API Docs - be it contributing code, triaging issues, or reviewing changes - make sure to chat with the Ember Learning team. You can do so either on  <a href="https://github.com/ember-learn/ember-api-docs/issues">an issue discussion on Github</a> or on the <strong>#dev-ember-learning</strong> channel through the <a href="https://discordapp.com/invite/emberjs">Ember Discord</a>!</p>
<hr />
<h2 id="releaseofemberargtypeshttpstwittercomjonkilroystatus1242639546749255681"><a href="https://twitter.com/jonkilroy/status/1242639546749255681">Release of ember-arg-types 🍎🍊</a></h2>
<p><a href="https://github.com/jkusa">Jon Kilroy (@jkusa)</a> released the <code>ember-arg-types</code> library which provides a decorator (<code>@arg</code>) that maps <a href="https://guides.emberjs.com/release/upgrading/current-edition/glimmer-components/">glimmer arguments</a> to local component properties. This allows default values and type checking to be declared and documented in your component JS file.</p>
<p>In this example, <code>sortBy</code> will return the string argument passed or will default to the string <code>’id’</code>:</p>
<pre><code class="javascript language-javascript">@arg(string)
sortBy = 'id';
</code></pre>
<p>Instead of writing something like this:</p>
<pre><code class="javascript language-javascript">get sortBy() {
  const { sortBy='id' } = this.args;
  assert('`sortBy` must be a string', typeof sortBy === 'string');
  return sortBy;
}
</code></pre>
<p>Furthermore <code>ember-arg-types</code> leverages the <a href="https://github.com/facebook/prop-types">facebook/prop-types</a> library by importing type validators for runtime type checking. As an example, the <code>name</code> argument below is required to be a string.</p>
<pre><code class="javascript language-javascript">import Component from '@glimmer/component';
import { arg } from 'ember-arg-types';
import { string } from 'prop-types';

export default class CharacterComponent extends Component {
  // `name` string arg that is required
  @arg(string.isRequired)
  name;
}
</code></pre>
<p>Try it out today by ember installing <a href="https://github.com/jkusa/ember-arg-types">ember-arg-types</a>!</p>
<hr />
<h2 id="embercliimprovementtipshttpsgistgithubcomvasind22122632be15f3bc98a092ab012524e2"><a href="https://gist.github.com/vasind/22122632be15f3bc98a092ab012524e2">Ember CLI improvement tips 🚀</a></h2>
<p><a href="https://github.com/vasind">Vasanth (@vasind)</a> collated a list of all <a href="https://ember-cli.com/"><strong>Ember CLI</strong></a> improvements for Ember applications as a GitHub gist. He showcased improvements to the <code>ember-cli-build.js</code> that speed up build times for development and test environments, while retaining the right configurations in production. He also added tips on optimizing applications using <a href="https://www.ember-cli-mirage.com/">Mirage</a>. <a href="https://gist.github.com/vasind/22122632be15f3bc98a092ab012524e2">Head out to his gist</a> to check them out!</p>
<hr />
<h2 id="betasofglimmerjs2httpsgithubcomglimmerjsglimmerjsreleases"><a href="https://github.com/glimmerjs/glimmer.js/releases">Betas of Glimmer.js 2 🎉</a></h2>
<p>A set of <strong>new betas for Glimmer.js 2.0.0</strong> (<a href="https://github.com/glimmerjs/glimmer.js/releases/tag/v2.0.0-beta.1">beta.1</a> &amp;&amp; <a href="https://github.com/glimmerjs/glimmer.js/releases/tag/v2.0.0-beta.3">beta.3</a>) have been released! 🔥🔥🔥</p>
<p>The releases incorporate some exciting new developments including a new minimal <code>renderComponent</code> API, a template import based design, a standardized build based on plain JavaScript modules, a new Glimmer.js app blueprint, and support for custom helpers and modifiers. The standardized build emulates the goals of Embroider in Ember.js and unlocks the ability to use whatever custom build pipeline you might want (WebPack, Parcel, Rollup, etc.)!</p>
<p>The Glimmer.js betas could pave the way for what we might want to do in Ember.js, and even what we might <em>not</em> want to do in Ember.js. Please note that these new Glimmer.js betas are definitely experimental. 🔬🧪 Have fun exploring them 🤠, but keep this in mind when considering them for use in your application.</p>
<hr />
<h2 id="watch3virtualtalksfromemberatxhttpstwittercomemberatxstatus1245383493632380929"><a href="https://twitter.com/EmberATX/status/1245383493632380929">Watch 3 virtual talks from EmberATX 📽️</a></h2>
<p>Hope everyone is well and taking care of themselves! 💞 If you have ~15 minutes to spare, you can watch a recent talk from EmberATX:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=2FQivvOK-04&list=PLHCmVP3S9Z1PZp5JU6VxmUyuQjO7vrLfy">ember-printable-pages</a> by <a href="https://github.com/chbonser">Chris Bonser (@chbonser)</a></li>
<li><a href="https://www.youtube.com/watch?v=KWBOYqAEh6M&list=PLHCmVP3S9Z1PZp5JU6VxmUyuQjO7vrLfy">Introducing Ember Modifiers</a> by <a href="https://github.com/sharpshark28">Ava Wroten (@sharpshark28)</a></li>
<li><a href="https://www.youtube.com/watch?v=Np3DdTrYmV0&list=PLHCmVP3S9Z1PZp5JU6VxmUyuQjO7vrLfy">CI with GitHub Actions for Ember Apps</a> by <a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a></li>
</ul>
<p>In particular, please check out the new addon, <a href="https://forge512.github.io/ember-printable-pages/">ember-printable-pages</a>! You can <strong>write declarative templates</strong> and <strong>reuse components</strong> to create printable pages for end users. It also supports <strong>progressive rendering</strong> to provide a smooth user experience when the end user needs to print <span style="font-style: italic;">hundreds</span> of pages. 💯</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/Robdel12" target="gh-user">@Robdel12</a>, <a href="https://github.com/skaterdav85" target="gh-user">@skaterdav85</a>, <a href="https://github.com/somasuna" target="gh-user">@somasuna</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/brendenpalmer" target="gh-user">@brendenpalmer</a>, <a href="https://github.com/sharpshark28" target="gh-user">@sharpshark28</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a> and <a href="https://github.com/SYU15" target="gh-user">@SYU15</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Abhilash, Jessica Jordan, Jared Galanis, Isaac Lee, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-142</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-142</guid><pubDate>Fri, 03 Apr 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 143]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Destroyables RFC in final comment period 💬,
Ember Engines documentation rewrite ⚙️,
Ember Octane at Square 💻,
check out the new Ember CLI documentation 📚,
introducing qunit-wait-for ⏰,
and last, but not least, power up your Ember app with ember-glue ✨!</p>
<!-- READMORE -->
<hr />
<h2 id="destroyablesrfcinfinalcommentperiodhttpsgithubcomemberjsrfcspull580"><a href="https://github.com/emberjs/rfcs/pull/580">Destroyables RFC in final comment period 💬</a></h2>
<p>The <strong>Destroyables</strong> RFC entered its final comment period today. That means you have 7 days (<strong>until April 17</strong>) to provide feedback.</p>
<p>The Destroyables RFC proposes an API that the Ember community can follow so that Ember's built-in constructs, which include components, services, routes, controllers, helpers, and modifiers, can clean up after themselves when destroyed. For example, a request in a data-fetching component would be cancelled if the parent is destroyed.</p>
<p>Please visit the <a href="https://github.com/emberjs/rfcs/blob/destroyables/text/0580-destroyables.md">RFC page</a> to learn more. Be sure to <a href="https://github.com/emberjs/rfcs/pull/580">provide your feedback</a> on time!</p>
<hr />
<h2 id="emberenginesdocumentationrewritehttpstwittercommvillanderstatus1246162676176355335"><a href="https://twitter.com/MVillander/status/1246162676176355335">Ember Engines documentation rewrite ⚙️</a></h2>
<p><a href="https://github.com/villander">Michael Villander (@villander)</a> announced a rewrite to the documentation for the Ember Engines Guides to improve the user experience for the community!</p>
<p>Updates include detailed explanations that range from what Ember Engines are and why should you use them, to differentiating the behaviour between <em>standard</em> and <em>in-repo</em> addons for Engines. The guide also goes through routable vs route-less Engines as well as how to “mount” them into your application. Finally, it also covers how to test code within Engines.</p>
<p>Huge thanks to <a href="https://github.com/dgeb">Dan Gebhardt (@dgeb)</a> and <a href="https://github.com/gabrielcsapo">Gabriel Csapo (@gabrielcsapo)</a>! Check out the <a href="https://ember-engines.netlify.app/docs">new Ember Engines docs</a> today and <a href="https://github.com/ember-engines/ember-engines-website">help contribute</a> to make them better!</p>
<hr />
<h2 id="emberoctaneatsquarehttpsdevelopersquareupcom"><a href="https://developer.squareup.com">Ember Octane at Square 💻</a></h2>
<p>Here at The Ember Times, we've been highlighting projects and teams who are using Ember Octane in their apps. This week, <a href="https://github.com/deanpapastrat">Dean Papastrat (@deanpapastrat)</a> shares his experience as an engineer at <a href="https://squareup.com/us/en">Square</a>! Dean writes:</p>
<blockquote>
  <p>Square enables businesses of all shapes and sizes to manage almost every aspect of their business - from payments to inventory to payroll - in one place. The Developers Experience team at Square builds products and tooling for external developers that build on Square's APIs, such as our <a href="https://developer.squareup.com/apps">Developer Dashboard</a>, <a href="https://developer.squareup.com/docs">Developer Documentation site</a>, <a href="https://developer.squareup.com/reference">API Reference</a>, and <a href="https://developer.squareup.com/explorer">API Explorer</a>.</p>
  <p>Our team recently released a new API Reference and API Explorer built on the Octane beta and Fastboot (don't worry, we're running production-grade Ember 3.17 now!). Despite being in beta, the choice to pick Octane was a no-brainer for us due to 3 major factors: performance, accessibility, and learning curve.</p>
  <p>Since our team’s primary customers are developers, we knew we'd need the site to be snappy. In Octane, we're able to render much larger lists without virtualization because of the performance gains from Glimmer components, which spares us a lot of complexity and accessibility issues that come with virtual lists. The biggest example of this is our objects index page and enum lists for properties, which render hundreds of list items with markdown and other rich content.</p>
  <p>The new API Reference is a completely accessible site, much in thanks to the improvements in Octane. It made it much easier for us to add ARIA attributes than past versions of Ember, where we had to bind lots of attributes explicitly or manually forward properties to elements inside of components. Specifically, the ability to apply "splattributes" to a given element in a component meant we could work with the HTML properties we were familiar with instead of working around the framework. The way angle bracket components use "@" symbols to delineate arguments on a component from HTML attributes made this easier for us as well, since it disambiguated how arguments and attributes would be handled on the component.</p>
  <p>Lastly, the lower learning curve of Octane became the strongest selling point for our team. With half our team being engineers that had never touched Ember before, we were wary of how long it would take people to pick up the concepts in Octane that weren't well-documented at the time. Instead, we were blown away at how quickly people were able to pick it up. The engineers new to Ember picked up Glimmer components with tracked properties in under a day, because they "just worked like classes". Using modifiers directly within the templates themselves felt much more straightforward for new engineers. In fact, there were no "Emberisms" they needed to learn to be productive. Angle bracket components felt more natural to our engineers coming from a React background, and the disambiguation of arguments / component state / attributes made it much easier to understand how data flowed from one component to another.</p>
  <p>The only regret we have is that we haven't been able to port the rest of our apps to Octane yet, and going back to computed properties feels like such a massive step backward, that it makes you realize how important Octane is for improving the Ember developer experience long term. We're excited to see how the Ember community approaches the challenge of modernizing the build system with Embroider, and can't wait to adopt it later this year.</p>
</blockquote>
<!-- alex enable just -->
<hr />
<h2 id="checkoutthenewemberclidocumentationhttpscliemberjscomrelease"><a href="https://cli.emberjs.com/release/">Check out the new Ember CLI documentation 📚</a></h2>
<p>In case you might not have known, the Ember.js website has <a href="https://cli.emberjs.com/release/">documentation dedicated to Ember CLI</a>. It covers both everyday and advanced uses that you will encounter when you write Ember apps or addons.</p>
<p>In the past two weeks, <a href="https://github.com/mehulkar">Mehul Kar (@mehulkar)</a> dedicated his time to <a href="https://github.com/ember-learn/cli-guides/pulls?q=is%3Apr+is%3Aclosed+author%3Amehulkar+created%3A%3E%3D2020-03-15+">keep the documentation up to date</a> and introduced 2 new sections: how to <a href="https://cli.emberjs.com/release/advanced-use/debugging/">debug when CLI commands fail</a> and how to <a href="https://cli.emberjs.com/release/writing-addons/custom-commands/">create custom CLI commands</a>.</p>
<p>We encourage you to check out the Ember CLI documentation to understand your toolset better. Don't forget to thank Mehul for his work!</p>
<hr />
<h2 id="introducingqunitwaitforhttpstwittercomalexlafrosciastatus1246102930475962368"><a href="https://twitter.com/alexlafroscia/status/1246102930475962368">Introducing qunit-wait-for ⏰</a></h2>
<p>There's an awesome new test helper by <a href="https://github.com/alexlafroscia">Alex LaFroscia (@alexlafroscia)</a> that rethinks the approach on how we wait for asynchronous behavior to resolve in our tests! 🎉</p>
<p>Typically in Ember tests you'd use one of the several available test helpers that <a href="https://github.com/emberjs/ember-test-helpers/blob/master/API.md#waituntil">wait until a promise resolves</a> before making some kind of assertion against the state of your application. However, using wait test helpers in this way can add complexity to your tests and couple ⛓ your tests to your implementation code.</p>
<p>With <a href="https://github.com/alexlafroscia/qunit-wait-for"><code>qunit-wait-for</code></a> the idea is to let assertions run immediately and fail gracefully until they pass or a timeout is reached. This allows you to wait ⏳ for async behavior to complete without your test code knowing any more than it needs to know about your app code. All you have to do is wrap your assertion with a <code>waitFor</code> assertion provided by <code>qunit-wait-for</code>, it's very cool!</p>
<p><code>qunit-wait-for</code> can be used not only in Ember.js, but in any JavaScript applications that use QUnit. Give it a spin today!</p>
<hr />
<h2 id="auicomponentlibraryforambitiousemberdevelopershttpswwwlinkedincompulseembergluewhatcouldnextgenerationuicomponentlibrarymunjal"><a href="https://www.linkedin.com/pulse/ember-glue-what-could-next-generation-ui-component-library-munjal/">A UI component library for ambitious Ember developers ✨</a></h2>
<p><strong>UI component libraries</strong> have become a popular, if not even essential part of a frontend developer's toolset.
Libraries such as <a href="https://emberobserver.com/addons/ember-paper">ember-paper</a> and <a href="https://semantic-org.github.io/Semantic-UI-Ember">semantic-ui-ember</a> allow us to create beautiful, seamless and intuitive user interfaces.
And who doesn't want to feel empowered to build applications that their users will find compelling to use and love?</p>
<p>Now a brand-new component collection might improve our Ember applications even further: <a href="https://github.com/gaurav0/ember-glue">ember-glue</a> is a
modern UI component library, that takes the latest best practices of frontend development into account. The components are <strong>accessible</strong>, <strong>responsive</strong> and <strong>themeable</strong>, allowing design updates with little effort.</p>
<p>Want to learn more about what <strong>ember-glue</strong> can do for your app? Check out the <a href="https://www.linkedin.com/pulse/ember-glue-what-could-next-generation-ui-component-library-munjal/">blog post describing the feature set and the motivation behind this addon</a>. And if you're curious, to explore the ecosystem of UI libraries for Ember apps further, be sure to consult <a href="https://emberobserver.com/categories/component-suites">Ember Observer</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kratiahuja" target="gh-user">@kratiahuja</a>, <a href="https://github.com/cibernox" target="gh-user">@cibernox</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/SergeAstapov" target="gh-user">@SergeAstapov</a>, <a href="https://github.com/pieter-v" target="gh-user">@pieter-v</a>, <a href="https://github.com/patricklx" target="gh-user">@patricklx</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/bmish" target="gh-user">@bmish</a>, <a href="https://github.com/gokatz" target="gh-user">@gokatz</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/Mithrilhall" target="gh-user">@Mithrilhall</a> and <a href="https://github.com/skaterdav85" target="gh-user">@skaterdav85</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Dean Papastrat, Amy Lam, Isaac Lee, Jessica Jordan, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-143</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-143</guid><pubDate>Fri, 10 Apr 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 144]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Call for a11y-focused contributors ❤️,
quest issue: drop mixins from ember-simple-auth 🔐,
RFC roundup 📣
Ember Conf 2020 trainings 🚀,
and last, but not least, state management with ember-statecharts 📈!</p>
<!-- READMORE -->
<hr />
<h2 id="callforcontributorsjointhestriketeamforaccessibilityinemberhttpsgithubcomemberjsrfcsissues595"><a href="https://github.com/emberjs/rfcs/issues/595">Call for contributors: join the strike team for accessibility in Ember</a></h2>
<p>The Ember community put in lots of work into <a href="https://guides.emberjs.com/release/accessibility/">framework features</a> and <a href="https://emberobserver.com/categories/accessibility">addons</a> to allow us to build accessible and user-friendly applications. But still there is more work to be done to <strong>address accessibility issues</strong> in Ember.js and to improve the future of how we build JavaScript apps.</p>
<p>Do you want to be part of these efforts to help modern Ember apps become more accessible?</p>
<p>Then be sure to join the <strong>#st-a11y strike team</strong> on the <a href="https://discordapp.com/invite/emberjs">Ember Discord chat</a>! The recently founded strike team for creating an <strong>accessible JavaScript framework</strong> has already put together a <a href="https://github.com/emberjs/rfcs/issues/595">detailed list of issues to work on</a> and is counting on your support. On top of that, there are several accessibility-related issues in <strong>ember-template-lint</strong> that could use your help, so if tooling is your thing, please <a href="https://github.com/ember-template-lint/ember-template-lint/issues">check out the issues on Github</a> and see if there's a rule you can help write!</p>
<p>For more ideas, questions and discussion around a11y-related work, <a href="https://discord.gg/emberjs">join the strike team in the #st-a11y channel today</a>!</p>
<hr />
<h2 id="questissuedropmixinsfromembersimpleauthhttpstwittercommarcoowstatus1250411978339819522"><a href="https://twitter.com/marcoow/status/1250411978339819522">Quest issue: drop mixins from ember-simple-auth 🔐</a></h2>
<p><a href="https://github.com/marcoow">Marco Otte-Witte (@marcoow)</a> announced a <a href="https://github.com/simplabs/ember-simple-auth/issues/2185">quest issue to Drop Mixins</a> in <a href="https://github.com/simplabs/ember-simple-auth">ember-simple-auth</a>.</p>
<p>The addon <a href="https://github.com/simplabs/ember-simple-auth">ember-simple-auth</a> is a lightweight library for implementing authentication and authorization with Ember.js applications. When it was originally designed, the addon was heavily leveraging <a href="https://api.emberjs.com/ember/release/classes/Mixin">mixins</a> so it could be one-step integrated by developers into their applications. However, with <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes">Native JavaScript classes</a>, mixins aren't really well supported and you have to fall back to constructs like:</p>
<pre><code class="javascript language-javascript">export default class ProtectedRoute extends Route.extend(AuthenticatedRouteMixin) { }
</code></pre>
<p>Furthermore, eventually mixins will likely be removed from Ember altogether and they already trigger <a href="https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/no-mixins.md">linter warnings</a>. The quest issue details several options to deal with this such as <a href="https://github.com/emberjs/rfcs/blob/master/text/0408-decorators.md">Ember Decorators</a> or Mixins that <a href="https://justinfagnani.com/2015/12/21/real-mixins-with-javascript-classes/">do not rely</a> on the Ember Object model.</p>
<p>Try out <a href="https://github.com/simplabs/ember-simple-auth">ember-simple-auth</a> and take a look at the <a href="https://github.com/simplabs/ember-simple-auth/issues/2185">quest issue</a> with any feedback or ideas you might have!</p>
<hr />
<h2 id="rfcrounduphttpstwittercomemberjs"><a href="https://twitter.com/emberjs">RFC roundup 📣</a></h2>
<p>The <strong>2020 Ember Roadmap</strong> Request for Comments (RFC) has been promoted to Final Comment Period (FCP). You can <a href="https://github.com/emberjs/rfcs/pull/519">read it here</a>. This was a long-running RFC with a lot of community feedback over time! The Core Team is excited to solidify 2020's plan and focus their efforts.</p>
<p>The <strong>Template Strict Mode</strong> RFC has also entered FCP! This RFC from <a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a> adds a new strict mode for Ember templates that has a clearer syntax with fewer ambiguities, and provides primitives for adding template imports in the future. Check it out <a href="https://github.com/emberjs/rfcs/pull/496">here</a>.</p>
<hr />
<h2 id="emberconf2020trainingshttpsemberconfcomschedule"><a href="https://emberconf.com/#/schedule/">Ember Conf 2020 trainings 🚀</a></h2>
<p>A heads up that some of the Ember Conf 2020 trainings are now available online at no additional cost! 💸</p>
<p>You can check out <a href="https://embermap.com/">EmberMap's</a> awesome trainings on <a href="https://twitter.com/ember_map/status/1245011062417772548">Domain Modeling for JavaScript Apps with Mirage JS</a> and <a href="https://twitter.com/ember_map/status/1246071188394250240">Tailwind CSS Tips, Tricks & Best Practices</a>!</p>
<p>Also now available is a super cool workshop from <a href="https://simplabs.com/">simplabs</a> to teach you the basics about <a href="https://github.com/simplabs/ast-workshop">Abstract Syntax Trees</a>!</p>
<p>Don't miss the bus 🚌 on this opportunity to level up your skills in these really cool topics. 😃</p>
<hr />
<h2 id="enjoymanagingstatewithemberstatechartshttpstwittercomlevelbossmikestatus1248247002489425921"><a href="https://twitter.com/LevelbossMike/status/1248247002489425921">Enjoy managing state with ember-statecharts 📈</a></h2>
<p><strong>State charts</strong> are a method to model complex program behavior as a set of states that react to events. And being able to manage and predict state in a growing Ember application can be very useful.</p>
<p>And this is where <a href="https://github.com/LevelbossMike/ember-statecharts"><strong>ember-statecharts</strong></a> comes in: This Ember addon provides us with a new abstraction layer to define state charts in our app, based on the conventions from the powerful <a href="https://xstate.js.org/">xstate library</a>.</p>
<p>Want to learn more? Be sure to <a href="https://twitter.com/LevelbossMike/status/1248247002489425921">check out the sparkling new documentation</a> and try it <a href="https://emberobserver.com/addons/ember-statecharts">for yourself</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/wayne-o" target="gh-user">@wayne-o</a>, <a href="https://github.com/gabrielcsapo" target="gh-user">@gabrielcsapo</a>, <a href="https://github.com/elwayman02" target="gh-user">@elwayman02</a>, <a href="https://github.com/lifeart" target="gh-user">@lifeart</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/ondrejsevcik" target="gh-user">@ondrejsevcik</a>, <a href="https://github.com/Robdel12" target="gh-user">@Robdel12</a>, <a href="https://github.com/buschtoens" target="gh-user">@buschtoens</a>, <a href="https://github.com/alexeykostevich" target="gh-user">@alexeykostevich</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/dfreeman" target="gh-user">@dfreeman</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-144</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-144</guid><pubDate>Fri, 17 Apr 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 145]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<!-- alex disable simple -->
<p>Ember Styleguide 4.0.0 release 🔥,
autotracking case study with TrackedMap 🐾🗺,
simple drag and drop in Ember Octane 🐺,
meet 2 developers who became Ember developers 🎉,
and last, but not least, watch the new EmberMap video on the <code>{{fn}}</code> helper 📺!</p>
<!-- alex enable simple -->
<!-- READMORE -->
<hr />
<h2 id="emberstyleguide400releasehttpsgithubcomemberlearnemberstyleguidereleasestagv400"><a href="https://github.com/ember-learn/ember-styleguide/releases/tag/v4.0.0">Ember Styleguide 4.0.0 release 🔥</a></h2>
<p>A new Ember Styleguide release was cut today 🛳 and it represents a massive amount of work by a number of contributors over the last year: 372 commits, 719 files and 13 contributors to be exact! 😱 Check out the app <a href="https://ember-styleguide.netlify.app/">here on the web</a> as well.</p>
<p>To see any of the individual changes, please look at the pre-release versions in the <a href="https://github.com/ember-learn/ember-styleguide/blob/master/CHANGELOG.md">changelog</a>. The changes are too many to capture here, but here are a few of the high level overviews:</p>
<ul>
<li>Remove ember-cli-addon docs in favor of field-guide for better SEO</li>
<li>Remove components that are not actively being used in any project</li>
<li>Implement base styles that are common across all of the Ember websites</li>
<li>Implement common CSS helpers for things that don't need a dedicated component</li>
<li>Upgrade most of the remaining components to Glimmer components</li>
<li>Streamline the CSS build pipeline to remove duplicate CSS and improve its Lighthouse score</li>
</ul>
<p><a href="https://github.com/mansona">Chris Manson (@mansona)</a>, <a href="https://github.com/MelSumner">Mel Sumner (@MelSumner)</a>,  <a href="https://github.com/pichfl">Florian Pichler (@pichfl)</a> and so many more deserve huge props 🙌🙌🙌 for this milestone release that will support development in all the Ember web properties! 🎉</p>
<hr />
<h2 id="autotrackingcasestudywithtrackedmaphttpswwwpzuraqcomautotrackingcasestudytrackedmap"><a href="https://www.pzuraq.com/autotracking-case-study-trackedmap/">Autotracking case study with TrackedMap 🐹</a></h2>
<p>In the latest edition of his <a href="https://twitter.com/pzuraq/status/1221950391782240256">blog post series on autotracking in Ember Octane</a>, Ember Core team member <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> gives us insight into an <a href="https://www.pzuraq.com/autotracking-case-study-trackedmap/">interesting case study</a> to explore the <strong>new reactivity model</strong> in <strong>Ember Octane</strong> even further. He outlines how to build a <code>TrackedMap</code> - an autotracked version of JavaScript's built-in <code>Map</code> class - and why building and using such a class will improve the developer ergonomics and performance of our Ember apps.</p>
<p>Curious to learn more? Read the full post on <a href="https://www.pzuraq.com/autotracking-case-study-trackedmap/">@pzuraq's blog</a>!</p>
<p>And by the way: Even though the case study is also a detailed guide on how to develop your own <code>TrackedMap</code>, you don't have to build it yourself, to be able to use this awesome feature in your Ember app. Check out @pzuraq's community addons <a href="https://github.com/pzuraq/tracked-built-ins">tracked-built-ins</a> or <a href="https://github.com/pzuraq/tracked-maps-and-sets">tracked-maps-and-sets</a> to autotrack <code>Map</code>s today!</p>
<hr />
<!-- alex disable simple -->
<h2 id="simpledraganddropinemberoctanehttpsdevtodgaveysimpledraganddropinemberoctane466i"><a href="https://dev.to/dgavey/simple-drag-and-drop-in-ember-octane-466i">Simple drag and drop in Ember Octane 🐺</a></h2>
<p>In his tutorial, <a href="https://dev.to/dgavey/simple-drag-and-drop-in-ember-octane-466i">Simple Drag and Drop in Ember Octane</a>, Ember developer <a href="https://github.com/dgavey">Derek Gavey (@dgavey)</a> gives you a straightforward <a href="https://emberjs.com/editions/octane/">Ember Octane</a> way of making an <strong>HTML drag and drop interface</strong> for your site. The code is minimal and you can extend it to meet your needs.</p>
<!-- alex enable simple -->
<p>The secret? You can use <a href="https://guides.emberjs.com/release/components/template-lifecycle-dom-and-modifiers/#toc_event-handlers">modifiers</a> to simplify adding drag events. Derek breaks everything down for you and explains each step.</p>
<p>I think articles like this will help you build your developer skillset. There is a lot of useful info in Derek Gavey's piece. We look forward to reading his next article on how to make a sortable list!</p>
<hr />
<h2 id="migrdesvelteaemberjsyfueparabienhttpsotroespacioblogwordpresscom20200417migredesvelteaemberjsyfueparabien"><a href="https://otroespacioblog.wordpress.com/2020/04/17/migre-de-svelte-a-emberjs-y-fue-para-bien/">Migré de Svelte a EmberJS y fue para bien 🎉</a></h2>
<p>Say hello to <a href="https://github.com/cesc1989">Francisco Quintero (@cesc1989)</a>. Francisco is a software engineer who recently <a href="https://otroespacioblog.wordpress.com/2020/04/17/migre-de-svelte-a-emberjs-y-fue-para-bien/">migrated his app Intrati from Svelte to Ember Octane</a> in <strong>16 days</strong>! In both cases, a friend recommended the framework and he learned by reading documentation, writing tests, and coding by trial-and-error.</p>
<p>In the <a href="https://otroespacioblog.wordpress.com/2020/04/17/migre-de-svelte-a-emberjs-y-fue-para-bien/">blog post</a>, Francisco shares what he liked and what he found to be difficult to do in Svelte and Ember. He also shares <a href="https://paper.dropbox.com/doc/Aprendizaje-Migrando-a-EmberJS--AyOEl5onXX29iRjnY_mtdqygAQ-Gj5CGvslVsQcrmGMKvWtR">the notes that he compiled while learning Ember</a>. We encourage you to read them to understand more what using Ember can be like for a new developer.</p>
<p>(Both Francisco's blog post and notes are written in Spanish. If you're not familiar with the language, you can use Google Translate or another translation software.)</p>
<hr />
<h2 id="todoapptutorialinemberoctaneforthosewhoknowreacthttpsdevtojennyjudovatodoapptutorialinemberoctaneforthosewhoknowreact1741"><a href="https://dev.to/jennyjudova/todo-app-tutorial-in-ember-octane-for-those-who-know-react-1741">Todo app tutorial in Ember Octane for those who know React 🎉</a></h2>
<p>Next, please welcome <a href="https://github.com/JennyJudova">Jenny Judova (@JennyJudova)</a>. Jenny is a UI engineer who has experience with React and began to learn Ember for her current job.</p>
<p>In the <a href="https://dev.to/jennyjudova/todo-app-tutorial-in-ember-octane-for-those-who-know-react-1741">blog post</a>, Jenny explains step-by-step how to create a Todo app and relates Ember Octane code to what you might see done in React. She finds that it's easier to learn a new language when it's compared to something you already know, even if the comparisons may not be perfect.</p>
<p>If you are interested in learning more about solving the Todo problem in Ember and React, please <a href="https://dev.to/jennyjudova/todo-app-tutorial-in-ember-octane-for-those-who-know-react-1741">check out the blog post</a>!</p>
<hr />
<h2 id="embermapthefnhelperhttpsembermapcomtopicswhatsnewinemberthefnhelper311"><a href="https://embermap.com/topics/what-s-new-in-ember/the-fn-helper-3-11">EmberMap: The {{fn}} Helper 📺</a></h2>
<p>This edition of EmberMap’s <a href="https://embermap.com/topics/what-s-new-in-ember">What’s New in Ember</a> series discusses the <code>fn</code> or <a href="https://github.com/emberjs/rfcs/pull/470">function helper</a> – Ember's conceptual shift in binding actions at the source, rather than at the invocation site.</p>
<p>The <a href="http://api.emberjs.com/ember/release/classes/Ember.Templates.helpers/methods/fn?anchor=fn"><code>fn</code> helper</a> which has been available since <a href="https://blog.emberjs.com/2019/07/15/ember-3-11-released.html">Ember 3.11</a>, provides a way to pass arguments to actions. While this may be something Ember already provided for a long time, the EmberMap video goes through the nuisance of how the <code>fn</code> helper provides added functionality by binding the <code>this</code> context and currying the arguments passed. For example, it allows you to <a href="https://guides.emberjs.com/release/upgrading/current-edition/action-on-and-fn/">pass parameters along to functions</a> in your templates:</p>
<pre><code class="handlebars language-handlebars">&lt;!-- Before --&gt;
&lt;button {{action 'handleClick' 123}}&gt;Click Me!&lt;/button&gt;
&lt;MyComponent @onClick={{action 'handleClick' 123}} /&gt;

&lt;!-- After --&gt;
&lt;button {{on "click" (fn this.handleClick 123)}}&gt;Click Me!&lt;/button&gt;
&lt;MyComponent @onClick={{fn this.handleClick 123}} /&gt;
</code></pre>
<p>Check out the full <a href="https://embermap.com/topics/what-s-new-in-ember/the-fn-helper-3-11">EmberMap video</a> and try using the <code>fn</code> helper in your app today!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/alexeykostevich" target="gh-user">@alexeykostevich</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/sandstrom" target="gh-user">@sandstrom</a>, <a href="https://github.com/rajasegar" target="gh-user">@rajasegar</a>, <a href="https://github.com/skaterdav85" target="gh-user">@skaterdav85</a>, <a href="https://github.com/bantic" target="gh-user">@bantic</a>, <a href="https://github.com/RajaSK05" target="gh-user">@RajaSK05</a>, <a href="https://github.com/chiragpat" target="gh-user">@chiragpat</a> and <a href="https://github.com/rahilvora" target="gh-user">@rahilvora</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Matthew Roderick, Jared Galanis, Isaac Lee, Jessica Jordan, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-145</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-145</guid><pubDate>Fri, 24 Apr 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 146]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember website(s) redesign call for contributors 🎨🐹,
Yehuda's Octane tutorial continued 🔥,
contribute to the Global Accessibility Awareness Day blog series ✍️,
ember-bootstrap 4 release candidate 🛳,
strict mode templates RFC accepted 💖,
and last, but not least, check out the Yahoo Knowledge Graph COVID-19 Dashboard  🗺️, built with Ember!</p>
<!-- READMORE -->
<hr />
<h2 id="callforcontributorsshippingtheemberwebsitesredesignhttpstwittercommelaniersumnerstatus1254497875062673411"><a href="https://twitter.com/melaniersumner/status/1254497875062673411">Call for contributors: Shipping the Ember website(s) redesign 🎨🐹</a></h2>
<p>Early last year, the community came together to <a href="https://github.com/emberjs/rfcs/pull/425">discuss the future of the design strategy of official Ember sites</a>. After plenty of time and work investments from individual contributors, companies and the Ember Core team, the redesign for the main site <a href="https://emberjs.com">emberjs.com</a> <a href="https://twitter.com/emberjs/status/1230912205631213569">shipped successfully</a>!</p>
<p>Many other official resources for the Ember community, such as the <a href="https://blog.emberjs.com/">Blog</a>, <a href="https://api.emberjs.com/">API Docs</a>, and <a href="https://cli.emberjs.com/">CLI Guides</a>, are looking forward to get a new look &amp; feel as well - and you can help with that! A <a href="https://twitter.com/melaniersumner/status/1254497875062673411?s=21">call for contributors</a> is looking for those who have experience with JavaScript, HTML and CSS and who want to help shipping the website redesign.</p>
<p>Want to get started? Be sure to read the <a href="https://blog.emberjs.com/2020/04/26/update-ember-website.html">official status update for the Ember Website</a> on the blog for more details on how to contribute. And feel free to reach out to the folks on the <strong>#st-website</strong> channel on the <a href="https://discordapp.com/invite/zT3asNS">Ember Discord</a> for any questions. We're looking forward to your contributions!</p>
<hr />
<h2 id="yehudasoctanetutorialcontinuedhttpsyehudakatzcom20200325emberoctaneletsgo"><a href="https://yehudakatz.com/2020/03/25/ember-octane-lets-go/">Yehuda's Octane tutorial continued 🔥</a></h2>
<p>Our very own <a href="https://github.com/wycats">Yehuda Katz (@wycats)</a> wrote a blog series for an <a href="https://yehudakatz.com/2020/03/25/ember-octane-lets-go/">Octane tutorial</a>, and there are two new posts added to it.</p>
<p>The third part of the tutorial, <a href="https://yehudakatz.com/2020/03/30/ember-octane-a-data-file/">Pulling Out Data</a>, talks about moving data from HTML into a separate file. This is the part in the series that introduces you to writing JavaScript for the first time. You'll also learn how to build your helpers and write unit tests for them.</p>
<p>The fourth part of the tutorial, <a href="https://yehudakatz.com/2020/04/06/ember-octane-airtable-time/">Airtable Time</a>, talks about moving the JSON into Airtable. It is a great approach that will reduce the need for an application build for changing only data.</p>
<p>So far there are seven posts planned:</p>
<ul>
<li><a href="https://yehudakatz.com/2020/03/25/ember-octane-lets-go/">Let's Go</a></li>
<li><a href="https://yehudakatz.com/2020/03/26/ember-octane-components/">Components</a></li>
<li><a href="https://yehudakatz.com/2020/03/30/ember-octane-a-data-file/">Pulling Out Data</a></li>
<li><a href="https://yehudakatz.com/2020/04/06/ember-octane-airtable-time/">Airtable Time</a></li>
<li>Cleaning Things Up</li>
<li>Adding More Pages</li>
<li>Polishing: Server-Side Rendering, Prerendering and Code Splitting</li>
</ul>
<p>So be on the lookout 👀 for more in this very helpful new series!</p>
<hr />
<h2 id="contributetotheglobalaccessibilityawarenessdayblogserieshttpsgithubcomemberlearnemberblogissues628"><a href="https://github.com/ember-learn/ember-blog/issues/628">Contribute to the Global Accessibility Awareness Day blog series ✍️</a></h2>
<p>The Ember Accessibility strike team is organizing a blog post series for <a href="https://globalaccessibilityawarenessday.org/">Global Accessibility Awareness Day (GAAD)</a>! This May 21st will mark the ninth annual Global Accessibility Awareness Day. The purpose of GAAD is to get everyone <strong>talking, thinking and learning</strong> about digital (web, software, mobile, etc.) access/inclusion and people with different disabilities.</p>
<p>Interested in writing a post about an a11y topic such as screenreaders, WCAG, or the POUR model? Coordinate with the team on the <a href="https://github.com/ember-learn/ember-blog/issues/628">GitHub issue</a> and the <a href="https://discordapp.com/channels/480462759797063690/680503382036840496">#st-a11y channel</a> on the <a href="https://discord.gg/emberjs">Ember Discord</a>.</p>
<hr />
<h2 id="emberbootstrap4releasecandidatehttpstwittercomsimonihmigstatus1255099221415510016"><a href="https://twitter.com/simonihmig/status/1255099221415510016">ember-bootstrap 4 release candidate 🛳</a></h2>
<p>The folks at <a href="https://github.com/kaliber5">kaliber5</a> have put out a new release candidate for <a href="https://github.com/kaliber5/ember-bootstrap">ember-bootstrap</a>! 🎉</p>
<p>This release candidate:</p>
<ul>
<li>Refactors to using tag-less components everywhere in preparation for a Glimmer rewrite</li>
<li>Drops Ember &lt; 3.16, Node 8 Package</li>
<li>Drops deprecated arguments for HTML attributes</li>
<li>Overhauls the build setup, using Embroider macros!!!</li>
</ul>
<p>Go ahead and check out the <a href="https://github.com/kaliber5/ember-bootstrap/releases/tag/v4.0.0-rc.0">release notes</a> for a full set of changes. Shout out to the contributors of this RC <a href="https://github.com/jakesjews">Jacob Jewell (@jakesjews)</a>, <a href="https://github.com/jelhan">Jeldrik Hanschke (@jelhan)</a> and <a href="https://github.com/simonihmig">Simon Ihmig (@simonihmig)</a> for getting this done!</p>
<hr />
<h2 id="strictmodetemplatesrfcacceptedhttpsgithubcomemberjsrfcspull496"><a href="https://github.com/emberjs/rfcs/pull/496">Strict mode templates RFC accepted 💖</a></h2>
<p>Strict mode templates RFC, for which the community discussion began in June 2019, was recently accepted by the Ember core teams. 🎉 You can read the RFC to <a href="https://github.com/emberjs/rfcs/blob/master/text/0496-handlebars-strict-mode.md">learn more about the proposed changes and motivations</a>.</p>
<p>At a high level, the "strict mode" (the terminology may change) is opt-in but intended to become the main way Ember users write templates. Once the strict mode is implemented (this may take time), the core teams and addon developers can start experimenting with <strong>better ways to support your development workflow</strong>. Experimental features such as <strong>template imports</strong> and <strong>single-file components</strong>, which build on top of the strict mode, will still need further design and iterations before they can be proposed and recommended to you.</p>
<p>In short, you don't need to worry about an immediate change. It is an exciting change to look forward to, because Ember has been using Handlebars for more than 8 years and we have learned how we can improve its language since. In the meantime, we encourage you to take a look at the <a href="https://github.com/emberjs/rfcs/blob/master/text/0496-handlebars-strict-mode.md">strict mode templates RFC</a>!</p>
<hr />
<h2 id="yahooknowledgegraphcovid19dashboardhttpsyahoogithubiocovid19dashboard"><a href="https://yahoo.github.io/covid-19-dashboard/">Yahoo Knowledge Graph COVID-19 Dashboard 🗺️</a></h2>
<p>The <a href="https://github.com/yahoo/covid-19-dashboard">Yahoo Knowledge Graph COVID-19 Dashboard</a> which was <a href="https://twitter.com/jonkilroy/status/1254873001146961925">built with Ember</a> launched with Yahoo’s open source <a href="https://github.com/yahoo/covid-19-data/">COVID-19 datasets</a> which are constructed entirely from primary (government and public agency) sources.</p>
<p>Check it out today at <a href="https://yahoo.github.io/covid-19-dashboard/">yahoo.github.io/covid-19-dashboard</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/jayjayjpg" target="gh-user">@jayjayjpg</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/alexeykostevich" target="gh-user">@alexeykostevich</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/maxwondercorn" target="gh-user">@maxwondercorn</a>, <a href="https://github.com/eramod" target="gh-user">@eramod</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/ansmonjol" target="gh-user">@ansmonjol</a>, <a href="https://github.com/SYU15" target="gh-user">@SYU15</a> and <a href="https://github.com/patricklx" target="gh-user">@patricklx</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Abhilash LR, Amy Lam, Jessica Jordan, Isaac Lee, Chris Ng, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-146</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-146</guid><pubDate>Fri, 01 May 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 147]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember 3.18 is out 🎉,
investigate arguments with Ember Inspector 🕵️‍♀️,
read the blog post comparing Ember Octane and React 🐹⚛️,
explore autosave with Ember Octane 💾,
review Embroider &amp; memoization RFCs 💬,
and last, but not least, check out the ember-keyboard RFC ⌨️!</p>
<!-- READMORE -->
<hr />
<h2 id="ember318isouthttpsblogemberjscom20200505ember318releasedhtml"><a href="https://blog.emberjs.com/2020/05/05/ember-3-18-released.html">Ember 3.18 is out 🎉</a></h2>
<p>The latest versions of <strong>Ember.js</strong>, <strong>ember-data</strong> and <strong>ember-cli</strong> are out <a href="https://blog.emberjs.com/2020/05/05/ember-3-18-released.html">with the <strong>3.18 release</strong></a>!
This new minor release version is full of bug fixes for the core libraries that power your Ember application, so be sure to upgrade soon.</p>
<p>For more info on the current release schedule of Ember check out <a href="https://emberjs.com/releases/">our releases page</a> and for information on Ember v3.18, you can give the official release post <a href="https://blog.emberjs.com/2020/05/05/ember-3-18-released.html">a read</a>.</p>
<hr />
<h2 id="investigatecomponentargumentswiththenewemberinspectorhttpstwittercomchancancodestatus1258514680256987136"><a href="https://twitter.com/chancancode/status/1258514680256987136">Investigate component arguments with the new Ember Inspector 🕵️‍♀️</a></h2>
<p>The brand-new, 4.0 version of <a href="https://guides.emberjs.com/release/ember-inspector/">Ember Inspector</a> - the best tool for <strong>inspecting and debugging your Ember applications</strong> - is out! The recent release comes not only with lots of valuable bug fixes, but also with many amazing features, including:</p>
<ul>
<li>Inspection of <strong>component arguments</strong>: You can now see and investigate <a href="https://emberjs.github.io/rfcs/0311-angle-bracket-invocation.html#arguments">arguments</a> passed to your components through Ember Inspector's component tree 🌳</li>
<li>Inspection of <strong>the store</strong>: Directly inspect your data store and send it as a variable for further debugging to your console. You can check out a demo recording of this feature in the <a href="https://github.com/emberjs/ember-inspector/pull/1163">PR description</a> of <a href="https://github.com/SYU15">Sarah Yu's (@SYU15)</a> work 🏬</li>
<li>Navigate through the component tree via <strong>keyboard</strong> with a new <a href="https://github.com/emberjs/ember-inspector/pull/1153">accessibility improvement</a> 🎹</li>
</ul>
<p>Check out the full list of features and improvements over at the project's <a href="https://github.com/emberjs/ember-inspector/blob/v4.0.1/CHANGELOG.md#v400-2020-05-06">changelog</a>. A sparkling thank you goes to the contributors <a href="https://github.com/SYU15">Sarah Yu (@SYU15)</a>, <a href="https://github.com/nummi">Jerry Nummi (@nummi)</a>, <a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a> and <a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a> who made this release happen!</p>
<hr />
<h2 id="blogpostcomparingemberoctaneandreacthttpswwwpzuraqcomcomparingemberoctaneandreact"><a href="https://www.pzuraq.com/comparing-ember-octane-and-react/">Blog post: Comparing Ember Octane and React 🐹⚛️</a></h2>
<p><a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> wrote a blog post <a href="https://www.pzuraq.com/comparing-ember-octane-and-react/">comparing Ember Octane and React</a> in terms of their respective programming models and developer experience using the latest idioms and best practices from both frameworks (Ember Octane and React Hooks).</p>
<p>The blog post goes through an in-depth analysis of the programming models between Ember and React including how they handle derived values and state, lifecycle hooks or methods to handle scheduling, and handling user interaction.</p>
<p>Check out the <a href="https://www.pzuraq.com/comparing-ember-octane-and-react/">takeaways</a> from this comparison in the full blog post!</p>
<hr />
<h2 id="autosaveenemberoctanehttpsbetocantu93comautosaveinemberoctane"><a href="https://betocantu93.com/autosave-in-ember-octane/">Auto save en Ember Octane 💾</a></h2>
<p><a href="https://github.com/betocantu93">Alberto Cantú (@betocantu93)</a>, in his first blog post in Spanish, explores <a href="https://betocantu93.com/autosave-in-ember-octane/">how to implement autosave in Ember</a>. We encourage you to check it out! Alberto starts with a basic form with a submit button, then introduces autosave and addresses potential problems using <code>ember-concurrency</code>.</p>
<p>Do you follow a similar pattern or have another approach to autosaving your user's form? Share your ideas with the JS community today!</p>
<hr />
<h2 id="embroidermemoizationrfcsenteredfinalcommentperiodhttpsgithubcomemberjsrfcspulls"><a href="https://github.com/emberjs/rfcs/pulls">Embroider & memoization RFCs entered Final Comment Period 💬</a></h2>
<p>In case you missed it, the RFCs for <a href="https://github.com/emberjs/rfcs/pull/507">Embroider</a> and <a href="https://github.com/emberjs/rfcs/pull/615">memoizing functions</a> entered their Final Comment Period (FCP) on May 1. And <a href="https://github.com/emberjs/rfcs/pull/615">memoizing functions</a> was merged in today!</p>
<hr />
<h2 id="emberkeyboardrfchttpsgithubcomadoptedemberaddonsemberkeyboardpull135"><a href="https://github.com/adopted-ember-addons/ember-keyboard/pull/135">ember-keyboard RFC ⌨️</a></h2>
<p>If you've ever wondered about some of the finer details of the <code>code</code> and <code>key</code> properties of keyboard events in modern browsers, you may want to check out <a href="https://github.com/lukemelia">Luke Melia's (@lukemelia)</a> recent <a href="https://github.com/adopted-ember-addons/ember-keyboard/pull/135">RFC</a> for <code>ember-keyboard</code>.</p>
<p>In case you didn't know, <code>ember-keyboard</code> is a ✨fantastic✨ Ember addon for the painless support of keyboard events.</p>
<!-- alex ignore just-->
<p>The team that supports <code>ember-keyboard</code> could really use community feedback on this one so if you're a user of the addon, interested in the subject or just feel like helping out, please head on over to the RFC and comment!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/lifeart" target="gh-user">@lifeart</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/abhilashlr" target="gh-user">@abhilashlr</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/roderickdevelopers" target="gh-user">@roderickdevelopers</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/burritoIand" target="gh-user">@burritoIand</a>, <a href="https://github.com/nathanhammond" target="gh-user">@nathanhammond</a>, <a href="https://github.com/bobisjan" target="gh-user">@bobisjan</a>, <a href="https://github.com/patricklx" target="gh-user">@patricklx</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/ansmonjol" target="gh-user">@ansmonjol</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a> and <a href="https://github.com/mansona" target="gh-user">@mansona</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jessica Jordan, Isaac Lee, Chris Ng, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-147</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-147</guid><pubDate>Fri, 08 May 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 148]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Watch the new EmberMap video on the <code>{{on}}</code> modifier 🔦,
mut and set autotracking in Octane 📖,
Ember Twiddle updates 🌟,
Ember performance tweaks 🏎,
preview deployments with ember-cli-deploy and GitHub Actions ✅,
and last, but not least, see helpers spawn from JavaScript files ✨!</p>
<!-- READMORE -->
<hr />
<h2 id="embermaptheonmodifierhttpsembermapcomtopicswhatsnewinembertheonmodifier311"><a href="https://embermap.com/topics/what-s-new-in-ember/the-on-modifier-3-11">EmberMap: The <code>{{on}}</code> Modifier 🔦</a></h2>
<p>Check out the <a href="https://twitter.com/ember_map/status/1255510563163197442">new EmberMap video</a> on the <code>{{on}}</code> modifier, a new way to attach events in Ember. It can be attached in either a plain HTML element or an Ember component.</p>
<pre><code class="handlebars language-handlebars">&lt;Toggle
  @checked={{this.isAdmin}}
  @onChange={{this.toggleIsAdmin}}
  {{on 'mouseenter' this.showTip}}
  {{on 'mouseleave' this.hideTip}}
/&gt;
</code></pre>
<p>The <code>{{on}}</code> modifier accepts two arguments: the event name and the function handler. The <strong>event name</strong> is actually the same argument that the vanilla JS API <code>element.addEventListener(eventName)</code> accepts. And the <strong>function handler</strong> is any action, meaning any properly bound function. It can either live on the component instance or be passed in as an argument.</p>
<pre><code class="handlebars language-handlebars">&lt;span
  role='checkbox'
  aria-checked={{if this.isChecked 'true' 'false'}}
  {{on 'click' this.toggle}}
  {{on 'keydown' this.toggle}}
&gt;
  {{! additional HTML }}
&lt;/span&gt;
</code></pre>
<p>Check out the full video explaining the <code>{{on}}</code> modifier on <a href="https://embermap.com/topics/what-s-new-in-ember/the-on-modifier-3-11">EmberMap</a>!</p>
<hr />
<h2 id="mutandsetautotrackinginoctanehttpsv5chriskrychocomjournalmutandsetandautotrackinginemberoctane"><a href="https://v5.chriskrycho.com/journal/mut-and-set-and-auto-tracking-in-ember-octane/">Mut and set autotracking in Octane 📖</a></h2>
<p>There's a new blog post 🎉 by <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> about some behavior that may surprise you involving auto-tracking when using <code>mut</code> or the <code>set</code> helper, and how they can differ from the use of actions in Ember Octane.</p>
<p>Read more about this at <a href="https://v5.chriskrycho.com/journal/mut-and-set-and-auto-tracking-in-ember-octane/">Chris' blog</a>. It's a quick read that may prevent you some refactoring pain if you're aware of the issues ahead of time. 😃</p>
<hr />
<h2 id="embertwiddleupdateshttpstwittercomgaurav9576status1259933735442698242"><a href="https://twitter.com/gaurav9576/status/1259933735442698242">Ember Twiddle updates 🌟</a></h2>
<p>Ember Twiddle <a href="https://github.com/ember-cli/ember-twiddle/releases/tag/v0.17.1">0.17.1</a> is here, now supporting <strong>Ember 3.18</strong> and template colocation! Need to share an Ember code reproduction? Ember Twiddle is a JSFiddle for Ember.</p>
<p>Check out the updates at <a href="https://t.co/PMkoyGsnSv?amp=1">ember-twiddle.com</a> and thank you to <a href="https://github.com/Gaurav0">Gaurav Munjal (@Gaurav0)</a>, <a href="https://github.com/RajaSK05">@RajaSK05</a> and <a href="https://github.com/gokatz">Gokul Kathirvel
(@gokatz)</a> for their contributions to the release! 👏</p>
<hr />
<h2 id="emberperformancetweakshttpsabhilashlrinemberperformancetweakspart1"><a href="https://abhilashlr.in/ember-performance-tweaks-part-1">Ember performance tweaks 🏎</a></h2>
<p><a href="https://github.com/abhilashlr">Abhilash LR (@abhilashlr)</a> blogs about <strong>optimizing build timelines & bundle size</strong> in your Ember apps, the first in a series on getting started with performance optimizations! Check out his tips and tricks in the writeup <a href="https://abhilashlr.in/ember-performance-tweaks-part-1">here</a>. Highlights include:</p>
<ul>
<li>Speeding up development<ul>
<li>Removing tests from the dev build</li>
<li>Removing Mirage from the dev build</li>
<li>Minification, gzip or brotli compression, and fingerprinting</li></ul></li>
<li>Asset size<ul>
<li>Analyze bundle size and optimize asset size</li>
<li>Removing dependencies not needed on app boot</li></ul></li>
</ul>
<blockquote>
  <p>The smaller the page assets, the faster it is for the user to view them. The faster it is for the user to view the page with text and UI, the greater trust they have on our apps/websites.</p>
</blockquote>
<p>But wait, there's more! In Abhilash's <a href="https://abhilashlr.in/ember-performance-tweaks-part-2">second part of the performance blog post series</a> it's all about <strong>optimizing assets</strong> for that perfect Lighthouse score. It teaches you how to reduce the number of requests for application assets to the absolute minimum, optimize your images efficiently and many other modern best practices related to asset handling.</p>
<p>If you want to make your own app load with the speed of light, be sure to <a href="https://abhilashlr.in/ember-performance-tweaks-part-2">check out the writeup today</a>!</p>
<hr />
<h2 id="learnaboutjavascriptinvokedhelperswiththeinvokehelperrfchttpsgithubcomemberjsrfcspull626"><a href="https://github.com/emberjs/rfcs/pull/626">Learn about JavaScript invoked helpers with the invokeHelper RFC ✨</a></h2>
<p>Never seen a helper spawn from a JavaScript file before? Then you should check out <a href="https://github.com/emberjs/rfcs/pull/626">the latest RFC about the <code>invokeHelper</code> API</a>!</p>
<p>The proposal suggests the creation of a new API, that allows you to invoke <a href="https://guides.emberjs.com/release/components/helper-functions/">helper functions</a> via JavaScript and not only via templates (the only way how helpers can invoked in Ember apps today).
This would extend Ember's reactive model by an API that:</p>
<ul>
<li>allows a transparent reuse of common code and patterns</li>
<li>as, similarly to components, owning a lifecycle</li>
<li>is, unlike components, JavaScript class <em>and</em> template compatible.</li>
</ul>
<p>If you want to learn more about the API design of <code>invokeHelper</code>, be sure to read the <a href="https://github.com/emberjs/rfcs/blob/invoke-helper/text/0626-invoke-helper.md">full RFC</a> and post your questions and ideas in the <a href="https://github.com/emberjs/rfcs/pull/626">comments below</a>!</p>
<hr />
<h2 id="previewdeploymentswithemberclideployandgithubactionshttpswwwkaliber5deenblogpreviewdeploymentswithemberclideployandgithubactions"><a href="https://www.kaliber5.de/en/blog/preview-deployments-with-ember-cli-deploy-and-github-actions/">Preview deployments with ember-cli-deploy and GitHub Actions ✅</a></h2>
<p>If you haven't had a chance, we encourage you to check out <a href="https://github.com/simonihmig">Simon Ihmig (@simonihmig)</a>'s blog post today. You can learn how to use <a href="http://ember-cli-deploy.com/">ember-cli-deploy</a> plugins and GitHub Actions to <a href="https://www.kaliber5.de/en/blog/preview-deployments-with-ember-cli-deploy-and-github-actions/">preview deployments from pull requests</a>!</p>
<p><img src="https://www.kaliber5.de/assets/images/gh-deployment-comment.png" alt="PR is deployed and ready for preview!" /></p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/allthesignals" target="gh-user">@allthesignals</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/lukemelia" target="gh-user">@lukemelia</a>, <a href="https://github.com/SYU15" target="gh-user">@SYU15</a>, <a href="https://github.com/mmun" target="gh-user">@mmun</a>, <a href="https://github.com/mrloop" target="gh-user">@mrloop</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a> and <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Jessica Jordan, Isaac Lee, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-148</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-148</guid><pubDate>Fri, 15 May 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 149]]></title><description><![CDATA[<p>🏄‍♂️ Emberistas! 🐹</p>
<p>Ember Engines acceptance testing guides 📝,
check out the new EmberMap video on Tracked Properties 👣,
polyfills for in-element and named blocks 🚀,
setting up Coveralls for your Ember addons 💪,
Ember in COVID-19 research 🔬📖🐹,
Global Accessibility Awareness Day Ember blog post 📖🐹,
"My Experience with Ember.js" video series 🎥,
and last, but not least, read the prettiest RFC in Emberland 💅!</p>
<!-- READMORE -->
<hr />
<h2 id="emberenginesacceptancetestingguidesoctanehttpsemberenginesnetlifyappdocstestingacceptance"><a href="https://ember-engines.netlify.app/docs/testing-acceptance">Ember Engines acceptance testing guides & Octane 📝</a></h2>
<p><a href="https://github.com/villander">Michael Villander (@villander)</a> and team have fleshed out docs about the <strong>acceptance test story</strong> in the Ember Engines ecosystem, touching on some bleeding-edge cases. Also, the entire doc examples were migrated to Ember Octane! Visit the official site to see <a href="https://ember-engines.netlify.app/docs/testing-acceptance">Ember Engines' new acceptance testing guides</a>. Many thanks to <a href="https://github.com/dgeb">Dan Gebhardt (@dgeb)</a>, <a href="https://github.com/gabrielcsapo">Gabriel Csapo (@gabrielcsapo)</a> and <a href="https://github.com/gossi">Thomas Gossmann (@gossi)</a> for their reviews and tips!</p>
<p>Using Ember Engines? Chat about it in the <a href="https://discord.com/channels/480462759797063690/487221820638887947">#ember-engines channel</a> on the <a href="https://discord.gg/emberjs">Ember Discord</a>.</p>
<hr />
<h2 id="embermaptrackedpropertieshttpsembermapcomtopicswhatsnewinembertrackedproperties313"><a href="https://embermap.com/topics/what-s-new-in-ember/tracked-properties-3-13">EmberMap: Tracked Properties 👣</a></h2>
<p>A new EmberMap video covers <a href="https://guides.emberjs.com/release/upgrading/current-edition/tracked-properties/">Tracked Properties</a> – a new way to access and mutate state in Ember with vanilla JavaScript.</p>
<p>While we have been able to use <a href="https://blog.emberjs.com/2018/04/13/ember-3-1-released.html">native ES5 getters</a> for accessing properties (<code>this.isOpen</code>), we still had to rely on calling <code>this.set</code> to mutate state. Tracked properties allow us to drop using <code>this.set</code> and instead use native setters (<code>this.isOpen = true;</code>) by annotating the properties we want to track.</p>
<p>Classic syntax:</p>
<pre><code class="javascript language-javascript">import { tracked } from "@glimmer/tracking";

export default Component.extend({
  isOpen: tracked({ value: false }),
});
</code></pre>
<p>Octane syntax:</p>
<pre><code class="javascript language-javascript">import { tracked } from '@glimmer/tracking';

class Person {
  @tracked firstName;
  @tracked lastName;

  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}
</code></pre>
<p>Tracked properties also allow us to use <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get">native JavaScript getters</a> as a replacement for computed properties by having dependent keys tracked. So try it out today in your app and vastly simplify the programming model by moving closer to native JavaScript language constructs.</p>
<p>Check out the <a href="https://embermap.com/topics/what-s-new-in-ember/tracked-properties-3-13">full video on EmberMap</a>!</p>
<hr />
<h2 id="polyfillsforinelementandnamedblockshttpsgithubcomemberpolyfills"><a href="https://github.com/ember-polyfills">Polyfills for in-element and named blocks 🚀</a></h2>
<p>Right now you can get a <strong>sneak peek</strong> in <a href="https://emberjs.com/releases/canary/">canary</a> of <a href="https://github.com/emberjs/rfcs/blob/master/text/0287-promote-in-element-to-public-api.md">public API {{in-element}}</a> and <a href="https://github.com/emberjs/rfcs/blob/master/text/0460-yieldable-named-blocks.md">yieldable named blocks</a>.</p>
<p>What is <code>{{in-element}}</code>? Sometimes developers need to render content outside of the regular HTML flow. This concept is also called "portals". Components like dropdowns and modals use this technique to render stuff close to the root of the page, so as to bypass CSS overflow rules. (Some apps that are embedded into static pages even use this technique to update parts of the page outside the app itself.)</p>
<p>Since it was a common use case, Glimmer baked <code>{{-in-element}}</code> into the VM, but as part of the private (or intimate) API. With the passing of the <a href="https://github.com/emberjs/rfcs/blob/master/text/0287-promote-in-element-to-public-api.md">RFC</a>, it's going public, perhaps in Ember 3.20. So if you've been using <code>{{-in-element}}</code>, you should switch to the <a href="https://github.com/ember-polyfills/ember-in-element-polyfill"><code>{{in-element}}</code> polyfill</a> instead, like <a href="https://github.com/gitKrystan">Krystan HuffMenne (@gitKrystan)</a> did for these couple of addons: <a href="https://github.com/ronco/ember-cli-head/pull/71">ember-cli-head</a> and <a href="https://github.com/DockYard/ember-maybe-in-element/pull/25">ember-maybe-in-element</a>.</p>
<p>The <a href="https://github.com/emberjs/rfcs/blob/master/text/0460-yieldable-named-blocks.md">yieldable named blocks RFC</a> makes it possible to pass one block or more to a component for customization. Check out the new <a href="https://github.com/ember-polyfills/ember-named-blocks-polyfill">ember-named-blocks-polyfill</a> to take advantage of this feature now!</p>
<hr />
<h2 id="settingupcoverallsforyouremberaddonshttphangaroundthewebcom202005settingupcoverallsforyouremberaddons"><a href="http://hangaroundtheweb.com/2020/05/setting-up-coveralls-for-your-ember-addons/">Setting up Coveralls for your Ember addons 💪</a></h2>
<p><a href="https://github.com/rajasegar/">Rajasegar Chandran (@rajasegar)</a> blogs about setting up Coveralls for your Ember addons. He explains how to setup <a href="https://github.com/kategengler/ember-cli-code-coverage">ember-cli-code-coverage</a> and <a href="https://coveralls.io/">Coveralls</a> for your repositories. Coveralls help you deliver code confidently by showing which parts of your code aren’t covered by your test suite. You can also learn how to use these techniques and make it part of your workflow using Github Actions.</p>
<p>Check out the <a href="http://hangaroundtheweb.com/2020/05/setting-up-coveralls-for-your-ember-addons/">blog post</a>!</p>
<hr />
<h2 id="emberincovid19researchhttpshubjhuedunovelcoronavirusinformationresearchpreparednesscoronavirusresearchpublicationsresources"><a href="https://hub.jhu.edu/novel-coronavirus-information/research-preparedness/coronavirus-research-publications-resources/">Ember in COVID-19 research 🔬📖🐹</a></h2>
<p>Johns Hopkins University (JHU) has announced new COVID-19 related features available in their <a href="https://pass.jhu.edu/">Public Access Submission System (PASS)</a>.</p>
<p>PASS (which is built using Ember.js on the frontend!), is a platform to assist researchers  🔬🧪📖 in complying with the access policies of their funders and institutions and is created by the Sheridan Libraries at JHU, in collaboration with the Harvard University Office for Scholarly Communication and the MIT Libraries.</p>
<p>As a <a href="https://hub.jhu.edu/novel-coronavirus-information/research-preparedness/coronavirus-research-publications-resources/">recent article</a> at JHU's news center the Hub has pointed out, "Through modifications to the Public Access Submission System (PASS), faculty or their proxies can now submit articles flagged specifically for [the] JHU COVID-19 collection."</p>
<p>It is so encouraging to see yet another example of Ember being used in applications that support important research for public good. 😍🐹</p>
<hr />
<h2 id="globalaccessibilityawarenessdayemberblogposthttpsblogemberjscom20200521globalaccessibilityawarenessdayhtml"><a href="https://blog.emberjs.com/2020/05/21/global-accessibility-awareness-day.html">Global Accessibility Awareness Day Ember blog post 📖🐹</a></h2>
<p>Did you know that May 21st was <a href="https://globalaccessibilityawarenessday.org/">Global Accessibility Awareness Day</a>? Well now you know 😃!</p>
<p>You may not have seen the recent <a href="https://blog.emberjs.com/2020/05/21/global-accessibility-awareness-day.html">blog post commemorating the occasion</a> and discussing accessibility in Ember. 🎉 The post includes lots of great information about how the community, the Ember core team and Ember's A11y Strike Team are working to support an accessible web. 💙💚💛💜</p>
<p>You should head on over to the blog post for more details on what you can do to get involved or how to make your Ember applications more accessible.</p>
<p>If you have accessibility related questions you can head on over to <a href="https://discordapp.com/invite/emberjs">the community Discord chat</a> in the #topic-a11y channel, and get answers and help right away.</p>
<p>Or, if you're interested in getting involved in Ember's A11y Strike Team, checkout the #st-a11y channel on Discord, and let us know! The meetings are also open to anyone who wants to attend.</p>
<p>Big shout out to <a href="https://github.com/MelSumner">Mel Sumner (@MelSumner)</a> for putting all that valuable accessiblity-related information together!</p>
<hr />
<h2 id="myexperiencewithemberjsvideoserieshttpswwwyoutubecomwatchvjkb1at1pk2e"><a href="https://www.youtube.com/watch?v=jkb1At1pk2E">"My Experience with Ember.js" video series 🎥</a></h2>
<p><a href="https://github.com/calWoolgar">Cal Woolgar (@calWoolgar)</a> has kicked off a new video series "My Experience with Ember.js", where he breaks down the basics of Ember.</p>
<!--alex ignore easy-->
<p>The first video <a href="https://www.youtube.com/watch?v=jkb1At1pk2E">What is Ember.js?</a> explains the <a href="https://handlebarsjs.com/">Handlebars templating language</a> and how it separates your JavaScript from HTML. Cal also touches on <a href="https://ember-cli.com/">ember-cli</a>, and how it enabled you to create a new application easily.</p>
<p>Cal aims to make his videos <strong>short and sweet</strong> 🍭 so that someone learning can reference something in bite-sized pieces. Look forward to what's next from Cal! 👏</p>
<hr />
<h2 id="theprettiestemberrfchttpsgithubcomemberjsrfcspull628"><a href="https://github.com/emberjs/rfcs/pull/628">The prettiest Ember RFC 💅</a></h2>
<p>By default, <a href="https://cli.emberjs.com/release/">ember-cli</a> already provides developers with plenty of tools and settings for linting and formatting of app code via <strong>eslint</strong> and <a href="https://github.com/ember-template-lint/ember-template-lint"><strong>ember-template-lint</strong></a>. But what if you could come to an agreement on some of the most significant bike-shedding disputes in your team once and for all, including discussions about tabs vs. spaces or the need for the newline at the end of a file?</p>
<p>In the <a href="https://github.com/emberjs/rfcs/pull/628">Request for Comments (RFC)</a> we get to have a peek into the possible, <strong>even prettier future for Ember codebases</strong> already! The proposal suggests to add <a href="https://prettier.io/">Prettier - a multi-language, opiniated code-formatter -</a> to Ember apps generated from ember-cli's <code>app</code> and <code>addon</code> blueprints.</p>
<!--alex ignore period-->
<p>Want to learn more about how this could help you and your team to collaborate on your code even better? Then be sure to <a href="https://github.com/emberjs/rfcs/blob/pretty-please!/text/0628-prettier.md">give the original RFC a read</a> soon, as it entered the Final Comment Period (FCP) recently. And don't forget to post your questions and suggestions in <a href="https://github.com/emberjs/rfcs/pull/628">the comments below the RFC PR</a>, <span style="font-style: italic;">pretty please</span>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/allthesignals" target="gh-user">@allthesignals</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/alexeykostevich" target="gh-user">@alexeykostevich</a>, <a href="https://github.com/sandstrom" target="gh-user">@sandstrom</a>, <a href="https://github.com/ansmonjol" target="gh-user">@ansmonjol</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/fivetanley" target="gh-user">@fivetanley</a> and <a href="https://github.com/CodingItWrong" target="gh-user">@CodingItWrong</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Matthew Roderick, Chris Ng, Amy Lam, Abhilash LR, Jared Galanis, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-149</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-149</guid><pubDate>Fri, 22 May 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 150]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember Octane vs Classic cheat sheet is in Octane 🔥, Ember tutorials on MDN 🎉, test directory RFC FCP closing 🚨⏳, new router service refresh RFC ♻️, and last, but not least, "My Experience with Ember.js" Part 2 🎬!</p>
<!-- READMORE -->
<hr />
<h2 id="emberoctanevsclassiccheatsheetisinoctanehttpsemberlearngithubioemberoctanevsclassiccheatsheet"><a href="https://ember-learn.github.io/ember-octane-vs-classic-cheat-sheet/">Ember Octane vs Classic cheat sheet is in Octane 🔥</a></h2>
<p><a href="https://ember-learn.github.io/ember-octane-vs-classic-cheat-sheet/">Ember Octane vs Classic Cheat Sheet</a> is a quick reference to understanding how to convert a classic Ember syntax to an Octane one. The website is nearing its one year anniversary! 🎂 What better way to celebrate than being upgraded from vanilla JS to an Ember Octane app?</p>
<p>Thanks to work by <a href="https://github.com/jenweber">Jen Weber (@jenweber)</a> and <a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a>, the project is now built on a few well-known solutions: <a href="https://github.com/ef4/ember-code-snippet"><code>ember-code-snippet</code></a>, <a href="https://github.com/shipshapecode/ember-prism"><code>ember-prism</code></a>, <a href="https://github.com/ember-intl/ember-intl"><code>ember-intl</code></a>, <a href="https://github.com/ember-cli-deploy/ember-cli-deploy"><code>ember-cli-deploy</code></a>, and GitHub Actions for CI.</p>
<p>What's in store for the future? The <a href="https://github.com/ember-learn/ember-octane-vs-classic-cheat-sheet/">project</a> can use your help with updated content, mobile responsive design, and—perhaps what's most cool—translations to languages besides English. If you'd like to help, please reach out to the Ember Learning Team on <a href="https://discord.com/channels/480462759797063690/480777444203429888">#dev-ember-learning</a> on <a href="https://discord.com/invite/emberjs">Discord</a>!</p>
<hr />
<h2 id="embertutorialsonmdnhttpsdevelopermozillaorgenusdocslearntools_and_testingclientside_javascript_frameworksember_tutorials"><a href="https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks#Ember_tutorials">Ember tutorials on MDN 🎉</a></h2>
<p><a href="https://github.com/nullvoxpopuli">Preston Sego (@NullVoxPopuli)</a> shared the <a href="https://twitter.com/nullvoxpopuli/status/1262124413794881541">news</a> that <a href="https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks#Ember_tutorials">Ember tutorials</a> are now on the Mozilla Developer Network (MDN) web docs, along with React and Vue! It's awesome to see Ember included in <a href="https://developer.mozilla.org/">MDN</a>, one of the most respected resources on the web for frontend developers.</p>
<p>In the <a href="https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks#Ember_tutorials">Ember tutorial</a>, you'll build a <strong>TodoMVC app in Ember</strong>. You can verify your code with the <a href="https://github.com/NullVoxPopuli/ember-todomvc-tutorial/tree/master/steps/00-finished-todomvc/todomvc">tutorial code repository</a> and also check out a <a href="https://nullvoxpopuli.github.io/ember-todomvc-tutorial/">live deployed version</a>. Thank you @NullVoxPopuli for your efforts in getting the word out about Ember! 👏</p>
<hr />
<h2 id="testdirectoryrfcfcpclosinghttpsgithubcomemberjsrfcspull575"><a href="https://github.com/emberjs/rfcs/pull/575">Test directory RFC FCP closing ⏳</a></h2>
<p>RFC Final Comment Period (FCP) closing alert 🚨!</p>
<p>The ✨awesome ✨ Request for Comments (RFC) by <a href="https://github.com/mehulkar">Mehul Kar (@mehulkar)</a> about changing the name of an Ember app's test directories to be more in sync with naming provided in the official guides has entered the last week of FCP.</p>
<p>The RFC proposes that this unification could make it easier to have a shared language between tests, and would reduce confusion for newer users when using Ember CLI.</p>
<p>If you're interested in the subject and have opinions you want to voice, now would be a good time to head on over to the <a href="https://github.com/emberjs/rfcs/pull/575">RFC</a> and provide some feedback.</p>
<hr />
<h2 id="newrouterservicerefreshrfchttpsgithubcomemberjsrfcspull631"><a href="https://github.com/emberjs/rfcs/pull/631">New router service refresh RFC ♻️</a></h2>
<p>There's a cool 😎 new RFC by <a href="https://github.com/Gaurav0">Gaurav Munjal (@Gaurav0)</a> regarding adding a <code>refresh</code> method to the router service.</p>
<p>Note: This RFC is suggesting a <code>refresh</code> method that would be different than the currently available <code>Route.prototype.refresh</code> method, which refreshes whatever route you call it on and all routes “below” it in the route hierarchy. This newly proposed method would refresh <span style="font-style: italic;">all</span> currently active routes.</p>
<p>If you're interested in commenting on the RFC, please head on over to the <a href="https://github.com/emberjs/rfcs/pull/631">PR</a> and make your voice heard 📣!</p>
<hr />
<h2 id="myexperiencewithemberjspart2httpswwwyoutubecomwatchvr2jdp4lb5xw"><a href="https://www.youtube.com/watch?v=R2JdP4lb5Xw">"My Experience with Ember.js" Part 2 🎬</a></h2>
<p><a href="https://github.com/calWoolgar">Cal Woolgar (@calWoolgar)</a> has a second video out, <a href="https://www.youtube.com/watch?v=R2JdP4lb5Xw">Creating an Ember Application</a>! He demonstrates how Ember CLI helps you get started with Ember.js.</p>
<p>This video touches on an <a href="https://guides.emberjs.com/release/getting-started/anatomy-of-an-ember-app/">Ember app's anatomy</a>. With Ember CLI, you can create a fully working application with <strong>one line of code!</strong> 🎉</p>
<pre><code class="bash language-bash">ember new "app-name"
</code></pre>
<p>With that command, Ember CLI installs all your dependencies for your new app. You can also create <a href="https://guides.emberjs.com/release/routing/defining-your-routes/">routes</a> and <a href="https://guides.emberjs.com/release/components/">templates</a> with the CLI.</p>
<pre><code class="bash language-bash">ember generate template "template-name"
ember generate route "route-name"
</code></pre>
<p>These are great videos for someone learning Ember, look forward to the next tutorial video from Cal! 😃</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/thoov" target="gh-user">@thoov</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/CodingItWrong" target="gh-user">@CodingItWrong</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/chriskrycho" target="gh-user">@chriskrycho</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/SergeAstapov" target="gh-user">@SergeAstapov</a>, <a href="https://github.com/patricklx" target="gh-user">@patricklx</a>, <a href="https://github.com/mmun" target="gh-user">@mmun</a>, <a href="https://github.com/gabrielcsapo" target="gh-user">@gabrielcsapo</a>, <a href="https://github.com/ygongdev" target="gh-user">@ygongdev</a>, <a href="https://github.com/danwenzel" target="gh-user">@danwenzel</a>, <a href="https://github.com/vasind" target="gh-user">@vasind</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, and <a href="https://github.com/jelhan" target="gh-user">@jelhan</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Matthew Roderick, Amy Lam, Isaac Lee, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-150</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-150</guid><pubDate>Fri, 29 May 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 151]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember.js for #BlackLivesMatter 🤝,
participate in the <code>ember new --lang</code> RFC 🌐,
change the way you load your data with <code>ember-await</code> ⌚,
beta release of ember-data-model-fragments 🚢,
connect an Ember App to an OAuth2 Python Flask Server 🔐,
and last, but not least, integrate Netlify with empress-blog 🚀!</p>
<!-- READMORE -->
<hr />
<h2 id="emberjsforblacklivesmatterhttpstwittercomemberjsstatus1267574075674812416"><a href="https://twitter.com/emberjs/status/1267574075674812416">Ember.js for #BlackLivesMatter 🤝</a></h2>
<p>You may have noticed that <a href="https://emberjs.com/">emberjs.com</a> is currently offline, as a small mark of respect, and expression of solidarity for <a href="https://blacklivesmatter.com/">#BlackLivesMatter</a>. The <a href="https://guides.emberjs.com/">Ember.js guides</a>, <a href="https://emberjs.com/guidelines">community code of conduct</a>, and <a href="https://emberjs.com/about/legal">legal information</a> remain available.</p>
<hr />
<h2 id="embernewlangrfchttpsgithubcomemberjsrfcspull635"><a href="https://github.com/emberjs/rfcs/pull/635"><code>ember new --lang</code> RFC 🌐</a></h2>
<p>There is an <a href="https://github.com/emberjs/rfcs/pull/635">RFC</a> to introduce the <code>--lang</code> flag to Ember CLI and help brand new Ember apps meet a <a href="https://www.w3.org/WAI/WCAG21/Understanding/language-of-page.html">Level A guideline for WCAG</a>. (Level A is the minimum level of conformance.) If the flag is used with a valid language code, the CLI will assign the <code>lang</code> attribute to the root <code>&lt;html&gt;</code> element in <code>app/index.html</code>.</p>
<p>How will the <code>lang</code> attribute help your end users?</p>
<blockquote>
  <p>"Both assistive technologies and conventional user agents can render text more accurately when the language of the Web page is identified. Screen readers can load the correct pronunciation rules. Visual browsers can display characters and scripts correctly. Media players can show captions correctly. As a result, users with disabilities will be better able to understand the content."</p>
  <p><a href="https://www.w3.org/WAI/WCAG21/Understanding/language-of-page.html#intent">WCAG Success Criterion 3.1.1: Intent</a></p>
</blockquote>
<!-- alex ignore just -->
<p>Please note that <span style="font-style: italic;">everyone</span> benefits from having a valid page language specified, not just users with disabilities. To learn more about the importance of <code>lang</code> attribute and provide feedback, we encourage you to <a href="https://github.com/emberjs/rfcs/pull/635">check out the RFC</a>.</p>
<!-- alex ignore White -->
<p>We extend our thanks to <a href="https://github.com/hergaiety">Ava Wroten (@hergaiety)</a>, <a href="https://github.com/josephdsumner">Joseph Sumner (@josephdsumner)</a>, <a href="http://github.com/jgwhite">Jamie White (@jgwhite)</a>, and <a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a> for their work!</p>
<hr />
<h2 id="changethewayyouloaddatawithemberawaithttpsexelordgitbookioemberawait"><a href="https://exelord.gitbook.io/ember-await/">Change the way you load data with <code>ember-await</code> ⌚</a></h2>
<p>In case you may have missed <a href="https://twitter.com/TheExelord/status/1257674588256903177">the announcement</a>, <a href="https://github.com/Exelord">Maciej Kwaśniak (@Exelord)</a> released <a href="https://exelord.gitbook.io/ember-await/"><code>ember-await</code></a> to provide a <strong>data-loading component</strong> with <strong>declarative promise resolution</strong>. The addon, inspired by <code>react-async</code>, uses Octane and <code>ember-concurrency</code> to manage promise state. 🔥</p>
<p>Try out <a href="https://exelord.gitbook.io/ember-await/"><code>ember-await</code></a> today!</p>
<hr />
<h2 id="betareleaseofemberdatamodelfragmentshttpsgithubcomlyticsemberdatamodelfragmentsreleasestag500beta0"><a href="https://github.com/lytics/ember-data-model-fragments/releases/tag/5.0.0-beta.0">Beta release of ember-data-model-fragments 🚢</a></h2>
<p>New beta alert! 🚨 Version 5.0.0-beta.0 of <code>ember-data-model-fragments</code> has recently been released!  </p>
<p>This beta provides support for Ember Data 3.13+ and includes a pretty serious rewrite to accommodate <code>RecordData</code>. Big shout out to the team behind it, and <a href="https://github.com/igorT">Igor Terzic
(@igorT)</a> for all the help! 😃</p>
<p>If you use model fragments, please try it out in your app and let <a href="https://github.com/richgt">Rich Glazerman (@richgt)</a> know if things are working.</p>
<hr />
<h2 id="connectinganemberapptoanoauth2pythonflaskserverhttpsblogsoftwarebyrichardcom20200526connectinganemberapptooauth2pythonflaskserver"><a href="https://blog.softwarebyrichard.com/2020/05/26/connecting-an-ember-app-to-oauth2-python-flask-server/">Connecting an Ember app to an OAuth2 Python Flask server 🔐</a></h2>
<p><a href="https://github.com/rbezemer">Richard Bezemer (@rbezemer)</a> wrote a <a href="https://blog.softwarebyrichard.com/2020/05/19/using-oauth2-with-flask-rest-jsonapi/">couple</a> of <a href="https://blog.softwarebyrichard.com/2020/05/26/connecting-an-ember-app-to-oauth2-python-flask-server/">blog posts</a> on adding Oauth2 support to a basic web project using Flask and Ember.</p>
<p>The blog post goes through adding a custom authenticator (called <code>custom-oauth2</code> in our example), using the <code>ember g</code> command to tell <a href="https://ember-simple-auth.com/">ember-simple-auth</a> how to connect and authenticate with our authentication server.</p>
<pre><code class="bash language-bash">ember g authenticator custom-oauth2
</code></pre>
<p>It also discusses custom data such as <code>serverTokenEndpoint</code>, <code>clientId</code>, and <code>serverTokenRevocationEndpoint</code> which our custom authenticator can use to implement its <code>authenticate()</code> method.</p>
<p>Now we can use <a href="https://ember-simple-auth.com/">ember-simple-auth</a> as a session management tool to handle querying for the current state of the user through the <code>session</code> Ember Service it provides.</p>
<pre><code class="javascript language-javascript">this.session.authenticate(
  'authenticator:custom-oauth2', 'password', this.username, this.password
);
</code></pre>
<p>Read more on the full the blog posts on <a href="https://blog.softwarebyrichard.com/2020/05/19/using-oauth2-with-flask-rest-jsonapi/">using Oauth2 with Flask-REST-JSONAPI</a> and on <a href="https://blog.softwarebyrichard.com/2020/05/26/connecting-an-ember-app-to-oauth2-python-flask-server/">connecting your Ember app to that Flask server</a>!</p>
<hr />
<h2 id="howtointegratenetlifycmswithempressbloghttpswwwmylittletechlifecomintegratenetlifycmswithempressblog"><a href="https://www.mylittletechlife.com/integrate-netlify-cms-with-empress-blog">How to integrate Netlify-CMS with Empress-blog 🚀</a></h2>
<p><a href="https://github.com/MalayaliRobz">Robin Philip Thomas</a> wrote a blog on integrating empress-blog and Netlify CMS.</p>
<p>What is <a href="https://github.com/empress/empress-blog">empress-blog</a>?</p>
<ul>
<li>A fully-functional, static site implementation of a blog system</li>
<li>Built on Ember</li>
<li>Fully working out of the box</li>
<li>SEO friendly output based on Markdown</li>
</ul>
<p><a href="https://www.netlifycms.org/">Netlify CMS</a> is based on client-side JavaScript, reusable APIs and prebuilt markup.</p>
<p>He explains how to integrate them both in a step-by-step approach. He also details on how to write your blog's content in Netlify CMS with the power of publishing workflows.</p>
<p>Check out <a href="https://www.mylittletechlife.com/integrate-netlify-cms-with-empress-blog">the blog post</a>! Happy blogging 😄</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/nickschot" target="gh-user">@nickschot</a>, <a href="https://github.com/flexoid" target="gh-user">@flexoid</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/spruce" target="gh-user">@spruce</a>, <a href="https://github.com/lukemelia" target="gh-user">@lukemelia</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chriskrycho" target="gh-user">@chriskrycho</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/Mikek2252" target="gh-user">@Mikek2252</a>, <a href="https://github.com/lyubarskiy" target="gh-user">@lyubarskiy</a>, and <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Abhilash LR, Isaac Lee, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-151</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-151</guid><pubDate>Fri, 05 Jun 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 152]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Meet the long-awaited <code>ember-collection</code> v1.0 release candidate 🎉,
use a modern keyboard API with <code>ember-keyboard</code> v6.0 ⌨️,
learn how to make your existing app accessible 💪,
introducing ember-concurrency-async 🚀,
and last, but not least, an interactive way to create new Ember apps RFC ✨🐹!</p>
<!-- READMORE -->
<hr />
<h2 id="meetthelongawaitedembercollectionv10releasecandidatehttpstwittercomalonskistatus1264930582758412288"><a href="https://twitter.com/Alonski/status/1264930582758412288">Meet the long-awaited <code>ember-collection</code> v1.0 release candidate 🎉</a></h2>
<p>After two years, a new version of <a href="https://github.com/adopted-ember-addons/ember-collection"><code>ember-collection</code></a> is here! You can use this addon to <strong>incrementally render a large list of items</strong>. The official <code>v1.0</code> will be released soon.</p>
<p>Two of the most notable <a href="https://github.com/adopted-ember-addons/ember-collection/releases/tag/v1.0.0-rc.0">changes</a> are:</p>
<ul>
<li>Ember upgrade from 2.18 to 3.12!</li>
<li>Improved continuous integration and auto-release process</li>
</ul>
<p>Please thank <a href="https://github.com/Alonski">Alon Bukai (@Alonski)</a>, <a href="https://github.com/Gaurav0">Gaurav Munjal (@Gaurav0)</a>, <a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a>, and <a href="https://github.com/vasind">Vasanth (@vasind)</a> for their help with maintaining <a href="https://github.com/adopted-ember-addons/ember-collection"><code>ember-collection</code></a>. If you currently use the addon, we ask that you upgrade and check that your app and tests continue to pass.</p>
<hr />
<h2 id="useamodernkeyboardapiwithemberkeyboardv60httpstwittercomlukemeliastatus1270672606220279808"><a href="https://twitter.com/lukemelia/status/1270672606220279808">Use a modern keyboard API with <code>ember-keyboard</code> v6.0 ⌨️</a></h2>
<p>Are you ready for another exciting addon release? This week, <code>ember-keyboard</code> announced <code>v6.0</code> and showcased 3 <strong>Octane-friendly</strong> ways to respond to keyboard events:</p>
<ul>
<li><code>{{on-key}}</code> helper</li>
<li><code>{{on-key}}</code> modifier</li>
<li><code>@onKey</code> decorator</li>
</ul>
<p>As you may know, there was recently an RFC to modernize <code>ember-keyboard</code> API. Recognizing <code>key</code> versus <code>code</code> is one of the difficult problems that this addon can now solve for you. Version 6 does limit support to Ember 3.8+ and modern browsers (IE 11 excluded) so you will want to think about your current requirements.</p>
<p>To learn more about modern keyboard API and your migration path, we encourage you to visit these sites:</p>
<ul>
<li><a href="http://adopted-ember-addons.github.io/ember-keyboard/">Official documentation</a></li>
<li><a href="https://github.com/adopted-ember-addons/ember-keyboard/blob/v6.0.0/CHANGELOG.md">v6.0.0 changelog</a></li>
<li><a href="https://github.com/adopted-ember-addons/ember-keyboard/blob/master/API-DESIGN.md">API design</a></li>
<li><a href="https://github.com/rust-lang/crates.io/pull/2563">Migration example from <code>crates.io</code></a></li>
</ul>
<p>Last but not least, don't forget to thank <a href="https://github.com/lukemelia">Luke Melia (@lukemelia)</a>, <a href="https://github.com/optikalefx">Sean Clark (@optikalefx)</a>, <a href="https://github.com/NullVoxPopuli">Preston Sego (@NullVoxPopuli)</a>, <a href="https://github.com/mattmcmanus">Matt McManus (@mattmcmanus)</a>, <a href="https://github.com/seanCodes">Sean Juarez (@seanCodes)</a>, and <a href="https://github.com/bendemboski">Ben Demboski (@bendemboski)</a> for shaping the new <code>ember-keyboard</code> API.</p>
<hr />
<h2 id="learnhowtomakeyourexistingemberappaccessiblehttpssimplabscomblog20200602howtoimprovetheaccessibilityofyourapp"><a href="https://simplabs.com/blog/2020/06/02/how-to-improve-the-accessibility-of-your-app/">Learn how to make your existing Ember app accessible 💪</a></h2>
<p>Using Ember, you might be familiar with a set of tools that you can already use today to <a href="https://guides.emberjs.com/release/accessibility/">make your app accessible</a>. But what do you do if you are working on an already <strong>mature Ember app</strong> that needs a lot of improvements to <strong>become accessible</strong>? Where do you even start?</p>
<p>In her recent blog post, <a href="https://github.com/sdebarros">Samanta de Barros (@sdebarros)</a> shares <a href="https://simplabs.com/blog/2020/06/02/how-to-improve-the-accessibility-of-your-app/">her findings</a> on improving the accessibility of an Ember app by employing an automated, gradual and <strong>a11y-focussed testing strategy</strong>, semantic markup and screen reader testing.</p>
<p>If you want to find out how to level up your app's accessibility, read <a href="https://simplabs.com/blog/2020/06/02/how-to-improve-the-accessibility-of-your-app/">her blog post on the simplabs blog</a> and if you learned something from it, be sure to share it with your Ember friends, too!</p>
<hr />
<h2 id="introducingemberconcurrencyasynchttpsgithubcomchancancodeemberconcurrencyasync"><a href="https://github.com/chancancode/ember-concurrency-async">Introducing ember-concurrency-async 🚀</a></h2>
<p>Have you wanted to use <a href="https://github.com/machty/ember-concurrency"><code>ember-concurrency</code></a> with TypeScript, but run into some limitations? In case you were not aware, there's a new addon by <a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a> called <a href="https://github.com/chancancode/ember-concurrency-async"><code>ember-concurrency-async</code></a>. This addon introduces the familiar <code>async/await</code> syntax to <code>ember-concurrency</code> tasks. 😃</p>
<p>The main advantage of the async method syntax over the default <code>ember-concurrency</code> generator method syntax is that it works better with the TypeScript compiler and things powered by it, such as the JavaScript language server in Visual Studio Code. Due to the fact that TypeScript already understands the <code>await</code> keyword natively, the compiler understands that yielding a value "returns" its resolved value - something not possible with generator method syntax.</p>
<p>Head on over to the <a href="https://github.com/chancancode/ember-concurrency-async">repo</a> to learn more and take a look at some examples of how <code>ember-concurrency-async</code> can help you write <code>ember-concurrency</code> tasks in TypeScript.</p>
<hr />
<h2 id="interactivewaytocreatenewemberappsrfchttpstwittercommelaniersumnerstatus1271530189948948486"><a href="https://twitter.com/melaniersumner/status/1271530189948948486">Interactive way to create new Ember apps RFC ✨🐹</a></h2>
<p>Hot 🔥 off the press is a brand new <a href="https://github.com/emberjs/rfcs/pull/638">RFC</a> by <a href="https://github.com/MelSumner">Mel Sumner (@MelSumner)</a> that proposes an interactive way to create Ember apps!</p>
<p>As part of the effort to make new Ember apps more conformant for digital accessibility requirements at a global scale, this RFC proposes an interactive workflow for new Ember apps. This will also have the benefit of assisting new users who prefer an interactive model of new app creation.</p>
<p>This new wizard for creating Ember apps would prompt users who type <code>ember new</code> into their command line with a series of questions that will help in defining certain aspects of their app, including whether the app is an app or addon, the app name, what the spoken/content language is, and what dependency manager and CI system are used.</p>
<p>If you have ideas about this exciting addition to Ember tooling please head on over to the <a href="https://github.com/emberjs/rfcs/pull/638">RFC</a> and share your thoughts.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/fivetanley" target="gh-user">@fivetanley</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/hergaiety" target="gh-user">@hergaiety</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/gokatz" target="gh-user">@gokatz</a>, <a href="https://github.com/backspace" target="gh-user">@backspace</a>, <a href="https://github.com/gvocale" target="gh-user">@gvocale</a>, <a href="https://github.com/lukemelia" target="gh-user">@lukemelia</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jessica Jordan, Jared Galanis, Isaac Lee, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-152</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-152</guid><pubDate>Fri, 12 Jun 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 153]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Set up fast with <code>ember-new-plus</code> ⚡️,
read through the Type Stability for Addons RFC 💠,
stories of becoming a developer 📖,
new LinkedIn group for Ember.js developers 🐹,
practice responsive design in Octane with <code>ember-container-query</code> ✨,
farewell Ember A11y Strike Team, hello Working Group for Digital Accessibility 🚀,
and last, but not least, handle asset urls with confidence in Ember &amp; Cordova 📱🐹!</p>
<!-- READMORE -->
<hr />
<h2 id="setupfastwithembernewplushttpsgithubcomatejembernewplus"><a href="https://github.com/atej/ember-new-plus">Set up fast with <code>ember-new-plus</code> ⚡️</a></h2>
<p><a href="https://github.com/atej">Aseem Taneja (@atej)</a> has created a bash script that automates the setup of some often-used tools in an Ember project. To further enhance your DX, it also recommends <a href="https://code.visualstudio.com/">VS Code</a> extensions and generates settings to integrate with them.</p>
<p>Based on your selections, you get:</p>
<ul>
<li>Linting and formatting with <a href="https://eslint.org">ESLint</a> + <a href="https://prettier.io">Prettier</a></li>
<li>Utility-first CSS with <a href="https://tailwindcss.com">Tailwind CSS</a> + <a href="https://postcss.org">PostCSS</a></li>
<li>Git hooks with <a href="https://github.com/typicode/husky">Husky</a></li>
<li>Pre-commit linting of staged files with <a href="https://github.com/okonet/lint-staged">lint-staged</a></li>
<li>Adherance to <a href="https://conventionalcommits.org">conventional commit messages</a> with <a href="https://github.com/conventional-changelog/commitlint">commitlint</a></li>
<li>A launch configuration for in-editor debugging with VS Code's <a href="https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome">Debugger for Chrome</a></li>
</ul>
<p>The configuration files generated when you first <a href="https://github.com/atej/ember-new-plus#quickstart-">run the script</a> can be tuned to your preference later. If you are about to make a new Ember project, give <a href="https://github.com/atej/ember-new-plus">ember-new-plus</a> a try!</p>
<hr />
<h2 id="rfctypestabilityforaddonshttpsgithubcomtypedemberemberclitypescriptpull1158"><a href="https://github.com/typed-ember/ember-cli-typescript/pull/1158">RFC: Type Stability for Addons 💠</a></h2>
<p><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> proposed a set of guidelines and tooling recommendations for managing changes as addons adopt <a href="https://www.typescriptlang.org/">TypeScript</a> throughout the Ember ecosystem, as part of the path to making TypeScript a first-class citizen in Ember as a whole.</p>
<p>In the <a href="https://github.com/typed-ember/ember-cli-typescript/pull/1158">RFC</a>, it proposes to align with <a href="https://emberjs.com/releases/">Ember’s SemVer and LTS commitments</a> and design workflows to support that policy, so that consumers of Ember addons which publish types are insulated from breaking changes in TypeScript whenever possible. The RFC outlines what needs to happen when we encounter:</p>
<ul>
<li>Breaking changes to type definitions</li>
<li>Non-breaking changes to type definitions</li>
<li>Bug fixes to type definitions</li>
<li>Dropping support for previously-supported versions</li>
</ul>
<p>Read through the full <a href="https://github.com/typed-ember/ember-cli-typescript/pull/1158">RFC on Type Stability for Addons</a> and leave some feedback!</p>
<hr />
<h2 id="storiesofbecomingadeveloperhttpsdevtoagathebadiashareyourdevstory51dg"><a href="https://dev.to/agathebadia/share-your-dev-story-51dg">Stories of becoming a developer 📖</a></h2>
<p><a href="https://github.com/Agathebadia">Agathe Badia (@honeypotio)</a> has written a blog post called <strong>Share your Dev story</strong>. This blog post introduces her new website 🎉 that was built with <a href="https://emberjs.com/">Ember.js</a>. It is called <a href="https://becoming-a-developer.netlify.app/">Becoming a Developer</a>.</p>
<p>On Becoming a Developer, you can share your background, the story of how you started, interest in coding, studies, first developer role, and some recommendations for anyone starting or continuing to dive into development. 💻</p>
<p>In her <a href="https://dev.to/agathebadia/share-your-dev-story-51dg">Share your Dev story</a> post, Agathe talks about how meaningful her new website is to her. You can see her passion as a developer shine. 🌟</p>
<p>Each developer's story is <strong>unique</strong> and <strong>insightful</strong> and can inspire <span style="font-style: italic;">you</span> to do something you never thought possible. <a href="https://becoming-a-developer.netlify.app/">Check it out</a> and be sure to share your own! 😃</p>
<hr />
<h2 id="farewellembera11ystriketeamhelloworkinggroupfordigitalaccessibilityhttpsgithubcomembera11ycorenotesblobembera11yembera11y202006june17md"><a href="https://github.com/ember-a11y/core-notes/blob/ember-a11y/ember-a11y/2020-06/june-17.md">Farewell Ember A11y Strike Team, hello Working Group for Digital Accessibility 🚀</a></h2>
<p>In case you didn't know, the Ember A11y Strike Team, formed to address the <a href="https://github.com/emberjs/rfcs/issues/595">issue that outlined the technical accessibility issues in new Ember apps</a> will have its final meeting next week 😢 … but fear not, some of the ✨ amazing ✨ work that the Strike Team did will be continued in the Working Group for Digital Accessibility! 🔥</p>
<p>The Working Group will be formed with some of the initial members who were also involved in the Strike Team.</p>
<p>You can read up on some of the work they've been planning for the Working Group <a href="https://github.com/ember-a11y/core-notes/blob/ember-a11y/ember-a11y/2020-06/june-17.md#discussion-notes">here</a>, but you can rest assured that the great work the Strike Team did will be advanced even further!</p>
<!--alex ignore special -->
<p>A huge shout out to everyone who was involved in the Ember A11y Strike Team with a special thank you to the following members who worked so hard to make Ember even more accessible:</p>
<!--alex ignore white -->
<ul>
<li><a href="https://github.com/josephdsumner">Joseph Sumner (@josephdsumner)</a>,</li>
<li><a href="https://github.com/rajasegar">Rajasegar Chandran (@rajasegar)</a>,</li>
<li><a href="https://github.com/abhilashlr">Abhilash (@abhilashlr)</a>,</li>
<li><a href="https://github.com/jgwhite">Jamie White (@jgwhite)</a>,</li>
<li><a href="https://github.com/hergaiety">Ava Gaiety Wroten (@hergaiety)</a>,</li>
<li><a href="https://github.com/hakilebara">Frédéric Soumaré (@hakilebara)</a>,</li>
<li><a href="https://github.com/KamiKillertO">Benjamin JEGARD (@KamiKillertO)</a>,</li>
<li><a href="https://github.com/lenoraporter">Lenora Porter (@lenoraporter)</a>,</li>
<li><a href="https://github.com/locks">Ricardo Mendes (@locks)</a></li>
<li><a href="https://github.com/MelSumner">Mel Sumner (@MelSumner)</a> and</li>
<li><a href="https://github.com/rwjblue">Rob Jackson (@rwjblue)</a></li>
</ul>
<p>💖💖💖💖💖💖</p>
<hr />
<h2 id="practiceresponsivedesigninoctanewithembercontainerqueryhttpsgithubcomijlee2embercontainerquery"><a href="https://github.com/ijlee2/ember-container-query">Practice responsive design in Octane with <code>ember-container-query</code> ✨</a></h2>
<p>Container queries allow you to practice <strong>responsive design at the component level</strong>. A component only needs to know how much space it has to figure out how to best present data.</p>
<p>Inspired by Chad Carbert's <a href="https://github.com/chadian/ember-fill-up"><code>ember-fill-up</code></a>, Isaac Lee created <a href="https://github.com/ijlee2/ember-container-query"><code>ember-container-query</code></a> that works best with Octane apps that target modern browsers. (IE 11 was excluded due to its lack of support for <a href="https://developer.mozilla.org/docs/Web/API/Resize_Observer_API"><code>Resize Observer API</code></a>, a possible future direction.)</p>
<p>In addition to responsive design, container queries can also help you learn a few other techniques. We encourage you to check out Isaac's blog posts for more details:</p>
<ul>
<li><a href="https://crunchingnumbers.live/2020/06/01/container-queries-reimagined/">Use modifiers to practice code composition</a></li>
<li><a href="https://crunchingnumbers.live/2020/06/03/container-queries-adaptive-images/">Decide the optimal image to load</a></li>
<li><a href="https://crunchingnumbers.live/2020/06/07/container-queries-cross-resolution-testing/">Test apps and addons at multiple resolutions</a></li>
</ul>
<hr />
<h2 id="newlinkedingroupforemberjsdevelopershttpswwwlinkedincompostsshibulijack_embercommunitystrongertogetheractivity6673898303190654976bgrg"><a href="https://www.linkedin.com/posts/shibulijack_ember-community-strongertogether-activity-6673898303190654976-BgRg/">New LinkedIn group for Ember.js developers 🐹</a></h2>
<p><a href="https://github.com/shibulijack">Shibu Lijack (@shibulijack)</a> created a LinkedIn <strong>group for EmberJS enthusiasts</strong>. It is a group that welcomes anyone who wants to share and discuss the latest and greatest of Ember.js, such as posts that are shared on the <a href="https://blog.emberjs.com/">Ember.js blog</a> and <a href="https://discord.com/invite/emberjs">Discord</a> channels.</p>
<p><a href="https://www.linkedin.com/groups/13863318/">Join the group</a> today and start sharing your blog posts!</p>
<hr />
<h2 id="confidentassethandlingforembercordovahttpsdevtobetocantu93understandingemberjspublicassetspathjj8"><a href="https://dev.to/betocantu93/understanding-ember-js-public-assets-path-jj8">Confident asset handling for Ember & Cordova 📱🐹</a></h2>
<p>If you ever wanted to write native mobile applications using <a href="http://corber.io/">Corber</a>,
you might have had questions on how url paths for your <strong>assets</strong> should look like. Especially if they are supposed to work both <strong>natively and in the browser</strong>.</p>
<p>But fear not! You can now learn all about it in <a href="https://github.com/betocantu93">Beto Cantú's (@betocantu93)</a> recent blog post <a href="https://dev.to/betocantu93/understanding-ember-js-public-assets-path-jj8">"Understanding Ember.js Public Assets Path for Browser and Cordova"</a>. The post not only explains how asset urls are managed in different version of Ember applications,
but also shows you how to write your own handy helper to make url handling a breeze in your next Corber project.</p>
<p>Read the full post <a href="https://dev.to/betocantu93/understanding-ember-js-public-assets-path-jj8">on Beto Cantú's blog</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/nbibler" target="gh-user">@nbibler</a>, <a href="https://github.com/SergeAstapov" target="gh-user">@SergeAstapov</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/pieter-v" target="gh-user">@pieter-v</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/jayjayjpg" target="gh-user">@jayjayjpg</a>, <a href="https://github.com/lenoraporter" target="gh-user">@lenoraporter</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/ijlee2" target="gh-user">@ijlee2</a>, <a href="https://github.com/nvdk" target="gh-user">@nvdk</a> and <a href="https://github.com/jdberrocal1" target="gh-user">@jdberrocal1</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask readers' questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Abhilash LR, Matthew Roderick, Chris Ng, Aseem Taneja, Isaac Lee, Jessica Jordan, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-153</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-153</guid><pubDate>Fri, 19 Jun 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 154]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Check out the new addon ember-stargate 🌟,
a new addon to integrate Netlify CMS with empress-blog 🎉,
learn to SEOptimize your Ember app 💪 ✨,
and last, but not least, a Readers' Question on how to become a writer for The Ember Times 📝!</p>
<!-- READMORE -->
<hr />
<h2 id="getreadyforemberstargatehttpstwittercomsimonihmigstatus1274066847873273859"><a href="https://twitter.com/simonihmig/status/1274066847873273859">Get ready for ember-stargate 🌟</a></h2>
<p><a href="https://github.com/simonihmig">Simon Ihmig (@simonihmig)</a> announced a new addon called <a href="https://github.com/kaliber5/ember-stargate">ember-stargate</a> – a modern and lightweight take on portals in Ember.</p>
<p>“Portals” are a way to render things in a different place of the DOM tree than they are logically defined in the app. There are a number of existing solutions in the Ember ecosystem for the same problem such as <a href="https://github.com/yapplabs/ember-wormhole">ember-wormhole</a>, <a href="https://github.com/ef4/ember-elsewhere">ember-elsewhere</a>, the native <code>{{in-element}}</code> (previously using the <a href="https://github.com/ember-polyfills/ember-in-element-polyfill">ember-in-element-polyfill</a>).</p>
<p>The <code>ember-stargate</code> addon aims to solve this problem without using private APIs, Ember's <code>component</code> helper, or having to jump through hoops to implement. All you need to make a portal work is to define the content that should be sent through the portal using <code>&lt;Portal @target="some-target"&gt;</code>, and the target - identified by its name - where it should be rendered to using <code>&lt;PortalTarget @name="some-target"&gt;</code>.</p>
<p>For example, suppose you want to update the footer in <code>application.hbs</code> from a child route:</p>
<p>Route:</p>
<pre><code class="handlebars language-handlebars">&lt;Portal @target="footer-title"&gt;Step 1&lt;/Portal&gt;
</code></pre>
<p>Application:</p>
<pre><code class="handlebars language-handlebars">{{outlet}}

&lt;footer class="sticky-footer"&gt;
  &lt;PortalTarget @name="footer-title" class="sticky-footer__title" /&gt;
&lt;/footer&gt;
</code></pre>
<p>Read more and try it out at <a href="https://github.com/kaliber5/ember-stargate">kaliber5/ember-stargate</a>!</p>
<hr />
<h2 id="anewaddontointegratenetlifycmswithempressbloghttpstwittercomrobie577status1275728902854529025"><a href="https://twitter.com/Robie577/status/1275728902854529025">A new addon to integrate Netlify CMS with empress-blog 🎉</a></h2>
<!--alex ignore easy just-->
<p>Integrating Netlify-CMS with Empress-blog is now super easy thanks to <a href="https://github.com/MalayaliRobz">Robin Philip Thomas (@MalayaliRobz)</a>! ✨✨✨ Just install the <code>empress-blog-netlify-cms</code> addon to your empress-blog project and enable Identity in netlify - your CMS is now ready! 🎉</p>
<p>You can check out the details of this exciting new addon in the <a href="https://github.com/MalayaliRobz/empress-blog-netlify-cms">GitHub repo</a>.</p>
<p>Be sure to give <a href="https://github.com/MalayaliRobz/empress-blog-netlify-cms"><code>empress-blog-netlify-cms</code></a> a spin if you're thinking about using Netlify-CMS and have been curious about <a href="https://github.com/empress/empress-blog">empress-blog</a>.</p>
<hr />
<h2 id="theultimateguideforseoptimizingyouremberapphttpsabhilashlrinemberperformancetweakspart3"><a href="https://abhilashlr.in/ember-performance-tweaks-part-3">The ultimate guide for SEOptimizing your Ember app 💪 ✨</a></h2>
<p>Making sure that your application is <strong>search engine optimized</strong> (SEO) is crucial to improve the quanitity and the quality of its traffic derived from organic search engine results. And this week you can learn all about how to make your own Ember app <strong>SEO-proof</strong>, too!</p>
<p>In the <a href="https://abhilashlr.in/ember-performance-tweaks-part-3">third installment</a> of his <a href="https://twitter.com/abhilashlr/status/1252602425598328833">blog series "Ember Performance Tweaks"</a>, Ember <a href="https://www.meetup.com/EmberJS-Chennai/">Chennai</a> organizer and blogger <a href="https://github.com/abhilashlr">Abhilash L R (@abhilashlr)</a> shows us how we can prepare our Ember apps for search engines using meta descriptions, title tags, Prember and much more!</p>
<p>Read the <a href="https://abhilashlr.in/ember-performance-tweaks-part-3">full post on Abhilash's personal blog</a> today!</p>
<hr />
<h2 id="readersquestionshowcanibecomeawriterfortheembertimesinthefuturehttpsdiscussemberjscomtreadersquestionshowcanibecomeawriterfortheembertimesinthefuture18006"><a href="https://discuss.emberjs.com/t/readers-questions-how-can-i-become-a-writer-for-the-ember-times-in-the-future/18006">Readers' Questions: How can I become a writer for The Ember Times in the future? 📝</a></h2>
<p>The Ember Times is made up of volunteers. We're always looking for more help! 🙂 This week, we got to answer a question that may have been on your mind (or, hopefully, starting today):</p>
<blockquote>
  <p>How can I become a writer for The Ember Times in the future?</p>
</blockquote>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/readers-questions-how-can-i-become-a-writer-for-the-ember-times-in-the-future/18006">Read more</a></p>
<p><a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a>, based on his experience, shared <a href="https://discuss.emberjs.com/t/readers-questions-how-can-i-become-a-writer-for-the-ember-times-in-the-future/18006">3 steps to becoming a writer</a>. Find out today how you can start contributing as an Ember Times writer!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/erinsinger93" target="gh-user">@erinsinger93</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/rajasegar" target="gh-user">@rajasegar</a>, <a href="https://github.com/bmish" target="gh-user">@bmish</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/jaydgruber" target="gh-user">@jaydgruber</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/richgt" target="gh-user">@richgt</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/chrc" target="gh-user">@chrc</a>, <a href="https://github.com/snewcomer" target="gh-user">@snewcomer</a>, <a href="https://github.com/ijlee2" target="gh-user">@ijlee2</a>, <a href="https://github.com/hergaiety" target="gh-user">@hergaiety</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/nickschot" target="gh-user">@nickschot</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/ChazJensen" target="gh-user">@ChazJensen</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a> and <a href="https://github.com/roderickdevelopers" target="gh-user">@roderickdevelopers</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jessica Jordan, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-154</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-154</guid><pubDate>Fri, 26 Jun 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 155]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>2020 Ember Roadmap published 🧭,
release of Ember.js 3.19! 🎉,
Rock &amp; Roll with Ember.js Octane edition is here 🔥🐹,
Ember 101: new video tutorial series for beginners 💻,
State of Frontend survey 📊,
and last, but not least, ember-meta 1.0.0 release 🚢!</p>
<!-- READMORE -->
<hr />
<h2 id="the2020emberroadmaphttpsblogemberjscom202007102020emberroadmaphtml"><a href="https://blog.emberjs.com/2020/07/10/2020-ember-roadmap.html">The 2020 Ember Roadmap 🧭</a></h2>
<p>Hot off the press is <a href="https://blog.emberjs.com/2020/07/10/2020-ember-roadmap.html">The 2020 Ember Roadmap</a>. We highly encourage you to have a look and <a href="https://twitter.com/emberjs/status/1281726749747949568">share the news</a> with developers in the wider JavaScript ecosystem!</p>
<p>This year, our 2 headline priorities are:</p>
<ul>
<li><strong>Polish the practical and conceptual details of Octane</strong> (tracked properties, Glimmer components, related tooling, accessibility, performance and payload improvements).</li>
<li><strong>Make Ember easier to try and adopt. Lower barriers for Ember developers when collaborating with the greater JavaScript project.</strong> We will do this through improvements and simplifications to the framework, and through focused communication with the greater JavaScript community.</li>
</ul>
<p>There's much more exciting news from the Roadmap than we can possibly include in this newsletter. For more information, please visit the <a href="https://blog.emberjs.com/2020/07/10/2020-ember-roadmap.html">Ember Blog</a>!</p>
<hr />
<h2 id="releaseofemberjs319httpsblogemberjscom20200626ember319releasedhtml"><a href="https://blog.emberjs.com/2020/06/26/ember-3-19-released.html">Release of Ember.js 3.19! 🎉</a></h2>
<p>The Ember project has released <a href="https://blog.emberjs.com/2020/06/26/ember-3-19-released.html">version 3.19 of Ember.js, Ember Data, and Ember CLI</a>. This release kicks off the 3.20 beta cycle for all sub-projects.</p>
<p>To see a list of updates, we encourage you to visit each project's changelog:</p>
<ul>
<li><a href="https://github.com/emberjs/ember.js/blob/v3.19.0/CHANGELOG.md#v3190-may-26-2020">Ember.js</a></li>
<li><a href="https://github.com/emberjs/data/blob/v3.19.0/CHANGELOG.md#release-3190-june-5-2020">Ember Data</a></li>
<li><a href="https://github.com/ember-cli/ember-cli/blob/v3.19.0/CHANGELOG.md#v3190">Ember CLI</a></li>
</ul>
<p>As a refresher the <a href="https://blog.emberjs.com/2013/09/06/new-ember-release-process.html">Ember Release Cycle</a> follows the following:</p>
<ul>
<li>Every six weeks: A new stable version of Ember.js</li>
<li>Every week: A new beta of the next version of Ember.js</li>
<li>Every day: A new canary build, which is the last successful build of the day</li>
<li>Every successful build: The ember-latest.js build is updated</li>
</ul>
<p>To help test beta builds and report any bugs before they are published as a final release in six weeks' time use the <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon to continuously test your projects against the latest releases.</p>
<hr />
<h2 id="rockrollwithemberjsoctaneeditionisherehttpstwittercombaazstatus1276104785079472130"><a href="https://twitter.com/baaz/status/1276104785079472130">Rock & Roll with Ember.js Octane edition is here 🔥🐹</a></h2>
<p>There's an updated version of <a href="https://github.com/balinterdi">Balint Erdi's (@balinterdi)</a> excellent book Rock &amp; Roll with Ember.js available, now with coverage for Ember's Octane Edition! 🎉</p>
<p>If you have not had a chance to give Rock &amp; Roll with Ember.js a read, you should. This is one of the most well-written books on Ember.js. It's a great way to introduce people who are new to Ember to the framework's conventions.</p>
<p>Using a pragmatic approach of learn-by-building, Rock &amp; Roll with Ember.js takes you through the process of building an Ember application from the ground up. You can expect to finish the book with a solid understanding of the fundamentals involved in building Ember applications.</p>
<p>You can find the book for sale <a href="https://www.balinterdi.com/rock-and-roll-with-emberjs/">here</a>.</p>
<hr />
<h2 id="ember101embertutorialseriesforbeginnershttpswwwyoutubecomplaylistlistplo3uqgz3y_qis5cdrzdyngf3b8i1lgsos"><a href="https://www.youtube.com/playlist?list=PLo3Uqgz3Y_QIS5cDRZdynGF3B8i1lgsOs">Ember 101: Ember tutorial series for beginners</a></h2>
<p>Please welcome a new <a href="https://www.youtube.com/playlist?list=PLo3Uqgz3Y_QIS5cDRZdynGF3B8i1lgsOs">video tutorial series</a> by <a href="https://github.com/aalasolutions">Aamir Mahmood (@aalasolutions)</a>! 🎉</p>
<p>At the time of writing, Aamir has put together 7 videos (each is about ten minutes long) to show you how you can make an Ember-Laravel app. Over the course, you will learn how to use:</p>
<ol>
<li>Ember Inspector</li>
<li>Ember CLI</li>
<li>Routes and helpers</li>
<li>Sass</li>
<li>Ember Data
6-7. Components and tracked properties</li>
</ol>
<p>Please show support by sharing the tutorial with people who are looking to develop their first app in Ember!</p>
<hr />
<h2 id="stateoffrontendsurveyhttpstshiostateoffrontend"><a href="https://tsh.io/state-of-frontend/">State of Frontend survey 📊</a></h2>
<p>Interested in helping Ember.js 🔥 get the recognition it deserves among other frontend tools? You may want to participate in the <a href="https://tsh.io/state-of-frontend/">State of Frontend Survey</a>.</p>
<!--alex ignore easy of-course-->
<p>This survey aims to assess frontend developers' work. It gives us a chance to provide input on tooling that we use (Ember, of course!).</p>
<p>It also allows participants the opportunity to comment on tooling they would like to learn and provide thoughts about the future of frontend development trends.</p>
<p>The survey should only take 7 minutes or so of your time. Please help promote the visibility of Ember.js. Your participation can better ensure that the survey provides accurate information about what tools developers use.</p>
<p>Take a moment and fill out the survey <a href="https://tsh.io/state-of-frontend/">here</a>.</p>
<hr />
<h2 id="embermeta100releasehttpstwittercomshipshapecodestatus1281406393577283587"><a href="https://twitter.com/shipshapecode/status/1281406393577283587">ember-meta 1.0.0 release 🚢</a></h2>
<p><code>ember-meta 1.0.0</code> has been released by <a href="https://github.com/shipshapecode">Ship Shape (@shipshapecode)</a>! Thanks to <a href="https://github.com/mansona">Chris Manson (@mansona)</a> for his continued help with this addon 🎉!</p>
<p>In case you weren't aware, <code>ember-meta</code> is an addon that helps set up <code>&lt;meta&gt;</code> tags for your Prember/Ember blog. These tags can support Open Graph, microdata, Twitter, Slack, etc.</p>
<p>This release updates dependencies, uses native class for the underlying service, and allows overloading some configurations.</p>
<p>Head on over to the <a href="https://github.com/shipshapecode/ember-meta/releases/tag/v1.0.0">release notes</a> if you want to learn more.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kiwiupover" target="gh-user">@kiwiupover</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/ijlee2" target="gh-user">@ijlee2</a>, <a href="https://github.com/hakilebara" target="gh-user">@hakilebara</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/snewcomer" target="gh-user">@snewcomer</a>, <a href="https://github.com/caassandra" target="gh-user">@caassandra</a>, <a href="https://github.com/mongoose700" target="gh-user">@mongoose700</a>, <a href="https://github.com/bmish" target="gh-user">@bmish</a>, <a href="https://github.com/cah-briangantzler" target="gh-user">@cah-briangantzler</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/nickschot" target="gh-user">@nickschot</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/muziejus" target="gh-user">@muziejus</a>, <a href="https://github.com/YoranBrondsema" target="gh-user">@YoranBrondsema</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jared Galanis, Isaac Lee, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-155</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-155</guid><pubDate>Fri, 10 Jul 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 156]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Read the blog post on using ember-concurrency with TypeScript 🤝,
reusable DOM behavior in React vs Ember 🪔,
and last, but not least, Mirage JS with GraphQL 🏝!</p>
<!-- READMORE -->
<hr />
<h2 id="usingemberconcurrencywithtypescripthttpsjamescdaviscomusingemberconcurrencywithtypescript"><a href="https://jamescdavis.com/using-ember-concurrency-with-typescript/">Using ember-concurrency with TypeScript 🤝</a></h2>
<p><a href="https://github.com/jamescdavis">James C. Davis (@jamescdavis)</a> wrote a blog post summarizing how to use <a href="https://github.com/microsoft/TypeScript">TypeScript</a> with <a href="https://github.com/machty/ember-concurrency">ember-concurrency</a> as well as some best practices.</p>
<p>ember-concurrency is an addon that manages asynchronous tasks in Ember applications. The addon traditionally exports a <code>task</code> function which is used similarly to a computed property.</p>
<pre><code class="javascript language-javascript">import { task } from 'ember-concurrency';

export default Component.extend({
  myTask: task(function*() {
    yield foo;
    return bar;
  })
}
</code></pre>
<p>The blog post goes through how to use ember-concurrency with Ember Octane and TypeScript. For Octane, we need to use Native Class Syntax. The <a href="https://github.com/machty/ember-concurrency-decorators">ember-concurrency-decorators</a> package was created to make this work for ember-concurrency.</p>
<p>However, decorators cannot change the type of the thing they decorate. To allow TypeScript, the <a href="https://github.com/chancancode/ember-concurrency-ts">ember-concurrency-ts</a> package was created to provide a couple of utility functions such as <code>taskFor</code>.</p>
<p>Finally, the <a href="https://github.com/chancancode/ember-concurrency-async">ember-concurrency-async</a> package provides a Babel transform that allows you to define ember-concurrency tasks using async/await rather than generator function. This simplifies using <code>taskFor</code> on assignment while providing complete type-safety for ember-concurrency tasks.</p>
<p>Read the <a href="https://jamescdavis.com/using-ember-concurrency-with-typescript/">full blog post</a> with all the tips and tricks and try it out yourself today!</p>
<hr />
<h2 id="reusabledombehaviorinreactvsemberhttpsdevtorajask05reusabledombehaviorinreactvsember4p04"><a href="https://dev.to/rajask05/reusable-dom-behavior-in-react-vs-ember-4p04">Reusable DOM behavior in React vs Ember 🪔</a></h2>
<p><a href="https://github.com/RajaSK05">Raja SK</a> wrote a blog post comparing React and Ember's approach to creating reusable components that deal with DOM behaviors. He talks about how to approach the same using the following patterns:</p>
<ul>
<li>React's class-based and functional component approach</li>
<li>Ember's mixin and <strong>modifier</strong> approach.</li>
</ul>
<p>He also talks about how to use the <a href="https://github.com/ember-modifier/ember-modifier">ember-modifier</a> addon if you have been using the Ember mixin patterns so far for DOM behaviors and sharing code between components.</p>
<p>Read the <a href="https://dev.to/rajask05/reusable-dom-behavior-in-react-vs-ember-4p04">full blog post</a> today!</p>
<hr />
<h2 id="miragejswithgraphqlhttpsgithubcommiragejsgraphql"><a href="https://github.com/miragejs/graphql">Mirage JS with GraphQL 🏝</a></h2>
<p>Have you been wanting to use <a href="https://miragejs.com/">Mirage JS</a> with GraphQL?</p>
<p>Thanks to <a href="https://github.com/jneurock">Rocky Neurock (@jneurock)</a>, <a href="https://github.com/miragejs/graphql">Mirage GraphQL</a> provides the ability to create a GraphQL route handler based on your GraphQL and Mirage schemas.</p>
<p>Mirage GraphQL does a bunch of things:</p>
<ul>
<li>It fulfills GraphQL requests by fetching data from Mirage's database.</li>
<li>It filters records from Mirage's database by using arguments from your GraphQL queries.</li>
<li>It handles create, update and delete type mutations automatically based on some conventions.</li>
<li>It allows you to supply your own resolvers (for cases where the automatic query and mutation resolution isn't sufficient).</li>
</ul>
<p>There's plenty of examples on how to get started using GraphQL with Mirage JS using Mirage GraphQL over at the repo, go ahead and <a href="https://github.com/miragejs/graphql#example-use-cases">check them out for yourself</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kiwiupover" target="gh-user">@kiwiupover</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/rjschie" target="gh-user">@rjschie</a>, <a href="https://github.com/arthirm" target="gh-user">@arthirm</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/richgt" target="gh-user">@richgt</a>, <a href="https://github.com/JoaoDsv" target="gh-user">@JoaoDsv</a>, <a href="https://github.com/snewcomer" target="gh-user">@snewcomer</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/st-h" target="gh-user">@st-h</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/pdud" target="gh-user">@pdud</a>, <a href="https://github.com/mehulkar" target="gh-user">@mehulkar</a>, <a href="https://github.com/bmish" target="gh-user">@bmish</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/abhilashlr" target="gh-user">@abhilashlr</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/nickschot" target="gh-user">@nickschot</a>, <a href="https://github.com/sly7-7" target="gh-user">@sly7-7</a>, <a href="https://github.com/superlou" target="gh-user">@superlou</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/hergaiety" target="gh-user">@hergaiety</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Abhilash LR, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-156</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-156</guid><pubDate>Fri, 17 Jul 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 157]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>LexasCMS releases official support for JSON:API and more 🎉,
Deprecation Stages RFC is out 🚀,
tweaking UI behavior with Ember Data queries 📝,
learn what reactivity means with an example 💡,
read the blog post series of lessons learned working with Ember 📔,
and last, but not least, "Ember Data in the Wild" Octane edition is here 📣!</p>
<!-- READMORE -->
<hr />
<h2 id="lexascmsreleasesofficialsupportforjsonapiandmorehttpswwwlexascmscomblogintroducingthejsonapicontentdeliveryapi"><a href="https://www.lexascms.com/blog/introducing-the-jsonapi-content-delivery-api/">LexasCMS releases official support for JSON:API and more 🎉</a></h2>
<p>Have you been looking to integrate a headless CMS with your Ember.js application?</p>
<p>LexasCMS recently shipped a new <strong>JSON:API compliant content delivery API</strong> which aims to make this integration easier than ever before.</p>
<p>Read the <a href="https://www.lexascms.com/blog/introducing-the-jsonapi-content-delivery-api/">release blog post</a> for more information.</p>
<h3 id="newemberdataaddonforlexascmsreleasedhttpsgithubcomlexascmsemberdatalexascms"><a href="https://github.com/LexasCMS/ember-data-lexascms">New Ember Data addon for LexasCMS released</a></h3>
<!--alex ignore easy-->
<p><a href="https://www.github.com/mike183">Michael Donaldson (@mike183)</a> has published the new <strong>ember-data-lexascms</strong> addon for easily integrating LexasCMS with any Ember.js application.</p>
<p>The step are: install the addon, configure your space ID and application adapters/serializers, and begin pulling content directly from LexasCMS using Ember Data.</p>
<p>You can visit the addon's <a href="https://github.com/LexasCMS/ember-data-lexascms">GitHub repo</a> for more details.</p>
<h3 id="emberjsintegrationguideforlexascmshttpswwwlexascmscomdocsintegrationsemberjs"><a href="https://www.lexascms.com/docs/integrations/ember-js/">Ember.js integration guide for LexasCMS</a></h3>
<p>A new integration guide for Ember.js has been published in the LexasCMS documentation.</p>
<p>This guide will show you how to begin <strong>pulling content from LexasCMS</strong> into your Ember.js application.</p>
<p>Check out the <a href="https://www.lexascms.com/docs/integrations/ember-js/">full integration guide</a> on the LexasCMS website.</p>
<!-- alex disable simple -->
<h3 id="simpleblogwebsiteusingemberjsandlexascmshttpsgithubcomlexascmsexampleemberblog"><a href="https://github.com/LexasCMS/example-ember-blog">Simple blog website using Ember.js and LexasCMS</a></h3>
<p><a href="https://www.github.com/mike183">Michael Donaldson (@mike183)</a> has created an example of a simple blog website which has been <strong>developed using Ember.js and LexasCMS</strong>.</p>
<!-- alex enable simple -->
<p>You can view the source code in the <a href="https://github.com/LexasCMS/example-ember-blog">GitHub repo</a>, and even use the project to quickly deploy your very own blog using the "Deploy to Netlify" button in the repo's README.</p>
<hr />
<h2 id="deprecationstagesrfcisouthttpsgithubcomemberjsrfcspull649"><a href="https://github.com/emberjs/rfcs/pull/649">Deprecation Stages RFC is out 🚀</a></h2>
<p>A new RFC takes Ember's promise of <strong>stability without stagnation</strong> to the next level
by introducing "Deprecation Stages". After multiple months of weekly discussions,
the <a href="https://discord.com/channels/480462759797063690/690649313457602651">Deprecation Process strike team</a> details a process to introduce deprecations
that will both allow early adopters to move <span style="font-style: italic;">faster</span> and larger apps to wait for the
dust to settle. <a href="https://github.com/emberjs/rfcs/pull/649">Check out the RFC and weigh in!</a></p>
<hr />
<h2 id="tweakinguibehaviorwithemberdataquerieshttpscodingitwrongcom20200623emberlisthtml"><a href="https://codingitwrong.com/2020/06/23/ember-list.html">Tweaking UI behavior with Ember Data queries 📝</a></h2>
<p><a href="https://github.com/codingitwrong">Josh Justice (@CodingItWrong)</a> has a new <a href="https://codingitwrong.com/2020/06/23/ember-list.html">blog post</a> about Ember Data, his <span style="font-style: italic;">favorite</span> part of Ember.js. Josh writes about building a todo list application, <a href="https://github.com/CodingItWrong/surely-ember">Surely</a>. He touches on querying with JSON:API, the basics of working with the model, sorting with Ember Data, the nuances of reloading, and more. Check out <a href="https://codingitwrong.com/2020/06/23/ember-list.html">Tweaking UI behavior with Ember Data queries</a> and the accompanying <a href="https://github.com/CodingItWrong/surely-ember">GitHub repo</a> to learn more about putting Ember Data to use!</p>
<hr />
<h2 id="whatisreactivityhttpsdevtotheaswathprabhuwhatisreactivity116f"><a href="https://dev.to/theaswathprabhu/what-is-reactivity-116f">What is reactivity? 💡</a></h2>
<!-- alex ignore just -->
<p>A key feature of Ember Octane is the new <strong>reactivity</strong> model. In essence, reactivity is <strong>deciding what to rerender and when</strong>. A good reactivity model can help us focus on business logic because the rerender <span style="font-style: italic;">just works</span>.</p>
<p>To illustrate this point, <a href="https://dev.to/theaswathprabhu">Aswathprabhu R.</a> shared <a href="https://dev.to/theaswathprabhu/what-is-reactivity-116f">What is Reactivity?</a> on his blog. You will learn what updating the DOM manually may look like in vanilla JavaScript, then how frameworks like React and <a href="https://guides.emberjs.com/release/in-depth-topics/autotracking-in-depth/">Ember</a> help separate the rerender logic.</p>
<p>We encourage you to check out Aswathprabhu's <a href="https://dev.to/theaswathprabhu/what-is-reactivity-116f">explanation of reactivity</a> today!</p>
<hr />
<h2 id="blogpostseriesoflessonslearnedworkingwithemberhttpsmonocompanyfrontendgettingtogripswithember"><a href="https://mono.company/frontend/getting-to-grips-with-ember/">Blog post series of lessons learned working with Ember 📔</a></h2>
<p><a href="https://github.com/Wolfr">Johan Ronsse (@Wolfr)</a> wrote a series of blog posts on working with Ember especially coming from a <a href="https://mono.company/frontend/working-within-ember-designer-point-of-view/">designer’s point of view</a>. The blog explains how <a href="https://mono.company/frontend/getting-to-grips-with-ember/">angle bracket and other Octane features</a> make invoking components feel like writing HTML for designers.</p>
<p>The blog also showcases a <a href="https://mono.company/frontend/doing-more-with-a-smaller-team-an-ember-octane-example/">button component</a> to illustrate how a good public interface helps end users be effective. The code that they have to write is simpler, which prevents them from introducing errors.</p>
<p>Finally, the last blog post covers <a href="https://mono.company/frontend/working-within-ember-designer-point-of-view/">nifty tools</a> that the Ember ecosystem provides. Addons make the complicated understandable and codemods help everyone move to the latest Ember release as soon as it becomes available.</p>
<p>Read all three blogs in the series below:</p>
<ul>
<li><a href="https://mono.company/frontend/getting-to-grips-with-ember/">Getting to grips with Ember</a></li>
<li><a href="https://mono.company/frontend/doing-more-with-a-smaller-team-an-ember-octane-example/">Doing more with a smaller team: a button component example</a></li>
<li><a href="https://mono.company/frontend/working-within-ember-designer-point-of-view/">Working in an Ember codebase from a designer point of view</a></li>
</ul>
<hr />
<h2 id="emberdatainthewildoctaneeditionisherehttpstwittercomiamdtangstatus1286705740019716097"><a href="https://twitter.com/iamdtang/status/1286705740019716097">"Ember Data in the Wild" Octane edition is here 📣</a></h2>
<!-- alex ignore tang -->
<p>Hot off the press is the 2nd edition of <a href="https://github.com/skaterdav85">David Tang (@skaterdav85)</a>'s <a href="https://leanpub.com/emberdatainthewild/c/octane-edition">Ember Data in the Wild</a>. 🎊</p>
<p>The 2nd edition presents new and updated content that is tailored to Ember Octane. If you are interested in learning more about Ember Data, be sure to check out <a href="https://leanpub.com/emberdatainthewild/c/octane-edition">David's book</a>! You can find the complete Table of Contents on the purchase website.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/jordpo" target="gh-user">@jordpo</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/kiwiupover" target="gh-user">@kiwiupover</a>, <a href="https://github.com/jad359" target="gh-user">@jad359</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/bmish" target="gh-user">@bmish</a>, <a href="https://github.com/lindyhopchris" target="gh-user">@lindyhopchris</a>, <a href="https://github.com/gibso" target="gh-user">@gibso</a>, <a href="https://github.com/mehulkar" target="gh-user">@mehulkar</a>, <a href="https://github.com/simonc" target="gh-user">@simonc</a>, <a href="https://github.com/ijlee2" target="gh-user">@ijlee2</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/mike183" target="gh-user">@mike183</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/knownasilya" target="gh-user">@knownasilya</a>, <a href="https://github.com/amessinger" target="gh-user">@amessinger</a>, <a href="https://github.com/roncodes" target="gh-user">@roncodes</a>, <a href="https://github.com/lenoraporter" target="gh-user">@lenoraporter</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/JoaoDsv" target="gh-user">@JoaoDsv</a>, <a href="https://github.com/akankshadharkar" target="gh-user">@akankshadharkar</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/richgt" target="gh-user">@richgt</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/SYU15" target="gh-user">@SYU15</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Michael Donaldson, Mehul Kar, Isaac Lee, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-157</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-157</guid><pubDate>Fri, 24 Jul 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 158]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember 3.20 Released 🚀,
a series of blog posts on ember-modifer and its internals 🎉,
detect when Ember components enter or leave the viewport 🔍,
a blog post and RFC on Ember.Component 📖,
and last, but not least, document Ember apps with Docfy 📗!</p>
<!-- READMORE -->
<hr />
<h2 id="ember320releasedhttpsblogemberjscom20200729ember320releasedhtml"><a href="https://blog.emberjs.com/2020/07/29/ember-3-20-released.html">Ember 3.20 Released 🚀</a></h2>
<p>A new <a href="https://blog.emberjs.com/2020/07/29/ember-3-20-released.html">Ember.js blog post</a> is up to announce the release of version 3.20 of Ember.js, Ember Data and Ember CLI!</p>
<p>3.20 includes several new features for the ecosystem.</p>
<ul>
<li>In Ember.js, the <code>{{in-element}}</code> helper is available as public API. This helper solves rendering challenges similarly to <code>ember-wormhole</code> and <code>ember-elsewhere</code>. It allows rendering content into a destination elsewhere on a page.</li>
<li>Ember Data explicitly supports the combined use of <code>EmbeddedRecordsMixin</code> and <code>JSONAPISerializer</code> through the <code>isEmbeddedRecordsMixinCompatible</code> property.</li>
<li>Ember CLI allows syncing Blueprints when running <code>npx ember-cli-update</code>, which avoids some potential issues that previously existed when running this flow. Check out the <a href="https://emberjs.github.io/rfcs/0477-blueprints-update.html">related RFC</a> to learn more.</li>
</ul>
<p>In Ember.js, <code>Meta.prototype.setSourceDestroyed</code> and <code>Meta.prototype.setSourceDestroying</code> are now deprecated. There were no deprecations for Ember Data. Ember CLI issues a warning for using Node 13 and deprecates the use of the <code>PACKAGER</code> experiment.</p>
<p>For more information, give the <a href="https://blog.emberjs.com/2020/07/29/ember-3-20-released.html">Ember.js blog post</a> a read.</p>
<hr />
<h2 id="aseriesofblogpostsonembermodiferanditsinternalshttpsdevto_raja_sk_howdoembermodifiersgettobemanagedinternally1i40"><a href="https://dev.to/_raja_sk_/how-do-ember-modifiers-get-to-be-managed-internally-1i40">A series of blog posts on ember-modifer and its internals 🎉</a></h2>
<p>Have you been looking to get started with ember-modifier in your Ember.js applications?</p>
<p><a href="https://github.com/RajaSK05">Raja SK (@RajaSK05)</a> wrote a series of blog posts on <strong>Ember modifiers</strong>.</p>
<h3 id="howdoembermodifiersgettobemanagedinternallyhttpsdevto_raja_sk_howdoembermodifiersgettobemanagedinternally1i40"><a href="https://dev.to/_raja_sk_/how-do-ember-modifiers-get-to-be-managed-internally-1i40">How do Ember Modifiers get to be managed internally? 🥼</a></h3>
<p>In continuation of his first blog post <a href="https://dev.to/rajask05/reusable-dom-behavior-in-react-vs-ember-4p04">reusable DOM behavior in React vs Ember</a>, Raja wrote a second post detailing the ember-modifier internals and what an <strong>element modifier manager</strong> is. He begins by talking about the modifier lifecycle methods. A modifier lifecycle consists of:</p>
<ul>
<li>createModifier()</li>
<li>installModifier()</li>
<li>updateModifier()</li>
<li>destroyModifier()</li>
</ul>
<p>In the process of explaining the lifecycle methods, Raja details each step with code snippets that help the reader understand what each of them means.</p>
<p>Read more about the element modifier manager and its internals <a href="https://dev.to/_raja_sk_/how-do-ember-modifiers-get-to-be-managed-internally-1i40">on dev.to</a> today!</p>
<h3 id="themagicbehindembermodifiershttpsdevto_raja_sk_themagicbehindtheembermodifiers164c"><a href="https://dev.to/_raja_sk_/the-magic-behind-the-ember-modifiers-164c">The magic behind Ember modifiers ✨</a></h3>
<p>Raja SK's third blog post on Ember modifiers is titled <a href="https://twitter.com/_raja_sk_/status/1285631182697369601?s=20">the magic behind the ember modifiers</a>, where he talks about the internal workings of an Ember modifier - a feature that is offered by Ember Octane.</p>
<p>In the process of explaining how a modifier works, he showcases its use by writing an autofocus modifier using the functional modifier approach.</p>
<p>For more details on the blog, check it out <a href="https://dev.to/_raja_sk_/the-magic-behind-the-ember-modifiers-164c">on dev.to</a>.</p>
<h3 id="demystifyingemberrendermodifiershttpsdevto_raja_sk_demystifyingemberrendermodifiers3j57"><a href="https://dev.to/_raja_sk_/demystifying-ember-render-modifiers-3j57">Demystifying ember-render-modifiers 😎</a></h3>
<p>Finally, Raja SK's fourth blog post talks about <a href="https://dev.to/_raja_sk_/demystifying-ember-render-modifiers-3j57">demystifying ember-render-modifiers</a>.</p>
<p>He talks about <a href="https://github.com/emberjs/ember-render-modifiers">ember-render-modifiers</a>, which provide element modifiers that can be used to hook into specific portions of the rendering lifecycle of a component.</p>
<!--alex ignore easy-->
<p>There are several addons based on ember-modifier, but <strong>ember-render-modifiers</strong> makes it easy to understand its implementation. If you are looking to write your own custom modifiers, then ember-render-modifiers is a good place to start with. Read more on the <a href="https://dev.to/_raja_sk_/demystifying-ember-render-modifiers-3j57">blog post on dev.to</a> today!</p>
<p>P.S. <a href="https://github.com/rwjblue">Robert Jackson (@rwjblue)</a> recently published a major version bump of <a href="https://github.com/ember-modifier/ember-modifier/">ember-modifier</a> to v2.x, check out the <a href="https://github.com/ember-modifier/ember-modifier/blob/master/CHANGELOG.md">Changelog</a>!</p>
<hr />
<h2 id="detectingemberjscomponentsenteringorleavingtheviewporthttpsmediumcomkoushikradusinganembercliaddondetectingemberjscomponentsenteringorleavingtheviewportdda5ad9b46bf"><a href="https://medium.com/@koushikrad/using-an-ember-cli-addon-detecting-ember-js-components-entering-or-leaving-the-viewport-dda5ad9b46bf">Detecting Ember.js components entering or leaving the viewport 🔍</a></h2>
<p><a href="https://github.com/Koushikrad">Koushik Radhakrishnan (@Koushikrad)</a> wrote a blog post on <a href="https://twitter.com/koushikrad/status/1287419970121379840">detecting when Ember components are entering or leaving the viewport</a>.</p>
<p>Consider a dashboard with 10 widget components, each of which makes an API request. When a user lands on the dashboard page, do we need all the widgets to fetch their data at the same time, even if the user's viewport shows only 5 widgets at a time?</p>
<p>A solution is to use the <a href="https://github.com/DockYard/ember-in-viewport">ember-in-viewport</a> addon, which detects if an Ember component has entered the browser's viewport. The addon tries a few different approaches (<code>IntersectionObserver</code> API, then <code>requestAnimationFrame</code>, then the Ember run loop and event listeners) to detect if a DOM element is in the user's browser.</p>
<p>By hooking up with the addon’s provided <code>inViewport</code> service, we are able to request data once the component is within the viewport.</p>
<pre><code class="javascript language-javascript">const { onEnter } = this.inViewport.watchElement(this.element, { viewportTolerance });  
onEnter(this._renderInView.bind(this));
</code></pre>
<p>The components that are not in view will not make a request for API data, unlike the route’s model hook using a <code>Promise.all</code>.</p>
<p>Read more about detecting components from the <a href="https://medium.com/@koushikrad/using-an-ember-cli-addon-detecting-ember-js-components-entering-or-leaving-the-viewport-dda5ad9b46bf">blog post</a>!</p>
<hr />
<h2 id="blogpostandrfconembercomponenthttpsmehulkarcomblog202007stopextendingembersbuiltincomponents"><a href="https://mehulkar.com/blog/2020/07/stop-extending-embers-built-in-components/">Blog post and RFC on Ember.Component 📖</a></h2>
<p>There's an interesting perspective about how your team might handle usage of Ember's built-in components in a <code>GlimmerComponent</code> world presented in <a href="https://github.com/mehulkar">Mehul Kar's (@mehulkar)</a> recent <a href="https://mehulkar.com/blog/2020/07/stop-extending-embers-built-in-components/">blog post</a>.</p>
<p>The post indicates that in order to avoid introducing breaking changes you may want to consider not extending <code>Ember.Component</code> since <code>GlimmerComponent</code> does not have the same methods to support such extension.</p>
<p>This blog post continues the conversation Mehul started in <a href="https://github.com/emberjs/rfcs/issues/587">an RFC</a> on the subject earlier this year that proposes making <code>@ember/component</code> an optional feature. Conversations like these are vital to the health of Ember's ecosystem! So if you're interested in participating in this conversation and have opinions, head on over to the RFC and provide some feedback.</p>
<hr />
<h2 id="documentemberappswithdocfyhttpsdocfydev"><a href="https://docfy.dev/">Document Ember apps with Docfy 📗</a></h2>
<p>Hope you didn't miss an <a href="https://twitter.com/josemarluedke/status/1281252101406855169">exciting announcement</a> earlier in July. <a href="https://github.com/josemarluedke">Josemar Luedke (@josemarluedke)</a> released <a href="https://docfy.dev/">Docfy</a>, a cross-framework tool to help you build documentation sites from Markdown files.</p>
<p>The best part? Docfy provides official support for Ember.js! You can style the Docfy components and leverage existing <a href="https://remark.js.org/">remark</a> plugins too.</p>
<p>Check out <a href="https://docfy.dev/docs/ember">Getting Started</a> to learn more about adding Docfy to your Ember apps.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/abhilashlr" rel="noopener noreferrer" target="_blank">@abhilashlr</a>, <a href="https://github.com/Alonski" rel="noopener noreferrer" target="_blank">@Alonski</a>, <a href="https://github.com/arthirm" rel="noopener noreferrer" target="_blank">@arthirm</a>, <a href="https://github.com/bekzod" rel="noopener noreferrer" target="_blank">@bekzod</a>, <a href="https://github.com/cah-briangantzler" rel="noopener noreferrer" target="_blank">@cah-briangantzler</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">@chancancode</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">@chrisrng</a>, <a href="https://github.com/CodingItWrong" rel="noopener noreferrer" target="_blank">@CodingItWrong</a>, <a href="https://github.com/dfreeman" rel="noopener noreferrer" target="_blank">@dfreeman</a>, <a href="https://github.com/emonroy" rel="noopener noreferrer" target="_blank">@emonroy</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">@ijlee2</a>, <a href="https://github.com/IzzatN" rel="noopener noreferrer" target="_blank">@IzzatN</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">@jaredgalanis</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">@jenweber</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">@kategengler</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">@kiwiupover</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">@locks</a>, <a href="https://github.com/loganrosen" rel="noopener noreferrer" target="_blank">@loganrosen</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">@MelSumner</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/ppegusii" rel="noopener noreferrer" target="_blank">@ppegusii</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">@pzuraq</a>, <a href="https://github.com/RichardOtvos" rel="noopener noreferrer" target="_blank">@RichardOtvos</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">@rwjblue</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">@scalvert</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">@snewcomer</a>, <a href="https://github.com/SYU15" rel="noopener noreferrer" target="_blank">@SYU15</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Abhilash LR, Isaac Lee, Jared Galanis, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-158</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-158</guid><pubDate>Fri, 31 Jul 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 159]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Community addon updates: stable version of ember-bootstrap v4 released 💥, and check out ember-dayjs-helpers 🕰️!</p>
<!-- READMORE -->
<hr />
<!--alex ignore just-->
<h2 id="justreleasedstableversionofemberbootstrapv4httpstwittercomsimonihmigstatus1290710885070262275"><a href="https://twitter.com/simonihmig/status/1290710885070262275">Just released: stable version of ember-bootstrap v4 💥</a></h2>
<p><a href="https://github.com/simonihmig">Simon Ihmig (@simonihmig)</a> announced the <strong>stable release</strong> of ember-bootstrap v4, <a href="https://twitter.com/simonihmig/status/1290710885070262275">tweeting</a> that it's another step toward a full Octane refactoring! Glimmer components are coming next.</p>
<p>Bootstrap users can check out the full list of changes in the <a href="https://github.com/kaliber5/ember-bootstrap/blob/master/CHANGELOG.md">changelog</a>. For breaking changes, give <a href="https://github.com/kaliber5/ember-bootstrap-codemods">ember-bootstrap-codemods</a> a try. We are appreciative of all the codemods in the Ember community!</p>
<p>Not familiar with ember-bootstrap? It's an Ember CLI addon that provides a collection of Ember components that mimic the <a href="https://getbootstrap.com/">original Bootstrap</a> plugins and components in an Ember-friendly way, replacing the need for <code>bootstrap.js</code>. For more info, check out the <a href="https://www.ember-bootstrap.com/">website</a> and the corresponding <a href="https://github.com/kaliber5/ember-bootstrap">repo</a>.</p>
<hr />
<h2 id="checkoutemberdayjshelpershttpsgithubcomrajasegaremberdayjshelpers"><a href="https://github.com/rajasegar/ember-dayjs-helpers">Check out ember-dayjs-helpers 🕰️</a></h2>
<p><a href="https://github.com/rajasegar">Rajasegar Chandran (@rajasegar)</a> created the <a href="https://github.com/rajasegar/ember-dayjs-helpers">ember-dayjs-helpers</a> library which contains over 30+ template helpers based on <a href="https://day.js.org/en">day.js</a>, a fast 2kB alternative to Moment.js with the same modern API.</p>
<!--alex ignore easy-->
<p>In your templates, you can easily use day.js APIs using the provided helpers. For example, you can use the <code>{{day-js}}</code> helper to display the current date or format a date provided.</p>
<pre><code class="handlebars language-handlebars">{{day-js}} =&gt; Display today's date
{{day-js date='2019-01-25' format='DD-MM-YYYY'}} =&gt; 25-01-2019
{{day-js date='2019-01-25' format='DD MMMM YYYY'}} =&gt; 25 January 2019
</code></pre>
<p>Check out the full project with the list of helpers provided on <a href="https://github.com/rajasegar/ember-dayjs-helpers">GitHub</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="undefined" rel="noopener noreferrer" target="_blank">@amyrlam</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@bmish</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@chriskrycho</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@chrisrng</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@dcyriller</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@ghedamat</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@ijlee2</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@krisselden</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@locks</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@mehulkar</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@miguelverissimo</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@nickschot</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@pzuraq</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@rwjblue</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@snewcomer</a>, <a href="undefined" rel="noopener noreferrer" target="_blank">@tashvaqa</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-159</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-159</guid><pubDate>Fri, 07 Aug 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 160]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>"I contribute to Ember" with Isaac Lee and Jared Galanis 🙌,
how to participate in the Ember RFC process 🚀,
EmberFest: share your virtual Hello with us! 🐹,
learn how to use csz in your Ember app 🌟,
and last, but not least, ember-cli-next: an experimental terminal UI for <code>ember-cli</code> 🔥!</p>
<!-- READMORE -->
<hr />
<h2 id="icontributetoemberwithisaacleeandjaredgalanishttpsdiscussemberjscomticontributetoemberwithisaacleeandjaredgalanis18127"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-isaac-lee-and-jared-galanis/18127">"I contribute to Ember" with Isaac Lee and Jared Galanis 🙌</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Isaac Lee" title="Isaac Lee - Contributor to Ember" src="/images/blog/emberjstimes/isaac_lee.jpg" />
</div>
<div class="float-right padded portrait-frame">
  <img alt="Jared Galanis" title="Jared Galanis - Contributor to Ember" src="/images/blog/emberjstimes/jared_galanis.jpg" />
</div>
<p>In the <strong>15th edition</strong> of our contributor interview series, we're highlighting The Ember Times' very own <a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a> and <a href="https://github.com/jaredgalanis">Jared Galanis (@jaredgalanis)</a>. We'd like to thank Isaac and Jared for their contributions to the Ember community, and congratulate them for joining the Ember Learning Core Team!</p>
<p>Check out the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-isaac-lee-and-jared-galanis/18127">the Ember Discuss forum</a>. They discuss their biggest motivations in contributing to Ember and how they got started in open source.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-isaac-lee-and-jared-galanis/18127">Read more</a></p>
<p style="font-style: italic;">The idea behind these interviews is to provide community members with more information and insight into open source contributions, learning resources, and community events. Contributors to the community gain a platform to share their thoughts on their own experiences and learnings as they were contributing to Ember. Our hope is that it gives first-time and advancing contributors a better sense of the fact that everyone starts out small, and that anyone can have a big impact on the community.</p>
<hr />
<h2 id="howtoparticipateintheemberrfcprocesshttpsgithubcomemberjsrfcs"><a href="https://github.com/emberjs/rfcs/">How to participate in the Ember RFC process 🚀</a></h2>
<p>The Request For Comments (RFC) process is intended to provide a consistent and controlled path for new features to enter the Ember.js framework.</p>
<p>Many changes, including bug fixes and documentation improvements, can be implemented and reviewed via the normal GitHub pull request workflow on the appropriate repo. Some changes though are "substantial", and we ask that these be put through a bit of a design process and produce a consensus among the Ember core teams.</p>
<p>So, what's a good way to propose <strong>your awesome idea</strong>? Well, there are a few options:</p>
<ol>
<li>Chat with others about your idea in the <a href="https://discord.com/channels/480462759797063690/500803406676492298">#dev-rfc channel</a> in <a href="https://discord.gg/emberjs">Discord</a>. This is a good way to get some initial feedback on your idea from folks in the community who have experience writing RFCs. They can also help you figure out if an RFC is already in the core team's backlog, and what next steps might look like.</li>
<li>Submit an issue to the <a href="https://github.com/emberjs/rfcs/">RFC repo</a>. This is a great way to receive feedback <span style="font-style: italic;">before</span> you start writing the RFC, and will help you maintain efficiency.</li>
</ol>
<p>Once you are ready to write the RFC for your awesome idea, there are a few important steps:</p>
<ol>
<li>Read through the entire <a href="https://github.com/emberjs/rfcs/">README</a> so that you understand what your RFC needs to succeed. Sometimes folks will skip over the <a href="https://github.com/emberjs/rfcs/blob/master/0000-template.md#how-we-teach-this">"How we teach this"</a> section or the <a href="https://github.com/emberjs/rfcs/blob/master/0000-template.md#alternatives">"Alternatives"</a> section of the template, and both of those are important to include for the RFC to proceed.</li>
<li>Find a core team member to champion the RFC! All RFCs need a core team champion, so review the <a href="https://emberjs.com/teams/">team list</a> to see who you should approach about championing your issue. That core team member makes sure that your RFC is discussed in meetings, so it's essential to have one if you want your awesome idea to succeed!</li>
</ol>
<p>If you're interested in eventually writing RFCs but don't know where to start, here are some steps you can take on your own:</p>
<ul>
<li>Read through the <a href="https://emberjs.github.io/rfcs/introduction.html">RFCs that have been accepted</a>. Look for the patterns, what similarities do they have?</li>
<li>Read through the <a href="https://github.com/emberjs/rfcs/issues">issues in the RFC repo</a>. Sometimes folks will know that an RFC needs to be written, but they don't have time to write it. That's a great place to start digging in.</li>
<li>Read through <a href="https://github.com/emberjs/rfcs/pulls">RFC pull requests</a> and read the questions and comments on the PRs. Look for patterns there too- can you anticipate questions and answer them in your RFC before they are asked?</li>
</ul>
<p>All in all, the RFC process is important to the growth of our community, but it can definitely be a little bit intimidating to know where to start if you're not used to writing RFCs! Hopefully this quick guide gives you a good idea of where to start.</p>
<hr />
<h2 id="learnhowtousecszinyouremberapphttpsdevtorajasegarembercszacssinjssolutionforstylinginember2mpp"><a href="https://dev.to/rajasegar/ember-csz-a-css-in-js-solution-for-styling-in-ember-2mpp">Learn how to use csz in your Ember app 🌟</a></h2>
<p>Last month, <a href="https://github.com/rajasegar">Rajasegar Chandran (@rajasegar)</a> gave a <a href="https://www.youtube.com/watch?v=uZrVHGEjLhs">virtual talk</a> at ESNextConf. 🎉 He talked about <a href="https://github.com/lukejacksonn/csz">csz</a>, a super tiny, framework-agnostic CSS-in-JS solution.</p>
<p>In addition, Rajasegar published an addon called <a href="https://github.com/rajasegar/ember-csz">ember-csz</a>. It provides a template helper so that we can try out <code>csz</code> in our Ember app.</p>
<pre><code class="handlebars language-handlebars">{{!-- app/components/my-button.hbs --}}
&lt;button class={{this.styleForButton}} type="button"&gt;
  {{@label}}
&lt;/button&gt;
</code></pre>
<pre><code class="javascript language-javascript">// app/components/my-button.js
import Component from '@glimmer/component';
import csz from 'csz';

export default class MyButtonComponent extends Component {
  styleForButton = csz`
    background: ${this.args.primary ? 'palevioletred' : 'white'};
    color: ${this.args.primary ? 'white' : 'palevioletred'};
    padding: 0.25em 1em;
  `;
}
</code></pre>
<p>Be sure to check out Rajasegar's <a href="https://www.youtube.com/watch?v=uZrVHGEjLhs">talk</a> and <a href="https://dev.to/rajasegar/ember-csz-a-css-in-js-solution-for-styling-in-ember-2mpp">blog post about ember-csz</a> to learn more!</p>
<hr />
<h2 id="emberclinextanexperimentalterminaluiforemberclihttpstwittercomrajasegar_cstatus1292731035164188673"><a href="https://twitter.com/rajasegar_c/status/1292731035164188673">ember-cli-next: An experimental terminal UI for <code>ember-cli</code> 🔥</a></h2>
<p>If you haven't seen <a href="https://github.com/rajasegar">Rajasegar Chandran's (@rajasegar)</a> fantastic new experimental terminal UI for <code>ember-cli</code>, <a href="https://github.com/rajasegar/ember-cli-next"><code>ember-cli-next</code></a>, you may want to check it out.</p>
<p>There are some pretty compelling ideas being presented in <code>ember-cli-next</code> around what command line user interface tooling could look like in the future. <code>ember-cli-next</code> allows <code>ember-cli</code> commands and project tasks to be displayed within a single unified terminal window.</p>
<p>There is also a brief video demo to watch on <a href="https://www.youtube.com/watch?v=do9sRiOxenA&feature=youtu.be">YouTube</a> that shows some of the things that <code>ember-cli-next</code> can do, and you can take a look at the repo <a href="https://github.com/rajasegar/ember-cli-next">here</a>.</p>
<hr />
<h2 id="emberfestshareyourvirtualhellowithushttpsmailchimpa241158d3c66welcometothelineupofemberfest6442608e7124c8fef8"><a href="https://mailchi.mp/a241158d3c66/welcome-to-the-line-up-of-emberfest-6442608?e=7124c8fef8">EmberFest: Share your virtual Hello with us! 🐹</a></h2>
<p><a href="http://emberfest.eu/">EmberFest</a>, the European EmberJS conference, is <a href="https://twitter.com/EmberFest/status/1263453851459497984">skipping</a> this year’s conference due to COVID-19. However, the organizers of the conference are <a href="https://mailchi.mp/a241158d3c66/welcome-to-the-line-up-of-emberfest-6442608?e=7124c8fef8">looking for people</a> who are interested in sharing a personal message or a short Hello video virtually.</p>
<p>If this sounds right up your alley you can <a href="https://www.dropbox.com/request/4YAbKdJmvD9E0yqjVsz4">upload your video on Dropbox</a>.</p>
<p>Alternatively, if webcams aren’t your thing, maybe you have some fun video impressions from the past years that capture the spirit of the conference. Ember developers strolling through that year's city, at the dinner party, or while in transit. Anything that reflects the EmberFest vibe and builds anticipation for our next in-person gathering is great and much appreciated!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/alexlafroscia" rel="noopener noreferrer" target="_blank">@alexlafroscia</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">@amyrlam</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">@bmish</a>, <a href="https://github.com/buschtoens" rel="noopener noreferrer" target="_blank">@buschtoens</a>, <a href="https://github.com/chadhietala" rel="noopener noreferrer" target="_blank">@chadhietala</a>, <a href="https://github.com/chrism" rel="noopener noreferrer" target="_blank">@chrism</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">@chrisrng</a>, <a href="https://github.com/davelindquist-egistix" rel="noopener noreferrer" target="_blank">@davelindquist-egistix</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">@ef4</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">@ijlee2</a>, <a href="https://github.com/jamescdavis" rel="noopener noreferrer" target="_blank">@jamescdavis</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">@jaredgalanis</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">@jherdman</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">@kiwiupover</a>, <a href="https://github.com/lukemelia" rel="noopener noreferrer" target="_blank">@lukemelia</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">@mansona</a>, <a href="https://github.com/maxhq" rel="noopener noreferrer" target="_blank">@maxhq</a>, <a href="https://github.com/Mikek2252" rel="noopener noreferrer" target="_blank">@Mikek2252</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/ondrejsevcik" rel="noopener noreferrer" target="_blank">@ondrejsevcik</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">@pzuraq</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">@rwjblue</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">@rwwagner90</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">@snewcomer</a>, <a href="https://github.com/sourabhmandal" rel="noopener noreferrer" target="_blank">@sourabhmandal</a>, <a href="https://github.com/Turbo87" rel="noopener noreferrer" target="_blank">@Turbo87</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Melanie Sumner, Chris Ng, Isaac Lee, Jared Galanis, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-160</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-160</guid><pubDate>Fri, 14 Aug 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 161]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>ember-component-template-colocation-migrator now supports addons 🎉,
built with Ember.js: 10001 virtual art exhibit 🎨,
ember-mobile-menu v2 released 📱,
help with Embroider readiness 🔥,
and last, but not least, new free video and instructor at EmberMap 📹!</p>
<!-- READMORE -->
<hr />
<h2 id="releaseofembercomponenttemplatecolocationmigrator110httpsgithubcomembercodemodsembercomponenttemplatecolocationmigratorreleasestagv110"><a href="https://github.com/ember-codemods/ember-component-template-colocation-migrator/releases/tag/v1.1.0">Release of ember-component-template-colocation-migrator 1.1.0 🎉</a></h2>
<p>The <a href="https://github.com/ember-codemods/ember-component-template-colocation-migrator">ember-component-template-colocation-migrator</a> codemod co-locates component JS and HBS files as described in the <a href="https://emberjs.github.io/rfcs/0481-component-templates-co-location.html">Component Templates Co-location RFC</a>. The v1.1.0 release adds <a href="https://github.com/ember-codemods/ember-component-template-colocation-migrator/pull/14">support for migrating addons</a>, but templates shared by multiple components are excluded. In this case, it is up to end users how to list those; they are reported in the same way other skipped templates (like partials) are. Similarly, mixins that use layout are not migrated.</p>
<p>When running the codemod, instead of:</p>
<pre><code class="bash language-bash">your-addon/
  addon/
    components/
      some-component.js
    templates/
      components/
        some-component.hbs
</code></pre>
<p>You will get:</p>
<pre><code class="bash language-bash">your-addon/
  addon/
    components/
      some-component.js
      some-component.hbs
</code></pre>
<p>Try it out today by running the migrator in your app or addon:</p>
<pre><code class="bash language-bash">npx github:ember-codemods/ember-component-template-colocation-migrator
</code></pre>
<hr />
<h2 id="builtwithemberjs10001virtualartexhibithttps10001undercurrentnycexhibitteams"><a href="https://10001.undercurrent.nyc/exhibit/teams">Built with Ember.js: 10001 virtual art exhibit 🎨</a></h2>
<p><a href="http://github.com/muziejus">Moacir P. de Sá Pereira (@muziejus)</a> announced in a <a href="https://twitter.com/muziejus/status/1291818497895477248">tweet</a> that while on vacation 🏝, he's been helping an art gallery put together a website for a virtual exhibition: <a href="https://10001.undercurrent.nyc/">10001.undercurrent.nyc</a>.</p>
<blockquote>
  <p>On August 5, <a href="https://undercurrent.nyc/">Undercurrent</a> launched “10001,” a collaborative virtual project that continues through September 12. This project is co-organized by the <a href="https://eunicglobal.eu/">European Union National Institutes of Culture</a>’s New York Cluster. Borrowing the zip code from both the Empire State Building and New York City’s Central Post Office, “10001” focuses on the collaboration of strangers and the narrative of their collective creative process using New York City as the linchpin. Coming from a variety of disciplines, twelve European Union artists who have never met each other will be randomly paired, making up a total of six teams. Through a series of Zoom sessions, each team will spend a six-week period developing a single project that will reimagine NYC post March 20, 2020.</p>
</blockquote>
<p>The 10001 website is built with Ember 3.18! It's fantastic to see Ember.js being used <strong>in the wild</strong>, and we think that the site design is pretty rad too. Look forward to checking out the content as the artists continue their work on this pandemic-friendly exhibition.</p>
<hr />
<h2 id="embermobilemenuv2releasedhttpsnickschotgithubioembermobilemenu"><a href="https://nickschot.github.io/ember-mobile-menu/">ember-mobile-menu v2 released 📱</a></h2>
<p>Earlier in August, <a href="https://github.com/nickschot">Nick Schot (@nickschot)</a> <a href="https://twitter.com/nickschot/status/1290009657373626368">announced the v2 release</a> of <code>ember-mobile-menu</code>.</p>
<!-- alex ignore retext-equality -->
<p>In case you weren't aware, <a href="https://github.com/nickschot/ember-mobile-menu"><code>ember-mobile-menu</code></a> provides a gesture-enabled hamburger menu. You can check out a real-world implementation in <a href="https://empress-hummingbird.netlify.app/">Empress Hummingbird</a>.</p>
<p>For a complete list of new features in v2, we encourage you to check out Nick's <a href="https://twitter.com/nickschot/status/1290009657373626368">tweet</a> and the <a href="https://github.com/nickschot/ember-mobile-menu/blob/master/CHANGELOG.md#v200-2020-08-01">repo changelog</a>. Here are a few of the best:</p>
<ul>
<li>Written in Octane (v3.20 at the time of writing)</li>
<li>Spring physics and cancellable/resumable finishing animations</li>
<li>Various menu styles</li>
<li>FastBoot support</li>
</ul>
<hr />
<h2 id="helpwithembroiderreadinesshttpsgithubcomemberjsemberjsissues19099"><a href="https://github.com/emberjs/ember.js/issues/19099">Help with Embroider readiness 🔥</a></h2>
<p>This week, <a href="https://github.com/wycats">Yehuda Katz (@wycats)</a> opened a <a href="https://github.com/emberjs/ember.js/issues/19099">meta issue</a> concerning the readiness of <a href="https://github.com/embroider-build/embroider">Embroider</a>, Ember's next build system. The issue is meant to track the steps that must be taken before people can practically use Ember with Embroider as a supported option with route-based code splitting ("Embroider readiness").</p>
<p>An app that enables Embroider's route-based code splitting with <code>splitAtRoutes</code> mode must be able to operate in the presence of the following flags (which means the app is not using classic dynamic features):</p>
<ul>
<li>staticAddonTestSupportTrees</li>
<li>staticAddonTrees</li>
<li>staticHelpers</li>
<li>staticComponents</li>
</ul>
<p>The first target for Emroider readiness is to create a transition path to route-based code splitting, which means that all addons included in the default blueprint must be able to do so. It also means that addons that are frequently used in real-world applications, such as <code>ember-concurrency</code>, need to be able to enable these flags.</p>
<p>Embroider is a really important next step for the future of Ember. It would be helpful for anyone interested to test out Embroider readiness in their addon or application in <code>splitAtRoutes</code> mode with these flags enabled and provide feedback. If you are inclined, head on over to the <a href="https://github.com/emberjs/ember.js/issues/19099">meta issue</a> and give it a read.</p>
<p>It is worth mentioning that other things need to be done in order to get Embroider stabilized for use in Ember. You can check that list out in <a href="https://github.com/ef4">Ed Faulkner's (@ef4)</a> <a href="https://github.com/embroider-build/embroider/issues/501">tracking issue</a>.</p>
<hr />
<h2 id="newfreevideoandinstructoratembermaphttpstwittercomember_mapstatus1295828816011636743"><a href="https://twitter.com/ember_map/status/1295828816011636743">New free video and instructor at EmberMap 📹</a></h2>
<p>EmberMap has a new instructor! <a href="https://github.com/cadeParade">Lindsay Cade (@cadeParade)</a> has joined the EmberMap crew and released her first video, which covers testing loading states 🎉. Bonus, this instructional video is free!</p>
<p>Lindsay teaches us how to use the wait helpers built into <code>ember-test-helpers</code> to ensure that you can write robust tests around loading state that wait for async behavior to resolve before making assertions.</p>
<p>Check out the free video at <a href="https://embermap.com/video/testing-loading-states">EmberMap</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/buschtoens" rel="noopener noreferrer" target="_blank">Jan Buschtöns (@buschtoens)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/JennyJudova" rel="noopener noreferrer" target="_blank">Jenny Judova (@JennyJudova)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/jrjohnson" rel="noopener noreferrer" target="_blank">Jonathan Johnson (@jrjohnson)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/kookyungmin" rel="noopener noreferrer" target="_blank">gguri4549 (@kookyungmin)</a>, <a href="https://github.com/krisselden" rel="noopener noreferrer" target="_blank">Kris Selden (@krisselden)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/sourabhmandal" rel="noopener noreferrer" target="_blank">Sourabh Mandal (@sourabhmandal)</a>, <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Isaac Lee, Jared Galanis, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-161</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-161</guid><pubDate>Fri, 21 Aug 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 162]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Update from the Accessibility Working Group 🙌,
syntax highlighting in markdown with ember-showdown-prism 🔦,
testing your Mirage.js setup 🧪,
and last, but not least, read the proposed <code>{{id}}</code> helper RFC 🆔.</p>
<!-- READMORE -->
<hr />
<h2 id="updatefromtheaccessibilityworkinggrouphttpsblogemberjscom20200825accessibilityworkinggroupupdatehtml"><a href="https://blog.emberjs.com/2020/08/25/accessibility-working-group-update.html">Update from the Accessibility Working Group 🙌</a></h2>
<p>In March 2020, a group of Ember developers formed the Accessibility (A11y) Strike Team, now known as the <strong>Ember A11y Working Group</strong>. The group wanted to address the issues that were outlined in <a href="https://github.com/emberjs/rfcs/issues/595">RFC #595: Technical A11y Issues in New Ember Apps</a>.</p>
<p>This week, <a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a> published an <a href="https://blog.emberjs.com/2020/08/25/accessibility-working-group-update.html">official blog post</a> to provide a status update. We encourage you to <a href="https://blog.emberjs.com/2020/08/25/accessibility-working-group-update.html">read the blog post</a>. Accessible apps are for everyone and the discussions, RFCs, and addons started by the A11y Strike Team may influence your app development.</p>
<p>As always, we give a big shout-out to all community members who participated in the A11y Strike Team. 💜</p>
<hr />
<h2 id="anewwaytoaddsyntaxhighlightingtoyourcodeblockswithembershowdownprismhttpstwittercomreal_atestatus1297892167181099010"><a href="https://twitter.com/real_ate/status/1297892167181099010">A new way to add syntax highlighting to your code blocks, with <code>ember-showdown-prism</code> 🔦</a></h2>
<p><a href="https://github.com/mansona">Chris Manson (@mansona)</a> released the first working version of <code>ember-showdown-prism</code> this week. This drop-in addon automatically adds <a href="https://prismjs.com/">Prism</a> syntax highlighting to Markdown code blocks if you are using <a href="https://github.com/showdownjs/showdown">showdown</a>.</p>
<p>This addon adds <strong>two unique</strong> features on top of the <code>prism</code>  and <code>showdown</code> features. Firstly, if you provide a <code>data-filename</code> attribute, it will add this name to your code block including the file type. You’ve probably seen this before in the Ember Guides.  Secondly, line numbers are added to the code block and are also clickable which give you sharable links if you are using Fastboot or prember.</p>
<p><a href="https://github.com/mansona">Chris</a> extracted the code from the guides, and with the help of <a href="https://github.com/nickschot">Nick Schot (@nickschot)</a> managed to give you this cool addon with these awesome features.</p>
<p>Check out the <a href="https://ember-showdown-prism.netlify.app">demo</a> and the <a href="https://github.com/empress/ember-showdown-prism">GitHub repo</a> and add some cool code blocks to your blog or documentation!</p>
<hr />
<h2 id="rfcidhelperhttpsgithubcomemberjsrfcspull659"><a href="https://github.com/emberjs/rfcs/pull/659">RFC: {{id}} Helper 🆔</a></h2>
<p><a href="https://github.com/steveszc">Steve Szczecina (@steveszc)</a> proposed adding a built-in <a href="https://github.com/emberjs/rfcs/pull/659"><code>{{id}}</code> helper</a> for generating unique IDs. This helper serves as a replacement for <code>elementId</code>, which is available in classic components but not in Glimmer components or route templates. Furthermore, it powers common use cases such as:</p>
<ul>
<li>Associating label and input elements using the label's <code>for</code> attribute and the input's <code>id</code> attribute.</li>
<li>Using WAI-ARIA attributes to improve accessibility (e.g. <code>aria-labelledby</code>, <code>aria-controls</code>)</li>
<li>Integrating 3rd party libraries that attach themselves to DOM elements using DOM IDs (e.g. maps, calendars, jQuery plugins)</li>
</ul>
<p>The proposed <code>{{id}}</code> helper can be invoked in 2 ways: without any argument or with a <code>for</code> argument.</p>
<p>When no arguments are passed, it will return a new unique ID string for every invocation. This invocation style would usually be paired with a <code>let</code> block.</p>
<pre><code class="handlebars language-handlebars">{{#let (id) as |emailId|}}
  &lt;label for={{emailId}}&gt;Email address&lt;/label&gt;
  &lt;input id={{emailId}} type="email" /&gt;
{{/let}}
</code></pre>
<!--alex ignore savage-->
<p>The named argument <code>for</code> accepts an object, string, number, Element, or primitive, and treats it as a stable reference for an ID. This allows the helper to return the same ID for a given input.</p>
<pre><code class="handlebars language-handlebars">&lt;label for="{{id for=this}}-email"&gt;Email address&lt;/label&gt;
&lt;input id="{{id for=this}}-email" type="email" /&gt;
</code></pre>
<p>For more information on why we need the <code>{{id}}</code> helper, please check out <a href="https://github.com/emberjs/rfcs/pull/659">RFC #659</a>. Be sure to provide your feedback by adding an emoji reaction or leaving a comment!</p>
<hr />
<h2 id="testingyourmiragejssetuphttpssimplabscomblog20200828testingthemiragejssetup"><a href="https://simplabs.com/blog/2020/08/28/testing-the-miragejs-setup/">Testing your Mirage.js setup 🧪</a></h2>
<p>If you're a Mirage.js user, you may want to take a look at <a href="https://github.com/turbo87/">Tobias Bieniek's (@turbo87)</a> new blog post on the <a href="https://simplabs.com/blog/2020/08/28/testing-the-miragejs-setup/">simplabs blog</a> that discusses testing your Mirage setup. 🎉</p>
<p>If you have used Mirage for your testing environment, you know how powerful it can be. The post covers a different sort of test involving Mirage – tests that test your Mirage API. 🤯  As Tobias points out, true end-to-end testing can be costly in time and complexity. One way to achieve a similar assurance that your mocked API is returning results similar to your real API is to test it.</p>
<p>You'll also find several helpful examples of how you might go about achieving a set of tests that test your Mirage responses. If you're a Mirage user you really should go give <a href="https://simplabs.com/blog/2020/08/28/testing-the-miragejs-setup/">the post</a> a read.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/arenoir" rel="noopener noreferrer" target="_blank">Aaron Renoir (@arenoir)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/kookyungmin" rel="noopener noreferrer" target="_blank">gguri4549 (@kookyungmin)</a>, <a href="https://github.com/krisselden" rel="noopener noreferrer" target="_blank">Kris Selden (@krisselden)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>

  <p>P.S. Our next issue will be in two weeks. See you then!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Anne-Greeth van Herwijnen, Chris Ng, Isaac Lee, Amy Lam, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-162</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-162</guid><pubDate>Fri, 28 Aug 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 163]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Learn what's new in the Ember 3.21 release 🎉,
Embroider preparation blog post 📖,
get ready for Hacktoberfest 2020 👩🏽‍💻🧑🏽‍💻,
CI with GitHub Actions for Ember Apps: Part 2 🎥,
and last, but not least, celebrate 3 addon major releases 🌟!</p>
<!-- READMORE -->
<hr />
<h2 id="learnwhatsnewinember321releasehttpsblogemberjscom20200902ember321releasedhtml"><a href="https://blog.emberjs.com/2020/09/02/ember-3-21-released.html">Learn what's new in Ember 3.21 release 🎉</a></h2>
<p>The Ember Blog <a href="https://blog.emberjs.com/2020/09/02/ember-3-21-released.html">announced the v3.21 releases</a> of Ember.js, Ember Data, and Ember CLI. The occasion also marked the <strong>LTS release of Ember v3.20</strong>. It will receive <a href="https://emberjs.com/releases/lts">bug fixes until May 2021 and security patches until September 2021</a>.</p>
<p>The release of version 3.21 may affect your development workflow in a few ways:</p>
<ul>
<li><code>getWithDefault</code> (both the function and class method) has been deprecated per <a href="https://github.com/emberjs/rfcs/blob/master/text/0554-deprecate-getwithdefault.md">RFC #554</a>.</li>
<li><code>ember new --lang</code> support has landed per <a href="https://github.com/emberjs/rfcs/blob/master/text/0635-ember-new-lang.md">RFC #635</a>.</li>
<li><a href="https://github.com/ember-cli/ember-try">ember-try</a> configuration for addons has been updated to include <code>ember-lts-3.20</code> and exclude <code>ember-lts-3.12</code>.</li>
</ul>
<p>The release also kicked off the 3.22 beta cycle. If you can, please help with testing beta builds and reporting bugs before version 3.22.0 is published. 💜</p>
<hr />
<h2 id="embroiderpreparationblogposthttpsmediumcomkiwiupoverembroiderpreparation14d59edafc0b"><a href="https://medium.com/@kiwiupover/embroider-preparation-14d59edafc0b">Embroider preparation blog post 📖</a></h2>
<p>Have you been thinking about giving Embroider a try in your addon? Well, the community could use your help in landing Embroider and you may want to consider trying it out!</p>
<p>If you are inclined to give this a go there's an ✨<strong>awesome</strong>✨ new <a href="https://medium.com/@kiwiupover/embroider-preparation-14d59edafc0b">blog post</a> on this subject by <a href="https://github.com/kiwiupover">Dave Laird (@kiwiupover)</a> that introduces some ideas about testing your addon against Embroider that may help you get started.</p>
<p>The blog post talks about how you can integrate Embroider into your build pipeline and how you can run your tests against it with <code>ember-try</code>. If you are at all curious about Embroider and/or you help maintain an addon, you should go give the fantastic and timely post a read.</p>
<hr />
<h2 id="getreadyforhacktoberfest2020httpshacktoberfestdigitaloceancom"><a href="https://hacktoberfest.digitalocean.com/">Get ready for Hacktoberfest 2020 👩🏽‍💻🧑🏽‍💻</a></h2>
<p><a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest</a> is a month-long celebration of open source software. Between October 1 and October 31, you are encouraged to submit <strong>4 quality pull requests to public GitHub repos</strong>. In return, you'll get a limited edition Hacktoberfest T-shirt and stickers (plus knowledge and fun).</p>
<p>If you are an addon maintainer, we encourage you to create issues with a well-defined scope for contributors to jump in and help. Be sure to label the issues with <code>Hacktoberfest</code> so that they're easier to discover. You can also tweet issues or repos with the hashtag <code>#Hacktoberfest</code>. Last but not least, please follow the <a href="https://emberjs.com/guidelines">Ember Community Guidelines</a> and provide a welcoming experience to all contributors.</p>
<p>If you are new to open source contribution, we encourage you to be curious and proactive in asking for help. (There is a <a href="https://discord.com/channels/480462759797063690/496453502298750988"><code>#hacktoberfest</code></a> channel on <a href="https://discord.gg/emberjs">Ember Discord</a>.) A repo may provide directions in <code>CONTRIBUTING</code> or <code>README</code> file to help you get started. An Ember addon that you have used before may be a good place to start; the Ember teams will also provide issues that may interest you.</p>
<ul>
<li><a href="https://help-wanted.emberjs.com">https://help-wanted.emberjs.com</a></li>
<li><a href="https://github.com/emberjs">https://github.com/emberjs</a></li>
<li><a href="https://github.com/ember-cli">https://github.com/ember-cli</a></li>
<li><a href="https://github.com/ember-data">https://github.com/ember-data</a></li>
<li><a href="https://github.com/ember-learn">https://github.com/ember-learn</a></li>
</ul>
<p>For more information, you can visit <a href="https://hacktoberfest.digitalocean.com/details">Hacktoberfest Details</a> and <a href="https://hacktoberfest.digitalocean.com/faq">Hacktoberfest FAQ</a>.</p>
<hr />
<h2 id="ciwithgithubactionsforemberappspart2httpscrunchingnumberslive20200831ciwithgithubactionsforemberappspart2"><a href="https://crunchingnumbers.live/2020/08/31/ci-with-github-actions-for-ember-apps-part-2/">CI with GitHub Actions for Ember Apps: Part 2 🎥</a></h2>
<p>In continuation of a blog post on <a href="https://crunchingnumbers.live/2020/03/17/ci-with-github-actions-for-ember-apps/">CI with GitHub Actions for Ember Apps</a>, <a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a> wrote another <a href="https://crunchingnumbers.live/2020/08/31/ci-with-github-actions-for-ember-apps-part-2/">blog post</a> about how Github Actions saved time on his projects. He talks about how to migrate to v2 actions, lower the runtime costs, and set up continuous deployment for your Ember apps.</p>
<p>If you are looking to setup Github Actions for your Ember apps, you should give <a href="https://crunchingnumbers.live/2020/03/17/ci-with-github-actions-for-ember-apps/">this blog post a read here</a>.</p>
<hr />
<h2 id="celebrate3addonmajorreleaseshttpsgithubcomtypedemberemberclitypescriptreleasestagv400"><a href="https://github.com/typed-ember/ember-cli-typescript/releases/tag/v4.0.0">Celebrate 3 addon major releases 🌟</a></h2>
<p>Three Ember addons recently published a major release:</p>
<ul>
<li><a href="https://github.com/typed-ember/ember-cli-typescript/releases/tag/v4.0.0">ember-cli-typescript v4.0.0</a>, in addition to introducing internal tests, enables the use of the <a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#the-usedefineforclassfields-flag-and-the-declare-property-modifier"><code>declare</code> property modifier</a>. Please check that <code>ember-cli-babel &gt;= v7.17.0</code> and <code>ember-auto-import &gt;= v1.6.0</code> (the latter if you use it).</li>
<li><a href="https://github.com/empress/empress-blog/releases/tag/v2.0.0">empress-blog v2.0.0</a> <a href="https://twitter.com/real_ate/status/1301536390845534208">significantly reduces the bundle size</a> of most sites built with <code>empress-blog</code>.</li>
<li><a href="https://github.com/ember-cli/eslint-plugin-ember/releases/tag/v9.0.0">eslint-plugin-ember v9.0.0</a> recommends 6 rules and provides an option to 3 existing rules.</li>
</ul>
<p>We thank all contributors who made these major releases possible: <a href="https://github.com/Bouke">Bouke Haarsma (@Bouke)</a>, <a href="https://github.com/bmish">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/mansona">Chris Mansona (@mansona)</a>, <a href="https://github.com/dfreeman">Dan Freeman (@dfreeman)</a>, <a href="https://github.com/hjdivad">David Hamilton (@hjdivad)</a>, <a href="https://github.com/mrloop">Ewan McDougall (@mrloop)</a>, <a href="https://github.com/jamescdavis">James Davis (@jamescdavis)</a>, and <a href="https://github.com/nickschot">Nick Schot (@nickschot)</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/andreyfel" rel="noopener noreferrer" target="_blank">Andrey Fel (@andreyfel)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/chrisvdp" rel="noopener noreferrer" target="_blank">Chris van der Ploeg (@chrisvdp)</a>, <a href="https://github.com/ckarlbe" rel="noopener noreferrer" target="_blank">Kalle (@ckarlbe)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/knownasilya" rel="noopener noreferrer" target="_blank">Ilya Radchenko (@knownasilya)</a>, <a href="https://github.com/krisselden" rel="noopener noreferrer" target="_blank">Kris Selden (@krisselden)</a>, <a href="https://github.com/lifeart" rel="noopener noreferrer" target="_blank">Alex Kanunnikov (@lifeart)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/theenadayalank" rel="noopener noreferrer" target="_blank">Theenadayalan (@theenadayalank)</a>, <a href="https://github.com/toh995" rel="noopener noreferrer" target="_blank">@toh995</a>, and <a href="https://github.com/wycats" rel="noopener noreferrer" target="_blank">Yehuda Katz (@wycats)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Isaac Lee, Jared Galanis, Abhilash LR, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-163</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-163</guid><pubDate>Fri, 11 Sep 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 164]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Hacktoberfest + The Ember Times ✍️,
a new reference page for Ember CLI commands 🔖,
migrating off of mixins in Ember Octane 👋,
async data and autotracking in Ember Octane ✨,
autotracking developer experience 🔥,
ember-concurrency 2.0.0.beta-1 🎉,
and last, but not least, EmberJS with REST API 💪!</p>
<!-- READMORE -->
<hr />
<h2 id="hacktoberfesttheembertimeshttpsgithubcomemberlearnemberblogblobmaincontributingmdwritingfortheembertimes"><a href="https://github.com/ember-learn/ember-blog/blob/main/CONTRIBUTING.md#writing-for-the-ember-times">Hacktoberfest + The Ember Times ✍️</a></h2>
<!--alex ignore host-hostess-->
<p><a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest</a> is a celebration of open source open to everyone in the global GitHub community. Whether you’re a developer, student learning to code, event host, or company of any size, you can help drive growth of open source and make positive contributions to an ever-growing community. All backgrounds and skill levels are encouraged to complete the challenge!</p>
<p>Need ideas for Hacktoberfest contributions? Or looking to get started in open source? We suggest working with us on the <a href="https://github.com/ember-learn/ember-blog/pull/778">next Ember Times issue</a>! As you may know, The Ember Times is the newsletter for the official <a href="https://blog.emberjs.com/">Ember Blog</a>. As writer, you will take on an active role in the Ember community and keep up with the latest events and discoveries. Prior experience in technical writing isn't required, as we will be happy to mentor and pair with you. We also encourage everyone around the globe to join; don't worry if English is your second language (or third, etc.).</p>
<p>Are you interested? You can reach out to the team in a few different ways:</p>
<ul>
<li>Chat with us on Discord in <a href="https://discord.com/channels/480462759797063690/485450546887786506">#support-ember-times channel</a>.</li>
<li>Leave a comment in the <a href="https://github.com/ember-learn/ember-blog/pulls">ember-blog</a> repo. We have a running list of topics that you can claim for the upcoming <a href="https://github.com/ember-learn/ember-blog/pull/778">October 9th issue</a> of The Ember Times!</li>
<li>Tweet us <a href="https://twitter.com/embertimes"><code>@embertimes</code> on Twitter</a>.</li>
</ul>
<p>In addition to supporting Ember and open source, participants will receive a limited edition T-shirt or can choose to plant a tree! We look forward to hearing from you soon! 🥰</p>
<hr />
<h2 id="anewreferencepageforemberclicommandshttpscliemberjscomreleaseadvanceduseclicommandsreference"><a href="https://cli.emberjs.com/release/advanced-use/cli-commands-reference/">A new reference page for Ember CLI commands 🔖</a></h2>
<p>The Ember CLI Guides has a new webpage that lists <a href="https://cli.emberjs.com/release/advanced-use/cli-commands-reference/">all Ember CLI commands</a>. Please bookmark it for reference and onboarding new developers.</p>
<p>As you can imagine, the list of commands and command options grew over time so documenting it for the CLI Guides wasn't a trivial task. We'd like to recognize <a href="https://github.com/fozy81">Tim (@fozy81)</a> for their amazing contribution. 💯</p>
<p>As always, you can check commands and command options in your terminal by running <code>ember --help</code>. Please feel free to provide feedback for the new webpage. If you see incorrect or missing information, you can open an issue in the <a href="https://github.com/ember-learn/cli-guides">cli-guides</a> repo.</p>
<hr />
<h2 id="migratingoffofmixinsinemberoctanehttpsv5chriskrychocomjournalmigratingoffofpromiseproxymixininemberoctane"><a href="https://v5.chriskrycho.com/journal/migrating-off-of-promiseproxymixin-in-ember-octane/">Migrating off of mixins in Ember Octane 👋</a></h2>
<p>Greetings from Ember Times HQ! We had a <strong>Readers' Question</strong> come in:</p>
<blockquote>
  <p>What's the recommended alternative for <code>Ember.Mixin</code> in Octane?</p>
</blockquote>
<p>In Classic Ember, if you wanted to define a piece of DOM behavior that you could reuse across your application, you would define a component <code>Mixin</code> that implemented the appropriate lifecycle hooks. As of Ember 3.15, the Ember project recommends Ember Octane for new applications and addons. And idiomatic Octane recommends that you avoid mixins. Going back to <a href="https://blog.emberjs.com/2019/12/20/octane-is-here.html">Octane is Here</a>, <a href="https://github.com/wycats">Yehuda Katz (@wycats)</a> gives a migration example. Element modifiers provide a new way to reuse DOM behavior, without some of the drawbacks that mixins have.</p>
<h3 id="beforeclassicembermixins">Before (Classic Ember): Mixins</h3>
<pre><code class="javascript language-javascript">import Mixin from '@ember/object/mixin';

export default Mixin.create({
  didInsertElement() {
    this._super();
    activateTabs(this.element);
  }

  willDestroyElement() {
    this._super();
    deactivateTabs(this.element);
  }
})
</code></pre>
<p>And then you would use the <code>Mixin</code> in a component like this:</p>
<pre><code class="javascript language-javascript">import Component from '@ember/component';

export default Component.extend(Tabs, {
  // ...
});
</code></pre>
<h3 id="afteremberoctaneelementmodifiers">After (Ember Octane): Element modifiers</h3>
<p>This is what our <code>Tabs</code> mixin looks like when reimplemented as a modifier.</p>
<pre><code class="javascript language-javascript">import { modifier } from 'ember-modifier';

export default modifier(element =&gt; {
  activateTabs(element);

  return () =&gt; deactivateTabs(element);
});
</code></pre>
<p>Since element modifiers work on any element, you don't need to create a whole component to create reusable DOM behavior. You can use a modifier on any element with this element modifier syntax.</p>
<pre><code class="handlebars language-handlebars">&lt;div {{tabs}}&gt;&lt;/div&gt;
</code></pre>
<p>Continuing further on the subject of mixins, <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> recently blogged about <a href="https://v5.chriskrycho.com/journal/migrating-off-of-promiseproxymixin-in-ember-octane/">Migrating Off of PromiseProxyMixin in Ember Octane</a>. A common pattern in many Classic Ember apps and addons was to use <code>PromiseProxyObject</code> mixin with <code>ObjectProxy</code> to expose the state of a promise to end users, and to make accessing the resolved data more convenient. Be sure to read the <a href="https://v5.chriskrycho.com/journal/migrating-off-of-promiseproxymixin-in-ember-octane/">blog post</a> for a deeper dive into a few suggested ways to approach a rewrite with a lightweight, auto-tracked, and Octane-ready solution.</p>
<p>P.S. Looking to future-proof no mixins in your codebase? We suggest enabling the handy <a href="https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/no-mixins.md">no-mixins rule on eslint-plugin-ember</a>.</p>
<hr />
<h2 id="blogpostasyncdataandautotrackinginemberoctanehttpsv5chriskrychocomjournalasyncdataandautotrackinginemberoctane"><a href="https://v5.chriskrycho.com/journal/async-data-and-autotracking-in-ember-octane/">Blog post: Async data and autotracking in Ember Octane ✨</a></h2>
<p>A new blog post from <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> talks about <a href="https://v5.chriskrycho.com/journal/async-data-and-autotracking-in-ember-octane/">Async Data and Autotracking in Ember Octane</a>. This blog post is a continuation of our previous writeup on <a href="https://v5.chriskrycho.com/journal/migrating-off-of-promiseproxymixin-in-ember-octane/">Migrating Off of PromiseProxyMixin in Ember Octane</a>, which describes a way to divest mixin and inheritance in favor of composition. Chris does this by using a <a href="https://gist.github.com/chriskrycho/306a82990dd82203073272e055df5cd1">load helper</a> and a new <code>AsyncData</code> structure.</p>
<p>The new blog goes through treating that <code>AsyncData</code> as ordinary data, but making sure to handle all states (loading, loaded, error). By integrating with tracked properties, the <code>AsyncData</code> class reacts to its modeled states and internals, handling this transition for us. This enables us to access the data returned from the load helper as normal data and react based on its state.</p>
<pre><code class="javascript language-javascript">import Component from '@glimmer/component';
import { load } from 'my-app/helpers/load';
import { fetchSomeData } from 'my-app/data/fetchers';

export default class Neato extends Component {
  get data() {
    return load(fetchSomeData(this.args.userId));
  }

  get displayData() {
    switch (this.data.state) {
      case 'LOADING':
        return 'loading...';
      case 'LOADED':
        return this.data.value;
      case 'ERROR':
        return `Whoops! Something went wrong! ${this.data.error.message}`;
    }
  }
}
</code></pre>
<p>Read more on the <a href="https://v5.chriskrycho.com/journal/async-data-and-autotracking-in-ember-octane/">full blog post on Chris’s blog</a>.</p>
<hr />
<h2 id="autotrackingdeveloperexperiencehttpsv5chriskrychocomjournalautotrackingelegantdxviacuttingedgecs"><a href="https://v5.chriskrycho.com/journal/autotracking-elegant-dx-via-cutting-edge-cs/">Autotracking developer experience 🔥</a></h2>
<p>If you couldn't get enough from <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a>, there's even more! 😄  </p>
<p>How does autotracking in Ember or Glimmer work? How does it improve developer experience? Which computer science concepts make it possible? (Answer: Lamport clocks 🤯)</p>
<p>If you're ready to learn a bit more about how efficient the autotracking system in Ember or Glimmer apps can be, you should head on over to the <a href="https://v5.chriskrycho.com/journal/autotracking-elegant-dx-via-cutting-edge-cs/">post</a>.</p>
<p>Rest assured, it's a pretty approachable explanation of some complex topics that we as Ember users benefit from in an Octane world. All are encouraged to go check it out!</p>
<hr />
<h2 id="emberconcurrency200beta1httpstwittercomm4xm4nstatus1308945677800681473"><a href="https://twitter.com/m4xm4n/status/1308945677800681473">ember-concurrency 2.0.0.beta-1 🎉</a></h2>
<p>There's a <a href="https://github.com/machty/ember-concurrency/releases/tag/2.0.0-beta.1">new beta release</a> of <code>ember-concurrency</code>! Thanks to the hard work of <a href="https://github.com/maxfierke">Max Fierke (@maxfierke)</a> 2.0.0.beta-1 introduces <code>@tracked</code> on Ember 3.16+, removes the ability to directly use the <code>{{action}}</code> helper, and removes the <code>get</code> and <code>set</code> compatibility methods from <code>Task</code>, <code>TaskGroup</code>, and <code>TaskInstance</code>.</p>
<p>As Max mentions in his tweet, 2.x is largely compatible with 1.x. For users that maintain addons that depend on <code>ember-concurrency</code>, it would be very helpful if you can use a wider version range so that some folks can try the 2.x betas and others can upgrade when they're able to.</p>
<p>More information about this and about upgrading to 2.0.0-beta.1 and other future 2.x releases in
general can be found in the <a href="https://github.com/machty/ember-concurrency/blob/v2/UPGRADING-2.x.md">upgrade document</a>.</p>
<p>Go ahead and give the <a href="https://github.com/machty/ember-concurrency/releases/tag/2.0.0-beta.1">release</a> notes a read.</p>
<hr />
<h2 id="emberjswithrestapihttpsjcwebconceptsnetemberjswithrestapi"><a href="https://jcwebconcepts.net/emberjs-with-rest-api/">EmberJS with REST API 💪</a></h2>
<p><a href="https://twitter.com/jrock2004">John Costanzo (@jrock2004)</a> wrote a blog titled <a href="https://jcwebconcepts.net/emberjs-with-rest-api/">EmberJS with REST API</a>. The blog explains how to get your APIs to work well with Ember Data out of the box, if it follows REST API conventions. If your APIs don't follow REST conventions, the post gives details about how to modify your Ember app serializer to make it work with Ember Data.</p>
<p>The blog also discusses using <a href="https://api.emberjs.com/ember-data/release/classes/JSONAPISerializer/methods/keyForAttribute?anchor=keyForAttribute"><code>keyForAttribute</code></a> to make some of the manual work a little easier, so that you do not have to map each API property to the Ember model property. Head over to <a href="https://jcwebconcepts.net/emberjs-with-rest-api/">the blog post</a> today and give it a read.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/bobisjan" rel="noopener noreferrer" target="_blank">Jan Bobisud (@bobisjan)</a>, <a href="https://github.com/chadhietala" rel="noopener noreferrer" target="_blank">Chad Hietala (@chadhietala)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/cloke" rel="noopener noreferrer" target="_blank">Cory Loken (@cloke)</a>, <a href="https://github.com/dmytro-krekota" rel="noopener noreferrer" target="_blank">Dmytro Krekota (@dmytro-krekota)</a>, <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/hergaiety" rel="noopener noreferrer" target="_blank">Ava Gaiety Wroten (@hergaiety)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/JamesS-M" rel="noopener noreferrer" target="_blank">@JamesS-M</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/jfdnc" rel="noopener noreferrer" target="_blank">Jacob (@jfdnc)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/knownasilya" rel="noopener noreferrer" target="_blank">Ilya Radchenko (@knownasilya)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">@patricklx</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/ro0gr" rel="noopener noreferrer" target="_blank">Ruslan Hrabovyi (@ro0gr)</a>, <a href="https://github.com/rreckonerr" rel="noopener noreferrer" target="_blank">Volodymyr Radchenko (@rreckonerr)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/tempo22" rel="noopener noreferrer" target="_blank">Nicolas Fléron (@tempo22)</a>, and <a href="https://github.com/wycats" rel="noopener noreferrer" target="_blank">Yehuda Katz (@wycats)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Abhilash LR, Chris Ng, Jared Galanis, Isaac Lee, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-164</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-164</guid><pubDate>Fri, 25 Sep 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 165]]></title><description><![CDATA[<p>வணக்கம் Emberistas! 🐹</p>
<p>Hacktoberfest 2020 events and info 🎃,
read the new RFC to deprecate <code>tryInvoke</code> 📜,
tips for switching from Ember Data to Ember Orbit 💡,
read the blog post on Ember Octane with Glimmer Components ✨,
and last, but not least, September EmberJS Chennai Meetup 🇮🇳 !</p>
<!-- READMORE -->
<hr />
<h2 id="hacktoberfest2020eventsandinfohttpsblogemberjscom20201001hacktoberfesthtml"><a href="https://blog.emberjs.com/2020/10/01/hacktoberfest.html">Hacktoberfest 2020 events and info 🎃</a></h2>
<p>Have you always wanted to contribute to open source, but don't know where to start? The month of October is the perfect time to give it a try!</p>
<!-- alex disable special just gal-guy gals-men-->
<p><a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest</a> is an annual celebration of open source happens around the world, in thousands of projects on GitHub. Here in Ember land, we have lined up special events, mentoring, pairing, and more. You can read the full details in the <a href="https://blog.emberjs.com/2020/10/01/hacktoberfest.html">Ember blog</a>, but here are the highlights:</p>
<ul>
<li>Tomorrow on <strong>Saturday, October 10th</strong>, drop into a pairing session! You can join voice chat on <a href="https://emberjs.com/community/">Ember Discord</a>, where mentors are available to to take your questions, give some advice, and do pair programming during two sessions. Just jump into the "General" voice channel on Discord, all the way at the bottom of the channels list. <strong>Mentors are available <a href="https://meetingzone.app/utc/saturday/1300">9am-10am ET</a>, and <a href="https://meetingzone.app/utc/sunday/0100">9pm-10pm ET</a></strong>. Click the links to see times in your own time zone.</li>
<li>You can <strong>join the <a href="https://discord.com/channels/480462759797063690/496453502298750988">#hacktoberfest</a> chat channel</strong> that is open all day, every day. Volunteers are also keeping an eye there for questions or help reviewing pull requests.</li>
<li>On October 16th, there is a <strong>sold out</strong> Contributors Workshop. If you are registered and can't make it, please let the organizers know so that someone else can join!</li>
<li>If you are a <strong>parent, person of color, LGBTQ+, or woman,</strong> check out our channels for these groups! They are another great place to connect with others and maybe find a pairing buddy. <span style="font-style: italic;">Please note we are welcoming and respectful of trans women and any others who identify as women in a way that is significant to them.</span></li>
<li>If you belong to one of those groups but have not joined the channel yet, you can ask in the <a href="https://discord.com/channels/480462759797063690/480499718330253342">#discord-server-admin</a> channel or send a direct message to Melanie Sumner.</li>
</ul>
<!-- alex enable special just gal-guy gals-men-->
<hr />
<h2 id="rfcdeprecatetryinvokehttpsgithubcomemberjsrfcspull673"><a href="https://github.com/emberjs/rfcs/pull/673">RFC: Deprecate tryInvoke 📜</a></h2>
<p><a href="https://github.com/bachvo">Bach Vo (@bachvo)</a> created a new RFC to <a href="https://github.com/emberjs/rfcs/pull/673">deprecate tryInvoke</a>. It builds on top of the previous <a href="https://emberjs.github.io/rfcs/0554-deprecate-getwithdefault.html">RFC to deprecate getWithDefault</a>.</p>
<p>The author explains that, in most cases, function arguments should not be optional. In the rare occasion that it is optional, the Javascript language has <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining">optional chaining</a> so we can deprecate the usage of <code>tryInvoke</code>.</p>
<p>Before:</p>
<pre><code class="javascript language-javascript">import { tryInvoke } from '@ember/utils';

foo() {
 tryInvoke(this.args, 'bar', ['baz']);
}
</code></pre>
<p>After:</p>
<pre><code class="javascript language-javascript">foo() {
 this.args.bar?.('baz');
}
</code></pre>
<p>Read the full <a href="https://github.com/emberjs/rfcs/pull/673">RFC on Github</a>!</p>
<hr />
<h2 id="switchingfromemberdatatoemberorbithttpsmediumcomswlhswitchingfromemberdatatoemberorbit82e202248f1c"><a href="https://medium.com/swlh/switching-from-ember-data-to-ember-orbit-82e202248f1c">Switching from ember-data to ember-orbit 💡</a></h2>
<p><a href="https://github.com/derekwsgray">Derek Gray (@derekwsgray)</a> encountered a business requirement to provide an Undo/Redo feature in a large Ember app. While gradually updating the app to rely on <a href="https://github.com/orbitjs/ember-orbit">ember-orbit</a>, Derek recorded <a href="https://medium.com/swlh/switching-from-ember-data-to-ember-orbit-82e202248f1c">tips and changes that you will want to consider</a> when you are in a similar situation. Perhaps you will want to leverage other Orbit features (offline cache, transaction logs, background sync strategies).</p>
<p>The blog post provides:</p>
<ul>
<li>A list of introductory reference materials</li>
<li>How to allow <code>ember-data</code> and <code>ember-orbit</code> to coexist during migration</li>
<li>How to convert <code>ember-data</code> syntax to <code>ember-orbit</code></li>
</ul>
<p>We encourage you to check it out and bookmark the link for future reference!</p>
<hr />
<h2 id="blogpostemberoctanewithglimmercomponentshttpssimplabscomblog20201005simplerandmorepowerfulcomponentsinemberoctanewithglimmercomponents"><a href="https://simplabs.com/blog/2020/10/05/simpler-and-more-powerful-components-in-ember-octane-with-glimmer-components/">Blog Post: Ember Octane with Glimmer Components ✨</a></h2>
<p><a href="https://github.com/locks">Ricardo Mendes (@locks)</a> in a blog post, goes through the challenges of building apps using classic Ember components and how Glimmer components address them in a modern, clean way. He goes through building Glimmer components from the viewpoint of classic Ember Components. Improvements include:</p>
<ul>
<li>Glimmer components use native class syntax and do not extend from EmberObject.</li>
<li>Separation of internal state (properties) and external state (arguments).</li>
<li>HTML-first approach makes for a much simpler API surface.</li>
</ul>
<p>With improvements such as Native Class Syntax, reducing the API surface, and removing framework gotchas like components adding a default <code>&lt;div&gt;</code> around itself provide the ability to reason about the code locally instead of having to rely on the framework knowledge.</p>
<p>Read the full blog post on <a href="https://simplabs.com/blog/2020/10/05/simpler-and-more-powerful-components-in-ember-octane-with-glimmer-components/">Simpler and more powerful components in Ember Octane with Glimmer Components</a> today!</p>
<hr />
<h2 id="septemberemberjschennaimeetuphttpswwwyoutubecomplaylistlistplh_rf0qob_syxufhvyflg8xmxwymsfwki"><a href="https://www.youtube.com/playlist?list=PLh_rF0Qob_syXUFhvYFLg8XmXWymsfWKi">September EmberJS Chennai Meetup 🇮🇳</a></h2>
<p>On September 4th, 2020, EmberJS Chennai featured five speakers at their fourth Meetup and the first virtual one. Topics included:</p>
<ul>
<li><a href="https://youtu.be/EvkRpoeikWI">Contextual component design</a> by Bhuvaneshwari K</li>
<li><a href="https://youtu.be/yp4PVKEjcqQ">Progressive Web App using EmberJS</a> by Monisha S</li>
<li><a href="https://youtu.be/-IKEDqXTbdQ">Sequential rendering with EmberJS</a> by <a href="https://twitter.com/kaelinralav">Kanalveli RA (@kaelinralav)</a></li>
<li><a href="https://youtu.be/1K712YagFE8">Degrading Ember Apps gracefully when offline</a> by Saravana Kumar V</li>
<li><a href="https://youtu.be/GCneFvINPVc">Building Bridges to the DOM with Modifiers</a> by <a href="https://twitter.com/rajasegar_c">Rajasegar Chandran (@rajasegar_c)</a></li>
</ul>
<p>You can watch all the five talks today on <a href="https://www.youtube.com/playlist?list=PLh_rF0Qob_syXUFhvYFLg8XmXWymsfWKi">YouTube playlist</a>. To learn more about EmberJS Chennai, you can visit their <a href="https://chennaiemberjs.in/">website</a> and follow them on <a href="https://twitter.com/EmberChennai">Twitter</a>, <a href="https://www.meetup.com/EmberJS-Chennai/">Meetup</a>, and the <a href="https://discordapp.com/channels/480462759797063690/562648585980739616">#as-india</a> channel on <a href="https://discord.com/invite/zT3asNS">Discord</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/34Johnny69" rel="noopener noreferrer" target="_blank">@34Johnny69</a>, <a href="https://github.com/abraaoduarte" rel="noopener noreferrer" target="_blank">Abraão Duarte (@abraaoduarte)</a>, <a href="https://github.com/allthesignals" rel="noopener noreferrer" target="_blank">Matt Gardner (@allthesignals)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/Anshu-jindal" rel="noopener noreferrer" target="_blank">@Anshu-jindal</a>, <a href="https://github.com/bachvo" rel="noopener noreferrer" target="_blank">bach vo (@bachvo)</a>, <a href="https://github.com/BarryThePenguin" rel="noopener noreferrer" target="_blank">Jonathan Haines (@BarryThePenguin)</a>, <a href="https://github.com/Benjy1979" rel="noopener noreferrer" target="_blank">Ben Glancy (@Benjy1979)</a>, <a href="https://github.com/betocantu93" rel="noopener noreferrer" target="_blank">Alberto Cantú Gómez (@betocantu93)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/BradLeftley" rel="noopener noreferrer" target="_blank">Bradley Leftley (@BradLeftley)</a>, <a href="https://github.com/chadhietala" rel="noopener noreferrer" target="_blank">Chad Hietala (@chadhietala)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/chiragpat" rel="noopener noreferrer" target="_blank">Chirag Patel (@chiragpat)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/chrisvdp" rel="noopener noreferrer" target="_blank">Chris van der Ploeg (@chrisvdp)</a>, <a href="https://github.com/hergaiety" rel="noopener noreferrer" target="_blank">Ava Gaiety Wroten (@hergaiety)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/JamesS-M" rel="noopener noreferrer" target="_blank">@JamesS-M</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/jcardali" rel="noopener noreferrer" target="_blank">Joe Cardali (@jcardali)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/jpsanantonio" rel="noopener noreferrer" target="_blank">Jayvic San Antonio (@jpsanantonio)</a>, <a href="https://github.com/jrowlingson" rel="noopener noreferrer" target="_blank">Jack Rowlingson (@jrowlingson)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/Kennie-create" rel="noopener noreferrer" target="_blank">@Kennie-create</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/KroneckerDeIta" rel="noopener noreferrer" target="_blank">@KroneckerDeIta</a>, <a href="https://github.com/lukemelia" rel="noopener noreferrer" target="_blank">Luke Melia (@lukemelia)</a>, <a href="https://github.com/mahmoodhosseini" rel="noopener noreferrer" target="_blank">Mahmood Hosseini (@mahmoodhosseini)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/maxfierke" rel="noopener noreferrer" target="_blank">Max Fierke (@maxfierke)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/mixonic" rel="noopener noreferrer" target="_blank">Matthew Beale (@mixonic)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/nwhittaker" rel="noopener noreferrer" target="_blank">Nathan Whittaker (@nwhittaker)</a>, <a href="https://github.com/parikhdhruv24791" rel="noopener noreferrer" target="_blank">Dhruv Parikh (@parikhdhruv24791)</a>, <a href="https://github.com/Pustur" rel="noopener noreferrer" target="_blank">Loris Bettazza (@Pustur)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/rishikesh7355" rel="noopener noreferrer" target="_blank">Rishikesh Yadav (@rishikesh7355)</a>, <a href="https://github.com/rohitpaulk" rel="noopener noreferrer" target="_blank">Paul Kuruvilla (@rohitpaulk)</a>, <a href="https://github.com/ronan-f" rel="noopener noreferrer" target="_blank">Ronan Fegan (@ronan-f)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/sdahlbac" rel="noopener noreferrer" target="_blank">Simon Dahlbacka (@sdahlbac)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/takshch" rel="noopener noreferrer" target="_blank">Taksh Chanana (@takshch)</a>, <a href="https://github.com/thisisgarv" rel="noopener noreferrer" target="_blank">@thisisgarv</a>, <a href="https://github.com/wycats" rel="noopener noreferrer" target="_blank">Yehuda Katz (@wycats)</a>, <a href="https://github.com/XenomShox" rel="noopener noreferrer" target="_blank">@XenomShox</a>, <a href="https://github.com/xuanluong" rel="noopener noreferrer" target="_blank">Sean Luong (@xuanluong)</a>, <a href="https://github.com/ygongdev" rel="noopener noreferrer" target="_blank">Yicheng (Jerry) Gong (@ygongdev)</a>, and <a href="https://github.com/zabrinatan" rel="noopener noreferrer" target="_blank">Zabrina (@zabrinatan)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Isaac Lee, Chris Ng, Jen Weber, Abhilash LR, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-165</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-165</guid><pubDate>Fri, 09 Oct 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 166]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>New RFC to Deprecate transition methods of Controller and Route ✍️,
learn what's new in the Ember 3.22 release 🎉
read the blog post on React component patterns in Ember ⚛️,
Glimmer VM tracking video 📹,
Deprecate tryInvoke RFC enters Final Comment Period 📜,
EmberMap Octane conversion video 📼,
and last, but not least, built with Ember: Emojible 🥳!</p>
<!-- READMORE -->
<hr />
<h2 id="rfcdeprecatetransitionmethodsofcontrollerandroutehttpsgithubcomemberjsrfcspull674"><a href="https://github.com/emberjs/rfcs/pull/674">RFC: Deprecate transition methods of Controller and Route ✍️</a></h2>
<p><a href="https://github.com/jelhan">Jeldrik Hanschke (@jelhan)</a> proposed a new RFC to <a href="https://github.com/emberjs/rfcs/pull/674">Deprecate transition methods of Controller and Route</a> in order to reduce public API exposed related to routing.</p>
<p>The RFC aims to deprecate the methods <code>transitionTo</code> and <code>replaceWith</code> of the Route object and the methods <code>transitionToRoute</code> and <code>replaceRoute</code> of the Controller object. The existing methods <code>transitionTo</code> and <code>replaceWith</code> of the RouterService object should be used instead.</p>
<p>The RFC proposes that the existing methods are today not documented properly so there are likely timing differences between the different routing calls even if from the outside they function the same. Supporting different ways to do the same increases complexity without providing much value and limiting options will make learning the framework easier for new developers.</p>
<p>Read and comment on the <a href="https://github.com/emberjs/rfcs/pull/674">full RFC on GitHub</a>!</p>
<hr />
<h2 id="learnwhatsnewintheember322releasehttpsblogemberjscom20201020ember322releasedhtml"><a href="https://blog.emberjs.com/2020/10/20/ember-3-22-released.html">Learn what's new in the Ember 3.22 release 🎉</a></h2>
<!--alex ignore host-hostess-->
<p>The Ember Blog <a href="https://blog.emberjs.com/2020/10/20/ember-3-22-released.html">announced the v3.22 releases</a> of Ember.js, Ember Data, and Ember CLI. There were a host of bug fixes across the board, one deprecation for Ember Data and several new features for Ember.js.</p>
<p>The release of version 3.22 introduced some new features you may want to be aware of in Ember.js:</p>
<!--alex ignore savage-->
<ol>
<li>Enabled <code>@ember/destroyable</code> API, which allows you to create and manage your own destroyables. For more information, please see the <a href="https://emberjs.github.io/rfcs/0580-destroyables.html">Destroyables RFC</a>.</li>
<li>Enabled Cache API, a low-level primitive for memoizing the result of a function based on autotracking. (You can install a <a href="https://github.com/ember-polyfills/ember-cache-primitive-polyfill">polyfill</a> for apps between versions 3.13 and 3.21.) For more information, please check the <a href="https://guides.emberjs.com/release/in-depth-topics/autotracking-in-depth/#toc_caching-of-tracked-properties">Ember Guides</a> and <a href="https://emberjs.github.io/rfcs/0615-autotracking-memoization.html">Autotracking Memoization RFC</a>.</li>
<li>Allowed passing the <code>transition</code> object to 2 route hooks, <code>activate</code> and <code>deactivate</code>.</li>
</ol>
<p>Additionally, Ember Data 3.22 introduced a deprecation for use of <code>najax</code> in favor of <code>ember-fetch</code> when fastboot is installed. And for new apps, Ember CLI 3.22 will install v9 or higher of <code>eslint-plugin-ember</code>, which may limit the version of Node that you use.</p>
<p>The release also kicked off the 3.23 beta cycle. If you can, please help with testing beta builds and reporting bugs before version 3.23.0 is published!</p>
<hr />
<h2 id="reactcomponentpatternsinemberjshttpswwweffectiveembercomblogreactcomponentpatterns"><a href="https://www.effective-ember.com/blog/react-component-patterns/">React component patterns in Ember.js ⚛️</a></h2>
<p><a href="https://github.com/LevelbossMike">Michael Klein (@LevelbossMike)</a> wrote a blog post comparing modern Ember with React. While not an expert on React, Michael goes through how <a href="https://dev.to/alexi_be3/react-component-patterns-49ho">React tackles challenges</a> when implementing SPAs. The blog goes through 3 different component patterns: Compound Component Pattern, Flexible Compound Component Pattern, and Provider Pattern - to see how each one is implemented in React and Ember.</p>
<!--alex ignore obvious-->
<p>The blog argues that the <a href="https://emberjs.com/editions/octane/">Octane Edition</a> of Ember provides conventions that help you fall into the pit of success instead of only giving you low-level primitives to solve common challenges in a multitude of ways with different tradeoffs that only seem to be obvious to people that are experts in React.</p>
<p>Read the full blog post where Michael compares each pattern with code samples in the <a href="https://www.effective-ember.com/blog/react-component-patterns/">Effective Ember blog</a>!</p>
<hr />
<h2 id="glimmervmtrackingvideohttpswwwyoutubecomwatchvbjkersrppei"><a href="https://www.youtube.com/watch?v=BjKERSRpPeI">Glimmer VM Tracking Video 📹</a></h2>
<p>We've had some nice blog posts on the subject of tracking in Octane recently, but if you've been wondering about how tracking works in the ✨✨Glimmer VM✨✨ and you learn better by audio visual 🔊📼 methods, you may want to check out the <a href="https://www.youtube.com/watch?v=BjKERSRpPeI">video on YouTube</a> that <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> and <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> put out at the beginning of September on the subject.</p>
<p>It's a very nice opportunity to watch and listen to two framework contributors discuss the internals of tracking in the Glimmer VM - we hope they put out another one soon!</p>
<hr />
<h2 id="deprecatetryinvokerfcentersfinalcommentperiodhttpstwittercomemberjsstatus1319720127320018944"><a href="https://twitter.com/emberjs/status/1319720127320018944">Deprecate tryInvoke RFC enters Final Comment Period 📜</a></h2>
<p><a href="https://github.com/bachvo">Bach Vo (@bachvo)</a> created a new RFC to <a href="https://github.com/emberjs/rfcs/pull/673">deprecate tryInvoke</a>, and we covered this a few weeks back.</p>
<p>You may recall that this RFC builds on top of the previous <a href="https://emberjs.github.io/rfcs/0554-deprecate-getwithdefault.html">RFC to deprecate getWithDefault</a>.</p>
<!--alex ignore just-->
<p>Well this newer RFC has just entered Final Comment Period, so you should head on over to the <a href="https://github.com/emberjs/rfcs/pull/673">RFC</a> and provide your thoughts while you still can.</p>
<hr />
<h2 id="embermapoctaneconversionvideohttpstwittercomember_mapstatus1319715247423369216"><a href="https://twitter.com/ember_map/status/1319715247423369216">EmberMap Octane conversion video 📼</a></h2>
<p>The good folks over at EmberMap are kicking off a new video series lead by <a href="https://github.com/cadeParade">Lindsay Cade (@cadeParade)</a> on converting to Octane and the <a href="https://embermap.com/topics/converting-to-octane-first-look/converting-a-model">first look video</a> is out now 🎉!</p>
<p>The video covers how to convert an Ember Model to native class syntax and it is 💸 free 💸, so go watch the first in what is sure to be an awesome series of videos on Octane conversions!</p>
<hr />
<h2 id="builtwithemberemojiblehttpscreatoremojiblestore"><a href="https://creator.emojible.store/">Built with Ember: Emojible 🥳</a></h2>
<p>We're big fans of emojis here at The Ember Times. With <a href="https://creator.emojible.store/">Emojible</a>, now you can create <strong>your own</strong> emojis! Show everyone how you really feel! Save your custom emojis and use them on Slack, Telegram, Signal, or anywhere you want to add some flair. From the <a href="https://twitter.com/emojible/status/1318534253471256576">announcement on Twitter</a>, we learned that the site was built with Ember.js! Awesome to see Ember on such a fun project. May we suggest a Tomster face in the next release?!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/34Johnny69" rel="noopener noreferrer" target="_blank">@34Johnny69</a>, <a href="https://github.com/69LaudaLassan69" rel="noopener noreferrer" target="_blank">@69LaudaLassan69</a>, <a href="https://github.com/ackzell" rel="noopener noreferrer" target="_blank">Axel Uriel Martínez Castillo (@ackzell)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/andreisebastianc" rel="noopener noreferrer" target="_blank">Andrei Sebastian Cîmpean (@andreisebastianc)</a>, <a href="https://github.com/AndriyTykhan" rel="noopener noreferrer" target="_blank">Andrii Tykhan (@AndriyTykhan)</a>, <a href="https://github.com/aredshaw" rel="noopener noreferrer" target="_blank">Aaron K Redshaw (@aredshaw)</a>, <a href="https://github.com/BarryThePenguin" rel="noopener noreferrer" target="_blank">Jonathan Haines (@BarryThePenguin)</a>, <a href="https://github.com/bobisjan" rel="noopener noreferrer" target="_blank">Jan Bobisud (@bobisjan)</a>, <a href="https://github.com/BradenLawrence" rel="noopener noreferrer" target="_blank">Braden Lawrence (@BradenLawrence)</a>, <a href="https://github.com/cah-johnryan" rel="noopener noreferrer" target="_blank">John Ryan (@cah-johnryan)</a>, <a href="https://github.com/cechus" rel="noopener noreferrer" target="_blank">Oscar Choque (@cechus)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/chiragpat" rel="noopener noreferrer" target="_blank">Chirag Patel (@chiragpat)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/chrisvdp" rel="noopener noreferrer" target="_blank">Chris van der Ploeg (@chrisvdp)</a>, <a href="https://github.com/DeepakPanda02" rel="noopener noreferrer" target="_blank">Deepak Panda (@DeepakPanda02)</a>, <a href="https://github.com/elwayman02" rel="noopener noreferrer" target="_blank">Jordan Hawker (@elwayman02)</a>, <a href="https://github.com/fabriciotav" rel="noopener noreferrer" target="_blank">Fabrício Tavares (@fabriciotav)</a>, <a href="https://github.com/fletcherrippon" rel="noopener noreferrer" target="_blank">Fletcher Rippon (@fletcherrippon)</a>, <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/gnclmorais" rel="noopener noreferrer" target="_blank">Gonçalo Morais (@gnclmorais)</a>, <a href="https://github.com/hbutau" rel="noopener noreferrer" target="_blank">Humphrey Butau (@hbutau)</a>, <a href="https://github.com/hverma73" rel="noopener noreferrer" target="_blank">Harsh Verma (@hverma73)</a>, <a href="https://github.com/Ian-Yy" rel="noopener noreferrer" target="_blank">Yyee (@Ian-Yy)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/JamesS-M" rel="noopener noreferrer" target="_blank">@JamesS-M</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/jbryson3" rel="noopener noreferrer" target="_blank">John Bryson (@jbryson3)</a>, <a href="https://github.com/jivthesh" rel="noopener noreferrer" target="_blank">Jivthesh M R (@jivthesh)</a>, <a href="https://github.com/Jogius" rel="noopener noreferrer" target="_blank">@Jogius</a>, <a href="https://github.com/jpsanantonio" rel="noopener noreferrer" target="_blank">Jayvic San Antonio (@jpsanantonio)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/lvegerano" rel="noopener noreferrer" target="_blank">Luis Vegerano (@lvegerano)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/manurampandit" rel="noopener noreferrer" target="_blank">Manu Ram Pandit (@manurampandit)</a>, <a href="https://github.com/mateusalexandre" rel="noopener noreferrer" target="_blank">Mateus Alexandre (@mateusalexandre)</a>, <a href="https://github.com/maxwondercorn" rel="noopener noreferrer" target="_blank">maxwondercorn (@maxwondercorn)</a>, <a href="https://github.com/mgoetzke" rel="noopener noreferrer" target="_blank">Marie Goetzke (@mgoetzke)</a>, <a href="https://github.com/mikoscz" rel="noopener noreferrer" target="_blank">Michał Staśkiewicz (@mikoscz)</a>, <a href="https://github.com/mo3taz1705" rel="noopener noreferrer" target="_blank">mo3taz1705 (@mo3taz1705)</a>, <a href="https://github.com/nag5000" rel="noopener noreferrer" target="_blank">Aleksey Nagovitsyn (@nag5000)</a>, <a href="https://github.com/Nelias" rel="noopener noreferrer" target="_blank">Michał Antropik (@Nelias)</a>, <a href="https://github.com/neojp" rel="noopener noreferrer" target="_blank">Joan Piedra (@neojp)</a>, <a href="https://github.com/NoneOfMaster" rel="noopener noreferrer" target="_blank">Russell Tepper (@NoneOfMaster)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/richgt" rel="noopener noreferrer" target="_blank">@richgt</a>, <a href="https://github.com/Rockin4Life33" rel="noopener noreferrer" target="_blank">Wayne Ritchie (@Rockin4Life33)</a>, <a href="https://github.com/rohitpaulk" rel="noopener noreferrer" target="_blank">Paul Kuruvilla (@rohitpaulk)</a>, <a href="https://github.com/rreckonerr" rel="noopener noreferrer" target="_blank">Volodymyr Radchenko (@rreckonerr)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/Rxbsxn" rel="noopener noreferrer" target="_blank">Robert Harężlak (@Rxbsxn)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/sdahlbac" rel="noopener noreferrer" target="_blank">Simon Dahlbacka (@sdahlbac)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/takshch" rel="noopener noreferrer" target="_blank">Taksh Chanana (@takshch)</a>, <a href="https://github.com/tmdtahir21" rel="noopener noreferrer" target="_blank">Mohammed Tahir (@tmdtahir21)</a>, <a href="https://github.com/Vedant-S" rel="noopener noreferrer" target="_blank">Vedant Shrivastava (@Vedant-S)</a>, <a href="https://github.com/wifelette" rel="noopener noreferrer" target="_blank">Leah Silber (@wifelette)</a>, and <a href="https://github.com/zinovik" rel="noopener noreferrer" target="_blank">@zinovik</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<blockquote>
  <p>P.S. Did we miss your past Readers' Question? We've added a new optional field to include your contact info, in case we need some clarification to answer your question in an upcoming issue. Please chat with us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter. As always, join us on Discord if you want want to write for the Ember Times or have a suggestion for next week's issue!</p></p>
</blockquote>
<div>
  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-166</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-166</guid><pubDate>Fri, 23 Oct 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 167]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>New Release and APIs for ember-a11y-testing 🎉,
two deprecation RFCs merged 🙌,
new Octane ready release of the a11y focused ember-select-light 🔦,
and last, but not least, ember-key-manager v1.0.0 ⌨️!</p>
<!-- READMORE -->
<hr />
<h2 id="release400ofembera11ytestinghttpsgithubcomembera11yembera11ytestingreleasestagv400"><a href="https://github.com/ember-a11y/ember-a11y-testing/releases/tag/v4.0.0">Release 4.0.0 of ember-a11y-testing 🎉</a></h2>
<p><a href="https://github.com/scalvert">Steve Calvert (@scalvert)</a> released 4.0.0 of <a href="https://github.com/ember-a11y/ember-a11y-testing">ember-a11y-testing</a> which included changes to the API to make it hands off in terms of running accessibility audits. The <code>ember-a11y-testing</code> library is a wrapper around <a href="https://github.com/dequelabs">Deque Labs'</a> <a href="https://github.com/dequelabs/axe-core">axe-core</a> accessibility testing engine. It integrates into your testing environment using either a one-time setup, or in individual tests using an <code>a11yAudit()</code> test helper.</p>
<p>With the new 4.0.0 release, you can do audit of your code using the regular test helper APIs by importing the <a href="https://github.com/ember-a11y/ember-a11y-testing#setupglobala11yhooks-usage"><code>setupGlobalA11yHooks</code> function</a> and invoking it in <code>tests/test-helper.js</code>. The <code>setupGlobalA11yHooks</code> function lets you write your own strategy on when to invoke the audit using the <code>shouldAudit</code> argument so you can run it all the time, for all the configured helpers, every n tests, for specific modules or test names, by route, etc.</p>
<p>Read more about the new changes to <a href="https://github.com/ember-a11y/ember-a11y-testing#setupglobala11yhooks-usage">ember-a11y-testing on GitHub</a>!</p>
<hr />
<h2 id="twodeprecationrfcsmergedhttpsgithubcomemberjsrfcs"><a href="https://github.com/emberjs/rfcs">Two deprecation RFCs merged 🙌</a></h2>
<p>On November 6th, the Ember framework team met to discuss <a href="https://github.com/emberjs/rfcs/pull/673">RFC 673: Deprecate <code>tryInvoke</code></a> and <a href="https://github.com/emberjs/rfcs/pull/674">RFC 674: Deprecate transition methods of controller and route</a>. The team decided to move both RFCs forward to the <strong>Accepted stage</strong>, which will allow the author and others to work on implementation.</p>
<p>We'd like to extend our thanks to <a href="https://github.com/bachvo">Bach Vo (@bachvo)</a> and <a href="https://github.com/jelhan">Jeldrik Hanschke (@jelhan)</a> for designing their RFCs and addressing the community's feedback. For more information, please visit the links to the RFCs above.</p>
<hr />
<h2 id="release20xofemberselectlighthttpsgithubcomembera11yemberselectlightreleasestagv200"><a href="https://github.com/ember-a11y/ember-select-light/releases/tag/v2.0.0">Release 2.0.x of ember-select-light 🔦</a></h2>
<p><a href="https://www.wroten.me/">Ava Wroten (@hergaiety)</a> released 2.0.0 of <a href="https://github.com/ember-a11y/ember-select-light/">ember-select-light</a>. You will find that the addon has moved to the <a href="https://github.com/ember-a11y">ember-a11y org</a> (join us on <a href="https://discord.com/invite/emberjs">Discord in #dev-ember-a11y</a>) and is <strong>Octane ready</strong>.</p>
<!--alex ignore simple-->
<p><strong>ember-select-light is a simple and accessible <code>&lt;select&gt;</code> dropdown component</strong> ✨. With its API, you can pass in a flat or nested array of options, or yield out to your template code that handles options. The component pairs nicely with the latest <a href="https://emberjs-1.gitbook.io/ember-component-patterns/form-components/select-element">ember-component-patterns for Select Elements</a>.</p>
<p>The 2.0.0 release drops support for older versions of Node and Ember. At minimum, Node v10 LTS and Ember.js v3.16 LTS are suggested. It also introduces some breaking syntax changes (see the <a href="https://github.com/ember-a11y/ember-select-light/blob/main/UPGRADE.md">upgrade guide</a>). Lastly, documentation has been updated.</p>
<p>Read more about the new changes to <a href="https://github.com/ember-a11y/ember-select-light/releases/tag/v2.0.0">ember-select-light on GitHub</a>!</p>
<hr />
<h2 id="emberkeymanagerv100httpsgithubcomicarusworksemberkeymanager"><a href="https://github.com/IcarusWorks/ember-key-manager">ember-key-manager v1.0.0 ⌨️</a></h2>
<p>ember-key-manager is a service for un(binding) key up and down events. <a href="https://github.com/BryanCrotaz">Bryan Crotaz (@BryanCrotaz)</a> submitted a PR that brought <a href="https://github.com/IcarusWorks/ember-key-manager">IcarusWorks/ember-key-manager</a> up to v1.0.0! With the major release, ember-key-manager now fully supports Octane, including template modifiers that can hook key presses to run component code. Learn more about ember-key-manager and similar addons under the <a href="https://emberobserver.com/categories/keyboard-events">Keyboard Events tag on Ember Observer</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/bobisjan" rel="noopener noreferrer" target="_blank">Jan Bobisud (@bobisjan)</a>, <a href="https://github.com/mehulkar" rel="noopener noreferrer" target="_blank">Mehul Kar (@mehulkar)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/Leooo" rel="noopener noreferrer" target="_blank">Lionel Viet (@Leooo)</a>, <a href="https://github.com/hergaiety" rel="noopener noreferrer" target="_blank">Ava Gaiety Wroten (@hergaiety)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/Ian-Yy" rel="noopener noreferrer" target="_blank">Yyee (@Ian-Yy)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/rreckonerr" rel="noopener noreferrer" target="_blank">Volodymyr Radchenko (@rreckonerr)</a>, <a href="https://github.com/sclaxton" rel="noopener noreferrer" target="_blank">Spencer Claxton (@sclaxton)</a>, <a href="https://github.com/jwlawrence" rel="noopener noreferrer" target="_blank">Joshua Lawrence (@jwlawrence)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/mk2" rel="noopener noreferrer" target="_blank">Haruka Asakura (@mk2)</a>, <a href="https://github.com/lukemelia" rel="noopener noreferrer" target="_blank">Luke Melia (@lukemelia)</a>, <a href="https://github.com/marcoow" rel="noopener noreferrer" target="_blank">Marco Otte-Witte (@marcoow)</a>, <a href="https://github.com/neojp" rel="noopener noreferrer" target="_blank">Joan Piedra (@neojp)</a>, <a href="https://github.com/chiragpat" rel="noopener noreferrer" target="_blank">Chirag Patel (@chiragpat)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/esbanarango" rel="noopener noreferrer" target="_blank">Esteban Arango Medina (@esbanarango)</a>, <a href="https://github.com/ratatatCat" rel="noopener noreferrer" target="_blank">@ratatatCat</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/jamescdavis" rel="noopener noreferrer" target="_blank">James C. Davis (@jamescdavis)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/boris-petrov" rel="noopener noreferrer" target="_blank">Boris Petrov (@boris-petrov)</a>, <a href="https://github.com/vvkpd" rel="noopener noreferrer" target="_blank">Vivek Pandey (@vvkpd)</a>, <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a>, <a href="https://github.com/aguynamedryan" rel="noopener noreferrer" target="_blank">Ryan Duryea (@aguynamedryan)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/JamesS-M" rel="noopener noreferrer" target="_blank">@JamesS-M</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/tylerturdenpants" rel="noopener noreferrer" target="_blank">Ryan Mark (@tylerturdenpants)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/jbryson3" rel="noopener noreferrer" target="_blank">John Bryson (@jbryson3)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/drewlee" rel="noopener noreferrer" target="_blank">Andrew A Lee (@drewlee)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, and <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Ava Wroten, Chris Ng, Isaac Lee, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-167</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-167</guid><pubDate>Fri, 06 Nov 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 168]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Read the blog on yieldable named blocks 📛,
keep up to date on <code>@use</code> and Resources RFC 💡,
ember-bootstrap Octane updates 🏎,
and last, but not least, from Phorest: Ember is still a good decision in 2020! 🙌</p>
<!-- READMORE -->
<hr />
<h2 id="blogmodaldialogusingyieldablenamedblockshttpsbalinterdicomblogmakingamodaldialogusingyieldablenamedblocks"><a href="https://balinterdi.com/blog/making-a-modal-dialog-using-yieldable-named-blocks/">Blog: Modal Dialog Using Yieldable Named Blocks 📛</a></h2>
<p>A blog post by <a href="https://github.com/balinterdi">Balint Erdi (@balinterdi)</a> goes through how <a href="https://emberjs.github.io/rfcs/0226-named-blocks.html">Named Blocks</a> allows us to have more than one block when invoking components using the angle-bracket syntax.</p>
<p>With the <a href="https://emberjs.github.io/rfcs/0460-yieldable-named-blocks.html">Yieldable Named Blocks RFC</a> accepted and the <a href="https://github.com/ember-polyfills/ember-named-blocks-polyfill">ember-named-blocks-polyfill</a> already implementing it, we can use yieldable named blocks in our Ember apps today. The blog goes through using the <code>{{yield to=""}}</code> syntax to implement multiple named blocks in a modal example.</p>
<p>Named blocks are useful anywhere where it makes sense to provide several "slots" that the user of the component can customize. Read the full post today on <a href="https://balinterdi.com/blog/making-a-modal-dialog-using-yieldable-named-blocks/">Balint’s blog</a>!</p>
<hr />
<h2 id="introducingusehttpswwwpzuraqcomintroducinguse"><a href="https://www.pzuraq.com/introducing-use/">Introducing <code>@use</code> 💡</a></h2>
<p>In October, <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> published a blog post and an addon to highlight updates regarding the <a href="https://github.com/emberjs/rfcs/blob/use-and-resources/text/0567-use-and-resources.md"><code>@use</code> and Resources RFC</a>.</p>
<p>In <a href="https://www.pzuraq.com/introducing-use/">Introducing <code>@use</code></a>, Chris explains how <a href="https://github.com/pzuraq/ember-could-get-used-to-this">ember-could-get-used-to-this</a> invites us to rethink template constructs. The addon proposes four top-level concepts:</p>
<ol>
<li>Functions, meant to replace Ember helpers defined with the <code>helper()</code> function</li>
<li>Resources, to bridge a gap between imperative and declarative programming through <code>@use</code> decorator and <code>Resource</code> class</li>
<li>Modifiers, to handle DOM modifications</li>
<li>Effects, to pull a value out of the system and use it externally</li>
</ol>
<p>Be sure to read the blog post and try out the addon. We think it will give you a preview of what's coming next to Ember!</p>
<hr />
<h2 id="emberbootstrapoctaneupdateshttpsgithubcomkaliber5emberbootstrap"><a href="https://github.com/kaliber5/ember-bootstrap">ember-bootstrap Octane updates 🏎</a></h2>
<p><a href="https://github.com/kaliber5/ember-bootstrap">kaliber5/ember-bootstrap</a> v4.4 was recently released, continuing their incremental Octane rewrite. Tooltips and popovers have been refactored to Glimmer components.</p>
<p>For ember-bootstrap's 4.x cycle, the overarching goal is to incrementally rewrite all components to Glimmer components. The team is also aiming to replace all computed properties with tracked properties. These changes have been possible because <strong>all components were first refactored to tagless components</strong>. 🌟</p>
<p>Other highlights from ember-bootstrap 4.x include adding Embroider compatibility (including <code>staticComponents</code>) and dropping support for subclassing components. As a replacement, users can now build a component library on top of ember-bootstrap, in a change that improves the developer experience.</p>
<p>For more details, check out the <a href="https://github.com/kaliber5/ember-bootstrap/blob/master/CHANGELOG.md">changelog</a>.</p>
<hr />
<h2 id="fromphorestemberisstillagooddecisionin2020httpsnothingventuredrockswechoseemberin2015anditisstillagooddecisionin2020c2eb1502a20a"><a href="https://nothingventured.rocks/we-chose-ember-in-2015-and-it-is-still-a-good-decision-in-2020-c2eb1502a20a">From Phorest: Ember is still a good decision in 2020 🙌</a></h2>
<p><a href="https://github.com/tniezurawski">Tomek Nieżurawski (@tniezurawski)</a> wrote abut how his company, <a href="https://www.phorest.com/">Phorest</a>, chose Ember in 2015…and that choice is still a good decision in 2020. Music to our ears! In the <a href="https://nothingventured.rocks/we-chose-ember-in-2015-and-it-is-still-a-good-decision-in-2020-c2eb1502a20a">blog post</a>, Tomek touches on some of the benefits of Ember:</p>
<ul>
<li>Conventions</li>
<li>Don't have to reinvent the wheel</li>
<li>Stability</li>
<li>Ecosystem</li>
<li>Community</li>
</ul>
<p>With Ember, some "limitations" and so-called conventions can save developers time. While the learning curve can be seen as steep, you won't experience <strong>decision paralysis</strong> as in other frameworks. Phorest found that Ember saved them a lot of time during their journey, allowing them to build high-quality software fast. Dive into the <a href="https://nothingventured.rocks/we-chose-ember-in-2015-and-it-is-still-a-good-decision-in-2020-c2eb1502a20a">article</a> to read more about Phorest's experience with Ember!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/chadhietala" rel="noopener noreferrer" target="_blank">Chad Hietala (@chadhietala)</a>, <a href="https://github.com/jamescdavis" rel="noopener noreferrer" target="_blank">James C. Davis (@jamescdavis)</a>, <a href="https://github.com/defraz" rel="noopener noreferrer" target="_blank">Christopher Fraser (@defraz)</a>, <a href="https://github.com/hergaiety" rel="noopener noreferrer" target="_blank">Ava Gaiety Wroten (@hergaiety)</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/cincodenada" rel="noopener noreferrer" target="_blank">Joel Bradshaw (@cincodenada)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/GuillaumeCisco" rel="noopener noreferrer" target="_blank">Cisco Guillaume (@GuillaumeCisco)</a>, <a href="https://github.com/chrismllr" rel="noopener noreferrer" target="_blank">Chris Miller (@chrismllr)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/eddiemm" rel="noopener noreferrer" target="_blank">Edgar Mancia (@eddiemm)</a>, <a href="https://github.com/achambers" rel="noopener noreferrer" target="_blank">Aaron Chambers (@achambers)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/KrishnaRPatel" rel="noopener noreferrer" target="_blank">Krishna Patel (@KrishnaRPatel)</a>, <a href="https://github.com/shivani2692" rel="noopener noreferrer" target="_blank">@shivani2692</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/pgengler" rel="noopener noreferrer" target="_blank">Phil Gengler (@pgengler)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/jwlawrence" rel="noopener noreferrer" target="_blank">Joshua Lawrence (@jwlawrence)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/jsturgis" rel="noopener noreferrer" target="_blank">Jeff Sturgis (@jsturgis)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a>, <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/nickschot" rel="noopener noreferrer" target="_blank">Nick Schot (@nickschot)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, and <a href="https://github.com/patocallaghan" rel="noopener noreferrer" target="_blank">Pat O'Callaghan (@patocallaghan)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Isaac Lee and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-168</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-168</guid><pubDate>Fri, 20 Nov 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 169]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Watch a deep dive on component primitives 📺, and check out the "Rock &amp; Roll with Ember band" interview series 🎸!</p>
<!-- READMORE -->
<hr />
<h2 id="watchcomponentprimitivesdeepdivehttpswwwyoutubecomwatchvo74wizsvaqu"><a href="https://www.youtube.com/watch?v=O74WizsVAQU">Watch: Component primitives deep dive 📺</a></h2>
<p><a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> and <a href="https://github.com/snewcomer">Scott Newcomer (@snewcomer)</a> <a href="https://twitter.com/pzuraq/status/1331340528705671168">deep dived</a> into Ember's component primitives such as the <code>setComponentTemplate</code>, <code>setComponentManager</code>, and <code>precompileTemplate</code> APIs.</p>
<p>Chris walks through the problem of formalizing relationships between the JavaScript component and its Handlebars template. This is done by preprocessing the template via the <code>precompileTemplate</code> API and then establishing that relationship to the JavaScript component using the <code>setComponentTemplate</code> API.</p>
<p>These <a href="https://emberjs.github.io/rfcs/0481-component-templates-co-location.html#low-level-primitives">primitives</a> are actually public so anyone can make a transform or parser to build their own custom template import syntax. This flexibility means we can experiment using these primitives before finalizing the API. We can even iterate on it later on to find the best fit for our ecosystem.</p>
<p>Watch the <a href="https://www.youtube.com/watch?v=O74WizsVAQU">full video discussion</a> on YouTube!</p>
<hr />
<h2 id="therockrollwithemberbandinterviewserieshttpsbalinterdicomblog"><a href="https://balinterdi.com/blog/">The "Rock & Roll with Ember band" interview series 🎸</a></h2>
<p><a href="https://github.com/balinterdi">Balint Erdi (@balinterdi)</a>, author of the popular book, <a href="https://balinterdi.com/rock-and-roll-with-emberjs/">Rock & Roll with Ember.js (RaRwE)</a>, has started a <a href="https://balinterdi.com/blog/">"Rock & Roll with Ember band" interview series</a> on his blog. We enjoyed reading these interviews about members from the beloved Ember community!</p>
<ul>
<li>🎤 <a href="https://github.com/stuartg99">Stuart Guthrie (@stuartg99)</a> of Freshwater, New South Wales, Australia talked about his experience since choosing Ember four years ago as the founder of <a href="https://polonious-systems.com/">Polonious Pty Ltd</a>. "We selected Emberjs as it was community driven, the community was well led and had a good 'vibe', still does."</li>
<li>🥁 <a href="https://github.com/belgoros">Serguei Cambour (@belgoros)</a> of Belgium talked about using Ember on side projects, having discovered Ember as a framework from his background in Ruby on Rails. The RaRwE book helped with the Ember learning curve, and he uses the <a href="https://discuss.emberjs.com/">Ember Discuss</a> or the relevant channel in the <a href="https://discord.com/invite/emberjs">Ember Discord chat</a> to ask questions.</li>
<li>🎹 <a href="https://github.com/typeoneerror">Ben Borowski (@typeoneerror)</a> of Canada used Ember on his side project, <a href="https://doki.io/">Doki.io</a>. Things he's jazzed about in the Ember world are code-splitting and the <a href="https://www.pzuraq.com/introducing-use/">@use RFC</a>, which we discussed in <a href="https://blog.emberjs.com/2020/11/20/the-ember-times-issue-168.html">Ember Times Issue #168</a>.</li>
<li>🎷 <a href="https://github.com/madnificent">Aad Versteden (@madnificent)</a> of Belgium is the co-founder and CEO of <a href="https://redpencil.io/">redpencil.io</a>, a consultancy which tries to keep the web an open space. Most of their backend work is <a href="https://semantic.works/">semantic.works</a>, which heavily pushes for Ember on the frontend. Aad would like to see the community more involved in <a href="https://github.com/ember-animation/ember-animated">ember-animated</a>. He's also hopeful that <a href="https://github.com/embroider-build/embroider">Embroider</a> will bring us tree shaking. Check out the <a href="https://balinterdi.com/blog/the-rock-roll-with-ember-band-aad-versteden/">full post</a> to read about Aad's thoughts on the pros and cons of Ember Data.</li>
</ul>
<p>Find all the interviews here: <a href="https://balinterdi.com/blog/">balinterdi.com/blog</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/brendenpalmer" rel="noopener noreferrer" target="_blank">Brenden Palmer (@brendenpalmer)</a>, <a href="https://github.com/Turbo87" rel="noopener noreferrer" target="_blank">Tobias Bieniek (@Turbo87)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/jl-cs" rel="noopener noreferrer" target="_blank">@jl-cs</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/stefanpenner" rel="noopener noreferrer" target="_blank">Stefan Penner (@stefanpenner)</a>, <a href="https://github.com/shivani2692" rel="noopener noreferrer" target="_blank">@shivani2692</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/achambers" rel="noopener noreferrer" target="_blank">Aaron Chambers (@achambers)</a>, <a href="https://github.com/nickschot" rel="noopener noreferrer" target="_blank">Nick Schot (@nickschot)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/KrishnaRPatel" rel="noopener noreferrer" target="_blank">Krishna Patel (@KrishnaRPatel)</a>, <a href="https://github.com/cincodenada" rel="noopener noreferrer" target="_blank">Joel Bradshaw (@cincodenada)</a>, <a href="https://github.com/tniezurawski" rel="noopener noreferrer" target="_blank">Tomek Nieżurawski (@tniezurawski)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, and <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-169</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-169</guid><pubDate>Fri, 04 Dec 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 170]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<!--alex ignore nuts-->
<p>Ember 3.23 released 🎉,
explore Ember/Glimmer component performance 🚅,
read the blog post on the Ember Octane mental model ✍️,
Ember + Tailwind 2.0 🎨,
learn how to use WebSockets with Ember Data 📟,
Glimmer apps with Snowpack 🔥️⛄,
and last, but not least, meet <code>fractal-page-object</code> ❄️!</p>
<!-- READMORE -->
<hr />
<h2 id="ember323releasedhttpsblogemberjscom20201214ember323releasedhtml"><a href="https://blog.emberjs.com/2020/12/14/ember-3-23-released.html">Ember 3.23 Released 🐹</a></h2>
<p>Version 3.23 of Ember.js, Ember Data, and Ember CLI was released on December 14th! Please use the <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon to continuously test your projects against the latest Ember releases.</p>
<p>Ember.js 3.23 included <a href="https://github.com/emberjs/ember.js/pull/19213">improved error ergonomics</a>, the <code>invokeHelper</code> from <a href="https://github.com/emberjs/rfcs/blob/master/text/0626-invoke-helper.md">JavaScript Helper Invocation API RFC</a>, and the helper manager from <a href="https://github.com/emberjs/rfcs/blob/master/text/0625-helper-managers.md">Helper Managers RFC</a>. There were no deprecations in Ember 3.23.</p>
<p>Ember Data 3.23 <a href="https://deprecations.emberjs.com/ember-data/v3.x/#toc_ember-data-najax-fallback">deprecates</a> <code>najax</code> requests when <code>ember-fetch</code> is installed to better guide users on how to update their app. If you do not have jQuery <a href="https://guides.emberjs.com/release/configuring-ember/optional-features/">enabled</a>, this deprecation does not apply to you.</p>
<p>There were <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.23.0">no significant changes</a> in Ember CLI 3.23.</p>
<p>Read the full <a href="https://blog.emberjs.com/2020/12/14/ember-3-23-released.html">Ember 3.23 release notes</a> for the complete information.</p>
<hr />
<h2 id="glimmerandembercomponentperformanceplaygroundhttpsnullvoxpopuligithubioemberthreeboxesdemo"><a href="https://nullvoxpopuli.github.io/ember-three-boxes-demo/">Glimmer and Ember component performance playground 🚅</a></h2>
<blockquote>
  <p>Using @glimmer/component instead of @ember/component can get you up to 2x speed boosts at almost half the memory consumption.
  -<a href="https://twitter.com/nullvoxpopuli">@nullvoxpopuli</a> (<a href="https://twitter.com/nullvoxpopuli/status/1335616011744251907">source</a>)</p>
</blockquote>
<p>Play with the <a href="https://nullvoxpopuli.github.io/ember-three-boxes-demo/">interactive browser demo</a> or <a href="https://github.com/NullVoxPopuli/ember-three-boxes-demo">explore the source</a> behind a performance comparison of Native JS, Ember Components and Glimmer Components. Feel the performance improvements the core team has achieved for yourself! 🔥</p>
<p><img src="/images/blog/emberjstimes/nullvoxpopuli-glimmer-performance.png" alt="Glimmer rendering thousands of three.js elements with fast performance" /></p>
<p>Within <a href="https://github.com/NullVoxPopuli/ember-three-boxes-demo/blob/master/README.md">the source README.md</a> are links to Twitter conversations happening across frameworks as well including similar projects for <a href="https://twitter.com/0xca0a/status/1199997552466288641">React (demo)</a> and <a href="https://twitter.com/Rich_Harris/status/1200807952522842112">Svelte (demo)</a>. 🌐</p>
<hr />
<!--alex ignore nuts-->
<h2 id="blogemberoctaneisanewmentalmodelhttpsv5chriskrychocomjournalemberoctaneisanewmentalmodel"><a href="https://v5.chriskrycho.com/journal/ember-octane-is-a-new-mental-model/">Blog: Ember Octane is a new mental model ✍️</a></h2>
<!--alex ignore easy-->
<p><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> wrote a <a href="https://v5.chriskrycho.com/journal/ember-octane-is-a-new-mental-model/">blog post</a> on how Ember Octane is not a 1:1 translation from Ember Classic but rather a whole new way of thinking and designing your code. This new programming model means that some patterns that you’re used to using in the Classic paradigm do not work in the new paradigm.</p>
<p>Chris goes through a couple examples of code that was fundamentally coupled to Ember Classic idioms such as the <a href="https://api.emberjs.com/ember/release/classes/Evented">Evented API</a> and usage of <code>didReceiveAttrs</code>. The blog argues that although these cases were rare, it’s possible the abstraction would benefit from being reworked substantially towards the Octane idioms.</p>
<p>Read the full blog post on <a href="https://v5.chriskrycho.com/journal/ember-octane-is-a-new-mental-model/">Chris’s blog</a> or follow the <a href="https://github.com/emberjs/rfcs/pull/669#issuecomment-739320902">discussion on GitHub</a>!</p>
<hr />
<h2 id="embertailwindcss20httpstwittercomraytileystatus1330493161848905730"><a href="https://twitter.com/raytiley/status/1330493161848905730">Ember + Tailwind CSS 2.0 🎨</a></h2>
<p>On the functional CSS train? Now that Tailwind 2.0 is out, you may be looking for guidance on setting it up in your Ember app, as there are some slight differences from Tailwind 1.x. <a href="https://github.com/raytiley/tailwind-ember-example">Ray Tiley (@raytiley)</a> put together <a href="https://github.com/raytiley/tailwind-ember-example">tailwind-ember-example</a> to demonstrate how to get things configured in Ember. Check out the conversation on <a href="https://twitter.com/raytiley/status/1330493161848905730">Twitter</a> or chime in on <a href="https://github.com/raytiley/tailwind-ember-example">GitHub</a> if you have more to add or run into any gotchas!</p>
<p>What's new in Tailwind 2.0? A new color palette, dark mode support, an extra wide 2XL breakpoint, and more. (Note that Tailwind 2.0 is not compatible with IE11, but IE11's end of life is set for 2021.) Check out Tailwind's fancy <a href="https://www.youtube.com/watch?v=3u_vIdnJYLc&feature=emb_logo">release trailer video</a> or the <a href="https://blog.tailwindcss.com/tailwindcss-v2">blog post</a> for more details.</p>
<hr />
<h2 id="liveupdateswithwebsocketsinemberdatahttpscodingitwrongcom20201002emberdataliveupdateswithrailshtml"><a href="https://codingitwrong.com/2020/10/02/ember-data-live-updates-with-rails.html">Live updates with WebSockets in Ember Data 📟</a></h2>
<p>If you want to learn how to update your Ember app with live data provided by others, <a href="https://github.com/codingitwrong">Josh Justice (@CodingItWrong)</a> wrote a <a href="https://codingitwrong.com/2020/10/02/ember-data-live-updates-with-rails.html">blog</a> about how to use <strong>WebSockets</strong> in combination with JSON:API to get live updates in your app.</p>
<p>The blog post is a step-by-step explanation with extensive code examples of using WebSockets with Ember Data. At the end of the blog post you will have a Todo List that will update information of all users to each other. Live updates are a new way of thinking about the data flow in your app, but the libraries that you probably are already using allow you to add them without adding too much code. This blog will give you a nice place to start experimenting with this cool technology.</p>
<hr />
<h2 id="glimmerappswithsnowpackhttpsdevtorajasegarbuildingglimmerappswithsnowpackigc"><a href="https://dev.to/rajasegar/building-glimmer-apps-with-snowpack-igc">Glimmer apps with Snowpack 🔥️⛄</a></h2>
<p>There's an awesome new <a href="https://dev.to/rajasegar/building-glimmer-apps-with-snowpack-igc">blog post</a> from <a href="https://github.com/rajasegar">Rajasegar Chandran (@rajasegar)</a> about how to build your Glimmer app with Snowpack 🔥️⛄!</p>
<p>The Glimmer VM runs the components we know and 💜 in Ember, and it is designed to run them super fast 🔥. Snowpack ⛄️ is a new, lightning-fast frontend build tool designed for the modern web. Snowpack leverages <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import">JavaScript's native module system</a>.</p>
<p>The post explains how to create a Snowpack app, add dependencies such as Glimmer, and how to configure Snowpack.</p>
<p>It's an exciting foray into new technologies that are built to optimize our experience as developers and users of web technologies.</p>
<p>But that is not all. Rajasegar has also created a <code>create-snowpack-app</code> <a href="https://github.com/rajasegar/snowpack-app-template-glimmer">template</a> to bootstrap your Glimmer app and use Snowpack.</p>
<p>There's also a sample Todo List app built using these exciting new technologies if you want to <a href="https://todolist-glimmer-snowpack.surge.sh/">check it out</a>.</p>
<p>Still not enough cool frontend bundler technology for you? Well, Rajasegar has written a follow-up post about <a href="https://dev.to/rajasegar/building-glimmer-apps-with-rollup-3jcj">how to use Rollup with a Glimmer app</a> as well!</p>
<hr />
<h2 id="meetfractalpageobjecthttpstwittercombendemboskistatus1338545855054270464"><a href="https://twitter.com/bendemboski/status/1338545855054270464">Meet <code>fractal-page-object</code> ❄️</a></h2>
<p><a href="https://github.com/bendemboski">Ben Demboski (@bendemboski)</a> released <a href="https://github.com/bendemboski/fractal-page-object">fractal-page-object</a>, a lightweight JavaScript <a href="https://martinfowler.com/bliki/PageObject.html">page object</a> addon for testing. It is framework-agnostic but is built with Ember and <code>qunit-dom</code> in mind. 🧡</p>
<p>Please give it a try and provide feedback. To learn more about testing with <code>fractal-page-object</code>, you can check out the <a href="https://github.com/bendemboski/fractal-page-object#fractal-page-object">README file</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/GavinJoyce" rel="noopener noreferrer" target="_blank">Gavin Joyce (@GavinJoyce)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/lifeart" rel="noopener noreferrer" target="_blank">Alex Kanunnikov (@lifeart)</a>, <a href="https://github.com/drewlee" rel="noopener noreferrer" target="_blank">Andrew A Lee (@drewlee)</a>, <a href="https://github.com/efx" rel="noopener noreferrer" target="_blank">Eli Flanagan (@efx)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/jeffdaley" rel="noopener noreferrer" target="_blank">Jeff Daley (@jeffdaley)</a>, <a href="https://github.com/nruth" rel="noopener noreferrer" target="_blank">Nicholas Rutherford (@nruth)</a>, <a href="https://github.com/BryanCrotaz" rel="noopener noreferrer" target="_blank">Bryan (@BryanCrotaz)</a>, <a href="https://github.com/spham92" rel="noopener noreferrer" target="_blank">Steven Pham (@spham92)</a>, <a href="https://github.com/suchitadoshi1987" rel="noopener noreferrer" target="_blank">Suchita Doshi (@suchitadoshi1987)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/taltcher" rel="noopener noreferrer" target="_blank">Tal Tchernihovski (@taltcher)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/hergaiety" rel="noopener noreferrer" target="_blank">Ava Gaiety Wroten (@hergaiety)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/mrloop" rel="noopener noreferrer" target="_blank">Ewan McDougall (@mrloop)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/nickschot" rel="noopener noreferrer" target="_blank">Nick Schot (@nickschot)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, and <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Ava Wroten, Amy Lam, Anne-Greeth van Herwijnen, Chris Ng, Jared Galanis, Isaac Lee, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-170</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-170</guid><pubDate>Fri, 18 Dec 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 171]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Speakers wanted for EmberConf 2021 📆,
Ember 3.24 release 🙌,
read the blog on understanding args in Glimmer components ✍️,
announcing the launch of the redesigned Ember Blog 📝,
five RFCs for Ember 4.0 milestone 💬,
and last, but not least,
micro-frontends with Glimmer.js and single-spa 🔥!</p>
<hr />
<h2 id="speakerswantedforemberconf2021httpsemberconfcom"><a href="https://emberconf.com/">Speakers wanted for EmberConf 2021 📆</a></h2>
<p>This year's <a href="https://emberconf.com/">EmberConf</a> has been announced to take place March 29-30, 2021! EmberConf is 2 days of Ember talks, sessions and fun — streaming live virtually anywhere. Want to give a talk at EmberConf? We're now accepting proposals.</p>
<p>EmberConf is great because our speakers are great, and you could be one of them. The Call for Papers (CFP) is public, starts out blind, and features a collaborative process to help applicants improve their proposals. Proposals will be accepted through <strong>January 31st at 11:59pm PT</strong>. Learn more at the <a href="https://cfp.emberconf.com/events/emberconf-2021">EmberConf 2021 CFP site</a>.</p>
<p>There are a lot of options for talks this year. Conference talks can be 30, 15, 10, or 5 minutes total. Have a talk idea? The EmberConf team will be voting on and reviewing talks on a rolling basis, and will attempt to send feedback sooner than their final evaluation. <strong>The earlier you submit, the more chance you'll have to tweak your pitch and improve your odds.</strong> Sounds like a good plan for this weekend then?! 📝</p>
<hr />
<h2 id="ember324releasehttpsblogemberjscomember324released"><a href="https://blog.emberjs.com/ember-3-24-released/">Ember 3.24 release 🙌</a></h2>
<p>Version 3.24  of Ember.js, Ember Data, and Ember CLI was released on January 7, 2021! Please use the <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon to continuously test your projects against the latest Ember releases.</p>
<p>Ember.js 3.24 included <a href="https://github.com/emberjs/ember.js/pull/19224">blueprint changes</a> when <a href="https://github.com/ember-cli/ember-page-title">ember-page-title</a> is installed, interface changes to <code>DeprecationOptions</code> requiring the keys <code>for</code> and <code>since</code> when using <code>deprecate()</code>, and updated the Glimmer VM to version 0.65.0.</p>
<p>The function <code>tryInvoke</code> from <code>@ember/utils</code> module has been deprecated in favor of JavaScript's optional chaining <code>?.</code> There have also been various deprecations for <code>Ember.String</code> methods including the <code>Ember.String.loc</code> function. Please check the <a href="https://deprecations.emberjs.com/v3.x/">Deprecations guide</a> for the full information.</p>
<p>Ember Data 3.24 included a fix where an attempt to set something on a deleted record no longer shows the value in the error message in a production environment. This was <a href="https://github.com/emberjs/data/pull/7370">done</a> to prevent leaking sensitive data.</p>
<p>Ember CLI 3.24 upgraded the packages that are present in the package.json blueprint to their latest version which included a major version changes for <a href="https://github.com/emberjs/ember-qunit/releases/tag/v5.0.0">ember-qunit to v5</a> and <a href="https://github.com/ember-cli/eslint-plugin-ember/releases/tag/v10.0.0">eslint-plugin-ember to v10</a>. The addon <a href="https://github.com/ember-cli/ember-page-title">ember-page-title</a> was also added to the blueprint. Finally prettier (along with eslint-config-prettier and eslint-plugin-prettier) was also added to the blueprint from <a href="https://github.com/emberjs/rfcs/blob/master/text/0628-prettier.md">RFC #628</a>.</p>
<p>Read the full <a href="https://blog.emberjs.com/ember-3-24-released/">Ember 3.24 release notes</a> for the complete information.</p>
<hr />
<h2 id="blogunderstandingargsinglimmercomponentshttpsv5chriskrychocomjournalunderstandingargsinglimmercomponents"><a href="https://v5.chriskrycho.com/journal/understanding-args-in-glimmer-components/">Blog: Understanding args in Glimmer components ✍️</a></h2>
<p><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> wrote a blog post on <a href="https://v5.chriskrycho.com/journal/understanding-args-in-glimmer-components/">understanding <code>args</code> in Glimmer components</a> with a focus on what happens when there are <em>updates</em> to <code>args</code>.</p>
<p>Chris explains how a Glimmer component works if you strip away all the reactivity and only do a single pass. The <a href="https://api.emberjs.com/ember/3.23/modules/@glimmer%2Fcomponent">Glimmer component API</a> sets the <code>args</code> object on to the class in the <code>constructor</code>. The <code>args</code> object in a Glimmer component is also <strong>read-only</strong> since it is a <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_class_fields">private class field</a> while exposed with a getter.</p>
<pre><code class="javascript language-javascript">class Component {
  #args: object;
  get args() {
    return this.#args;
  }

  constructor(args: object) {
    this.#args = args;
  }
}
</code></pre>
<p>The blog recommends to never assign from a property on <code>args</code> to a local class field in a Glimmer component because changes to the parent will never be reflected in the component. You should instead use getters that are re-computed when invoked.</p>
<p>Read the full blog post on <a href="https://v5.chriskrycho.com/journal/understanding-args-in-glimmer-components/">Chris’s blog</a>.</p>
<hr />
<h2 id="announcingthelaunchoftheredesignedemberbloghttpsblogemberjscom"><a href="https://blog.emberjs.com">Announcing the launch of the redesigned Ember Blog 📝</a></h2>
<!--alex ignore king-queen-->
<p><a href="https://blog.emberjs.com/">The Ember Blog</a> has a new look and a new codebase!
The Ember Blog was started 8 years ago, in 2012. For many years, it was a custom Ruby app
that was mainly used for release blog posts.
Today, the blog is the home for The Ember Times,
release announcements, guest-written learning articles, and more,
so a group of dedicated contributors set out to make some improvements.
The blog is now an Ember app, and under the hood, it uses the same tech
that powers the Ember Guides, <a href="https://github.com/empress">Empress</a>.
Empress tools help turn markdown into HTML within an Ember app,
meaning that articles are quick to write using Markdown, and contributors
can use all the great tools that Ember has to offer.</p>
<p>Please check out <a href="https://blog.emberjs.com/">the blog</a> today! Many thanks to the contributors who worked on this project! 👏</p>
<!--alex ignore king-queen-->
<p>Did you spot any issues? Want to help build future features?
You can find the main repository at
<a href="https://github.com/ember-learn/ember-blog">ember-learn/ember-blog</a> on GitHub.
Most styles and components come from the shared component library that all Ember's public sites use,
<a href="https://github.com/ember-learn/ember-styleguide">ember-styleguide</a>.
The <a href="https://github.com/ember-learn/empress-blog-ember-template">empress-blog-ember-template</a>
has a lot of the layout logic that is specific to this blog,
and <a href="https://github.com/empress/empress-blog">empress-blog</a> handles the general application code for routing and data requests for blogs in general.</p>
<!--alex ignore king-queen-->
<p>If you like what you see, you can <a href="https://github.com/empress/empress-blog#super-quick-start">make your own blog using Empress</a> in about 10 minutes!</p>
<hr />
<h2 id="fiverfcsforember40milestonehttpsgithubcomemberjsrfcsmilestone1"><a href="https://github.com/emberjs/rfcs/milestone/1">Five RFCs for Ember 4.0 milestone 💬</a></h2>
<p>The Ember Core Team has been working hard on paving way for <a href="https://github.com/emberjs/rfcs/milestone/1">Ember 4.0 release</a>. This week on January 16th, four RFCs were merged, and <a href="https://twitter.com/emberjs/status/1350282638670639105">five RFCs entered the Final Comment Period</a>.</p>
<p>Currently, a total of 5 RFCs are open under the 4.0 milestone:</p>
<ul>
<li><a href="https://github.com/emberjs/rfcs/pull/689">Deprecate <code>{{hasBlock}}</code> and <code>{{hasBlockParams}}</code> in Templates</a></li>
<li><a href="https://github.com/emberjs/rfcs/pull/704">Deprecate Octane Optional Features</a></li>
<li><a href="https://github.com/emberjs/rfcs/pull/705">Deprecate jQuery Integration Optional Feature</a></li>
<li><a href="https://github.com/emberjs/rfcs/pull/706">Deprecate the Ember Global</a></li>
<li><a href="https://github.com/emberjs/rfcs/pull/707">Modernize Built-In Components (Part 2)</a></li>
</ul>
<p>Have a look at the outstanding RFCs when you find time. Please feel free to share the links with other developers and participate in the RFCs by providing feedback! 🌟</p>
<hr />
<h2 id="microfrontendswithglimmerjsandsinglespahttpsdevtorajasegarmicrofrontendswithglimmerjsandsinglespa42aa"><a href="https://dev.to/rajasegar/micro-frontends-with-glimmer-js-and-single-spa-42aa">Micro-frontends with Glimmer.js and single-spa 🔥</a></h2>
<p>There is another great new Glimmer-focused <a href="https://dev.to/rajasegar/micro-frontends-with-glimmer-js-and-single-spa-42aa">blog post</a> from <a href="https://github.com/rajasegar">Rajasegar Chandran (@rajasegar)</a> about how to make Micro-Frontends with Glimmer.js and single-spa!</p>
<p>If you haven't been following along, Rajasegar has published a number of fantastic <a href="https://dev.to/rajasegar">posts on dev.to</a>, many of which involve Glimmer.js.</p>
<p>This new post looks at using the <a href="https://single-spa.js.org/">single-spa library</a> to buld micro-frontends with Glimmer.</p>
<p>Single-spa is a JavaScript router for front-end microservices that lets you use multiple frameworks in a single-page application. For the integration with Glimmer, Rajasegar has published a <a href="https://github.com/rajasegar/single-spa-glimmer">single-spa plugin</a> that facilitates injecting multiple super-fast Glimmer apps into a single page, something which is not otherwise possible.</p>
<p>This setup is all pretty experimental and cutting-edge, but it does demonstrate the flexibility of Glimmer, and what you can do with it if you have very specific use cases.</p>
<p>Check this great post out and look for more great Glimmer content from Rajasegar in the future!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/chadhietala" rel="noopener noreferrer" target="_blank">Chad Hietala (@chadhietala)</a>, <a href="https://github.com/chiragpat" rel="noopener noreferrer" target="_blank">Chirag Patel (@chiragpat)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/dwickern" rel="noopener noreferrer" target="_blank">Derek Wickern (@dwickern)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/knownasilya" rel="noopener noreferrer" target="_blank">Ilya Radchenko (@knownasilya)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/jeffdaley" rel="noopener noreferrer" target="_blank">Jeff Daley (@jeffdaley)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/jderr-mx" rel="noopener noreferrer" target="_blank">John Derr (@jderr-mx)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/dcyriller" rel="noopener noreferrer" target="_blank">Cyrille David (@dcyriller)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/czikarito" rel="noopener noreferrer" target="_blank">Pawel Kuwik (@czikarito)</a>, <a href="https://github.com/nickschot" rel="noopener noreferrer" target="_blank">Nick Schot (@nickschot)</a>, <a href="https://github.com/Alonski" rel="noopener noreferrer" target="_blank">Alon Bukai (@Alonski)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/sandstrom" rel="noopener noreferrer" target="_blank">@sandstrom</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/kennethlarsen" rel="noopener noreferrer" target="_blank">Kenneth Larsen (@kennethlarsen)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/genisd" rel="noopener noreferrer" target="_blank">Daniel (@genisd)</a>, <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, and <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter/">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jen Weber, Amy Lam, Isaac Lee, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-171</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-171</guid><pubDate>Fri, 15 Jan 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 172]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Get your EmberConf talk proposals in ASAP, TypeScript in Ember guide, Storybook for Ember tutorial, building a Router component for Glimmer.js, and building prototypes with Ember.</p>
<hr />
<h2 id="remoteemberconftalkproposalsduethissundayhttpsemberconfcombecomeaspeaker"><a href="https://emberconf.com/become-a-speaker">Remote EmberConf talk proposals due this Sunday! 🗣</a></h2>
<p>Developers around the world are invited to <a href="https://emberconf.com/become-a-speaker">submit talk proposals for EmberConf 2021</a>! The deadline for submissions is this <strong>Sunday, January 31st at 11:59pm ET</strong>.</p>
<p>Is there something cool you learned recently that you would like to share? Do you want to build up your speaking and teaching skills? Did you build something you are proud of?</p>
<p>This is your chance to share it! Talks are pre-recorded and the conference is fully remote.</p>
<p>If you have questions or need some help, visit the <a href="https://discord.com/channels/480462759797063690/480502413917421570">#emberconf</a> channel on the <a href="https://emberjs.com/community/">Community Discord</a>. Good luck!</p>
<hr />
<h2 id="videotutorialstypescriptbasicswithemberjshttpstwittercomknownasilyastatus1349571457983127561"><a href="https://twitter.com/knownasilya/status/1349571457983127561">Video tutorials: TypeScript basics with Ember.js 🔤</a></h2>
<p><a href="https://github.com/knownasilya">Ilya Radchenko (@knownasilya)</a> did a couple of videos on getting started with <a href="https://www.typescriptlang.org/">TypeScript</a> for your Ember.js applications.</p>
<p>The <a href="https://www.youtube.com/watch?v=G7QWvhMXMSc">first video</a> goes through setting up <a href="https://github.com/typed-ember/ember-cli-typescript">ember-cli-typescript</a> which installs a variety of addons which provides blueprints, types, and the TypeScript dependency itself. It also adds the <code>tsconfig.json</code> file which <a href="https://www.typescriptlang.org/docs/handbook/tsconfig-json.html">provides compiler options</a> to TypeScript.</p>
<p>The <a href="https://www.youtube.com/watch?v=FOrCbXW223E">second video</a> does an in-depth example of using TypeScript in Ember such as making a route, controller, and when using actions and decorators. He also briefly goes through where to add global type declarations in your project and other tips for working with TypeScript in your Ember application today.</p>
<hr />
<h2 id="storybookforembertutorialhttpswwwlearnstorybookcomintrotostorybookemberengetstarted"><a href="https://www.learnstorybook.com/intro-to-storybook/ember/en/get-started/">Storybook for Ember tutorial 🎨</a></h2>
<p><a href="https://storybook.js.org/">Storybook</a> has taken the world of <strong>design systems</strong> by storm! What is Storybook? Storybook helps you build UI components that are isolated from business logic and context of your app. Sort of a "style guide as a service." Check out the new <a href="https://www.learnstorybook.com/intro-to-storybook/ember/en/get-started/">Storybook for Ember tutorial</a> for guidance on setting up Storybook in your Ember app.</p>
<p><a href="https://github.com/gossi">Thomas Gossmann (@gossi)</a> spearheaded the Ember + Storybook effort and wrote a complementary blog post, <a href="https://gos.si/blog/ember-with-storybook-behind-the-scenes/">Ember with Storybook – Behind the Scenes</a>. The post touches on a few ideas:</p>
<ul>
<li>How Storybook and Ember are independent build pipelines</li>
<li>Options for writing Storybook docs in Markdown</li>
<li>Different strategies for Storybook setup depending on your app architecture (e.g. monorepo vs. multirepo).</li>
</ul>
<p>But wait, there's more - you can use @gossi's open source Ember design system, hokulea, as a reference!</p>
<ul>
<li><a href="https://github.com/hokulea/hokulea">GitHub Repo</a></li>
<li><a href="https://hokulea.netlify.app/">hokulea Storybook</a></li>
</ul>
<p>Already using Storybook with Ember, or going to try it out in your application? Be sure to check out the <a href="https://storybook.js.org/docs/ember/get-started/introduction">official Storybook docs</a> and contribute to the Ember section if you can to further flesh it out!</p>
<hr />
<h2 id="buildingaroutercomponentforglimmerjshttpsdevtorajasegarbuildingaroutercomponentforglimmerjs52bk"><a href="https://dev.to/rajasegar/building-a-router-component-for-glimmer-js-52bk">Building a Router component for Glimmer.js 🧭</a></h2>
<p><a href="https://github.com/rajasegar">Rajasegar Chandran (@rajasegar)</a> wrote a blog on building routing components for apps built using Glimmer.js. Unlike Ember, which has built-in routing, Glimmer is only a rendering engine. Rajasegar's blog walks through how routing can be achieved for Glimmer apps. He talks about this Routing system by building a Route Registry, Route component, Link component, and the Router Component.</p>
<p>As a bonus he also mentions about how you can achieve code-splitting JS bundles and lazy loading components.</p>
<p>Read more about <a href="https://dev.to/rajasegar/building-a-router-component-for-glimmer-js-52bk">Building a Router component for Glimmer.js</a> if you have been looking for routers for your Glimmer apps!</p>
<hr />
<h2 id="buildingprototypeswithemberhttpstwittercomsimplabsstatus1338871240342327296"><a href="https://twitter.com/simplabs/status/1338871240342327296">Building prototypes with Ember 🐹</a></h2>
<p>If you have not seen the recent <a href="https://github.com/simplabs">simplabs</a> blog post by <a href="https://github.com/pichfl">Florian Pichler (@pichfl)</a> on Building prototypes with Ember.js, you may want to give it a read.</p>
<p>Florian's post covers the approach they took in building <a href="https://github.com/simplabs/ember-hotspots">ember-hotspots</a>, an addon that can enable the experience of building prototypes that many design oriented software solutions provide, but in the framework we all know and love, Ember.js! 🔥</p>
<p>The post dives into the details of how to create hotspots and efficiently handle images with preloading, and even discusses a little bit of the Broccoli work involved.</p>
<p>If you're interested, head on over to the <a href="https://simplabs.com/blog/2020/12/15/building-prototypes-with-emberjs-and-ember-hotspots/">simplabs blog</a> and check out more about <code>ember-hotspots</code>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/genisd" rel="noopener noreferrer" target="_blank">Daniel (@genisd)</a>, <a href="https://github.com/dwickern" rel="noopener noreferrer" target="_blank">Derek Wickern (@dwickern)</a>, <a href="https://github.com/dcyriller" rel="noopener noreferrer" target="_blank">Cyrille David (@dcyriller)</a>, <a href="https://github.com/Alonski" rel="noopener noreferrer" target="_blank">Alon Bukai (@Alonski)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/smfoote" rel="noopener noreferrer" target="_blank">Steven (@smfoote)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/chadhietala" rel="noopener noreferrer" target="_blank">Chad Hietala (@chadhietala)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/abhilashlr" rel="noopener noreferrer" target="_blank">abhilashlr (@abhilashlr)</a>, <a href="https://github.com/lukemelia" rel="noopener noreferrer" target="_blank">Luke Melia (@lukemelia)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/BnitoBzh" rel="noopener noreferrer" target="_blank">@BnitoBzh</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/abadri" rel="noopener noreferrer" target="_blank">Abilash Badri (@abadri)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/chiragpat" rel="noopener noreferrer" target="_blank">Chirag Patel (@chiragpat)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/srsgores" rel="noopener noreferrer" target="_blank">Sean Goresht (@srsgores)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/lifeart" rel="noopener noreferrer" target="_blank">Alex Kanunnikov (@lifeart)</a>, <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a>, <a href="https://github.com/jamescdavis" rel="noopener noreferrer" target="_blank">James C. Davis (@jamescdavis)</a>, <a href="https://github.com/czikarito" rel="noopener noreferrer" target="_blank">Pawel Kuwik (@czikarito)</a>, <a href="https://github.com/Turbo87" rel="noopener noreferrer" target="_blank">Tobias Bieniek (@Turbo87)</a>, <a href="https://github.com/jderr-mx" rel="noopener noreferrer" target="_blank">John Derr (@jderr-mx)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/davecombs" rel="noopener noreferrer" target="_blank">Dave Combs (@davecombs)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/sukima" rel="noopener noreferrer" target="_blank">Devin Weaver (@sukima)</a>, and <a href="https://github.com/jelhan" rel="noopener noreferrer" target="_blank">Jeldrik Hanschke (@jelhan)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>, now on Substack! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Abhilash L R, Jen Weber, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-172</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-172</guid><pubDate>Fri, 29 Jan 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 173]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Beta release of ember-template-lint v3, Prettier for .hbs, learn more Ember.js in 2021, new Ember-related podcasts, Pro Ember Data book, and the EmberConf community spotlight!</p>
<hr />
<h2 id="betareleaseofembertemplatelintv3httpstwittercommelaniersumnerstatus1349820518216708096"><a href="https://twitter.com/melaniersumner/status/1349820518216708096">Beta release of ember-template-lint v3 ✅</a></h2>
<p><a href="https://github.com/ember-template-lint/ember-template-lint">ember-template-lint</a> which is a linter for template files in Ember has released a <a href="https://github.com/ember-template-lint/ember-template-lint/releases/tag/v3.0.0-beta.0">beta version of 3.0.0</a>. Thanks to <a href="https://github.com/scalvert">Steve Calvert (@scalvert)</a> and <a href="https://github.com/rwjblue">Rob Jackson (@rwjblue)</a>, this release will include the <strong>TODO feature</strong> which will help teams adopt the latest version of ember-template-lint and immediately apply linting rules to new code while allowing time to resolve existing issues.</p>
<p>As part of the 3.0.0 beta release, a lot of rules have also been <a href="https://github.com/ember-template-lint/ember-template-lint/pull/1643">turned on in the default recommended config</a>. This version will also <a href="https://github.com/ember-template-lint/ember-template-lint/pull/1639">promote the octane config</a> into the default recommended config.</p>
<p>Check out the full <a href="https://github.com/ember-template-lint/ember-template-lint/issues/1315">plan for the 3.0.0 release</a> on GitHub and the related <a href="https://blog.emberjs.com/how-to-todo-in-ember-template-lint">blog post</a>.</p>
<hr />
<h2 id="prettierforhbshttpsdevtojelhanformatglimmertemplateswithprettieripa"><a href="https://dev.to/jelhan/format-glimmer-templates-with-prettier-ipa">Prettier for .hbs 😀</a></h2>
<p>Prettier is coming to an Ember <code>.hbs</code> file near you! <a href="https://prettier.io/">Prettier</a> is a popular opinionated code formatter. New Ember projects get Prettier out of the box for <code>.js</code> files, and existing projects can adopt Prettier with <a href="https://cli.emberjs.com/release/basic-use/upgrading/"><code>ember-cli-update</code></a>.</p>
<!-- alex ignore whitespaces -->
<p>Check out <a href="https://github.com/jelhan">Jeldrik Hanschke (@jelhan)'s</a> post <a href="https://dev.to/jelhan/format-glimmer-templates-with-prettier-ipa">Format Glimmer templates with Prettier</a> and <a href="https://twitter.com/jelhan1/status/1358537538932248576">tweet thread</a> to learn how to configure Prettier for Ember <code>.hbs</code> files, with specific tips to Prettier <code>.hbs</code> on save in VS Code. Note: Prettier for Glimmer templates does not (yet) respect meaningful whitespaces, which will be problematic if your application is not internationalized (i18n'd). Give it a try in your app to see if there are any gotchas.</p>
<p>There is a PR from <a href="https://github.com/dcyriller">Cyrille David (@dcyriller)</a> to <a href="https://github.com/prettier/prettier/pull/10290">Move Handlebars support out of alpha to release</a> on Prettier as well.</p>
<hr />
<h2 id="learnmoreemberjsin2021">Learn more Ember.js in 2021 💡</h2>
<p>If you are new to Ember.js in 2021—first of all, on behalf of the broader community, a warm welcome from The Ember Times! We're lucky to have you and hope that you will say hello and ask questions. 👋🏼</p>
<p>Over the past couple of months, several people have helped out with your learning experience by publishing blog posts and videos. We'd like to list them here for your convenience (apologies if we missed something; please let us know on the <a href="https://discord.com/channels/480462759797063690/485450546887786506"><code>#support-ember-times</code></a> channel on <a href="https://discord.gg/emberjs">Discord</a>):</p>
<ul>
<li><a href="https://www.youtube.com/playlist?list=PLfQwL10yab39JgxX5PaVyqUkPs_0sT790">Ember.js Octane Basics</a> by Ilya Radchenko</li>
<li><a href="https://www.youtube.com/playlist?list=PLk51HrKSBQ88wDXgPF-QLMfPFlLwcjTlo">Ember.js Tutorial for Beginners in 2020</a> by Shawn Chen</li>
<li><a href="https://www.youtube.com/playlist?list=PLfQwL10yab3_MLihiat-r9l8qt8x1RD7J">Ember & TypeScript series</a> by Ilya Radchenko</li>
<li><a href="https://medium.com/search?q=I%20%E2%9D%A4%20Ember.js%20Evan%20Martinez">I ❤ Ember.js — Introduction</a> by Evan Martinez</li>
<li><a href="https://www.youtube.com/watch?v=DoWdWxW1Sk0">UI Automation Testing with Ember.js</a> by Palak Goel</li>
</ul>
<p>Please check them out to learn more about Ember.js. You can provide the authors support and encouragement by giving a thumbs up and sharing the link with others!</p>
<hr />
<h2 id="newemberrelatedpodcasts">New Ember-related podcasts 🎙</h2>
<p>There are a few new interesting podcasts on the block that either were recently released or will be released soon that will cover Ember-related, and other, subjects:</p>
<ul>
<li>For a more fully Ember-focused podcast, check out <a href="https://twitter.com/kennethlarsen/status/1359568838401097729">The Ember Report</a> by <a href="https://github.com/kennethlarsen">Kenneth Larsen (@kennethlarsen)</a> and <a href="https://github.com/buschtoens">Jan Buschtöns (@buschtoens)</a>. The first episode was recently recorded and should hopefully be out soon!</li>
<li>If you are interested in listening to conversations that are not exclusively tech-related and don't mind hearing a bit about whiskey, but also would like to hear about some web and Ember topics, <a href="https://twitter.com/shipshapecode/status/1358853436486393865">Whiskey Web and Whatnot</a>, by <a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a> and <a href="https://github.com/chuckcarpenter">Chuck Carpenter (@chuckcarpenter)</a> of Ship Shape released its first episode this week, give it a listen and follow on <a href="https://open.spotify.com/show/19jiuHAqzeKnkleQUpZxDf">Spotify</a>!</li>
</ul>
<hr />
<h2 id="proemberdatabookhttpstwittercomiamdtangstatus1347253677438889985"><a href="https://twitter.com/iamdtang/status/1347253677438889985">Pro Ember Data book 📖</a></h2>
<!-- alex ignore tang -->
<p><a href="https://github.com/skaterdav85">David Tang (@skaterdav85)</a> has recently published a new book about Ember Data 🔥🔥🔥! If you were a fan of David's previous book, Ember Data in the Wild, you'll love the new book, <a href="https://www.apress.com/us/book/9781484265604">Pro Ember Data</a>!</p>
<p>Pro Ember Data covers a variety of topics that come up when working with Ember Data, including everything from adapters and serializers to polymorphic relationships and Pro Ember Data will teach you how to adapt Ember Data to fit your custom API.</p>
<p>If you've been looking to deepen your knowledge about Ember Data, definitely consider getting yourself a copy.</p>
<p>Bonus! David has also recently released a <a href="https://davidtang.io/trapping-focus-in-a-modal-in-ember/">blog post</a> on how to make modal's more accessible.</p>
<hr />
<h2 id="emberconfcommunityspotlighthttpsemberconfcomaboutcommunityspotlight"><a href="https://emberconf.com/about/community-spotlight">EmberConf community spotlight 🙌</a></h2>
<p>Coronavirus has robbed us of lots of things, and in the conference area, one of the things we all miss most is the <em>Hallway Track</em>. The random interactions we'd have meeting strangers and old friends in between sessions, on the lunch lines, at after parties, etc.</p>
<!-- alex ignore basically just -->
<p>We'll recapture some of this online, but nothing really replaces the feels of seeing someone else smile and hearing them tell their story. So let's get a mini version! We're looking for short (30 second to 2½ minute) videos from community members, basically just saying hello. Submit your videos <a href="https://emberconf.com/about/community-spotlight">here</a>, and they'll be curated by emcee <a href="https://github.com/donaldsonjulia">Julia Donaldson (@donaldsonjulia)</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/dfreeman" rel="noopener noreferrer" target="_blank">Dan Freeman (@dfreeman)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/urbany" rel="noopener noreferrer" target="_blank">João Teixeira (@urbany)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/alexlafroscia" rel="noopener noreferrer" target="_blank">Alex LaFroscia (@alexlafroscia)</a>, <a href="https://github.com/patocallaghan" rel="noopener noreferrer" target="_blank">Pat O'Callaghan (@patocallaghan)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/chiragpat" rel="noopener noreferrer" target="_blank">Chirag Patel (@chiragpat)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/jaydgruber" rel="noopener noreferrer" target="_blank">@jaydgruber</a>, <a href="https://github.com/jamescdavis" rel="noopener noreferrer" target="_blank">James C. Davis (@jamescdavis)</a>, <a href="https://github.com/whanchong" rel="noopener noreferrer" target="_blank">whanchong (@whanchong)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/krisselden" rel="noopener noreferrer" target="_blank">Kris Selden (@krisselden)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/brendenpalmer" rel="noopener noreferrer" target="_blank">Brenden Palmer (@brendenpalmer)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/yads" rel="noopener noreferrer" target="_blank">Vadim Kazakov (@yads)</a>, <a href="https://github.com/davecombs" rel="noopener noreferrer" target="_blank">Dave Combs (@davecombs)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/josephdsumner" rel="noopener noreferrer" target="_blank">Joseph D. Sumner (@josephdsumner)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/Turbo87" rel="noopener noreferrer" target="_blank">Tobias Bieniek (@Turbo87)</a>, <a href="https://github.com/hjdivad" rel="noopener noreferrer" target="_blank">David J. Hamilton (@hjdivad)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a>, <a href="https://github.com/kobsy" rel="noopener noreferrer" target="_blank">Matt Kobs (@kobsy)</a>, <a href="https://github.com/sandstrom" rel="noopener noreferrer" target="_blank">@sandstrom</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/eramod" rel="noopener noreferrer" target="_blank">Dianne Eramo (@eramod)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/charlespierce" rel="noopener noreferrer" target="_blank">Charles Pierce (@charlespierce)</a>, <a href="https://github.com/thoov" rel="noopener noreferrer" target="_blank">Travis Hoover (@thoov)</a>, <a href="https://github.com/azhiv" rel="noopener noreferrer" target="_blank">Artem Zhivoderov (@azhiv)</a>, and <a href="https://github.com/wondersloth" rel="noopener noreferrer" target="_blank">Matthew Edwards (@wondersloth)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>, now on Substack! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jared Galanis, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-173</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-173</guid><pubDate>Fri, 12 Feb 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 174]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Podcast on native apps and Ember, keep up with the latest in template linting with the Tailwind CSS linter, release of ember-browser-services, and real-world Ember roundup.</p>
<hr />
<h2 id="buildingnativeappswithemberjshttpsaudioemberreport"><a href="https://audio.ember.report">Building native apps with Ember.js 🎙️</a></h2>
<p>The first <a href="https://audio.ember.report/">Ember Report</a> <a href="https://audio.ember.report/1680877/7875391-001-building-native-apps-with-ember-js">podcast</a> is <strong>live</strong>! You can find it on all the podcast platforms, like <a href="https://open.spotify.com/show/58CczXeudOxy4cCdQ0CJUi">Spotify</a> and <a href="https://podcasts.apple.com/podcast/the-ember-report/id1554053161">Apple Podcasts</a>. <a href="https://github.com/kennethlarsen">Kenneth Larsen (@kennethlarsen)</a> and <a href="https://github.com/buschtoens">Jan Butschen (@buschtoens)</a> tell you all about the ins and outs of building native apps with Ember.js. Kenneth asks all the critical questions, you as a listener might have, and Jan shares his expertise on how they embedded their Ember.js app in <a href="https://capacitorjs.com/docs">Capacitor</a>, the successor to <a href="https://cordova.apache.org">Cordova</a>.</p>
<p>With practical examples and a ton of show notes, this podcast will get you started in the world of native apps as an Ember developer. From discussing the technology and the developer experience to discussing the future of native apps vs PWA’s, they’ve got you covered.</p>
<hr />
<h2 id="rediscoverclasssanitywithtailwindcsslinterforembertemplatesv2xhttpsgitlabcommichalbryxiopensourceembertemplatelintplugintailwindcss"><a href="https://gitlab.com/michal-bryxi/open-source/ember-template-lint-plugin-tailwindcss">Rediscover class sanity with Tailwind CSS linter for Ember templates v2.x 🌬</a></h2>
<p>Know what's cool? Respectful, emotionally responsible pull request reviews! A great way to do that is with linting tools to let the computer gently push collaborators towards codebase consistency instead of having to enforce standards through comments and suggestions.</p>
<p>Ember has a wonderful suite of linting tools and hot off the presses is the chill plugin for <a href="https://github.com/ember-template-lint/ember-template-lint">ember-template-lint</a> for all of those <a href="https://tailwindcss.com/">Tailwind CSS</a> users out there, v2.x of <a href="https://gitlab.com/michal-bryxi/open-source/ember-template-lint-plugin-tailwindcss">ember-template-lint-plugin-tailwindcss</a>!</p>
<video controls width="100%">
    <source src="https://gitlab.com/michal-bryxi/open-source/ember-template-lint-plugin-tailwindcss/-/raw/master/docs/rule/class-order.webm"
            type="video/webm" alt='Example of class-order rule'>

    Sorry, your browser doesn't support embedded videos.
</video>
<p><em>Tailwind classes can become quite verbose</em> so it can be nice to encourage some standards for how so many classes can be cleanly added to the DOM. This latest version of the linter gives maintainers full control of <strong>class ordering and when line breaks should occur</strong> (both for <em>classes per line</em> and optionally by <em>class grouping</em>).</p>
<hr />
<h2 id="releaseofemberbrowserserviceshttpsgithubcomcrowdstrikeemberbrowserservices"><a href="https://github.com/CrowdStrike/ember-browser-services">Release of ember-browser-services ⚙️</a></h2>
<p>The <a href="https://github.com/CrowdStrike/ember-browser-services">ember-browser-services</a> addon is officially released! The addon provides a collection of <a href="https://guides.emberjs.com/release/services/">Ember Services</a> that allow for consistent interaction with browser APIs. This provides consistent interaction with browser APIs and easier testing.</p>
<p>For tests, you can stub out the Ember Service from ember-browser-services with your own implementation in order to verify the behavior you were testing. Any changes to a service's implementation during a test are discarded after the test finishes, there’s even a shorthand way of doing so using the <code>setupBrowserFakes</code> export.</p>
<p>Try out <a href="https://github.com/CrowdStrike/ember-browser-services">ember-browser-services</a> today by checking out their code on GitHub!</p>
<hr />
<h2 id="realworldemberroundup">Real-world Ember roundup 🙌</h2>
<ul>
<li>The blog post <a href="https://blog.forestadmin.com/track-performance-of-your-web-application-with-javascript-2/">Track performance of your web application with JavaScript</a> discusses how <a href="https://www.forestadmin.com/">Forest Admin</a> used JavaScript's <strong>Performance API</strong> to implement tracking of app load time in their Ember web app. They're also monitoring the time of requests made by customers on their admin backend. They've implemented the functionality of <em>react-addons-perf</em> (now deprecated in React 16) in Ember. Check out the article for implementation details to track performance, with the goal of improving the user experience.</li>
<li>Have you been missing meetups since the pandemic? Looking for some pre-EmberConf talks for learning and inspiration? Mark your calendar's for <a href="https://www.meetup.com/Ember-LA/events/276336494/">Ember LA's <strong>Virtual</strong> March Meetup</a>. This month, <a href="https://github.com/hergaiety">Ava Gaiety Wroten (@hergaiety)</a> will be giving a presentation called <strong>Achieving A11y Automation Testing</strong>, about an Ember success story with lessons that can be applied to any framework or project. Folks from anywhere are encouraged to attend! P.S. Feel free to submit a talk 📜, anything from a five minute lightning talk to a full-length presentation is welcome.</li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/hergaiety" rel="noopener noreferrer" target="_blank">Ava Gaiety Wroten (@hergaiety)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/lolmaus" rel="noopener noreferrer" target="_blank">Andrey Mikhaylov (lolmaus) (@lolmaus)</a>, <a href="https://github.com/wondersloth" rel="noopener noreferrer" target="_blank">Matthew Edwards (@wondersloth)</a>, <a href="https://github.com/cnocon" rel="noopener noreferrer" target="_blank">Cristin O'Connor (@cnocon)</a>, <a href="https://github.com/charlespierce" rel="noopener noreferrer" target="_blank">Charles Pierce (@charlespierce)</a>, <a href="https://github.com/mixonic" rel="noopener noreferrer" target="_blank">Matthew Beale (@mixonic)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/patocallaghan" rel="noopener noreferrer" target="_blank">Pat O'Callaghan (@patocallaghan)</a>, <a href="https://github.com/Windvis" rel="noopener noreferrer" target="_blank">Sam Van Campenhout (@Windvis)</a>, <a href="https://github.com/herzzanu" rel="noopener noreferrer" target="_blank">Sabin Hertanu (@herzzanu)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/brendenpalmer" rel="noopener noreferrer" target="_blank">Brenden Palmer (@brendenpalmer)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/jeffdaley" rel="noopener noreferrer" target="_blank">Jeff Daley (@jeffdaley)</a>, <a href="https://github.com/jamescdavis" rel="noopener noreferrer" target="_blank">James C. Davis (@jamescdavis)</a>, <a href="https://github.com/zhanwang626" rel="noopener noreferrer" target="_blank">Zhan Wang (@zhanwang626)</a>, <a href="https://github.com/lindyhopchris" rel="noopener noreferrer" target="_blank">Christopher Gammie (@lindyhopchris)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a>, <a href="https://github.com/thoov" rel="noopener noreferrer" target="_blank">Travis Hoover (@thoov)</a>, <a href="https://github.com/drewlee" rel="noopener noreferrer" target="_blank">Andrew A Lee (@drewlee)</a>, <a href="https://github.com/yads" rel="noopener noreferrer" target="_blank">Vadim Kazakov (@yads)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/Bouke" rel="noopener noreferrer" target="_blank">Bouke Haarsma (@Bouke)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/nickschot" rel="noopener noreferrer" target="_blank">Nick Schot (@nickschot)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, and <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Anne-Greeth van Herwijnen, Ava Wroten, Chris Ng, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-174</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-174</guid><pubDate>Fri, 26 Feb 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 175]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember Community Survey 2021, official TypeScript support RFC, EmberConf Contributors Workshop, Ember - a beacon of productivity, <code>ember-responsive-image</code> v2 released, Mirage JS for complex testing, and new podcast episodes!</p>
<hr />
<h2 id="embercommunitysurvey2021httpsemberjscomembercommunitysurvey2021"><a href="https://emberjs.com/ember-community-survey-2021/">Ember Community Survey 2021 📆</a></h2>
<p>The annual community survey is up - please take the survey <strong>today</strong> and let us know what you think about Ember!</p>
<ul>
<li>Totally Anonymous: No personal identification is attached to survey responses. Last year, over 1000 participants shared information about themselves, their businesses, and applications.</li>
<li>At <a href="https://emberconf.com/">EmberConf</a>, the results to the 2021 survey will be shared with a comparison to the 2020 results. Detailed aggregate and individual responses will also be made public.</li>
</ul>
<p><center>
<a class="es-button centered" href="https://emberjs.com/ember-community-survey-2021/">Take the 2021 Ember Community Survey</a>
</center></p>
<p>Questions? Feedback? Please join us in the <a href="https://discord.com/channels/480462759797063690/480777444203429888">#dev-ember-learning</a> channel on the <a href="https://discord.gg/emberjs">Discord community chat</a>, or email the survey team via <a href="mailto:survey@emberjs.com">survey@emberjs.com</a>.</p>
<p>P.S. Please spread the word about the survey, ask your friends and coworkers to fill it out today!</p>
<hr />
<h2 id="rfcofficialtypescriptsupporthttpsgithubcomemberjsrfcspull724"><a href="https://github.com/emberjs/rfcs/pull/724">RFC: Official TypeScript support ✅</a></h2>
<p><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> put up an <a href="https://github.com/emberjs/rfcs/pull/724">RFC for Official TypeScript support</a> in Ember. The goal of the RFC is to determine if we should support <a href="https://www.typescriptlang.org/">TypeScript</a> as a first-class citizen in Ember, and if yes, identify any gaps present today.</p>
<blockquote>
  <p>Ember officially supporting TypeScript means: All libraries which are installed as part of the default blueprint must ship accurate and up-to-date type definitions for the current edition. These types will uphold a Semantic Versioning commitment which includes a definition of SemVer for TypeScript types as well as a specification of supported compiler versions and settings, so that TypeScript will receive the same stability commitments as the rest of Ember.</p>
</blockquote>
<ul>
<li>Any addon that is part of the default blueprint must ship types</li>
<li>Define a policy on what constitutes a breaking change for consumers of a library which publishes types, including Ember’s core libraries</li>
<li>New Ember apps and addons should support TypeScript by default, though the details of what that means (for example how it will use <a href="https://github.com/typed-ember/ember-cli-typescript">ember-cli-typescript</a> or not) will be resolved in future RFCs</li>
<li>The RFC explicitly does not require support for “typed templates” (though the community is working on this and thinks it’s key to the long-term TypeScript story)</li>
</ul>
<p>Read and comment on the <a href="https://github.com/emberjs/rfcs/pull/724">RFC on GitHub</a>!</p>
<hr />
<h2 id="emberconfcontributorsworkshophttpsemberconfcomschedulepreconf_contributorsworkshop"><a href="https://emberconf.com/schedule/pre-conf_contributors-workshop">EmberConf Contributors Workshop 🐹</a></h2>
<p>We're certainly all excited about the upcoming (virtual) EmberConf 2021, but don't forget that there's a Contributors Workshop too!</p>
<p>The Contributors Workshop, hosted by <a href="https://github.com/locks">Ricardo Mendes (@locks)</a> and <a href="https://github.com/hergaiety">Ava Gaiety Wroten (@hergaiety)</a>, will bring our community together to share knowledge about how you can make your first contribution to Ember. There's not much more to it, all you need to bring is an eagerness to learn and contribute to the framework we know and love! 💜💛🧡❤️</p>
<p>You can register for the workshop <a href="https://tilde.wufoo.com/forms/emberconf-2021-contributors-workshop-registration/">here</a>.</p>
<hr />
<h2 id="emberabeaconofproductivityhttpssimplabscomblog20210312emberjsin2021abeaconofproductivity"><a href="https://simplabs.com/blog/2021/03/12/Ember.js-in-2021---a-beacon-of-productivity/">Ember - a beacon of productivity 📖</a></h2>
<p><a href="https://github.com/marcoow">Marco Otte-Witte (@marcoow)</a> has written an excellent new <a href="https://simplabs.com/blog/2021/03/12/Ember.js-in-2021---a-beacon-of-productivity/">blog post</a> for the Simplabs blog about why Ember is still a beacon of productivty in a sea of complexity, even after 10 years.</p>
<p>Marco covers how Ember's approach can avoid accidental complexity and all the other things that makes it such a great tool. Even if you know and love Ember, it's well worth a read, so please check out the post if you get a chance.</p>
<hr />
<h2 id="emberresponsiveimagev2releasedhttpstwittercomsimonihmigstatus1369316435621724163"><a href="https://twitter.com/simonihmig/status/1369316435621724163"><code>ember-responsive-image</code> v2 released 🖼️</a></h2>
<p><a href="https://github.com/kaliber5/ember-responsive-image">ember-responsive-image</a> is an addon created by <a href="https://github.com/simonihmig">Simon Ihmig (@simonihmig)</a>. At build time, the addon uses <a href="https://github.com/lovell/sharp">sharp</a> to generate resized images that are optimized for web.</p>
<p>Simon <a href="https://twitter.com/simonihmig/status/1369316435621724163">announced the v2 release</a>, which provides the following features:</p>
<ul>
<li><code>&lt;ResponsiveImage&gt;</code> rewritten as a Glimmer component</li>
<li>Next-gen image formats WebP and AVIF</li>
<li>Fixed and responsive layouts</li>
<li>Lazy loading + LQIP (Low Quality Image Placeholders)</li>
<li>FastBoot and Embroider support</li>
</ul>
<p>To learn more how <code>ember-responsive-image</code> can help you optimize loading images, we encourage you to check out the following links:</p>
<ul>
<li><a href="https://github.com/kaliber5/ember-responsive-image#basic-usage">README: Basic Usage</a></li>
<li><a href="https://www.industrialempathy.com/posts/image-optimizations/">Maximally Optimizing Image Loading for the Web in 2021</a></li>
<li><a href="https://github.com/ember-learn/ember-website/pull/769">Implementation in <code>ember-website</code> repo</a></li>
</ul>
<hr />
<h2 id="howqontousedmiragejsforcomplexuserflowtestinghttpsmediumcomqontowayhowtohandleuploadingandparsingfilesinyourfrontendapptests19bee8e7a61f"><a href="https://medium.com/qonto-way/how-to-handle-uploading-and-parsing-files-in-your-frontend-app-tests-19bee8e7a61f">How Qonto used Mirage JS for complex user flow testing ⬆️</a></h2>
<p><a href="https://github.com/herzzanu">Sabin Hertanu (@herzzanu)</a> details a <strong>testing challenge</strong> he ran into at <a href="https://qonto.com/en">Qonto</a> in the article <a href="https://medium.com/qonto-way/how-to-handle-uploading-and-parsing-files-in-your-frontend-app-tests-19bee8e7a61f">How to handle uploading and parsing files in your frontend app tests</a>. In Qonto's Ember app, users can upload a file to their servers for creating transfers in bulk. The server reads, parses, and processes the data before sending a list of transfers in response. Mocking the endpoints to accurately match this full process would take a lot of time and code, in addition to being challenging to maintain and scale.</p>
<p><a href="https://miragejs.com/">Mirage JS</a> is a library for mocking API endpoints as <a href="https://miragejs.com/docs/main-concepts/route-handlers/">route handlers</a> to test JavaScript apps, without having to rely on any backend services. Sabin discusses how Qonto uses Mirage <a href="https://miragejs.com/docs/main-concepts/factories/">Factories</a> to test this tricky user flow. Check out the walkthrough with test code samples in the <a href="https://medium.com/qonto-way/how-to-handle-uploading-and-parsing-files-in-your-frontend-app-tests-19bee8e7a61f">blog post</a> to learn about how Qonto mocked the API to make sure it matches what they would expect from the real API in production. Effective testing can pay dividends in improving the developer experience and maintaining the quality of the user experience!</p>
<hr />
<h2 id="newpodcastepisodes">New Podcast Episodes 🎙</h2>
<p>There are fresh episodes of the new Ember-related podcasts available now! 🔥🔥🔥</p>
<!-- alex ignore tang -->
<p>The <a href="https://twitter.com/EmberReport">Ember Report</a> has published a <a href="https://twitter.com/EmberReport/status/1369010817518166020">great episode</a> that features <a href="https://github.com/skaterdav85">David Tang (@skaterdav85)</a> who shares all about how he came to write his Ember Data books, "Ember Data in the Wild" and the more recently published <a href="https://www.apress.com/us/book/9781484265604">Pro Ember Data</a>. They cover a ton of good subjects, such as how David got into teaching web development and also dig into a variety of Ember Data subjects, so check out the podcast when you can!</p>
<!-- alex ignore of-course -->
<p>Also, the Whiskey, Web and Whatnot podcast has released a <a href="https://twitter.com/shipshapecode/status/1369961936096538625">cool new episode</a> that features <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a>. They talk about whiskey, of course, but also cover some of the new exciting new things that Chris has been working on for Glimmer and Ember - strict mode and template imports amongst other things. Great stuff!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/evoactivity" rel="noopener noreferrer" target="_blank">Liam Potter (@evoactivity)</a>, <a href="https://github.com/jeffdaley" rel="noopener noreferrer" target="_blank">Jeff Daley (@jeffdaley)</a>, <a href="https://github.com/patocallaghan" rel="noopener noreferrer" target="_blank">Pat O'Callaghan (@patocallaghan)</a>, <a href="https://github.com/Cartmanishere" rel="noopener noreferrer" target="_blank">Pranav Gajjewar (@Cartmanishere)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a>, <a href="https://github.com/smfoote" rel="noopener noreferrer" target="_blank">Steven (@smfoote)</a>, <a href="https://github.com/stefanpenner" rel="noopener noreferrer" target="_blank">Stefan Penner (@stefanpenner)</a>, <a href="https://github.com/alexlafroscia" rel="noopener noreferrer" target="_blank">Alex LaFroscia (@alexlafroscia)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/steventsao" rel="noopener noreferrer" target="_blank">Steven Tsao (@steventsao)</a>, <a href="https://github.com/sly7-7" rel="noopener noreferrer" target="_blank">Sylvain MINA (@sly7-7)</a>, <a href="https://github.com/arenoir" rel="noopener noreferrer" target="_blank">Aaron Renoir (@arenoir)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/lifeart" rel="noopener noreferrer" target="_blank">Alex Kanunnikov (@lifeart)</a>, <a href="https://github.com/dfreeman" rel="noopener noreferrer" target="_blank">Dan Freeman (@dfreeman)</a>, <a href="https://github.com/kaermorchen" rel="noopener noreferrer" target="_blank">Stanislav Romanov (@kaermorchen)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/thoov" rel="noopener noreferrer" target="_blank">Travis Hoover (@thoov)</a>, <a href="https://github.com/esquith" rel="noopener noreferrer" target="_blank">Esquith Allen (@esquith)</a>, <a href="https://github.com/Windvis" rel="noopener noreferrer" target="_blank">Sam Van Campenhout (@Windvis)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/zhanwang626" rel="noopener noreferrer" target="_blank">Zhan Wang (@zhanwang626)</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/loganrosen" rel="noopener noreferrer" target="_blank">Logan Rosen (@loganrosen)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/rpemberton" rel="noopener noreferrer" target="_blank">Rob Pemberton (@rpemberton)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, and <a href="https://github.com/fdrobidoux" rel="noopener noreferrer" target="_blank">Félix Dion-Robidoux (@fdrobidoux)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Isaac Lee, Amy Lam, Chris Ng, Jared Galanis, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-175</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-175</guid><pubDate>Fri, 12 Mar 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 176]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>EmberConf is this Monday, get into the EmberConf vibe with Leah and Kenneth, meet Glint, a typed-template solution for Ember, and the release of ember-electron v3!</p>
<hr />
<h2 id="emberconfisthismondayhttpsemberconfcom"><a href="https://emberconf.com/">EmberConf is this Monday 🎉</a></h2>
<p>EmberConf is <strong>the best place</strong> to meet the folks behind the magic, and Virtual EmberConf 2021 is this upcoming Monday and Tuesday! 🙌 <a href="https://emberconf.com/">EmberConf</a> is two days of Ember talks, sessions and fun -- streaming live virtually everywhere.</p>
<p>Hop onto the <a href="https://discord.gg/emberjs">Ember Discord</a> to start chatting with your Ember friends in the <a href="https://discord.com/channels/480462759797063690/480502413917421570">#emberconf</a> channel. Starting this Monday, most EmberConf chatter will take place in <a href="https://discord.com/channels/480462759797063690/824756378814906435">#ec-hallway</a> and the dedicated-per-session channels under the "Virtual EmberConf" category.</p>
<p>Here at the Ember Times, we are super excited about the conference <a href="https://emberconf.com/schedule/">lineup</a>. Monday is an optional day of workshops and BonusConf streams, from "Debugging Your Brain" to "Introducing Template Imports". Tuesday's main event will be a full day of keynotes and technical sessions, including "Ending the Plague of Memory Leaks", "Fast-Track Ember with Fastboot + Embroider", "Typed Ember <code>extends</code> Confidence", and more. P.S. It's still possible to attend last minute!</p>
<ul>
<li>Tickets are $99. If you are unemployed, laid off, or a student, tickets are only $5. Tell a friend!</li>
<li>Monday's will include two AMA's and you can submit your questions <a href="https://tilde.wufoo.com/forms/emberconf-2021-ama-questions/">here</a>.<ul>
<li>AMA with <a href="https://github.com/rwjblue">Robert Jackson (@rwjblue)</a>, hosted by <a href="https://github.com/melsumner">Melanie Sumner (@MelSumner)</a></li>
<li>AMA with <a href="https://github.com/wycats">Yehuda Katz (@wycats)</a>, hosted by <a href="https://github.com/donaldsonjulia">Julia Donaldson (@donaldsonjulia)</a></li></ul></li>
</ul>
<hr />
<h2 id="theinsandoutsoforganisingemberconfhttpsaudioemberreport16808778115211003leahsilberonemberconf2021"><a href="https://audio.ember.report/1680877/8115211-003-leah-silber-on-emberconf-2021">The ins and outs of organising EmberConf 📻</a></h2>
<p>In the latest <a href="https://twitter.com/EmberReport">Ember Report</a> <a href="https://audio.ember.report/1680877/8115211-003-leah-silber-on-emberconf-2021">podcast</a>, <a href="https://twitter.com/wifelette">Leah Silber (@wifelette)</a> talks about organising a remote EmberConf, the history of EmberConf, and additional topics like <a href="https://emberconf.com/about/inclusiveness-at-emberconf">inclusiveness</a> that are so crucial to the EmberConf vibe.</p>
<p>This podcast gives a nice insight into the mind of a great conference organiser. There are also tips and pointers for people looking to organise conferences or meet-ups remotely and in real life.</p>
<p>In addition to how to organise a conference, Leah tells us about her favourite talks and the cool things that will happen at EmberConf 2021, such as workshops and the <a href="https://emberconf.com/kids">kids track</a>.</p>
<p>Be sure to check out the podcast episode, <a href="https://audio.ember.report/1680877/8115211-003-leah-silber-on-emberconf-2021">Leah Silber on EmberConf 2021</a>!</p>
<hr />
<h2 id="introducingglintatypedtemplatesolutionforglimmerxandemberhttpswwwsalsifycomblogengineeringintroducingglintatypedtemplatesolutionforglimmerxandember"><a href="https://www.salsify.com/blog/engineering/introducing-glint-a-typed-template-solution-for-glimmerx-and-ember">Introducing: Glint, a typed-template solution for GlimmerX and Ember ✨</a></h2>
<p>Some <a href="https://twitter.com/__dfreeman/status/1374765841158434816">exciting news from the Typed Ember team</a>: You can use <a href="https://github.com/typed-ember/glint">Glint</a> to <strong>type check Ember and Glimmer templates</strong>. "Similar to Vetur for Vue projects, Glint consists of a CLI (command-line interface) and a language server to provide feedback and enforce correctness both locally during editing and project-wide in CI (continuous integration)."</p>
<p><img alt="" role="presentation" src="/images/blog/2020-03-26/glint-featured.png" /></p>
<p>To learn more why Glint was born and what you can do with Glint, we encourage you to have a look at the blog post, <a href="https://www.salsify.com/blog/engineering/introducing-glint-a-typed-template-solution-for-glimmerx-and-ember">Introducing: Glint, a typed-template solution for GlimmerX and Ember</a>. The blog post provides amazing screenshots and GIFs to demonstrate Glint in action.</p>
<p>Please thank the Typed Ember team, which consists of <a href="https://github.com/dfreeman">Dan Freeman (@dfreeman)</a>, <a href="https://github.com/jamescdavis">James Davis (@jamescdavis)</a>, and <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a>, by trying out Glint today!</p>
<hr />
<h2 id="releaseofemberelectronv3httpstwittercombendemboskistatus1370905222336286721"><a href="https://twitter.com/bendemboski/status/1370905222336286721">Release of ember-electron v3 ⚛️</a></h2>
<p><a href="https://github.com/adopted-ember-addons/ember-electron/releases/tag/v3.0.0">Ember Electron V3</a> was released by <a href="https://github.com/bendemboski">Ben Demboski (@bendemboski)</a> adding some key improvements over v2 including:</p>
<ul>
<li>latest Electron tooling</li>
<li>faster build pipeline</li>
<li>much improved developer ergonomics</li>
<li>restored support for Ember Inspector (and other extensions)</li>
</ul>
<p>Get started today with the <a href="https://ember-electron.js.org/">official Ember Electron docs</a> and read more about the release on <a href="https://github.com/adopted-ember-addons/ember-electron/releases/tag/v3.0.0">GitHub</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/betocantu93" rel="noopener noreferrer" target="_blank">Alberto Cantú Gómez (@betocantu93)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/jwlawrence" rel="noopener noreferrer" target="_blank">Joshua Lawrence (@jwlawrence)</a>, <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/lifeart" rel="noopener noreferrer" target="_blank">Alex Kanunnikov (@lifeart)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/balinterdi" rel="noopener noreferrer" target="_blank">Balint Erdi (@balinterdi)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/yaxinr" rel="noopener noreferrer" target="_blank">Gilfanov Ramil (@yaxinr)</a>, <a href="https://github.com/thoov" rel="noopener noreferrer" target="_blank">Travis Hoover (@thoov)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/Windvis" rel="noopener noreferrer" target="_blank">Sam Van Campenhout (@Windvis)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/hergaiety" rel="noopener noreferrer" target="_blank">Ava Gaiety Wroten (@hergaiety)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/aroskar" rel="noopener noreferrer" target="_blank">Abhishek Aroskar (@aroskar)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/sly7-7" rel="noopener noreferrer" target="_blank">Sylvain MINA (@sly7-7)</a>, <a href="https://github.com/kaermorchen" rel="noopener noreferrer" target="_blank">Stanislav Romanov (@kaermorchen)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/esquith" rel="noopener noreferrer" target="_blank">Esquith Allen (@esquith)</a>, <a href="https://github.com/patocallaghan" rel="noopener noreferrer" target="_blank">Pat O'Callaghan (@patocallaghan)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, and <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Amy Lam, Anne-Greeth van Herwijnen, Isaac Lee, Chris Ng, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-176</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-176</guid><pubDate>Fri, 26 Mar 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 177]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>EmberConf videos, virtual Ember Meetups, achieving a11y automation testing, and serverless functions in Ember and Glimmer.</p>
<hr />
<h2 id="virtualemberconf2021httpswwwyoutubecomplaylistlistpl4eq2dppybbkc3vz8_n4xkeboowqcpqbk"><a href="https://www.youtube.com/playlist?list=PL4eq2DPpyBbkc3vz8_N4xkeboowQcPQbK">Virtual EmberConf 2021 🔥 📼</a></h2>
<p>Heyo! Did you miss out on Virtual EmberConf 2021? Did you see some talks, but missed others? Did you watch all of the content, but want to re-watch things!? 👀 Fear not, the suite of full conference talks can now be found online now as <a href="https://www.youtube.com/playlist?list=PL4eq2DPpyBbkc3vz8_N4xkeboowQcPQbK">individual videos</a>.</p>
<p>If you didn't get a chance to see them, you shouldn't miss the <a href="https://www.youtube.com/watch?v=pJPUQQQ9QDg&list=PL4eq2DPpyBbkc3vz8_N4xkeboowQcPQbK&index=10">Keynote Part 1</a> and <a href="https://www.youtube.com/watch?v=1Z6cLV2licU&list=PL4eq2DPpyBbkc3vz8_N4xkeboowQcPQbK&index=11">Keynote Part 2</a> by none other than our own <a href="https://github.com/wycats">Yehuda Katz (@wycats)</a> and <a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a>.</p>
<p>Also not to be missed are talks by <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> on <a href="https://www.youtube.com/watch?v=oQZJU7WDCZE&list=PL4eq2DPpyBbkc3vz8_N4xkeboowQcPQbK&index=5">template imports</a>, and a stunning talk on <a href="https://www.youtube.com/watch?v=Mt7v-VbFjxk&list=PL4eq2DPpyBbkc3vz8_N4xkeboowQcPQbK&index=15">building robust and reliable software</a> by <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a>.</p>
<p>There was also a beautiful and inspiring 💖 talk about <a href="https://www.youtube.com/watch?v=MJ1t1K5r_gQ&list=PL4eq2DPpyBbkc3vz8_N4xkeboowQcPQbK&index=16">Learning Ember in 2021</a> by <a href="https://github.com/lenoraporter">Lenora Porter (@lenoraporter)</a>.</p>
<p>For sure, whatever you do, do not miss the absolutely mind blowing 🤯 closing keynote by <a href="https://github.com/ef4">Edward Faulkner (@ef4)</a> about the future of build tooling, <a href="https://www.youtube.com/watch?v=09USvAy7w9g&list=PL4eq2DPpyBbkc3vz8_N4xkeboowQcPQbK&index=23">Mho</a>.</p>
<p>Really, all of the talks were quite ✨✨ amazing ✨✨ and if you have not seen them you should go check them out when you can. A big <strong>thank you</strong> to all the speakers at Virtual Ember Conf 2021!!! 🧡💛💜💙💚</p>
<p>If you're interested in some great notes about the talks you can find <a href="https://github.com/alexdiliberto">Alex DiLiberto's (@alexdiliberto)</a> notes <a href="https://alexdiliberto.com/posts/emberconf-2021-notes/">here</a>.</p>
<p>There's also plenty of official and unofficial bonus content out there, including:</p>
<ul>
<li>An <a href="https://www.youtube.com/watch?v=CXv55zFcJdI">unofficial TypeScript AMA</a> with <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> and  <a href="https://github.com/acorncom">David Baker (@acorncom)</a></li>
<li>Another <a href="https://twitter.com/courajs/status/1379477838420713474">look at Mho</a> with <a href="https://github.com/ef4">Edward Faulkner (@ef4)</a> and <a href="https://github.com/courajs">Aaron Sikes (@courajs)</a></li>
<li>Typed Ember extends Confidence blog series, which translates the talk to prose, plus some bonus content that couldn't fit in the conference talk! Be sure to check out all three posts by <a href="https://github.com/gitKrystan">Krystan HuffMenne</a>: <a href="https://blog.skylight.io/ts-extends-confidence-1/">Part 1: What is TypeScript?</a>, <a href="https://blog.skylight.io/ts-extends-confidence-2/">Part 2: Converting Your Ember App to TypeScript</a>, and <a href="https://blog.skylight.io/ts-extends-confidence-3/">Part 3: The Real Benefits of TypeScript</a></li>
</ul>
<p>Don't miss it, friends!</p>
<hr />
<h2 id="virtualembermeetups">Virtual Ember meetups 🧑‍💻</h2>
<p>Have you been missing attending your local Ember meetup during the pandemic? Well you're in luck, there are a couple of virtual Ember meetups happening next week that you can attend!</p>
<p>If you've been wanting to learn more about what the <strong>Fastboot</strong> team is up to, you may want to check out the <a href="https://www.eventbrite.com/e/ember-fastboot-ssr-beyond-tickets-144468965565?aff=ebdssbonlinesearch">online event</a> occurring on April 14th. There will be some great talks by members of Fastboot team, including appearances by <a href="https://github.com/kiwiupover">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/suchitadoshi1987">Suchita Doshi
 (@suchitadoshi1987)</a>, <a href="https://github.com/xg-wang">Thomas Wang
 (@xg-wang)</a> and <a href="https://github.com/snewcomer">Scott Newcomer (@snewcomer)</a>.</p>
<p>Haven't had your fill yet? The next day, April 15th, you can come visit with Emberistas and Embereños from Los Angeles, and far and wide, for some more good Fastboot content, as well as discussions on <strong>modifiers and components</strong> at the <a href="https://www.meetup.com/Ember-LA/events/277245874">Ember LA Meetup</a>!</p>
<hr />
<h2 id="achievinga11yautomationtestinghttpstwittercomtestjssummitstatus1369241608944762883"><a href="https://twitter.com/TestJSSummit/status/1369241608944762883">Achieving a11y automation testing 🎥</a></h2>
<p>If you're looking for some content in the wider JavaScript community beyond EmberConf, you can checkout the fantastic talk by <a href="https://github.com/hergaiety">Ava Gaiety Wroten (@hergaiety)</a> at TestJS Summit covering <a href="https://twitter.com/TestJSSummit/status/1369241608944762883">a11y automated testing</a>! 🔥🔥🔥</p>
<p>The talk covers not only what Ember does for accessibility in testing, but also highlights some approaches and tools you can use for making automation a11y focused in other frameworks.</p>
<hr />
<h2 id="serverlessfunctionsinemberandglimmerhttpsshipshapeioblogserverlessfunctionsemberglimmer"><a href="https://shipshape.io/blog/serverless-functions-ember-glimmer/">Serverless functions in Ember and Glimmer 💯</a></h2>
<p>After using <a href="https://nextjs.org/docs/api-routes/introduction">API Routes</a> in Next.js, <a href="https://github.com/jaredgalanis">Jared Galanis (@jaredgalanis)</a> explored bringing the same functionality to Ember and Glimmer. Next's API routes are essentially node functions that deploy as serverless lambdas. They can provide a place to write a GraphQL endpoint, serve as a gateway to other APIs, or serve as a full-fledged backend that talks to a persistence layer.</p>
<p>The article walks through the setup of serverless functions in both Ember and Glimmer, using Netlify or Vercel. Check out Jared's blog post for <a href="https://shipshape.io/">Ship Shape</a>, <a href="https://shipshape.io/blog/serverless-functions-ember-glimmer/">Serverless Functions in Ember and Glimmer</a> and try it out yourself for some developer experience gains on the frontend!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/hergaiety" rel="noopener noreferrer" target="_blank">Ava Gaiety Wroten (@hergaiety)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/lupestro" rel="noopener noreferrer" target="_blank">Ralph Mack (@lupestro)</a>, <a href="https://github.com/acorncom" rel="noopener noreferrer" target="_blank">David Baker (@acorncom)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/nickeidler" rel="noopener noreferrer" target="_blank">Nicholas Eidler (@nickeidler)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/pernambucano" rel="noopener noreferrer" target="_blank">Paulo Fernandes (@pernambucano)</a>, <a href="https://github.com/afzal273" rel="noopener noreferrer" target="_blank">Afzal Syed (@afzal273)</a>, <a href="https://github.com/chadhietala" rel="noopener noreferrer" target="_blank">Chad Hietala (@chadhietala)</a>, <a href="https://github.com/Valgueiro" rel="noopener noreferrer" target="_blank">Mateus Valgueiro (@Valgueiro)</a>, <a href="https://github.com/theklr" rel="noopener noreferrer" target="_blank">Kevin R (@theklr)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/Krashaune" rel="noopener noreferrer" target="_blank">Kiera Thomasson (@Krashaune)</a>, <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a>, <a href="https://github.com/Angel-gc" rel="noopener noreferrer" target="_blank">Angel Concepcion (@Angel-gc)</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/ejfian-2020" rel="noopener noreferrer" target="_blank">@ejfian-2020</a>, <a href="https://github.com/sandstrom" rel="noopener noreferrer" target="_blank">@sandstrom</a>, <a href="https://github.com/milindalvares" rel="noopener noreferrer" target="_blank">Milind Alvares (@milindalvares)</a>, <a href="https://github.com/piotrekbator" rel="noopener noreferrer" target="_blank">Piotrek Bator (@piotrekbator)</a>, <a href="https://github.com/barelyknown" rel="noopener noreferrer" target="_blank">Sean Devine (@barelyknown)</a>, <a href="https://github.com/DanaKirsh" rel="noopener noreferrer" target="_blank">@DanaKirsh</a>, <a href="https://github.com/MarissaWood" rel="noopener noreferrer" target="_blank">Marissa Wood (@MarissaWood)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/hmajoros" rel="noopener noreferrer" target="_blank">Hank Majoros (@hmajoros)</a>, <a href="https://github.com/tricknotes" rel="noopener noreferrer" target="_blank">Ryunosuke Sato (@tricknotes)</a>, <a href="https://github.com/ziw" rel="noopener noreferrer" target="_blank">@ziw</a>, <a href="https://github.com/vivasconcelos" rel="noopener noreferrer" target="_blank">@vivasconcelos</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/esquith" rel="noopener noreferrer" target="_blank">Esquith Allen (@esquith)</a>, <a href="https://github.com/benjahur" rel="noopener noreferrer" target="_blank">@benjahur</a>, <a href="https://github.com/mamiller93" rel="noopener noreferrer" target="_blank">Matthew Miller (@mamiller93)</a>, and <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jared Galanis, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-177</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-177</guid><pubDate>Fri, 09 Apr 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 178]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Find out about the Ember 3.26 release, updated release of Unstable Ember Language Server, and addon roundup.</p>
<hr />
<h2 id="ember326releasedhttpsblogemberjscomember326released"><a href="https://blog.emberjs.com/ember-3-26-released">Ember 3.26 released 🥳</a></h2>
<p><a href="https://blog.emberjs.com/ember-3-26-released">Ember 3.26 release was announced</a> on April 12, 2021. The release patched a few bug fixes in <code>ember-source</code> and <code>ember-cli</code>. It also introduced several deprecations in <code>ember-source</code> in preparation of the <strong>upcoming Ember 4.0 release</strong>.</p>
<p>We encourage you to make time to address deprecated patterns in your apps and addons. The <a href="https://deprecations.emberjs.com/">Deprecations Guide</a> provides examples of how you might update your code.</p>
<p>Here are 3 quick tips for what you can do for Ember 3.26:</p>
<ol>
<li><p>To make a route transition in a controller or route, inject the <code>router</code> service and use its <code>transitionTo</code> or <code>replaceWith</code> method. You can check the <a href="https://api.emberjs.com/ember/release/classes/RouterService">API Guides</a> to learn more about the <code>router</code> service.</p>
<p>For new code, using the <code>router</code> service shouldn't cause an issue. When you update existing code, however, your app may behave differently when the route transition occurs. Before any update, write tests that cover the intended behavior.</p></li>
<li><p>When you invoke the <code>&lt;LinkTo&gt;</code> component with angle brackets, use named arguments to improve code readability. The arguments include <code>@route</code>, <code>@model</code>, <code>@models</code>, and <code>@query</code>.</p></li>
<li><p>If you use Ember Data in a controller or route, inject the <code>store</code> service.</p></li>
</ol>
<p>Need help with upgrading your app? You can ask questions in the <a href="https://discuss.emberjs.com/">Ember Discussion Forum</a> or the <code>#help</code> channel on <a href="https://discord.gg/emberjs">Ember Discord</a>.</p>
<hr />
<h2 id="updatedreleaseofunstableemberlanguageserverhttpsmarketplacevisualstudiocomitemsitemnamelifeartvscodeemberunstable"><a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-ember-unstable">Updated release of Unstable Ember Language Server ✨</a></h2>
<p>A new version of <a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-ember-unstable">Unstable Ember Language Server</a> has been published thanks to <a href="https://github.com/suchitadoshi1987">Suchita Doshi (@suchitadoshi1987)</a> and <a href="https://github.com/lifeart">Alex Kanunnikov (@lifeart)</a>.</p>
<p>The Unstable Ember Language Server is a VSCode extension that provides VSCode users features like auto complete, goto definition and diagnostics for Ember projects. While the name contains the word “unstable,” it is very <strong>stable</strong> and is actually a fork of the <a href="https://github.com/ember-tooling/ember-language-server">original Ember Language Server project</a>.</p>
<p>This recent release adds <a href="https://github.com/rwjblue/ember-holy-futuristic-template-namespacing-batman">batman syntax</a> support (namespaces) to <a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-ember-unstable">Unstable Ember Language Server</a> so try it out today on your VSCode!</p>
<hr />
<h2 id="addonroundup">Addon roundup 🙌</h2>
<p>We wanted to highlight some recent happenings around the web! Check them out and give them a try! 😎</p>
<!-- alex ignore easy -->
<ul>
<li>Do you want to use OAuth in your Ember app? <a href="https://github.com/sinankeskin">Sinan Keskin (@sinankeskin)</a> wrote a new addon, <a href="https://github.com/sinankeskin/ember-oauther">ember-oauther</a>, which allows you to sign in and register a user with OAuth easily! OAuth is an open standard for <strong>access delegation</strong>, commonly used to help a user register or log in to a web app via their login for Facebook, Google, Microsoft, etc.</li>
<li><a href="https://github.com/elwayman02/ember-resize-modifier">ember-resize-monitor</a> provides a <a href="https://ember-resize-modifier.jhawk.co/modifiers/did-resize/">did-resize</a> modifier for detecting <strong>resize events</strong> on the element or component it's attached to. These events could include window resizing CSS changes, content updates, and more. <a href="https://github.com/elwayman02">Jordan Hawker (@elwayman02)</a> published a v0.2.0 and gave a shoutout to <a href="https://github.com/xjmdoo">Tamas Sule (@xjmdoo)</a> for improving the addon's performance by 10x!</li>
<li><a href="https://github.com/ember-a11y/ember-a11y-testing">ember-a11y-testing</a> v4.0.4 is here! ember-a11y-testing is a wrapper around Deque Labs' <a href="https://github.com/dequelabs/axe-core">axe-core</a> <strong>accessibility testing engine</strong>. The addon can be integrated in your testing environment either as a one-time setup, or in individual tests using an <code>a11yAudit()</code> test helper. Raise your Lighthouse score <em>and</em> improve the web at the same time! Thank you to the team that made this happen, including these recent contributors: <a href="https://github.com/drewlee">Andrew A Lee (@drewlee)</a>, <a href="https://github.com/danwenzel">Dan Wenzel (@danwenzel)</a>, <a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/scalvert">Steve Calvert (@scalvert)</a>, <a href="https://github.com/rwjblue">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/thoov">Travis Hoover (@thoov)</a>, and <a href="https://github.com/zelaznik">
Steve Zelaznik (@zelaznik)</a>.</li>
<li><a href="https://github.com/suchitadoshi1987/els-addon-import-specifiers">Suchita Doshi (@suchitadoshi1987)</a> published a new experimental language server addon, <a href="https://github.com/suchitadoshi1987/els-addon-import-specifiers">els-addon-import-specifiers</a>, that jumps to <strong>the line</strong> of an import directly, instead of the parent file. Nice!</li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/hannakim91" rel="noopener noreferrer" target="_blank">Hanna (@hannakim91)</a>, <a href="https://github.com/btecu" rel="noopener noreferrer" target="_blank">Bj Tecu (@btecu)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/rinoldsimon" rel="noopener noreferrer" target="_blank">Rinold Simon (@rinoldsimon)</a>, <a href="https://github.com/brendenpalmer" rel="noopener noreferrer" target="_blank">Brenden Palmer (@brendenpalmer)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/esquith" rel="noopener noreferrer" target="_blank">Esquith Allen (@esquith)</a>, <a href="https://github.com/rajasegar" rel="noopener noreferrer" target="_blank">Rajasegar Chandran (@rajasegar)</a>, <a href="https://github.com/patocallaghan" rel="noopener noreferrer" target="_blank">Pat O'Callaghan (@patocallaghan)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/stephencweiss" rel="noopener noreferrer" target="_blank">Stephen Weiss (@stephencweiss)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/nickschot" rel="noopener noreferrer" target="_blank">Nick Schot (@nickschot)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/lin-ll" rel="noopener noreferrer" target="_blank">Lucy Lin (@lin-ll)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/jayjayjpg" rel="noopener noreferrer" target="_blank">Jesse Jordan (@jayjayjpg)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/afzal273" rel="noopener noreferrer" target="_blank">Afzal Syed (@afzal273)</a>, <a href="https://github.com/davecombs" rel="noopener noreferrer" target="_blank">Dave Combs (@davecombs)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/josemarluedke" rel="noopener noreferrer" target="_blank">Josemar Luedke (@josemarluedke)</a>, <a href="https://github.com/tylerbecks" rel="noopener noreferrer" target="_blank">Tyler Becks (@tylerbecks)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/spham92" rel="noopener noreferrer" target="_blank">Steven Pham (@spham92)</a>, and <a href="https://github.com/broxsonl" rel="noopener noreferrer" target="_blank">Lee Broxson (@broxsonl)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Amy Lam, Isaac Lee, Chris Ng, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-178</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-178</guid><pubDate>Fri, 23 Apr 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 179]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Global Accessibility Awareness Day, Readers' Question: Embroider status update, <code>@use</code> with Ember Apollo Client, and how JS frameworks solved the problem of rendering fast.</p>
<hr />
<h2 id="may20thisglobalaccessibilityawarenessdayhttpstwittercommelaniersumnerstatus1389703699241578502s20"><a href="https://twitter.com/melaniersumner/status/1389703699241578502?s=20">May 20th is Global Accessibility Awareness Day 💟</a></h2>
<p><a href="https://en.wikipedia.org/wiki/Global_Accessibility_Awareness_Day">Global Accessibility Awareness Day</a>, an awareness day focusing on digital access and inclusion for the more than one billion people with disabilities and impairments, will be celebrated on May 20, 2021. Here are some suggestions from <a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a> on how you can get involved in some accessibility (a11y) related open source projects!</p>
<ol>
<li>Help convert <a href="https://github.com/ember-components/ember-component-patterns">ember-component-patterns</a> from Gitbook to an Ember app</li>
<li>Help with <a href="https://github.com/MelSumner/a11y-automation">a11y-automation.dev</a> which is a project to track a11y automation</li>
<li>Check out the <a href="https://help-wanted.emberjs.com/ember-a11y">help wanted page</a> for issues in the <a href="https://github.com/ember-a11y">ember-a11y GitHub organization</a></li>
<li>Help write some <a href="https://github.com/ember-template-lint/ember-template-lint/issues?q=is%3Aopen+is%3Aissue+label%3Aa11y">a11y-related linting rules</a> for ember-template-lint</li>
</ol>
<p>For more ideas please check out the <a href="https://globalaccessibilityawarenessday.org/">Global Accessibility Awareness Day (GAAD) website</a>!</p>
<hr />
<h2 id="readersquestionwhatsthecurrentstatusoftheembroiderproject">Readers' Question: What’s the current status of the Embroider project? 🧵</h2>
<p>What's the current status of the Embroider project? <a href="https://github.com/embroider-build/embroider">Embroider</a> is nearing a 1.0 release. Embroider has been a long time coming, and the future is looking bright. Several large, heavily-tested Ember apps are already shipping to production with Embroider! The official cutover point will be when Ember CLI starts generating new apps with Embroider by default. 🙌 <strong>Embroider won't be turned on in the next Ember CLI 3.27 release</strong>, but the <a href="https://github.com/emberjs/rfcs/pull/746">Enable Embroider Request for Comments (RFC)</a> was opened up today by <a href="https://github.com/thoov">Travis Hoover (@thoov)</a>. Check it out!</p>
<p>If you're not familiar with Embroider, Embroider is a new build pipeline that will provide a way to compile Ember apps into spec-compliant, modern JavaScript. Using Embroider will make it easier to take advantage of code splitting and tree shaking in your app.</p>
<p>There are some risks if you choose to use Embroider in production today. You're likely to discover that some Ember addons don't work or will break your build. Right now, Embroider's own configuration options are subject to change, so you'll need to read the <a href="https://github.com/embroider-build/embroider/blob/master/CHANGELOG.md">CHANGELOG.md</a> to check for any gotchas when updating Embroider packages in your app.</p>
<p>The <a href="https://github.com/emberjs/rfcs/blob/dbb7a7c5dc7a6698368f078aa66f97c4bddd4bcb/text/0000-enable-embroider.md#community-adoption">Community Adoption</a> section of the RFC highlights that Embroider has created a testing package for addon authors to consume in their ember-try scenarios to verify their addons work under Embroider. A meta issue will be created tracking the Top 100 addons according to <a href="https://emberobserver.com/">Ember Observer</a>.</p>
<p>In case you missed it, Embroider was mentioned at virtual EmberConf 2021:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=1Z6cLV2licU">Keynote Part 2 AKA "Platform State of the Union"</a> by <a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a> had an Embroider highlight, <a href="https://youtu.be/1Z6cLV2licU?t=555">starting here</a>.</li>
<li>In the <a href="https://www.youtube.com/watch?v=09USvAy7w9g">Fun Fast Tools for Serious Work</a> talk, <a href="https://github.com/ef4">Edward Faulkner (@ef4)</a> describes the Embroider vision and what it can unlock!</li>
</ul>
<hr />
<h2 id="emberapolloclientusehttpsdevtochrismllremberapolloclientuse5h3o"><a href="https://dev.to/chrismllr/ember-apollo-client-use-5h3o">Ember Apollo Client + <code>@use</code> 💡</a></h2>
<p>In a new app, <a href="https://github.com/chrismllr">Chris Miller (@chrismllr)</a> got to try out <a href="https://github.com/ember-graphql/ember-apollo-client">ember-apollo-client</a>, a GraphQL client for Ember apps. 🧡</p>
<p>Chris summarized his learning in the article <a href="https://dev.to/chrismllr/ember-apollo-client-use-5h3o">Ember Apollo Client + <code>@use</code></a>. The article concerns the following question:</p>
<ul>
<li>Ember provides a few possible ways to fetch data. Which way do we follow with <code>ember-apollo-client</code> in the equation?</li>
</ul>
<p>Towards the end, Chris shows how to use the <code>@use</code> API (from <a href="https://github.com/pzuraq/ember-could-get-used-to-this">ember-could-get-used-to-this</a>) to wrap <code>ember-apollo-client</code> methods. This solution may apply to other data-fetching APIs, such as Ember Data.</p>
<p>Interested in learning more? Check out <a href="https://dev.to/chrismllr/ember-apollo-client-use-5h3o">Ember Apollo Client + <code>@use</code></a> today!</p>
<hr />
<h2 id="acomparisonofrenderingenginesofreactangularandemberhttpswwwheisedeselectix202152018311514916341034"><a href="https://www.heise.de/select/ix/2021/5/2018311514916341034">A Comparison of Rendering Engines of React, Angular, and Ember 🌐</a></h2>
<p><a href="https://twitter.com/jelhan1/status/1384931700036222981">Eine große Überraschung</a> from <a href="https://github.com/jelhan">Jeldrik Hanschke (@jelhan)</a>: The May issue of iX, a computer magazine from Germany, features the article <a href="https://www.heise.de/select/ix/2021/5/2018311514916341034">Die Rendering-Engines von React, Angular und Ember im Vergleich</a>.</p>
<p>The article is written for developers at all levels. Jeldrik provides a naive rendering engine to motivate the performance problems that it will encounter. Afterwards, you will get to learn how computer science helped create rendering engines that are performant.</p>
<p>How do React, Angular, and Ember turn your single-page application code into what the user sees? What are the strengths and weaknesses in their approach? If you want to learn more about rendering engines, we encourage you to check out <a href="https://www.heise.de/select/ix/2021/5/2018311514916341034">Jeldrik's article in iX</a>! <em>(Note: This article is in German, but can be translated by a browser such as Google Chrome. You'll need to sign up on Heise.de to read, but there is a free trial period.)</em></p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/basz" rel="noopener noreferrer" target="_blank">Bas Kamer (@basz)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/chadhietala" rel="noopener noreferrer" target="_blank">Chad Hietala (@chadhietala)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/esquith" rel="noopener noreferrer" target="_blank">Esquith Allen (@esquith)</a>, <a href="https://github.com/spham92" rel="noopener noreferrer" target="_blank">Steven Pham (@spham92)</a>, <a href="https://github.com/btecu" rel="noopener noreferrer" target="_blank">Bj Tecu (@btecu)</a>, <a href="https://github.com/tylerturdenpants" rel="noopener noreferrer" target="_blank">Ryan Mark (@tylerturdenpants)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/srih4ri" rel="noopener noreferrer" target="_blank">Srihari (@srih4ri)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/brendenpalmer" rel="noopener noreferrer" target="_blank">Brenden Palmer (@brendenpalmer)</a>, <a href="https://github.com/amk221" rel="noopener noreferrer" target="_blank">Andrew Kirwin (@amk221)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, and <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-179</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-179</guid><pubDate>Fri, 07 May 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 180]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember's 10 year anniversary, Prettier for Handlebars support, Embroider in 3.5 weeks, GAAD pledge, quickstart to authentication, built with Ember: Fleetbase, and new and shiny add-ons ✨</p>
<hr />
<h2 id="happy10yearanniversaryemberjs">Happy 10 year anniversary, Ember.js! 🎉</h2>
<div>
  <img alt="Ember 10 year anniversary cake" title="Jared Galanis - Contributor to Ember" src="/images/blog/emberjstimes/ember-10-year-anniversary-cake.jpeg" />
</div>
<p>Many thanks to <a href="https://twitter.com/NataliFel/status/1393240918258499589">Natasha Fel</a> and <a href="https://github.com/andreyfel">Andrey Fel (@andreyfel)</a> for sharing their photos from <a href="https://emberjs-nn.timepad.ru/event/1618665/">Ember Nizhny Novgorod's Meetup</a>, which featured a celebratory Nizhny Novgorod Tomster cake for Ember's big anniversary! Check out more photos from the meetup <a href="https://vk.com/album-183353390_279540779">here</a>.</p>
<hr />
<h2 id="prettierforhandlebarssupporthttpsprettierioblog20210509230htmlemberhandlebars"><a href="https://prettier.io/blog/2021/05/09/2.3.0.html#ember--handlebars">Prettier for Handlebars support 🙌</a></h2>
<p>Prettier can now officially format HTML templates with Handlebars (HBS) in the newly released <a href="https://prettier.io/blog/2021/05/09/2.3.0.html#ember--handlebars">version 2.3.0</a>. Thank you to <a href="https://github.com/dcyriller">Cyrille David (@dcyriller)</a> for pushing this initiative, which started in 2017, through the finish line.</p>
<p>Prettier is an opinionated code formatter. It enforces a consistent style by parsing your code and reprinting it with its own rules that take the maximum line length into account, wrapping code when necessary. This removes all bikeshedding on what rules we should have or shouldn’t have and instead provides one standard for everyone to use by default.</p>
<p>In order to keep your project aligned with Prettier’s formatting we can use the Ember Template Lint plugin: <a href="https://github.com/ember-template-lint/ember-template-lint-plugin-prettier">ember-template-lint-plugin-prettier</a>. This plugin defines a <em>single rule</em> that rule will compare your code with Prettier's output.</p>
<p>So try it out today by using the <strong>glimmer parser</strong> for Prettier!  </p>
<hr />
<h2 id="embroiderfromzerotoroutesplittingin35weekshttpsdevtobendemboskiembroiderfromzerotoroutesplittingin35weeks5abo"><a href="https://dev.to/bendemboski/embroider-from-zero-to-route-splitting-in-3-5-weeks-5abo">Embroider: from zero to route splitting in 3.5 weeks 📝</a></h2>
<p>If you have been part of the Ember community for a while now and have read <a href="https://blog.emberjs.com/the-ember-times-issue-179#toc_readers-question-what%E2%80%99s-the-current-status-of-the-embroider-project-%F0%9F%A7%B5">The Ember Times' last issue</a>, you have probably heard about <a href="https://github.com/embroider-build/embroider">Embroider</a>. This project is currently at version 0.41.0 and usable in Ember projects.</p>
<p><a href="https://github.com/bendemboski">Ben Demboski (@bendemboski)</a> wrote this <a href="https://dev.to/bendemboski/embroider-from-zero-to-route-splitting-in-3-5-weeks-5abo">blog</a> about how he implemented Embroider in a commercial, <a href="https://ember-electron.js.org"><code>ember-electron</code></a> app.</p>
<p>Ben's <a href="https://dev.to/bendemboski/embroider-from-zero-to-route-splitting-in-3-5-weeks-5abo">blog post</a> explains in detail the app and the process used to make the app use Embroider. All the hard things he ran into, such as ES6 module compliance and third-party add-ons. Luckily, after 3.5 weeks, Ben achieved <strong>tree-shaking</strong> and <strong>code splitting across routes</strong>. So if you want to start taking advantage of what Embroider has to offer, this post is a great place to start.</p>
<p>If you read the blog, start with this project yourself and look for a place to get more help, check out the <code>#dev-embroider</code> channel on <a href="https://discord.gg/emberjs">Ember.JS Discord</a>.</p>
<hr />
<h2 id="embertakesthegaadpledgehttpsblogemberjscomgaad2021"><a href="https://blog.emberjs.com/gaad-2021">Ember takes the GAAD Pledge 😍</a></h2>
<p><a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a> authored a blog post in conjuction with this week's <a href="https://globalaccessibilityawarenessday.org/">Global Accessibility Awareness Day</a> (GAAD) to announce that Ember has taken the GAAD pledge <strong>to make accessibility a core value of our framework</strong>.</p>
<p>Be sure to read the <a href="https://blog.emberjs.com/gaad-2021">post</a> to learn more about what Ember has done so far in its efforts for “accessibility by default” , what accessibilty-related work is in the pipeline, and how you can get involved if you're interesting in contributing to Ember a11y efforts!</p>
<hr />
<h2 id="embersimpleauthvideohttpswwwyoutubecomwatchvbswn4_ebtpi"><a href="https://www.youtube.com/watch?v=bSWN4_EbTPI">Ember Simple Auth video 📽</a></h2>
<p>Are you looking for a friendly, step by step guide to adding authentication to your Ember app? Look no further than the Ember Simple Auth <a href="https://www.youtube.com/watch?v=bSWN4_EbTPI">Quickstart video</a> published by <a href="https://simplabs.com/">Simplabs</a>. This video provides helpful introduction to this popular authentication/authorization <a href="https://ember-simple-auth.com/">Ember addon</a>. <a href="https://github.com/marcoow">Marco Otte-Witte (@marcoow)</a> explains this tricky part of app development using the latest Ember Octane syntax.</p>
<!--alex enable simple-->
<hr />
<h2 id="builtwithemberfleetbasehttpsfleetbaseio"><a href="https://fleetbase.io/">Built with Ember: Fleetbase 🚀</a></h2>
<p><a href="https://fleetbase.io/">Fleetbase</a> is a new logistics platform built with Ember by co-founders <a href="https://github.com/roncodes">Ronald A. Richardson (@roncodes)</a> and <a href="https://github.com/shivthakker">Shiv Thakker (@shivthakker)</a>. Fleetbase is an API-first logistics platform for developers and businesses. Customers can design, build, customize and control their logistics operations and experience using their APIs and console. Based in Singapore, Fleetbase has a mission to <strong>tech enable</strong> traditional businesses.</p>
<p>Check out Fleetbase on <a href="https://www.producthunt.com/posts/fleetbase">ProductHunt</a>!</p>
<hr />
<h2 id="newshinyaddons">New shiny addons ✨</h2>
<p>The Ember addon ecosystem is always expanding and we love to keep you up to date with all of them. So here is a summarized list of the latest addons made by the community for the community.</p>
<ul>
<li><a href="https://github.com/retailnext/ember-bem-helpers">ember-bem-helpers</a>: BEM helpers for Ember.js applications</li>
<li><a href="https://github.com/Windvis/ember-breadcrumb-trail">ember-breadcrumb-trail</a>: Minimalistic but very flexible breadcrumb management solution for Ember applications.</li>
<li><a href="https://github.com/CrowdStrike/ember-url-hash-polyfill">ember-url-hash-polyfill</a>: Support for in/inter page linking / scrolling with hashes in EmberJS</li>
<li><a href="https://github.com/onehilltech/ember-cli-custom-properties">ember-cli-custom-properties</a>: Adds support for CSS custom properties (variables) to components</li>
<li><a href="https://github.com/NullVoxPopuli/ember-statechart-component">ember-statechart-component</a>: Statecharts as components. No classes. Pure declarative state transitions.</li>
<li><a href="https://github.com/gossi/ember-command">ember-command</a>: An implementation of the command design pattern for #emberjs</li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/lin-ll" rel="noopener noreferrer" target="_blank">Lucy Lin (@lin-ll)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/bgantzler" rel="noopener noreferrer" target="_blank">@bgantzler</a>, <a href="https://github.com/amk221" rel="noopener noreferrer" target="_blank">Andrew Kirwin (@amk221)</a>, <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/runnerboy22" rel="noopener noreferrer" target="_blank">Tyler (@runnerboy22)</a>, <a href="https://github.com/thomascchen" rel="noopener noreferrer" target="_blank">Tom Chen (@thomascchen)</a>, <a href="https://github.com/prasannavijayan" rel="noopener noreferrer" target="_blank">_pvy (@prasannavijayan)</a>, <a href="https://github.com/spham92" rel="noopener noreferrer" target="_blank">Steven Pham (@spham92)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/dmuneras" rel="noopener noreferrer" target="_blank">Daniel Múnera Sánchez (@dmuneras)</a>, <a href="https://github.com/hannakim91" rel="noopener noreferrer" target="_blank">Hanna (she/her) (@hannakim91)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/chiragpat" rel="noopener noreferrer" target="_blank">Chirag Patel (@chiragpat)</a>, <a href="https://github.com/lukemelia" rel="noopener noreferrer" target="_blank">Luke Melia (@lukemelia)</a>, <a href="https://github.com/acorncom" rel="noopener noreferrer" target="_blank">David Baker (@acorncom)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/ombr" rel="noopener noreferrer" target="_blank">Luc Boissaye (@ombr)</a>, <a href="https://github.com/brendenpalmer" rel="noopener noreferrer" target="_blank">Brenden Palmer (@brendenpalmer)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/sly7-7" rel="noopener noreferrer" target="_blank">Sylvain MINA (@sly7-7)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/danielpunkass" rel="noopener noreferrer" target="_blank">Daniel Jalkut (@danielpunkass)</a>, <a href="https://github.com/wise-introvert" rel="noopener noreferrer" target="_blank">Fardeen Panjwani (@wise-introvert)</a>, and <a href="https://github.com/anehx" rel="noopener noreferrer" target="_blank">Jonas Metzener (@anehx)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Tim Foster, Chris Ng, Anne-Greeth van Herwijnen, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-180</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-180</guid><pubDate>Fri, 21 May 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 181]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>EmberFest, remodeling an Ember app, Ember CLI history, ember-auto-import, web bundling, ember-concurrency release, Ember Data roundup, rwjblue podcast, and keeping a clean git history.</p>
<hr />
<h2 id="emberfest2021ishappeninghttpstwittercomemberfeststatus1398291012489994241"><a href="https://twitter.com/EmberFest/status/1398291012489994241">EmberFest 2021 is happening! 🏛️</a></h2>
<p>Mark your calendars for <strong>September 30th – October 1st</strong> of 2021 – <a href="https://emberfest.eu/">EmberFest</a> will be back as a hybrid on-site/virtual event! EmberFest is the European Community Ember Conference. The location will be a secret until ticket sales are open so stay tuned.</p>
<p>The EmberFest team is confident that this year’s conference can happen in person. At the same time, they realize that some people can’t or might not want to travel yet, so for the first time, EmberFest is going hybrid: there will be both on-site and remote tickets for a livestream available. Early bird tickets will start on <strong>June 11, 2021</strong>.</p>
<p>If you’re interested in seeing what it’s like, check out the last <a href="https://www.youtube.com/watch?v=8EyI_xyha6k">EmberFest conference in 2019</a>, which was in Copenhagen!</p>
<hr />
<h2 id="emberclihistoryemberautoimportwebbundlingmorehttpstwittercomchriskrychostatus1397991369231138817"><a href="https://twitter.com/chriskrycho/status/1397991369231138817">Ember CLI history, ember-auto-import, web bundling & more 🌎</a></h2>
<p><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> recently got together with some LinkedIn colleagues, <a href="https://github.com/davecombs">Dave Combs (@davecombs)</a> and <a href="https://github.com/grconrad">Richard Conrad (@grconrad)</a>, to chat about the history of Ember CLI, ember-auto-import, web bundling and more.</p>
<p>If you've been looking to learn more about how these things came into being and developed over time, including how they have had impact on the development of modern build tools like Embroider, then you may want to go check out the super interesting <a href="https://www.youtube.com/watch?v=c5yV1HjGIK0">video</a>.</p>
<p>If you haven't had enough Krycho 😄 and have some more time on your hands, you might also want to go checkout a package that Chris <a href="https://twitter.com/chriskrycho/status/1397747097487613952">recently published</a> called <code>ember-simple-track-helper</code> which essentially provides an equivalence for React's <code>useState</code> hook for Ember and Glimmer template only components.</p>
<hr />
<h2 id="emberdatahappenings">Ember Data happenings 👀</h2>
<p>In a prior issue, we mentioned that Ember.js celebrated it's 10th birthday! However, Ember Data's first commits in GitHub were ~15 years ago. The commit history started in SproutCore, which later morphed into Ember.js and Ember Data. Check out <a href="https://github.com/runspired">Chris Thoburn (@runspired)'s</a>'s talk on <a href="https://www.youtube.com/watch?v=zbqbsOyLM30">Ember Data</a> from Ember Fest 2019 for more background!</p>
<p>In more Ember Data news, v4.0 is coming! Open <a href="https://github.com/emberjs/rfcs/pulls?q=is%3Apr+is%3Aopen+label%3AT-ember-data">Ember Data Request For Comments (RFCs)</a> will target 5.0, and approved RFC's will be enabled in 4.1 at the soonest.</p>
<p><a href="https://github.com/emberjs/rfcs/pull/745">RFC #475</a> calls for modernizing the <code>PromiseManyArray</code>. The RFC intends to deprecate reading, mutating or operating on an async <code>hasMany</code> relationship before resolving its value in the application's JavaScript code. Rendering an async <code>hasMany</code> in a template will continue to work as expected. Check out the <a href="https://github.com/runspired/rfcs/blob/ember-data/deprecate-methods-on-promise-many-array/text/0745-ember-data-deprecate-methods-on-promise-many-array.md">rendered RFC</a> and comment if you have any feedback!</p>
<hr />
<h2 id="remodelinganemberappblogserieshttpstwittercomjwwweberstatus1400455533627207681"><a href="https://twitter.com/jwwweber/status/1400455533627207681">Remodeling an Ember app blog series 📖</a></h2>
<p>In an exciting new series of new blog posts Ember Learning core team member <a href="https://github.com/jenweber">Jen Weber (@jenweber)</a> is covering the process of bringing an older Ember app up-to-date with Octane and a modern Ember Data strategy.</p>
<p>In the process of writing the posts Jen is pairing with Ember Data core team member, <a href="https://github.com/runspired">Chris Thoburn (@runspired)</a>, so there should be lots of great content to look forward to in the coming days.</p>
<p>The first post, which is available now, lays the ground work for what Jen and Chris will be working on, and includes lists of how to approach overhauling an Ember app, some debugging strategies you might take and more. You can find the first introductory blog post <a href="https://www.jenweber.dev/remodeling-an-ember-app---introduction/">here on Jen's blog</a>.</p>
<hr />
<h2 id="emberconcurrency210releasehttpstwittercomm4xm4nstatus1399769152953462790"><a href="https://twitter.com/m4xm4n/status/1399769152953462790">ember-concurrency 2.1.0 release 🐹</a></h2>
<!--alex ignore waiters-waitresses-->
<p>In case you hadn't noticed, <a href="https://github.com/maxfierke">Max Fierke (@maxfierke)</a> recently released version 2.1.0 of <code>ember-concurrency</code>! This release includes a public API for Yieldables. Yieldables let you hook into the low-level execution logic of an ember-concurrency task and provide a new way to instrument TaskInstances by providing a safe mechanism to implement custom waiters, hooks, introspection, and other operations from application code.</p>
<p>ember-concurrency 2.1.0 also fixes an important bug where task state updates could be applied out of order in some situations.</p>
<p>If you have been looking to access the internals of ember-concurrency that allow it to go beyond what Promises are capable of, <a href="https://github.com/machty/ember-concurrency/releases/tag/2.1.0">this release</a> might be of interest to you.</p>
<hr />
<h2 id="anewepisodeofwebwhiskeywhatnothttpstwittercomshipshapecodestatus1397661771146698752"><a href="https://twitter.com/shipshapecode/status/1397661771146698752">A new episode of Web, Whiskey & Whatnot 🔈</a></h2>
<p>There's a new episode of the Ember-related podcast Web, Whiskey &amp; Whatnot out 🎉! This episode features none other than <a href="https://github.com/rwjblue">Robert Jackson (@rwjblue)</a>. The Ship Shape gang and rwjblue discuss a bit about how rwjblue got involved in contributing to Ember.js, a bit about the web and, yes, a bit about whiskey.</p>
<p>Go checkout the episode wherever you listen to podcasts!</p>
<hr />
<h2 id="keepingacleangithistoryhttpssimplabscomblog20210526keepingacleangithistory"><a href="https://simplabs.com/blog/2021/05/26/keeping-a-clean-git-history/">Keeping a clean git history 🖋</a></h2>
<p>Ember Learning core team member <a href="https://github.com/mansona">Chris Manson (@mansona)</a> has published a super helpful new blog post about one of the developer fundamentals that we all should know about, how to keep a clean git history.</p>
<p>Chris talks about the importance of keeping a tidy git history and provides some excellent tips and workflows on how one might go about doing that. There is also an in-depth working example of some challenges that come up when managing your commits and how you can use visual tools like <a href="https://git-fork.com/">Fork</a> to achieve a higher level of mastery over your git history.</p>
<p>Head on over to the Simplabs blog to check out the <a href="https://simplabs.com/blog/2021/05/26/keeping-a-clean-git-history/">post</a> and learn how to clean up your git history!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/hannakim91" rel="noopener noreferrer" target="_blank">Hanna (she/her) (@hannakim91)</a>, <a href="https://github.com/brendenpalmer" rel="noopener noreferrer" target="_blank">Brenden Palmer (@brendenpalmer)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/Windvis" rel="noopener noreferrer" target="_blank">Sam Van Campenhout (@Windvis)</a>, <a href="https://github.com/btecu" rel="noopener noreferrer" target="_blank">Bj Tecu (@btecu)</a>, <a href="https://github.com/MichalBryxi" rel="noopener noreferrer" target="_blank">Michal Bryxí (@MichalBryxi)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/j000shDotCom" rel="noopener noreferrer" target="_blank">Josh Lindsay (@j000shDotCom)</a>, <a href="https://github.com/skaterdav85" rel="noopener noreferrer" target="_blank">David Tang (@skaterdav85)</a>, <a href="https://github.com/mixonic" rel="noopener noreferrer" target="_blank">Matthew Beale (@mixonic)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/stefanpenner" rel="noopener noreferrer" target="_blank">Stefan Penner (@stefanpenner)</a>, <a href="https://github.com/runnerboy22" rel="noopener noreferrer" target="_blank">Tyler (@runnerboy22)</a>, <a href="https://github.com/helgablazhkun" rel="noopener noreferrer" target="_blank">Olga Torkhanova (@helgablazhkun)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/aoumiri" rel="noopener noreferrer" target="_blank">Anass OUMIRI (@aoumiri)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/elwayman02" rel="noopener noreferrer" target="_blank">Jordan Hawker (@elwayman02)</a>, <a href="https://github.com/lukemelia" rel="noopener noreferrer" target="_blank">Luke Melia (@lukemelia)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, and <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jared Galanis, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-181</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-181</guid><pubDate>Fri, 04 Jun 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 182]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Using the in-element helper, migrating Controllers to top-level Components, Ember Upgrade Sprints, Ember development on Twitch, and remodeling an Ember App Part 2.</p>
<hr />
<h2 id="usingtheinelementhelperhttpswwwlinkedincompulseemberjsusinginelementhelperfaithor"><a href="https://www.linkedin.com/pulse/emberjs-using-in-element-helper-faith-or/">Using the in-element helper ⛳</a></h2>
<p><a href="https://github.com/faith-or">Faith Or (@faith-or)</a> wrote a blog post on how they migrated from <code>ember-wormhole</code> to the built-in <code>in-element</code> helper introduced in Ember 3.20.</p>
<p><a href="https://github.com/yapplabs/ember-wormhole">Ember Wormhole</a> is an addon that renders a child view somewhere else in the DOM <em>outside</em> of the component.</p>
<p>The <a href="https://api.emberjs.com/ember/3.20/classes/Ember.Templates.helpers/methods/in-element?anchor=in-element">in-element helper</a> renders its block content outside of the regular flow, into a DOM element given by its <code>destinationElement</code> positional argument.</p>
<p>Common use cases for both include when a piece of UI is a logical child of a component but needs to render somewhere else such as a loading screen, a modal, tooltip or even a dropdown. The differences between the two are slight. Faith goes into more detail in the blog post.</p>
<p>There are 3 main takeaways.</p>
<ol>
<li><code>in-element</code> needs the destination to exist before we use it, while <code>ember-wormhole</code> does not.</li>
<li>With <code>in-element</code>, when the destination element changes, the content is re-rendered completely.</li>
<li>By default, the <code>in-element</code> helper will replace all the contents of the destination element. (You will need to configure it not to using <code>insertBefore=null</code>.)</li>
</ol>
<p>Read the full <a href="https://www.linkedin.com/pulse/emberjs-using-in-element-helper-faith-or/">blog post on LinkedIn</a> and check out the <a href="https://github.com/faith-or/emberjs-inelement-vs-wormhole-demo">demo on GitHub</a>!</p>
<hr />
<h2 id="migratingcontrollerstotoplevelcomponentsinemberhttpsdevtojuanazammigratingcontrollerstotoplevelcomponentsinemberggc"><a href="https://dev.to/juanazam/migrating-controllers-to-top-level-components-in-ember-ggc">Migrating Controllers to top-level Components in Ember 📖</a></h2>
<p>In this <a href="https://dev.to/juanazam/migrating-controllers-to-top-level-components-in-ember-ggc">blog post</a>, <a href="https://github.com/juanazam">Juan Manuel Azambuja (@juanazam)</a> shows a real world example of how to replace your template contents with a single top-level component. The top-level component can then take on a similar role as the controller.</p>
<p>Juan presents a few tricks as well as a useful discussion of using <a href="https://github.com/ember-modifier/ember-modifier">ember-modifiers</a> addon to solve updating issues. The blog sums up the advantages and disadvantages of the top-level approach, and cautions that the framework doesn't fully support this solution without some compromises.</p>
<hr />
<h2 id="emberupgradesprintshttpsblogcentricadevember20210408emberupgradesprintshtml"><a href="https://blog.centrica.dev/ember/2021/04/08/ember-upgrade-sprints.html">Ember Upgrade Sprints 🆕</a></h2>
<p>A key ingredient of app development is maintenance. Without refactoring code and upgrading dependencies often, our development cycle can slow down and we may fail to meet compliance. When you have a couple of apps to maintain, upgrading Ember may not be a big problem. What can you do when you have many apps to maintain and work with many other people?</p>
<p>In <a href="https://blog.centrica.dev/ember/2021/04/08/ember-upgrade-sprints.html">Ember Upgrade Sprints</a>, <a href="https://github.com/stevetyler">Steve Tyler (@stevetyler)</a> provides a few tips for upgrading apps with every LTS release (<a href="https://emberjs.com/releases/lts/">Long-Term Support</a>). In addition, Steve shares some challenges that you may face and how you can orient your teams' sprints.</p>
<p>For more information, we encourage you to check out the blog post. What are some of your insights and resources for upgrading Ember apps and addons? Please share them with the community!</p>
<hr />
<h2 id="emberdevelopmentontwitchtvhttpswwwtwitchtvreal_ate"><a href="https://www.twitch.tv/real_ate/">Ember development on Twitch.tv 📺</a></h2>
<p><a href="https://github.com/mansona">Chris Manson (@mansona)</a> has started to stream Ember development on Twitch. In engaging <a href="https://www.twitch.tv/real_ate/videos">Twitch streams</a> Chris shows how he does maintenance and development in the Ember ecosystem. Every stream has a nice table of contents and time boxed periods where Chris works on a certain topic.</p>
<p><a href="https://www.twitch.tv/real_ate/schedule">Every Thursday at 10:30 - 13:00 (GMT+2)</a>, you can join Chris on an adventure through contributing in Open Source, chat with other Ember enthusiasts and get <strong>inspired</strong> to contribute yourself.</p>
<hr />
<h2 id="remodelinganemberapppart2httpswwwjenweberdevremodelinganemberapptesting"><a href="https://www.jenweber.dev/remodeling-an-ember-app---testing/">Remodeling an Ember App Part 2 🐹</a></h2>
<p>Part 2 of <a href="https://github.com/jenweber">Jen Weber's (@jenweber)</a> ✨fantastic✨ new series on bringing an older Ember app up-to-date with Octane and a modern Ember Data strategy is out now!</p>
<p>In <a href="https://www.jenweber.dev/remodeling-an-ember-app---testing/">part 2</a>, Jen covers some testing and debugging strategies that <a href="https://github.com/runspired">Chris Thoburn (@runspired)</a> shared and are particularly helpful when upgrading an Ember application.</p>
<p>From approaches to how to optimize running the tests suite to approaches on how to deal with linting errors to better understanding application test failures, there is a ton of great content in the post that developers of any experience level could learn from.</p>
<p>Be sure to continue to watch for additional posts with more great content as this series continues!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/sumitd94" rel="noopener noreferrer" target="_blank">Sumit Dhanania (@sumitd94)</a>, <a href="https://github.com/mydea" rel="noopener noreferrer" target="_blank">Francesco Novy (@mydea)</a>, <a href="https://github.com/hannakim91" rel="noopener noreferrer" target="_blank">Hanna (she/her) (@hannakim91)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/esquith" rel="noopener noreferrer" target="_blank">Esquith Allen (@esquith)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/ctjhoa" rel="noopener noreferrer" target="_blank">Camille TJHOA (@ctjhoa)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/sandstrom" rel="noopener noreferrer" target="_blank">@sandstrom</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/sandydoo" rel="noopener noreferrer" target="_blank">Sander Melnikov (@sandydoo)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/stefanpenner" rel="noopener noreferrer" target="_blank">Stefan Penner (@stefanpenner)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/mixonic" rel="noopener noreferrer" target="_blank">Matthew Beale (@mixonic)</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/jacojoubert" rel="noopener noreferrer" target="_blank">Jaco Joubert (@jacojoubert)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/charlesfries" rel="noopener noreferrer" target="_blank">Charles Fries (@charlesfries)</a>, <a href="https://github.com/bantic" rel="noopener noreferrer" target="_blank">Cory Forsyth (@bantic)</a>, <a href="https://github.com/chiragpat" rel="noopener noreferrer" target="_blank">Chirag Patel (@chiragpat)</a>, <a href="https://github.com/dcyriller" rel="noopener noreferrer" target="_blank">Cyrille David (@dcyriller)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/prakashchoudhary07" rel="noopener noreferrer" target="_blank">Prakash Choudhary (@prakashchoudhary07)</a>, <a href="https://github.com/ankushdharkar" rel="noopener noreferrer" target="_blank">Ankush Dharkar (@ankushdharkar)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/Turbo87" rel="noopener noreferrer" target="_blank">Tobias Bieniek (@Turbo87)</a>, and <a href="https://github.com/saracope" rel="noopener noreferrer" target="_blank">Sara Cope (@saracope)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Tim Foster, Anne-Greeth van Herwijnen, Chris Ng, Isaac Lee, Jared Galanis, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-182</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-182</guid><pubDate>Fri, 18 Jun 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 183]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>New release of Unstable Ember Language Server, share code snippets on Twitter using Ember, the difference between ember serve and npm run start, and an addon roundup!</p>
<hr />
<h2 id="releaseofuelsv2016httpsdiscordcomchannels480462759797063690480499624663056390845766724040523786"><a href="https://discord.com/channels/480462759797063690/480499624663056390/845766724040523786">Release of uELS v2.0.16 ✅</a></h2>
<p><a href="https://github.com/lifeart/ember-language-server">Unstable Ember Language Server</a> is a fully featured fork of Ember Language Server. While the name says <em>unstable</em> it actually has been <strong>stable</strong> and ready to use for day-to-day development!</p>
<p>Thanks to both <a href="https://github.com/alexlafroscia">Alex LaFroscia (@alexlafroscia)</a> and <a href="https://github.com/lifeart">Alex Kanunnikov (@lifeart)</a> for new version release which provides:</p>
<ul>
<li>Support workspace/didChangeConfiguration event</li>
<li>Improved startup speed by delaying template tokenization</li>
<li>Autocomplete now use global registry and file change events, not fs lookup, but we still do fs lookup on project initialization</li>
<li>Added template-lint severity support</li>
<li>Improved template-linting speed</li>
</ul>
<p>Try out uELS today:</p>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-ember-unstable">VSCode Marketplace</a></li>
<li><a href="https://github.com/NullVoxPopuli/coc-ember">neoVim</a></li>
<li>Emacs using <a href="https://github.com/emacs-lsp/lsp-mode">lsp-mode</a></li>
<li>Use <a href="https://open-vsx.org/extension/lifeart/vscode-ember-unstable">Open VSX</a> for hosting extensions with <a href="https://www.gitpod.io/">GitPod</a>, <a href="https://onivim.io/">Onivim</a>, <a href="https://coder.com/">Coder</a>, <a href="https://vscodium.com/">VSCodium</a>, and <a href="https://theia-ide.org/">Theia</a>.</li>
</ul>
<hr />
<h2 id="sharecodesnippetsontwitterusingemberhttpslimberglimdowncom"><a href="https://limber.glimdown.com/?">Share code snippets on Twitter using Ember 🐦</a></h2>
<p>Do you want to share demos, gifs, or code snippets on Twitter? Try <a href="https://limber.glimdown.com/?">limber.glimdown.com</a> from <a href="https://github.com/nullvoxpopuli">@NullVoxPopuli</a>, built with Ember! Code snippets on <a href="https://limber.glimdown.com/?">limber.glimdown.com</a> can be copied as text or images. Check out <a href="https://twitter.com/nullvoxpopuli/status/1402650042364829700">how it works on Twitter</a>.</p>
<hr />
<h2 id="thedifferencebetweenemberserveandnpmrunstarthttpsdevtojayjayjpgthedifferencebetweenemberserveandnpmrunstart2m5p"><a href="https://dev.to/jayjayjpg/the-difference-between-ember-serve-and-npm-run-start-2m5p">The difference between ember serve and npm run start 🖥</a></h2>
<p><a href="https://github.com/jayjayjpg">Jesse Jordan (@jayjayjpg)</a> blogged about some subtle differences between <code>npm run start</code> and <code>ember serve</code>, inspired by <a href="https://stackoverflow.com/questions/63340251/is-there-a-difference-between-ember-serve-and-npm-start">this question on StackOverflow</a>. Even when using <a href="https://github.com/nvm-sh/nvm">nvm</a>, there can be some dependency gotchas with globally installed packages. Check out Jesse's <a href="https://dev.to/jayjayjpg/the-difference-between-ember-serve-and-npm-run-start-2m5p">dev.to post</a> for more info.</p>
<hr />
<h2 id="addonroundup">Addon roundup 🌐</h2>
<ul>
<li>Using <a href="https://github.com/empress/empress-blog">empress-blog</a>? If you're not familiar with it, empress-blog is the fully-functional, SEO friendly static site implementation of a blog system built on Ember. Check out <a href="https://github.com/MichalBryxi">Michal Bryxí (@MichalBryxi)</a>'s bite-sized blog posts posts on <a href="https://dev.to/michalbryxi/mixpanel-empress-blog-5fd2">how to set up Mixpanel tracking events in empress-blog</a> and <a href="https://dev.to/michalbryxi/tag-page-in-main-menu-for-empress-blog-31b9">how to add a tag page to your empress-blog main menu</a>.</li>
<li>Want to migrate your Ember projects to Tailwind CSS, but don't know where to start? <a href="https://github.com/rajasegar">Rajasegar Chandran (@rajasegar)</a> created the <a href="https://github.com/rajasegar/ember-tailwind-codemod">ember-tailwind-codemod</a> addon to make your migrations less painful. Give it a spin on your repos and check out the README for contribution ideas.</li>
<li><a href="https://github.com/rajasegar">Rajasegar Chandran (@rajasegar)</a> created <em>another</em> new addon, <a href="https://github.com/rajasegar/ember-plantuml">ember-plantuml</a>, which allows you to visualize your Ember components and models via PlantUML. You can also download the UML diagrams as SVG files. Look forward to trying it out, seems promising for visual learners!</li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/jacojoubert" rel="noopener noreferrer" target="_blank">Jaco Joubert (@jacojoubert)</a>, <a href="https://github.com/saracope" rel="noopener noreferrer" target="_blank">Sara Cope (@saracope)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/hannakim91" rel="noopener noreferrer" target="_blank">Hanna (she/her) (@hannakim91)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/prakashchoudhary07" rel="noopener noreferrer" target="_blank">Prakash Choudhary (@prakashchoudhary07)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/esquith" rel="noopener noreferrer" target="_blank">Esquith Allen (@esquith)</a>, <a href="https://github.com/lukeingalls" rel="noopener noreferrer" target="_blank">Luke Ingalls (@lukeingalls)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/ankushdharkar" rel="noopener noreferrer" target="_blank">Ankush Dharkar (@ankushdharkar)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/chiragpat" rel="noopener noreferrer" target="_blank">Chirag Patel (@chiragpat)</a>, <a href="https://github.com/sumitd94" rel="noopener noreferrer" target="_blank">Sumit Dhanania (@sumitd94)</a>, and <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-183</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-183</guid><pubDate>Thu, 01 Jul 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 184]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>The Road to Ember 4.0, introducing a11y-disabled-modifier, Emberliners talks, and get your update for ember-engines 0.8.18.</p>
<hr />
<h2 id="theroadtoember40httpsblogemberjscomtheroadtoember40"><a href="https://blog.emberjs.com/the-road-to-ember-4-0/">The Road to Ember 4.0 🛣</a></h2>
<p><a href="https://github.com/mixonic">Matthew Beale (@mixonic)</a> from the Ember Core Framework and Steering Committee <a href="https://emberjs.com/teams/">teams</a>, writes about <a href="https://blog.emberjs.com/the-road-to-ember-4-0/">The Road to Ember 4.0</a> on the official Ember blog.</p>
<ul>
<li><strong>Announcing Ember 4.0</strong>: Ember 4.0 will be released around September 20th. Ember 4.4 will be the first LTS candidate of the 4.x series.</li>
<li><strong>Whats in a 4.0?</strong>: As a major version of Ember, there are no new features. This sections discusses the removal of deprecated APIs. For example, <code>Ember.Logger</code> is removed in favor of native console APIs. Also, <code>sendAction</code> is removed in favor of calling closure actions like any other callback.</li>
<li><strong>Planning your upgrade to 4.0</strong>: Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon as part of your upgrade process.</li>
<li><strong>Contributing to Ember 4.0</strong>: Join us on <a href="https://discord.com/invite/emberjs">Discord</a> in the #dev-ember-js, #dev-ember-data, #dev-ember-cli, or #dev-ember-learning channels to find out how you can contribute.</li>
</ul>
<p>Please check out the <a href="https://blog.emberjs.com/the-road-to-ember-4-0/">detailed post</a> in full for more details on how you can prepare for your upgrade!</p>
<blockquote>
  <p>We're looking forward to working with the community on Ember 4.0 and on the opportunities beyond it. As always we appreciate your support, your trust, and our common partnership.</p>
</blockquote>
<hr />
<h2 id="introducingthea11ydisabledmodifiermodifierhttpsdiscordcomchannels480462759797063690480499624663056390842592654696382474"><a href="https://discord.com/channels/480462759797063690/480499624663056390/842592654696382474">Introducing the a11y-disabled-modifier Modifier 💚</a></h2>
<!--alex disable invalid-->
<p>Inspired by the <a href="https://css-tricks.com/">CSSTricks</a> blog post on <a href="https://css-tricks.com/making-disabled-buttons-more-inclusive/">Making Disabled Buttons More Inclusive</a>, <a href="https://github.com/chriskrycho/">Chris Krycho (@chriskrycho)</a> created the <a href="https://github.com/chriskrycho/a11y-disabled-modifier">a11y-disabled-modifier</a> addon.</p>
<p>The blog post argues against the <code>disabled</code> attribute in <code>&lt;button&gt;</code> in favor of the <code>aria-disabled</code> attribute since it does not prevent clicking and focusing on the button which is useful when you are navigating the site using the Tab key.</p>
<p>This modifier implements accessible and usable button-disabling by adding <code>aria-disabled="true"</code> to the target element when the <code>when</code> named argument is truthy. It will also stop any clicks on the button from propagating and ensures form submission does not trigger.</p>
<pre><code class="handlebars language-handlebars">&lt;form {{on "submit" this.submit}}&gt;
  &lt;label&gt;some text: &lt;input type='text' /&gt;&lt;/label&gt;
  &lt;button type='submit' {{disabled when=this.isInvalid}}&gt;submit&lt;/button&gt;
&lt;/form&gt;
</code></pre>
<p>Try it out today by running <code>ember install a11y-disabled-modifier</code> on your Ember app!</p>
<!--alex enable invalid-->
<hr />
<h2 id="emberberlinmeetupwith4talkshttpswwwyoutubecomwatchvcswtzj6nlmab_channelpusherl"><a href="https://www.youtube.com/watch?v=c-sWTZJ6nlM&ab_channel=Pusherl">Ember Berlin Meetup with 4 talks 📽</a></h2>
<p>Four amazing talks from our friends at <a href="https://www.meetup.com/Ember-js-Berlin/">Emberliners meetups</a> are now available for binge watching!</p>
<ol>
<li><p>First up, is <a href="https://www.youtube.com/watch?v=c-sWTZJ6nlM&t=540s">Embroider: from zero to route splitting in 3.5 weeks</a> by <a href="https://github.com/bendemboski">Ben Demboski (@bendemboski)</a> which explores what it takes to update a large desktop Ember app to use Embroider.</p></li>
<li><p><a href="https://github.com/Agathebadia">Agathe Badia (@Agathebadia)</a> shows her fascinating work on creating a <a href="https://www.youtube.com/watch?v=c-sWTZJ6nlM&t=2156s">Colorblindness emulator with Ember, an A11y project</a>.</p></li>
<li><p><a href="https://github.com/mydea">Francesco Novy (@mydea)</a> presents <a href="https://www.youtube.com/watch?v=c-sWTZJ6nlM&t=3480s">You could get used to this: Managing GraphQL data</a> - a great primer on GraphQL in Ember.</p></li>
<li><p>Lastly, <a href="https://github.com/levelbossmike">Michael Klein (@levelbossmike)</a> and <a href="https://github.com/pangratz">Clemens Mueller (@pangratz)</a> discuss <a href="https://www.youtube.com/watch?v=c-sWTZJ6nlM&t=5118s">On the development of reactive systems with Ember.js</a>, providing an insightful view on approaching Ember development as a reactive system using <a href="https://ember-statecharts.com/">ember-statecharts</a> addon.</p></li>
</ol>
<p>These talks give a great snapshot lots of exciting developments happening around the Ember community 💗.</p>
<hr />
<h2 id="emberenginesv0818isouthttpstwittercommvillanderstatus1406367740668092420"><a href="https://twitter.com/MVillander/status/1406367740668092420">ember-engines v0.8.18 is out! 🎉</a></h2>
<p>If you're already using <a href="https://ember-engines.netlify.app/">ember-engines</a> or plan on using it, be sure to <a href="https://twitter.com/MVillander/status/1406367740668092420">upgrade your dependency</a>!</p>
<p>The <strong>latest patch release</strong> of ember-engines not only includes bug fixes for older Ember apps, but also several build fixes and new deprecation warnings to help up you keep your application up-to-date.</p>
<p>A huge thank you goes to <a href="https://github.com/thoov">Travis Hoover (@thoov)</a>, <a href="https://github.com/bertdeblock">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/villander">Michael Villander (@villander)</a> and <a href="https://github.com/rwjblue">Robert Jackson (@rwjblue)</a> for their work on the project!</p>
<p>Check out the full list of recent updates in the following <strong>changelogs</strong>:</p>
<ul>
<li><a href="https://github.com/ember-engines/ember-engines/releases/tag/v0.8.16">v0.8.16</a></li>
<li><a href="https://github.com/ember-engines/ember-engines/releases/tag/v0.8.17">v0.8.17</a></li>
<li><a href="https://github.com/ember-engines/ember-engines/releases/tag/v0.8.18">v0.8.18</a></li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/mixonic" rel="noopener noreferrer" target="_blank">Matthew Beale (@mixonic)</a>, <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/tcouloumy" rel="noopener noreferrer" target="_blank">@tcouloumy</a>, <a href="https://github.com/kennethlarsen" rel="noopener noreferrer" target="_blank">Kenneth Larsen (@kennethlarsen)</a>, <a href="https://github.com/jayjayjpg" rel="noopener noreferrer" target="_blank">Jesse Jordan (@jayjayjpg)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, and <a href="https://github.com/wondersloth" rel="noopener noreferrer" target="_blank">Matthew Edwards (@wondersloth)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jesse Jordan, Tim Foster, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-184</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-184</guid><pubDate>Fri, 16 Jul 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 185]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>New Educative course, using Ember with XState, let codemods upgrade your app &amp; deal with jQuery, Ember.js: The Good Parts, new release of ember-deep-tracked, why blueprints are cool.</p>
<hr />
<p><img alt="Ember on Educative" src="/images/educative.avif" /></p>
<h2 id="developingrobustemberjsapplicationscourseoneducativehttpswwweducativeiocoursesrobustemberjsapplications"><a href="https://www.educative.io/courses/robust-ember-js-applications">Developing Robust Ember.js Applications course on Educative 🆕</a></h2>
<p>Based on the popular book, <a href="https://balinterdi.com/rock-and-roll-with-emberjs/">Rock and Roll with Ember.js</a>, Educative has a new (paid) course, <a href="https://www.educative.io/courses/robust-ember-js-applications">Developing Robust Ember.js Applications</a> by <a href="https://github.com/balinterdi">Balint Erdi (@balinterdi)</a>. Balint chose to partner with Educative because their courses are <strong>interactive</strong>: there are quizzes and coding challenges at the end of most chapters, which will help reinforce understanding and learning.</p>
<p>Takeaway skills:</p>
<ul>
<li>Understand how Ember.js works in web applications</li>
<li>Help the user understand how the different building blocks, including components, routing, and services, make everything work in Ember.js</li>
<li>Learn how to use Ember CLI</li>
<li>Learn how to completely develop and Ember.js application</li>
</ul>
<p>We look forward to giving the course a spin!</p>
<hr />
<h2 id="usingemberwithxstatehttpsemersongithubiopostsemberjswithxstate"><a href="https://emerson.github.io/posts/emberjs-with-xstate">Using Ember with XState ❎</a></h2>
<p>Over the past year, the frontend team at <a href="https://www.closingfolders.com/">iManage Closing Folders</a> has been experimenting with state machines and Ember. What is a state machine? From <a href="https://www.freecodecamp.org/news/state-machines-basics-of-computer-science-d42855debc66/">Understanding State Machines on freeCodeCamp</a>, a state machine will read a series of inputs. When it reads an input, it will switch to a different state. Each state specifies which state to switch to, for a given input.</p>
<p>In the post <a href="https://emerson.github.io/posts/emberjs-with-xstate">Using EmberJS with XState</a>, <a href="https://github.com/Emerson">Emerson Lackey (@Emerson)</a> discusses the benefits and drawbacks of state machines. For example, state machines provide a framework-agnostic way of defining presentational state. State machines eliminate emergent states in favor or explicit states. For example, if you have two boolean states on a component, <code>isSaving</code> and <code>isError</code>, you actually have four states to consider.</p>
<p>Emerson walks through an example of how to use <a href="https://xstate.js.org/">XState</a> and Ember to implement a signup form. We appreciate the detailed code walkthrough, and agree that the state visualizations are definitely awesome! In addition to the writeup, check out the accompanying full source of <a href="https://github.com/Emerson/emberjs-xstate-example">emberjs-state-example on GitHub</a>.</p>
<hr />
<h2 id="letcodemodsupgradeyourappanddealwithjqueryhttpstwittercomjwwweberstatus1415062325149720578"><a href="https://twitter.com/jwwweber/status/1415062325149720578">Let codemods upgrade your app and deal with jQuery 🤖</a></h2>
<p>Another <strong>must-read tutorial</strong> for anyone who is <strong>building and maintaining Ember applications</strong> is coming your way:</p>
<p>In her article <a href="https://www.jenweber.dev/remodeling-an-ember-app---codemods">"Remodeling an Ember App - Codemods and jQuery"</a> Ember core team member <a href="https://github.com/jenweber">Jen Weber (@jenweber)</a> teaches you where to find <strong>codemods</strong> and how to use them for upgrades of your Ember app. Additionally, you will learn how you can make your app <a href="https://guides.emberjs.com/release/configuring-ember/optional-features/#toc_jquery-integration">exclude the jQuery dependency automatically</a> to save a few extra kilobytes on your builds!</p>
<p>Read the full article <a href="https://www.jenweber.dev/remodeling-an-ember-app---codemods">here</a> (or alternatively on <a href="https://dev.to/jenweber/remodeling-an-ember-app-codemods-and-jquery-3e8k">dev.to</a>) and if this tutorial helped you with your own upgrade, be sure to <a href="https://twitter.com/jwwweber/status/1415062325149720578">share your experience on the post announcement</a>!</p>
<hr />
<h2 id="emberjsthegoodpartshttpsmediumcomsarbbottamemberjsthegoodpartsf80850414053"><a href="https://medium.com/@sarbbottam/ember-js-the-good-parts-f80850414053">Ember.js | The Good Parts 👍</a></h2>
<p><a href="https://github.com/sarbbottam">Sarbbottam Bandyopadhyay (@sarbbottam)</a>, who has been developing Ember apps since mid-2017, once shared <a href="https://medium.com/@sarbbottam/challenges-i-face-with-ember-js-59bfba30416e">the challenges that he had faced with Ember.js</a>.</p>
<p>This week, Sarbbottam gave an update to describe his <strong>newfound developer productivity and happiness</strong>, thanks to Ember Octane. Titled <a href="https://medium.com/@sarbbottam/ember-js-the-good-parts-f80850414053">Ember.js | The Good Parts</a>, the blog post provides several code examples of a before-and-after. It also describes how a change in syntax and new features (small adjustments) can mean a big improvement to developer experience.</p>
<p>We encourage you to check out <a href="https://medium.com/@sarbbottam/ember-js-the-good-parts-f80850414053">Sarbbottam's blog post</a>!</p>
<hr />
<h2 id="releaseofemberdeeptrackedhttpstwittercomnullvoxpopulistatus1406022013639135232"><a href="https://twitter.com/nullvoxpopuli/status/1406022013639135232">Release of ember-deep-tracked 🎉</a></h2>
<p><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> published <a href="https://github.com/NullVoxPopuli/ember-deep-tracked">ember-deep-tracked</a> which is a prototype of "deep tracking" for Ember.</p>
<p>To try it out, you need to annotate the object using a decorator similar to <code>tracked</code>.</p>
<pre><code class="js language-js">import { tracked } from 'ember-deep-tracked';
import Component from '@glimmer/component';

export default class Foo extends Component {
  @tracked obj = { bar: 2 };
}
</code></pre>
<p>In the example above when the object <code>obj,bar</code> updates using <code>{{this.obj.bar}}</code> will also update since it is deeply tracked.</p>
<p>Note the addon is not recommended for performance sensitive situations such as rendering a table from a large data set where updates to that data set are frequent. This is because without updates there will be an increase in initial render time.</p>
<hr />
<h2 id="whyblueprintsarecoolhttpsdevtojayjayjpgwhyblueprintsinemberarecoolandhowtheysaveyoutimewritingtests1p0b"><a href="https://dev.to/jayjayjpg/why-blueprints-in-ember-are-cool-and-how-they-save-you-time-writing-tests-1p0b">Why Blueprints are Cool 😎</a></h2>
<p>If you've been using Ember for any length of time you almost certainly have come to appreciate the robust generators that <code>ember-cli</code> provides. Ember's first-in-class generators can cut down on development time by reducing the need to write boilerplate and reducing the risk of errors in setting up your code.</p>
<p>If you've been wondering about how those generators get set up and how you can create your own, then you're in luck! There's a super helpful ✨✨new article✨✨ by our very own <a href="https://github.com/jayjayjpg">Jessy Jordan (@jayjayjpg)</a> on how you can write your own blueprints to customize generator commands for use in setting up tests files in Ember 🔥🔥🔥.</p>
<p>The article walks us through the process from top to bottom on how blueprints drive the built-in Ember generators for setting up tests, and how we can create our own blueprints for customizing this setup and make automating this part of writing tests a snap.</p>
<p>By following the thorough explanations provided in <a href="https://dev.to/jayjayjpg/why-blueprints-in-ember-are-cool-and-how-they-save-you-time-writing-tests-1p0b">the article</a> you can get started writing your own blueprints in no time!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/mixonic" rel="noopener noreferrer" target="_blank">Matthew Beale (@mixonic)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/faith-or" rel="noopener noreferrer" target="_blank">Faith Or (@faith-or)</a>, <a href="https://github.com/hadenpf" rel="noopener noreferrer" target="_blank">Haden (@hadenpf)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Chris Garrett (@pzuraq)</a>, <a href="https://github.com/stefanpenner" rel="noopener noreferrer" target="_blank">Stefan Penner (@stefanpenner)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/elwayman02" rel="noopener noreferrer" target="_blank">Jordan Hawker (@elwayman02)</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/mydea" rel="noopener noreferrer" target="_blank">Francesco Novy (@mydea)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/robertosequeira" rel="noopener noreferrer" target="_blank">Roberto Sequeira (@robertosequeira)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/hellomattio" rel="noopener noreferrer" target="_blank">Matt Doyle (@hellomattio)</a>, <a href="https://github.com/jayjayjpg" rel="noopener noreferrer" target="_blank">Jessy Jordan (@jayjayjpg)</a>, <a href="https://github.com/MrChocolatine" rel="noopener noreferrer" target="_blank">Max Z (@MrChocolatine)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/harshith-venkatesh" rel="noopener noreferrer" target="_blank">Harshith Venkatesh (@harshith-venkatesh)</a>, <a href="https://github.com/hmajoros" rel="noopener noreferrer" target="_blank">Hank Majoros (@hmajoros)</a>, and <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jesse Jordan, Isaac Lee, Chris Ng, Jared Galanis, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-185</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-185</guid><pubDate>Fri, 30 Jul 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 186]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Read the blog post on Avoiding Lifecycle in Components, announcing Glimmer Apollo, new release for ember-responsive-image, and code in public: Ember dev streaming on Twitch.</p>
<hr />
<h2 id="blogpostavoidinglifecycleincomponentshttpstwittercomnullvoxpopulistatus1421128258427490311"><a href="https://twitter.com/nullvoxpopuli/status/1421128258427490311">Blog post: Avoiding Lifecycle in Components ✍️</a></h2>
<p><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> published a blog post on <a href="https://nullvoxpopuli.com/avoiding-lifecycle">Avoiding Lifecycle in Components</a>, namely the lifecycle hooks that come with <a href="https://github.com/emberjs/ember-render-modifiers">ember-render-modifiers</a>.</p>
<p>For some context, ember-render-modifiers was created from <a href="https://emberjs.github.io/rfcs/0415-render-element-modifiers.html">RFC 415: Render Element Modifiers</a> which introduced  three new generic element modifiers: <code>{{did-insert}}</code>, <code>{{did-update}}</code>, and <code>{{will-destroy}}</code>. The caveat however was that these modifiers were meant for quickly migrating away from classic Ember components to Glimmer components, because they largely allow you to use the same lifecycle hook methods you've already written while attaching them to these modifiers.</p>
<p>The blog outlines several possibilities to avoid using these modifiers:</p>
<ul>
<li>Creating your own custom modifier when behavior is tied to a particular DOM node or DOM tree</li>
<li>Starting Ember 3.25, using a local modifier which is only referenced within your component</li>
<li>Using <code>useFunction</code> from <a href="https://github.com/NullVoxPopuli/ember-resources">ember-resources</a> to lazily load data instead of doing it in <code>did-insert</code> or <code>did-update</code> modifiers</li>
<li>Handling destruction using <code>registerDestructor</code> from <a href="https://api.emberjs.com/ember/release/modules/@ember%2Fdestroyable">@ember/destroyable</a> or using <code>willDestroy</code> directly from the <a href="https://api.emberjs.com/ember/release/modules/@glimmer%2Fcomponent#willdestroy">Glimmer lifecycle hook</a></li>
</ul>
<p>Read more about the different strategies to avoiding lifecycle in components at the <a href="https://nullvoxpopuli.com/avoiding-lifecycle">Avoiding Lifecycle in Components blog post</a>!</p>
<hr />
<h2 id="announcingglimmerapollohttpsglimmerapollocom"><a href="https://glimmer-apollo.com/">Announcing Glimmer Apollo 🎉</a></h2>
<p><a href="https://github.com/josemarluedke">Josemar Luedke (@josemarluedke)</a> shared <a href="https://glimmer-apollo.com/">Glimmer Apollo</a> on <a href="https://twitter.com/josemarluedke/status/1410295473072611328">Twitter</a>, a new addon that integrates GraphQL in your Ember and Glimmer apps with a declarative API to query, mutate, and access GraphQL data.</p>
<p>For background, <a href="https://graphql.org/">GraphQL</a> is a query language for APIs and a runtime for fulfilling those queries with your existing data. <a href="https://www.apollographql.com/docs/react/">Apollo Client</a> is a popular, declarative data-fetching library for GraphQL. Glimmer Apollo uses the concept of <a href="https://www.pzuraq.com/introducing-use/">Resources</a> to enable the integration of Glimmer's autotracking system with Apollo Client. The library is also reactive: queries are automatically re-executed when arguments change. The UI reflects any changes when cache data has been updated.</p>
<p>Glimmer Apollo is written in TypeScript, allowing APIs to specify the shape of the result data and variables. TypeScript also has friendly IntelliSense while coding. Glimmer Apollo is also an <strong>Embroider native addon</strong> (v2) and integrates with FastBoot (server-side rendering). 💯</p>
<hr />
<h2 id="emberresponsiveimagev3releasehttpsgithubcomkaliber5emberresponsiveimage"><a href="https://github.com/kaliber5/ember-responsive-image"><code>ember-responsive-image</code> v3 release 🖼</a></h2>
<p>Optimising image size and formats to improve performance can get complicated, but the <a href="https://github.com/kaliber5/ember-responsive-image"><code>ember-responsive-image</code></a> addon has your back! Now you have even more reason to take advantage of its abilities following the annoucement by <a href="https://github.com/simonihmig">Simon Ihmig (@simonihmig)</a> of <a href="https://github.com/kaliber5/ember-responsive-image/releases/tag/v3.0.0">version 3</a>. This release provides support for Cloudinary and imgix image CDNs, further enriching a full set of functionality for re-sizing images and optimizing image loading times across all browsers. Go check it out.</p>
<hr />
<h2 id="codeinpublicemberdevelopmentstreamingontwitchhttpswwwtwitchtvreal_ate"><a href="https://www.twitch.tv/real_ate">Code in public: Ember development streaming on Twitch 📹</a></h2>
<!-- alex ignore king-queen -->
<p><a href="https://github.com/mansona">Chris Manson (@mansona)</a> of the Ember Learning Team continues to livestream open source Ember development on Twitch! Check out the channel at <a href="https://www.twitch.tv/real_ate">twitch.tv/real_ate</a> and give it a follow! In the most recent stream, Chris does some coding work on <a href="https://github.com/MelSumner/a11y-automation">MelSumner/a11y-automation</a>, then switches gears to <a href="https://github.com/empress/field-guide">empress/field-guide</a>. Catch the next episode live <a href="https://www.twitch.tv/real_ate/schedule">every Thursday from 10:30-13:00 (GMT+2)</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/swarajpure" rel="noopener noreferrer" target="_blank">Swaraj Rajpure (@swarajpure)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/suchitadoshi1987" rel="noopener noreferrer" target="_blank">Suchita Doshi (@suchitadoshi1987)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/stefanpenner" rel="noopener noreferrer" target="_blank">Stefan Penner (@stefanpenner)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/dgeb" rel="noopener noreferrer" target="_blank">Dan Gebhardt (@dgeb)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a>, <a href="https://github.com/brendenpalmer" rel="noopener noreferrer" target="_blank">Brenden Palmer (@brendenpalmer)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, and <a href="https://github.com/jayjayjpg" rel="noopener noreferrer" target="_blank">Jessy Jordan (@jayjayjpg)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Connect with us 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Tim Foster, Chris Ng, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-186</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-186</guid><pubDate>Mon, 16 Aug 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 187]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Release: ember-engines-router-service, ember-scroll-modifier and ember-user-activity updates, and Coding with the Dead on Twitch.</p>
<hr />
<h2 id="releaseemberenginesrouterservicehttpstwittercommvillanderstatus1423659543427522560"><a href="https://twitter.com/MVillander/status/1423659543427522560">⚙️ Release: ember-engines-router-service</a></h2>
<p><a href="https://github.com/villander">Michael Villander (@villander)</a> released the <a href="https://github.com/villander/ember-engines-router-service">ember-engines-router-service</a> addon which provides the Router service for <a href="https://github.com/ember-engines/ember-engines">ember-engines</a>.</p>
<p>The addon gives you access to the <a href="https://api.emberjs.com/ember/release/classes/RouterService">RouterService API</a> inside each engine. This allows you to inject the router service as usual to your component within an engine and use APIs such as <code>transitionTo</code> and even <code>transitionToExternal</code> which help link <code>externalRoutes</code> together.</p>
<pre><code class="js language-js">import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
import { action } from ‘@ember/object’;

export default class SomeComponent extends Component {
  @service router;

  @action
  transitionToHome() {
    this.router.transitionToExternal('other.route');
  }

  @action
  transitionToAdmin() {
    this.router.transitionTo('admin.route');
  }
}
</code></pre>
<p>To learn more, <a href="https://github.com/villander/ember-engines-router-service">try it out today</a> in your application or read the <a href="https://github.com/emberjs/rfcs/pull/122">Engine Linking RFC</a> for more documentation.</p>
<hr />
<h2 id="emberscrollmodifierandemberuseractivityupdateshttpstwittercomaxlehellfirestatus1424825542767874052"><a href="https://twitter.com/AxleHellfire/status/1424825542767874052">🚀 Ember-scroll-modifier and ember-user-activity updates</a></h2>
<p><a href="https://github.com/elwayman02">Jordan Hawker (@elwayman02)</a> announced updates to two of his add-ons.</p>
<p><a href="https://ember-scroll-modifiers.jhawk.co">ember-scroll-modifiers</a> got a minor update to add an amazing test helper to <strong>make it easier</strong> to test usage of the <strong>scroll-into-view</strong> modifier in your code.</p>
<p><a href="https://ember-user-activity.jhawk.co/">ember-user-activity</a> got a major update, with the release over version 6.0.0. This version drops support for Ember 3.16 and IE11. Not only does it drop support, but it enables the <strong>use</strong> in <strong>Ember 4.0</strong> 🥳!</p>
<hr />
<h2 id="codingwiththedeadontwitchhttpstwittercommuziejusstatus1427725501112717319"><a href="https://twitter.com/muziejus/status/1427725501112717319">📺 Coding with the Dead on Twitch</a></h2>
<!--alex ignore host-hostess-->
<p><strong><a href="https://www.twitch.tv/videos/1121252669">Studio Remote: Coding with the Dead</a></strong> is a Twitch series from Columbia University Libraries. <a href="https://github.com/muziejus">Moacir P. de Sá Pereira (@muziejus)</a> is your host, live streaming coding in Ember! In the most recent episode, Moacir works on <a href="https://github.com/wandertext/wandertext">wandertext</a>, an open source app to create and share semantically rich geospatial datasets. The app is currently under heavy development! It's neat that viewers can follow along with the code, project management via GitHub issues, debugging, spelunking through addons, and more!</p>
<p>Moacir is typically scheduled for Tuesday afternoons at 3pm ET on Twitch. Follow <a href="https://www.twitch.tv/culstudio">CULStudio</a> on Twitch and check out the <a href="https://www.twitch.tv/culstudio/schedule">schedule</a> to tune in live or async!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/ChrisCarini" rel="noopener noreferrer" target="_blank">Chris Carini (@ChrisCarini)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/suchitadoshi1987" rel="noopener noreferrer" target="_blank">Suchita Doshi (@suchitadoshi1987)</a>, <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a>, <a href="https://github.com/aniketh-deepsource" rel="noopener noreferrer" target="_blank">@aniketh-deepsource</a>, <a href="https://github.com/raycohen" rel="noopener noreferrer" target="_blank">Ray Cohen (@raycohen)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/hermionethebrightone" rel="noopener noreferrer" target="_blank">Hermione Granger (@hermionethebrightone)</a>, <a href="https://github.com/stefanpenner" rel="noopener noreferrer" target="_blank">Stefan Penner (@stefanpenner)</a>, <a href="https://github.com/btecu" rel="noopener noreferrer" target="_blank">Bj Tecu (@btecu)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/Oluwadamilareolusakin" rel="noopener noreferrer" target="_blank">Tolulope Oluwadamilare Olusakin (@Oluwadamilareolusakin)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/rajakvk" rel="noopener noreferrer" target="_blank">@rajakvk</a>, <a href="https://github.com/harshith-venkatesh" rel="noopener noreferrer" target="_blank">Harshith Venkatesh (@harshith-venkatesh)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/basz" rel="noopener noreferrer" target="_blank">Bas Kamer (@basz)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, and <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Anne-Greeth Schot-van Herwijnen, Chris Ng, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-187</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-187</guid><pubDate>Fri, 27 Aug 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 188]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember 3.28 and 4.0 Beta Released, open source contributors wanted for Ember v4, reactively handle audio in Octane with <code>ember-stereo</code>, and Twitter thread: Ember is data-first.</p>
<hr />
<h2 id="ember328and40betareleasedhttpsblogemberjscomember328released"><a href="https://blog.emberjs.com/ember-3-28-released/">🎉 Ember 3.28 and 4.0 Beta Released</a></h2>
<p>After 3.5 years and 28 minor releases, Ember 3.28 marks the end of the project's 3.x series. To ensure a smooth upgrade path going into the 4.x series, 3.28 has been declared an LTS (Long Term Support) candidate. In six weeks, the latest patch version of 3.28 will be promoted to be the latest LTS release and replace 3.24-LTS.</p>
<p><strong>We're also announcing the start of the Ember 4.0 beta cycle for all sub-projects.</strong> Following the process set in previous major versions, Ember 4.0's beta introduces no new features. Instead, it removes support for deprecated public APIs. We encourage our community (especially addon authors) to help test beta builds and report any bugs before they are published as a stable release in six weeks' time. We also encourage everyone to help maintainers resolve deprecations in their favorite addons. The <a href="https://github.com/ember-cli/ember-try">ember-try</a> addon is a great way to continuously test your projects against the latest Ember releases.</p>
<p>Developers who want to prepare for the upcoming 4.0 version of Ember should work to resolve all deprecation warnings in their apps and addons while using Ember 3.28. An app or addon with no deprecation warnings on Ember 3.28 should be able to upgrade from Ember 4.0 without making significant changes outside of the dependency versions.</p>
<p>You can read more about Ember's plans for 4.0 in <a href="https://blog.emberjs.com/the-road-to-ember-4-0/">The Road to Ember 4.0</a>. Please visit <a href="https://blog.emberjs.com/ember-3-28-released/">Ember 3.28 and 4.0 Beta Released</a> for the rest of the post, including details on Ember.js, Ember Data, and Ember CLI. Many thanks to <a href="https://github.com/mixonic">Matthew Beale (@mixonic)</a>, <a href="https://github.com/jenweber">Jen Weber (@jenweber)</a>, and <a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a> for the excellent and informative writeup!</p>
<hr />
<h2 id="opensourcecontributorswantedforemberv4">📣 Open source contributors wanted for Ember v4</h2>
<p>Do you have some time to help out with shipping Ember v4? 🔥 The Learning Team is preparing docs and guides, and we need your brainpower and writing skills!</p>
<p>Help wanted to complete this month:</p>
<ul>
<li>The most pressing issue is the deprecation guides, please start here if you have bandwidth and comment to claim a subtask of the issue. <a href="https://github.com/ember-learn/deprecation-app/issues/893">GitHub issue: Write missing deprecation guides</a></li>
<li>Look through the API docs and remove references to classic syntax. We only want to show Octane style examples in v4. <a href="https://github.com/emberjs/ember.js/issues/19702">GitHub issue: [Documentation] Epic - remove classic examples from API docs for Ember 4</a></li>
</ul>
<p>In addition to commenting on the GitHub issues, we can also chat on <a href="https://discord.com/channels/480462759797063690/480499624663056390/882839642448220230">#dev-ember-learning on Discord</a>.</p>
<hr />
<h2 id="reactivelyhandleaudiosinoctanewithemberstereohttpsgithubcomjkeenemberstereo"><a href="https://github.com/jkeen/ember-stereo">🎵 Reactively handle audios in Octane with <code>ember-stereo</code></a></h2>
<p>Since 2016, <a href="https://github.com/jkeen">Jeff Keen (@jkeen)</a> helped develop the open-source <a href="https://github.com/nypublicradio/ember-hifi">ember-hifi</a> for the New York Public Radio.</p>
<!-- alex ignore retext-equality -->
<p>Jeff recently released its modern, reactive successor <a href="https://github.com/jkeen/ember-stereo">ember-stereo</a>. He has worked hard on making audio manipulation simple and providing <a href="https://ember-stereo.com/docs">extensive examples</a>. We encourage you to have a look!</p>
<p>Out of the box, you will be provided with:</p>
<ul>
<li><code>stereo</code> service: It manages loading and playing sounds, making sure that only one sound plays at a time, setting volume, and providing system-level events that your application can tie into.</li>
<li>Template helpers, which can perform an action on, or retrieve information from, a sound or <code>url</code> string—something entirely new from how <code>ember-hifi</code> did things!</li>
<li>A couple of modifiers, to help control volume and position</li>
<li><code>setupStereoTest()</code>, to help write tests</li>
</ul>
<hr />
<h2 id="twitterthreademberisdatafirsthttpstwittercomdavertstatus1435372911452373000"><a href="https://twitter.com/davert/status/1435372911452373000">🐦 Twitter thread: Ember is data-first</a></h2>
<p><a href="https://github.com/DavertMik">Michael Bodnarchuk (@DavertMik)</a> wrote a <a href="https://twitter.com/davert/status/1435372911452373000">Twitter thread</a> on how tracked properties in Glimmer components help you build data-oriented components.</p>
<p>Michael mentions that in React you write hooks to update the component's state, while in Ember the component's state is tied to the data. This data first approach makes it so we can pass the reacting class to the root component and we do not need to change any child components to make it work.</p>
<p>Read the full <a href="https://twitter.com/davert/status/1435372911452373000">Twitter thread</a> and let us know if you have any thoughts about it too!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/xg-wang" rel="noopener noreferrer" target="_blank">Thomas Wang (@xg-wang)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/charlesfries" rel="noopener noreferrer" target="_blank">Charles Fries (@charlesfries)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/esquith" rel="noopener noreferrer" target="_blank">Esquith Allen (@esquith)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/ChrisCarini" rel="noopener noreferrer" target="_blank">Chris Carini (@ChrisCarini)</a>, <a href="https://github.com/sly7-7" rel="noopener noreferrer" target="_blank">Sylvain MINA (@sly7-7)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/lifeart" rel="noopener noreferrer" target="_blank">Alex Kanunnikov (@lifeart)</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/Glarregle" rel="noopener noreferrer" target="_blank">Gabriela Larregle (@Glarregle)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/himynameisjonas" rel="noopener noreferrer" target="_blank">Jonas Brusman (@himynameisjonas)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/stefanpenner" rel="noopener noreferrer" target="_blank">Stefan Penner (@stefanpenner)</a>, <a href="https://github.com/ndekeister-us" rel="noopener noreferrer" target="_blank">Nathanaël Dekeister (@ndekeister-us)</a>, <a href="https://github.com/brendenpalmer" rel="noopener noreferrer" target="_blank">Brenden Palmer (@brendenpalmer)</a>, and <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-188</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-188</guid><pubDate>Fri, 10 Sep 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 189]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>RFC: Asset Import Spec, ember-element-query v4, EmberFest 2021 - best of both worlds, Glimmer cheatsheet, and Glimmer Apollo v0.4.0.</p>
<hr />
<h2 id="rfcassetimportspechttpsgithubcomemberjsrfcspull763"><a href="https://github.com/emberjs/rfcs/pull/763">✍️ RFC: Asset Import Spec</a></h2>
<p><a href="https://github.com/ef4">Edward Faulkner (@ef4)</a> proposed a new <a href="https://github.com/emberjs/rfcs/pull/763">RFC</a> which defines the standard semantics for what it means to depend on files that are not JavaScript or CSS, like images, fonts, and other media. The ecosystem today mostly relies on <a href="https://github.com/ember-cli/broccoli-asset-rev">broccoli-asset-rev</a> which is a Broccoli plugin that adds fingerprint checksums and CDN URLs to your assets. The RFC argues that the broccoli-asset-rev plugin does not take advantage of the newer capabilities we have in <a href="https://github.com/ef4/ember-auto-import">ember-auto-import</a> and <a href="https://github.com/embroider-build/embroider">embroider</a>. The proposed pull-based design lets code declare what assets it needs and then not worry about how those assets will get delivered is safer and easier to change in the future.</p>
<pre><code class="js language-js">import myImage from './hello.png';

class extends Component {
  myImage = myImage
}
</code></pre>
<pre><code class="handlebars language-handlebars">&lt;img src={{this.myImage}} /&gt;
</code></pre>
<p>If this is something you are interested in, please read and discuss the <a href="https://github.com/emberjs/rfcs/pull/763">Asset Import Spec RFC on GitHub</a>!</p>
<hr />
<h2 id="emberelementqueryv4httpsgithubcomlolmausemberelementquery"><a href="https://github.com/lolmaus/ember-element-query/">✨ ember-element-query v4</a></h2>
<p><a href="https://github.com/lolmaus">Andrey Mikhaylov (@lolmaus)</a> announced the <a href="https://twitter.com/lolmaus_en/status/1424083417591914499">release</a> of <a href="https://github.com/lolmaus/ember-element-query/">ember-element-query</a> v4, a <strong>complete rewrite for Octane</strong> with a new convenient API.</p>
<p>Element queries are a technique to do responsive transformations based on the element's own size, rather than the viewport size. You can implement reusable responsive components with encapsulated styles, that are decoupled from their parent context. Such components will realign their content depending on how much space is available to them.</p>
<p>For example, if you put a responsive component into a tight sidebar, it will align its content vertically. When the sidebar expands, the component will realign horizontally, in order to efficiently use available space. Check out <a href="https://www.smashingmagazine.com/2016/07/how-i-ended-up-with-element-queries-and-how-you-can-use-them-today/">Element Queries, And How You Can Use Them Today</a> on Smashing Magazine to learn more.</p>
<p>Historically, <code>ember-element-query</code> was the first Ember addon to offer element queries out of the box, but back then it used an inefficient implementation and was written in the now-outdated Classic Ember paradigm. It served as one of inspirations for <a href="https://github.com/chadian">Chad Carbert's (@chadian)</a> <a href="https://github.com/chadian/ember-fill-up">ember-fill-up</a>. <a href="https://www.youtube.com/watch?v=RIdjk9_RSBY">Announced</a> at EmberFest 2019 as a proof-of-concept, <code>ember-fill-up</code> saw no updates and was discontinued.</p>
<p>The first element query addon to be released with feature completeness, full test coverage and lasting support was <a href="https://github.com/ijlee2/">Isaac Lee's (@ijlee2)</a> <code>ember-container-query</code>, featured in <a href="https://blog.emberjs.com/the-ember-times-issue-153/">The Ember Times #153</a>. The re-release of <code>ember-element-query</code> followed suit with a subjectively more convenient, opinionated API, backed by modern, efficient <code>ResizeObserver</code> under the hood. <a href="https://github.com/ijlee2/">@ijlee2</a> provided kind support, criticism and generously shared the demo app with <a href="https://github.com/lolmaus">@lolmaus</a>'s <code>ember-element-query</code>.</p>
<p>Check out the detailed <a href="https://github.com/lolmaus/ember-element-query/">README</a> and give the addon a spin!</p>
<hr />
<h2 id="emberfest2021bestofbothworldshttpsemberfesteu"><a href="https://emberfest.eu">🏛️ EmberFest 2021 - best of both worlds</a></h2>
<p>Next week, after a year of absence because of COVID, <a href="https://emberfest.eu">EmberFest</a> is back. On the 30th of September and the 1st of October, Emberistas will gather <strong>digitally</strong> and <strong>on-site</strong> in Rome to hear awesome Ember talks.</p>
<p>There will be well-known EmberConf/Fest speakers like <a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a> and <a href="https://github.com/ef4">Edward Faulkner (@ef4)</a>, as well as first-time speakers like <a href="https://github.com/BobrImperator">Bartlomiej Dudzik (@BobrImperator)</a>, <a href="https://github.com/JennyJudova">Jenny Judova (@JennyJudova)</a>, and <a href="https://github.com/ZoeBijl">Zoë Bijl (@ZoeBijl)</a>. The <a href="https://emberfest.eu/schedule/">line-up</a> is super diverse and interesting for all Ember enthusiasts.</p>
<p>Remote tickets are still available. A few on-site tickets too, if you plan on arriving at the last minute. We hope you enjoy EmberFest wherever you decide to join.</p>
<hr />
<h2 id="glimmercheatsheethttpstwittercomnullvoxpopulistatus1439652161625985037"><a href="https://twitter.com/nullvoxpopuli/status/1439652161625985037">⚡️ Glimmer Cheatsheet</a></h2>
<p>If you've ever found the Ember Octane vs Ember Classic Cheat Sheet cheatsheet helpful, and you're also interested in Glimmer.js, you might want to check out the in-progress and exciting, but <strong>unofficial</strong>, <a href="https://cheatsheet.glimmer.nullvoxpopuli.com/docs">Glimmer Cheatsheet</a> that <a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> recently started to put together.</p>
<p>So far only part of the <a href="https://cheatsheet.glimmer.nullvoxpopuli.com/docs/templates">templates page</a> has been written, but if you're interested in contributing there is a rough outline and placeholder i18n to help get you started.</p>
<p>Take a look at the <a href="https://github.com/nullvoxpopuli/ember-cheat-sheet">GitHub repo</a> or the <a href="https://cheatsheet.glimmer.nullvoxpopuli.com/docs">deployed app</a> for more!</p>
<hr />
<h2 id="glimmerapollov040httpstwittercomjosemarluedkestatus1441532888072142859"><a href="https://twitter.com/josemarluedke/status/1441532888072142859">📈 Glimmer Apollo v0.4.0</a></h2>
<p><a href="https://github.com/josemarluedke">Josemar Luedke (@josemarluedke)</a> recently released a new <a href="https://github.com/josemarluedke/glimmer-apollo/releases/tag/v0.4.0">v0.4.0</a> of Glimmer Apollo that includes support for <a href="https://glimmer-apollo.com/docs/fetching/subscriptions/">subscriptions</a>! 🔥</p>
<p>If you haven't checked out Glimmer Apollo and you would like to make use of Apollo to access GraphQL data in your Glimmer or Ember app, you should take a look at this <a href="https://github.com/josemarluedke/glimmer-apollo">exciting project</a> and give <a href="https://glimmer-apollo.com/docs">the docs</a> a read.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/davideferre" rel="noopener noreferrer" target="_blank">Davide Ferrero (@davideferre)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/lifeart" rel="noopener noreferrer" target="_blank">Alex Kanunnikov (@lifeart)</a>, <a href="https://github.com/tben" rel="noopener noreferrer" target="_blank">Ben Tidy (@tben)</a>, <a href="https://github.com/enspandi" rel="noopener noreferrer" target="_blank">Andreas Minnich (@enspandi)</a>, <a href="https://github.com/StephanH90" rel="noopener noreferrer" target="_blank">@StephanH90</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/jkeen" rel="noopener noreferrer" target="_blank">Jeff Keen (@jkeen)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/ro0gr" rel="noopener noreferrer" target="_blank">Ruslan Hrabovyi (@ro0gr)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/colenso" rel="noopener noreferrer" target="_blank">@colenso</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/Baltazore" rel="noopener noreferrer" target="_blank">Kirill Shaplyko (@Baltazore)</a>, <a href="https://github.com/charlesfries" rel="noopener noreferrer" target="_blank">Charles Fries (@charlesfries)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/jfdnc" rel="noopener noreferrer" target="_blank">Jacob (@jfdnc)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/maxfierke" rel="noopener noreferrer" target="_blank">Max Fierke (@maxfierke)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/sly7-7" rel="noopener noreferrer" target="_blank">Sylvain Mina (@sly7-7)</a>, <a href="https://github.com/ddzz" rel="noopener noreferrer" target="_blank">Darius Dzien (@ddzz)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, and <a href="https://github.com/ndekeister-us" rel="noopener noreferrer" target="_blank">Nathanaël Dekeister (@ndekeister-us)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Anne-Greeth Schot-van Herwijnen, Jared Galanis, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-189</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-189</guid><pubDate>Fri, 24 Sep 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 190]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>It's October…and that means it's time for Hacktoberfest! Also, try out the first beta release of Ember 4.0 today, plus a release of ember-popperjs</p>
<hr />
<h2 id="hacktoberfesthttpshacktoberfestdigitaloceancom"><a href="https://hacktoberfest.digitalocean.com/">🎃 Hacktoberfest</a></h2>
<p><a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest</a> is an annual, worldwide celebration organized by DigitalOcean and sponsored by many companies that use open source software.
Many Ember projects are participating this year! If you complete the challenge,
you can get a prize!</p>
<p>To participate:</p>
<ul>
<li>Sign up anytime between October 1 and October 31.</li>
<li>Make 4 approved Pull Requests to public repositories on GitHub that have the <code>hacktoberfest</code> topic.
Take a moment to learn about what goes into an <a href="https://hacktoberfest.digitalocean.com/resources/participation">"approved" Pull request</a>.</li>
<li>If you are among the first 50,000 developers who complete the challenge, you get a prize. This year, you can select between a T-shirt and a tree planted in your name.</li>
<li>Join the <a href="https://discord.com/channels/480462759797063690/496453502298750988"><code>#hacktoberfest</code></a> channel in the <a href="https://discord.gg/emberjs">Ember Community Discord</a>
to collaborate with other participants!</li>
</ul>
<h3 id="emberprojectsyoucanhelpoutwith">Ember projects you can help out with</h3>
<p>Are you wondering what to work on?</p>
<p>There are <a href="https://github.com/search?q=topic%3Aember+topic%3Ahacktoberfest">100 and counting Ember projects participating</a>!
Here's a list of <a href="https://github.com/search?o=desc&q=topic%3Aember+topic%3Ahacktoberfest&s=updated&type=Repositories">recently updated issues</a> in those repositories.</p>
<p>Ember 4.0 is coming up, and so one area of need is to help addon maintainers
upgrade to version 3.28 and <a href="https://deprecations.emberjs.com/">resolve deprecations</a>. Even if addon authors
do not have issues open for this work, you can open one and offer to help.</p>
<p>You can also visit <a href="https://help-wanted.emberjs.com/">Ember's Help Wanted</a> to find good issues to work on. The Ember Learning Team and others are curating some super beginner-friendly issues. In Help Wanted, you can find these issues, along with more intermediate and advanced issues. If you want to help, comment on an issue to let others know that you are working on it. If the issue you want to work on is taken, try asking if the other volunteers would like to collaborate!</p>
<h3 id="connectwithotherparticipants">Connect with other participants</h3>
<p>Join the <a href="https://discord.com/channels/480462759797063690/496453502298750988"><code>#hacktoberfest</code></a> channel in the <a href="https://discord.gg/emberjs">Ember Community Discord</a> to connect with other developers. You can find a buddy to pair with, a mentor to guide you, or toss around ideas.</p>
<p>If you are someone who is willing to help mentor new contributors, please let us know in <a href="https://discord.com/channels/480462759797063690/496453502298750988"><code>#hacktoberfest</code></a> on Discord. Addon maintainers are welcome to post issues they need help with too!</p>
<!--alex ignore gal-guy -->
<p>Additionally, there are several more groups within the Ember Community Discord where you can find others to collaborate with. There are Discord channels for women, LGBTQ+, and people of color. If you belong to one of those groups, you can ask to join in the <a href="https://discord.com/channels/480462759797063690/480499718330253342"><code>#discord-server-admin</code></a> channel.</p>
<hr />
<h2 id="ember400beta1releasedhttpsgithubcomembercliemberclireleasestagv400beta1"><a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.0.0-beta.1">✨ Ember 4.0.0-beta.1 released</a></h2>
<p>On October 4, the first beta of Ember 4.0 has been released. It contains improvements to documentation as well as a few new features:</p>
<ul>
<li>Add <code>addons.exclude</code> and <code>addons.include</code> options (implements <a href="https://github.com/emberjs/rfcs/pull/639">RFC #639</a>)</li>
<li>Add <code>pnpm</code> support to <code>ember install</code> command</li>
<li>Default <code>ember new</code> and <code>ember addon</code> to use GitHub Actions (implements <a href="https://github.com/emberjs/rfcs/pull/696">RFC #696</a>)</li>
<li>Update app and addon blueprints to use <code>ember-auto-import@v2</code></li>
</ul>
<p>For more information about the 4.0.0-beta.1 release, you can visit the <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.0.0-beta.1">release page on GitHub</a>. We encourage you try it out and provide feedback.</p>
<hr />
<h2 id="releaseofemberpopperjshttpstwittercomnullvoxpopulistatus1444713887220240400"><a href="https://twitter.com/nullvoxpopuli/status/1444713887220240400">🎉 Release of ember-popperjs</a></h2>
<p><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> released v1.0.0 of <a href="https://github.com/NullVoxPopuli/ember-popperjs">ember-popperjs</a> which provides a single <code>&lt;PopperJS&gt;</code> component with with APIs to create popover, tooltips, and more!</p>
<p>The addon provides 2 modifiers: <code>{{trigger}}</code> which sets up the target element for the popover element to position itself to – and <code>{{popover}}</code> which attaches to the element that is the container of the popover content. There are also <code>placement</code> and <code>options</code> attributes which can be applied to <a href="https://popper.js.org/docs/v2/constructors/#options">customize</a> the <code>&lt;PopperJS&gt;</code> behaviour.</p>
<pre><code class="handlebars language-handlebars">&lt;PopperJS as |trigger popover|&gt;
  &lt;button {{trigger}} {{on "click" this.yourClickHandler}}&gt;
    {{yield to="trigger"}}
  &lt;/button&gt;

  {{#if this.yourVisibilityIndicator}}
    &lt;div {{popover}}&gt;
      This is a popover!
      {{yield to="default"}}
    &lt;/div&gt;
  {{/if}}
&lt;/PopperJS&gt;
</code></pre>
<p>Note that PopperJS does not provide styles for making a popover nor does it provide click handlers for showing and hiding the popover. Try it out today, it’s available on <a href="https://github.com/NullVoxPopuli/ember-popperjs">GitHub</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/lfrost" rel="noopener noreferrer" target="_blank">Lyle Frost (@lfrost)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/jfdnc" rel="noopener noreferrer" target="_blank">Jacob (@jfdnc)</a>, <a href="https://github.com/ddzz" rel="noopener noreferrer" target="_blank">Darius Dzien (@ddzz)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/aoifehannigan" rel="noopener noreferrer" target="_blank">Aoife Hannigan (@aoifehannigan)</a>, <a href="https://github.com/patocallaghan" rel="noopener noreferrer" target="_blank">Pat O'Callaghan (@patocallaghan)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/dcyriller" rel="noopener noreferrer" target="_blank">Cyrille (@dcyriller)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/nlepage" rel="noopener noreferrer" target="_blank">Nicolas Lepage (@nlepage)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/Turbo87" rel="noopener noreferrer" target="_blank">Tobias Bieniek (@Turbo87)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, and <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jen Weber, Isaac Lee, Chris Ng, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-190</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-190</guid><pubDate>Fri, 08 Oct 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 191]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember 4 is approaching, checkout v4.0.0-beta.9 🐹,
Ember.js Template Imports Blog Series 📚,
New Releases of uELS published to VSCode ✅,
tracked-built-ins v2.0.0 🔥,
Announcing Checkup v1.0.0 🩺,
Addon roundup 🙌,
GlimmerX Workshop Resources ✨,
Migrating an Ember addon to the next-gen v2 format 🚀</p>
<hr />
<h2 id="ember4isapproachingcheckoutv400beta9httpstwittercommixonicstatus1458594719093694466"><a href="https://twitter.com/mixonic/status/1458594719093694466">Ember 4 is approaching, checkout v4.0.0-beta.9 🐹</a></h2>
<p>If you've been following along with the progress on Ember 4 you might know that the next major version of Ember is approaching.</p>
<p>If you are able to, you should check out <a href="https://github.com/emberjs/ember.js/releases/tag/v4.0.0-beta.9">Ember v4.0.0-beta.9</a> in your cutting edge codebases now. A few minor API removals remain, but the vast bulk of planned changes from 3.28 are in this release.</p>
<p>For more details on the road to Ember 4.0 see this <a href="https://blog.emberjs.com/the-road-to-ember-4-0/">blog post</a>.</p>
<hr />
<h2 id="emberjstemplateimportsblogserieshttpsv5chriskrychocomjournalembertemplateimports"><a href="https://v5.chriskrycho.com/journal/ember-template-imports/">Ember.js Template Imports Blog Series 📚</a></h2>
<p>There's a fantastic new 5 part series from <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> on template imports that goes into great detail comparing the various options for template imports that are on the table for the Ember and Glimmer community while we are experimenting with designs for components being available in the same file (you may have heard to this referred to as single-file components).</p>
<p>So far, 4 parts of the 5 part series have been published and the posts cover an introduction on the formats, comparisons on teaching and understanding, tooling considerations and integrated testing.</p>
<p>As is typical of the content Chris puts out, the discussion in this series is precise, thoughtful and complex. It will teach you a lot about single file components and what is involved in the decision making behind such an important choice for our community.</p>
<p>Many thanks to Chris for putting the thought process out there for all of us to better understand the options.</p>
<p>You can find the 4 parts already published, here:</p>
<ul>
<li><a href="https://v5.chriskrycho.com/journal/ember-template-imports/part-1/">Part 1, an introduction</a></li>
<li><a href="https://v5.chriskrycho.com/journal/ember-template-imports/part-2/">Part 2, teaching and understanding components</a></li>
<li><a href="https://v5.chriskrycho.com/journal/ember-template-imports/part-3/">Part 3, tradeoffs on tooling</a></li>
<li><a href="https://v5.chriskrycho.com/journal/ember-template-imports/part-4/">Part 4, integrated testing</a></li>
</ul>
<hr />
<h2 id="glimmerxworkshopresourceshttpstwittercomvaierstatus1456309739017707521"><a href="https://twitter.com/vaier/status/1456309739017707521">GlimmerX Workshop Resources ✨</a></h2>
<p>Earlier this month <a href="https://github.com/lifeart">Alex Kanunnikov (@lifeart)</a> hosted <a href="https://holyjs-moscow.ru/talks/workshop-glimmerx-declarative-ui-i-derived-reactivity-in-27kb/">a workshop</a> at the <a href="https://holyjs-moscow.ru/">HolyJS</a> conference regarding GlimmerX and how you can use it to build declarative UIs.</p>
<p>Recently Alex has shared the <a href="https://github.com/lifeart/glimmerx-workshop">materials for the workshop</a> which provide an excellent set of resources if you have been wondering what it takes to build an application using Glimmer.</p>
<p>Check it out if you get a chance!</p>
<hr />
<h2 id="migratinganemberaddontothenextgenv2formathttpstwittercomsimonihmigstatus1457797305608781826"><a href="https://twitter.com/simonihmig/status/1457797305608781826">Migrating an Ember addon to the next-gen v2 format 🚀</a></h2>
<p>If you've seen the <a href="https://emberjs.github.io/rfcs/0507-embroider-v2-package-format.html">v2 Addon Format RFC</a> for embroider compatibility and wondered how you can upgrade your addon to this new format, you're in luck.</p>
<p>There's a new blog post on how to go about migrating an Ember addon to the next-gen v2 format by <a href="https://github.com/simonihmig">Simon Ihmig (@simonihmig)</a>.</p>
<p>The <a href="https://www.kaliber5.de/en/blog/v2-addon_en">post</a> covers all the necessary information on why and how you can make these upgrades for your addon.</p>
<hr />
<h2 id="newreleasesofuelspublishedtovscodehttpsdiscordcomchannels480462759797063690480499624663056390896699510888226826"><a href="https://discord.com/channels/480462759797063690/480499624663056390/896699510888226826">New Releases of uELS published to VSCode ✅</a></h2>
<p><a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-ember-unstable">Unstable Ember Language Server</a> is a fully featured fork of Ember Language Server. While the name says <em>unstable</em>, it actually is <strong>stable</strong> and recently several new versions <a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-ember-unstable">v3.0.8, v3.0.9 and v3.0.10</a> were published!</p>
<p>Thank you to <a href="https://github.com/lifeart">Alex Kanunnikov (@lifeart)</a> for the updates such as: async file system access, improved startup performance, fixed found issues, and multiple file system providers support. Also, Internationalization tooling was improved.</p>
<p>As part of these releases, experimental <a href="https://code.visualstudio.com/api/extension-guides/web-extensions">VSCode web-version support</a> was added. This allows uELS to be integrated into any browser environment.</p>
<hr />
<h2 id="trackedbuiltinsv200httpsgithubcomtrackedtoolstrackedbuiltinsreleasestagv200"><a href="https://github.com/tracked-tools/tracked-built-ins/releases/tag/v2.0.0">tracked-built-ins v2.0.0 🔥</a></h2>
<p>v2.0.0 of <code>tracked-built-ins</code> <a href="https://github.com/tracked-tools/tracked-built-ins/releases/tag/v2.0.0">was released</a> and it now supports Ember v4.x, has better internal implementations, includes a lot of dependency updates and provides fewer deprecation warnings!</p>
<p>Many thanks to <a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a>, <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> and <a href="https://github.com/SergeAstapov">Sergey Astapov
 (@SergeAstapov)</a> for their work on this release.</p>
<hr />
<h2 id="announcingcheckupv100httpswwwlinkedincompulseannouncingcheckup10stevecalvert"><a href="https://www.linkedin.com/pulse/announcing-checkup-10-steve-calvert/">Announcing Checkup v1.0.0 🩺</a></h2>
<p>The Checkup team has released version 1.0 of <a href="https://github.com/checkupjs/checkup">the Checkup framework</a>, which, if you did not know, provides a nice way to gather static analysis insights for your front-end projects.</p>
<p>Checkup can be used in Ember and can make things like tracking progress in certain efforts, like Octane migrations, easier. There is a custom plugin system and it outputs to standard formats for integration with other common tooling like VS Code.</p>
<p>Checkout the <a href="https://www.linkedin.com/pulse/announcing-checkup-10-steve-calvert/">blog post</a> on the release by <a href="https://github.com/scalvert">Steve Calvert (@scalvert)</a>.</p>
<hr />
<h2 id="addonroundup">Addon roundup 🙌</h2>
<p>There's been quite a few new releases of Ember addons since our last issue. Check them out and maybe give them a try! In no particular order:</p>
<ul>
<li><a href="https://github.com/simplabs/ember-simple-auth/releases/tag/4.1.0">ember-simple-auth v4.1.0</a> was released which adds implementation for explicit API and deprecates implicit use of initializers in ESA. There's also a migration path, <a href="https://github.com/simplabs/ember-simple-auth/blob/master/guides/upgrade-to-v4.md">here</a>.</li>
<li><a href="https://github.com/snewcomer/ember-stateful-promise">ember-stateful-promise</a> is a new addon that helps with async operations, including derived state for native promises and decorators to track promise state.</li>
<li><a href="https://github.com/jelhan/ember-autoresize-modifier/releases/tag/v0.4.0">ember-autoresize-modifier v0.4.0</a> was released and now supports resizing textareas to fit content.</li>
<li><a href="https://github.com/machty/ember-concurrency/releases/tag/2.2.0">ember-concurrency v.2.2.0</a> was released and introduces a public task modifiers api and an onError option for the perform helper.</li>
<li><a href="https://github.com/ember-modifier/ember-modifier/releases/tag/v3.0.0">ember-modifier v3.0.0</a> was released and it fixes some bugs, adds Ember 4.x compatibility and drops support for old versions of Node, Ember and TypeScript.</li>
<li><a href="https://github.com/ember-cli/ember-exam/releases/tag/v7.0.0">ember-exam v7.0.0</a> was released, updating ember-auto-import to v2 for readiness for apps using ember-auto-import v2 and dropping support for node 10.</li>
<li><a href="https://github.com/ember-cli/ember-try/releases/tag/v2.0.0">ember-try v2.0.0</a> was released and now deprecated bower support is removed and experimental support for <a href="https://twitter.com/pnpmjs">pnpmjs</a> has been added.</li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank our <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/amandakalk" rel="noopener noreferrer" target="_blank">Amanda Cahill (@amandakalk)</a>, <a href="https://github.com/step2yeung" rel="noopener noreferrer" target="_blank">Stephen Yeung (@step2yeung)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/balinterdi" rel="noopener noreferrer" target="_blank">Balint Erdi (@balinterdi)</a>, <a href="https://github.com/rajakvk" rel="noopener noreferrer" target="_blank">@rajakvk</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/VincentMolinie" rel="noopener noreferrer" target="_blank">Vincent Molinié (@VincentMolinie)</a>, <a href="https://github.com/brkn" rel="noopener noreferrer" target="_blank">Berkan Ünal (@brkn)</a>, <a href="https://github.com/Windvis" rel="noopener noreferrer" target="_blank">Sam Van Campenhout (@Windvis)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/ddzz" rel="noopener noreferrer" target="_blank">Darius D. (@ddzz)</a>, <a href="https://github.com/raido" rel="noopener noreferrer" target="_blank">Raido Kuli (@raido)</a>, <a href="https://github.com/jamescdavis" rel="noopener noreferrer" target="_blank">James C. Davis (@jamescdavis)</a>, <a href="https://github.com/luxferresum" rel="noopener noreferrer" target="_blank">Lukas Kohler (@luxferresum)</a>, <a href="https://github.com/michaelbdai" rel="noopener noreferrer" target="_blank">Bing Dai (@michaelbdai)</a>, <a href="https://github.com/igorT" rel="noopener noreferrer" target="_blank">Igor Terzic (@igorT)</a>, <a href="https://github.com/krisselden" rel="noopener noreferrer" target="_blank">Kris Selden (@krisselden)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/mixonic" rel="noopener noreferrer" target="_blank">Matthew Beale (@mixonic)</a>, <a href="https://github.com/Turbo87" rel="noopener noreferrer" target="_blank">Tobias Bieniek (@Turbo87)</a>, <a href="https://github.com/charlesfries" rel="noopener noreferrer" target="_blank">Charles Fries (@charlesfries)</a>, <a href="https://github.com/jfdnc" rel="noopener noreferrer" target="_blank">Jacob (@jfdnc)</a>, <a href="https://github.com/kdagnan" rel="noopener noreferrer" target="_blank">Kyle D. (@kdagnan)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/v-jiepeng" rel="noopener noreferrer" target="_blank">Jaydon Peng (@v-jiepeng)</a>, <a href="https://github.com/mehulkar" rel="noopener noreferrer" target="_blank">Mehul Kar (@mehulkar)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/thoov" rel="noopener noreferrer" target="_blank">Travis Hoover (@thoov)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/GreatWizard" rel="noopener noreferrer" target="_blank">Guillaume Gérard (@GreatWizard)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/ro0gr" rel="noopener noreferrer" target="_blank">Ruslan Hrabovyi (@ro0gr)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/square-brackets" rel="noopener noreferrer" target="_blank">Stjepan Petrusa (@square-brackets)</a>, and <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-191</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-191</guid><pubDate>Sun, 14 Nov 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 192]]></title><description><![CDATA[<p>👋 Emberistas! 🐹
Release of ember-functions-as-helper-polyfill 🎉,
First pre-release of ember-template-lint v4 🧹,
Phorest Interview of Balint Erdi 🎙️,
Paired Programming 👭,
Ember.js Template Imports Blog Series Finale 📚,
Deprecate Bower Support RFC ⏰</p>
<hr />
<h2 id="releaseofemberfunctionsashelperpolyfillhttpstwittercomnullvoxpopulistatus1460052313624784899"><a href="https://twitter.com/nullvoxpopuli/status/1460052313624784899">Release of ember-functions-as-helper-polyfill 🎉</a></h2>
<p><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> released the <a href="https://github.com/NullVoxPopuli/ember-functions-as-helper-polyfill">ember-functions-as-helper-polyfill</a> addon which implements <a href="https://github.com/emberjs/rfcs/pull/756">RFC 756: Default Helper Manager</a>. The addon lets you use plain functions as helpers, check out the example below:</p>
<pre><code class="javascript language-javascript">import Component  from '@glimmer/component';

export default class MyComponent extends Component {
  myHelper = x =&gt; x * 2;
}
</code></pre>
<pre><code class="handlebars language-handlebars">{{this.myHelper 3}}
</code></pre>
<p>This reduces the need to create <a href="https://guides.emberjs.com/release/components/helper-functions/">traditional helpers</a> especially when a helper is only really used within the same component. This addon reduces the amount of boilerplate code written and is a more representational model of how template and JS interact.</p>
<p>Try out this functionality today with the <a href="https://github.com/NullVoxPopuli/ember-functions-as-helper-polyfill">polyfill</a>!</p>
<hr />
<h2 id="firstprereleaseofembertemplatelintv4httpsgithubcomembertemplatelintembertemplatelintreleasestagv400alpha0"><a href="https://github.com/ember-template-lint/ember-template-lint/releases/tag/v4.0.0-alpha.0">First pre-release of ember-template-lint v4 🧹</a></h2>
<p><a href="https://github.com/bmish">Bryan Mishkin (@bmish)</a> has kicked off the release cycle for <a href="https://github.com/ember-template-lint/ember-template-lint">ember-template-lint</a> v4 with the first pre-release version <a href="https://github.com/ember-template-lint/ember-template-lint/releases/tag/v4.0.0-alpha.0">v4.0.0-alpha.0</a>!</p>
<p>The key changes so far include:</p>
<ul>
<li>Adding over a dozen rules to the <code>recommended</code> config</li>
<li>Removing deprecated rules, options, and behaviors</li>
<li>Dropping support for old versions of Node</li>
<li>Enforcing stricter default behavior for a few rules</li>
<li>Enforcing stricter validation of configuration files and rule tests</li>
<li>Enforcing a strictly-defined public Node API</li>
</ul>
<p>Please test it out and provide feedback about the current changes or changes you would like to see by commenting in the <a href="https://github.com/ember-template-lint/ember-template-lint/issues/1908">tracking issue</a>.</p>
<hr />
<h2 id="phorestinterviewofbalinterdihttpsnothingventuredrocksemberphorestwithbalinterdi7e90126975ee"><a href="https://nothingventured.rocks/ember-phorest-with-balint-erdi-7e90126975ee">Phorest Interview of Balint Erdi 🎙️</a></h2>
<p><a href="https://github.com/balinterdi">Balint Erdi (@balinterdi)</a>, author of <a href="https://balinterdi.com/rock-and-roll-with-emberjs/">Rock & Roll with Ember.js</a> and co-organizer of <a href="https://emberfest.eu/">EmberFest</a>, recently got to share his thoughts of working with Ember. In addition to the <a href="https://www.youtube.com/watch?v=BQ46w3PGw7s">full video</a>, you can find a summary of the interview on <a href="https://nothingventured.rocks/ember-phorest-with-balint-erdi-7e90126975ee">Phorest's blog</a>.</p>
<p>What is it like to transition a legacy desktop application to an Ember app? To develop a brand new app that runs on Embroider? How can I hire developers and provide a good culture to help with retention? And what was EmberFest 2021 like for Balint?</p>
<p>Check out the interview to find out the answers to these questions!</p>
<hr />
<h2 id="pairedprogramminghttpsnothingventuredrockstheperfectpair8d72db3d8a8b"><a href="https://nothingventured.rocks/the-perfect-pair-8d72db3d8a8b">Paired Programming 👭</a></h2>
<p><a href="https://github.com/aoifehannigan">Aoife (@aoifehannigan)</a> and <a href="https://github.com/mofiebiger">Mo (@mofiebiger)</a>, a senior and junior pair of engineers at Phorest, recently presented a lightning talk at Ember{{fest}} that addressed the topic of paired programming. They <a href="https://nothingventured.rocks/the-perfect-pair-8d72db3d8a8b">documented their recent experiences with the activity</a> after electing to pair up to tackle learning Ember, the framework we know and love, and the one that they would be using to build a new application feature together.</p>
<p>Not only did the two find this practice ideal for avoiding unnecessary code complexity, but it also helped with feelings of isolation that arose during the pandemic-induced shift to remote work. While one drawback this pair found was a difficulty in context switching, the positive takeaways they discovered in regard to paired programming exercises include:</p>
<ul>
<li>The opportunity to get to know one's colleagues on a personal level</li>
<li>A chance to grow one's programming and communication skills by observing, teaching, and asking questions</li>
<li>The strategic advantage that comes with discussing a plan of action in advance and breaking problems down into smaller chunks</li>
<li>An opportunity to build up a rapport with colleagues that led to more interaction overall and less time spent struggling alone</li>
</ul>
<hr />
<h2 id="emberjstemplateimportsblogseriesfinalehttpsv5chriskrychocomjournalembertemplateimports"><a href="https://v5.chriskrycho.com/journal/ember-template-imports/">Ember.js Template Imports Blog Series Finale 📚</a></h2>
<p>You may remember from our last issue that there has been a great new 5+ part series from <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> on template imports. Well, part 5 of the series of posts is now out and there's also a bonus 6th post! 🔥</p>
<p>The <a href="https://v5.chriskrycho.com/journal/ember-template-imports/part-5/">5th post</a> covers approaches to styling concerns in the context of template imports and the <a href="https://v5.chriskrycho.com/journal/ember-template-imports/part-6/">6th post</a> provides a nice summary of all that's been discussed thus far in the series and what sorts of recommendations that Chris makes.</p>
<p>If you have not had a chance to read the series, do yourself a favor and check it out <a href="https://v5.chriskrycho.com/journal/ember-template-imports/">here</a>.</p>
<hr />
<h2 id="deprecatebowersupportrfchttpsgithubcomemberjsrfcspull772"><a href="https://github.com/emberjs/rfcs/pull/772">Deprecate Bower Support RFC ⏰</a></h2>
<p><a href="https://github.com/bertdeblock">Bert De Block (@bertdeblock)</a> recently published a much-needed RFC that proposes how we might go about deprecating support for building Bower packages and the use of Bower-related APIs. ✨</p>
<p>If you are interested and would like to participate in / comment on the RFC, go ahead and give it a read and leave a comment, <a href="https://github.com/emberjs/rfcs/pull/772">here</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank our <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/ddzz" rel="noopener noreferrer" target="_blank">Darius D. (@ddzz)</a>, <a href="https://github.com/jaswilli" rel="noopener noreferrer" target="_blank">Jason Williams (@jaswilli)</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/lolmaus" rel="noopener noreferrer" target="_blank">Andrey Mikhaylov (lolmaus) (@lolmaus)</a>, <a href="https://github.com/Windvis" rel="noopener noreferrer" target="_blank">Sam Van Campenhout (@Windvis)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/michaelbdai" rel="noopener noreferrer" target="_blank">Bing Dai (@michaelbdai)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/m1073496" rel="noopener noreferrer" target="_blank">Jessica Justice (@m1073496)</a>, <a href="https://github.com/SOUMOJIT-CHAKRABORTY" rel="noopener noreferrer" target="_blank">Soumojit Chakraborty (@SOUMOJIT-CHAKRABORTY)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/jfdnc" rel="noopener noreferrer" target="_blank">Jacob (@jfdnc)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/pbernery" rel="noopener noreferrer" target="_blank">Philippe Bernery (@pbernery)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/amyrlam" rel="noopener noreferrer" target="_blank">Amy Lam (@amyrlam)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/Turbo87" rel="noopener noreferrer" target="_blank">Tobias Bieniek (@Turbo87)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/adrigzr" rel="noopener noreferrer" target="_blank">Adrián González Rus (@adrigzr)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/mixonic" rel="noopener noreferrer" target="_blank">Matthew Beale (@mixonic)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, and <a href="https://github.com/kdagnan" rel="noopener noreferrer" target="_blank">Kyle D. (@kdagnan)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Bryan Mishkin, Isaac Lee, Jessica Justice, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-192</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-192</guid><pubDate>Sun, 28 Nov 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 193]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Happy 10th Birthday Ember 🐹,
Ember Addon Roundup 🌎,
First-Class Component Templates RFC 📖,
Author Built-In Blueprints in TypeScript RFC in FCP ⌛️,
Defaults &amp; Initial Values in Octane 🔥,
Uploading images to S3 in Ember 📸</p>
<hr />
<h2 id="happy10thbirthdayemberhttpstwittercomwycatsstatus1468774795529515008"><a href="https://twitter.com/wycats/status/1468774795529515008">Happy 10th Birthday Ember 🐹</a></h2>
<p>On December 8th Ember.js completed another trip around the 🌞 and turned 10 years old! 🥳</p>
<p><a href="https://github.com/wycats">Yehuda Katz (@wycats)</a> recently <a href="https://twitter.com/wycats/status/1468774795529515008">tweeted about the milestone for Ember</a> and called out some of the most notable things that have been achieved in Ember's history:</p>
<ul>
<li>we adopted promises and made them the primary way to do async in Ember (2013)</li>
<li>we added first-class support for JS modules via ember-cli (2014)</li>
<li>we adopted React-style one-way data flow via Glimmer (2015)</li>
<li>we landed the VM architecture (Glimmer 2) as a drop-in, backwards-compatible change (2016). This change was cited by React as one of the technical motivations for Hooks.</li>
<li>Moved the primary Ember API from Ember.* (global) to an intentionally designed JS module API (2016)</li>
<li>Landed support for native JS classes (2017)</li>
<li>Landed support for ES getters and setters, eliminating the need for manual get/set (2018)</li>
<li>Eliminated mandatory dependency on jQuery (2018)</li>
<li>Tracked Properties and Autotracking (2019)</li>
<li>Landed the Octane Edition in a minor release as a backwards-compatible change (2019). This came with a revamped component system based on native JS features (no longer inheriting from the classic Ember.Object superclass), more composable DOM (modifiers), autotracking by default</li>
<li>Landed the primitives needed to support putting templates and JS in the same file, as well as multiple components in one file (2020). Also shipped a library that works with stable Ember that lets you use it today.</li>
<li>Landed Embroider, Ember's next generation, drop-in build system that natively supports npm packages, template imports (see above) and webpack bundling (2021). It also (already) supports route-based code-splitting for Ember apps that opt into slightly stricter (idiomatic) code</li>
<li>Large, real-world apps have been able to make the migration to route-based code splitting in a matter of a few weeks.</li>
<li>All of that doesn't include massive improvements to a11y, very strong TypeScript support (soon maintained officially by the framework team, once the relevant RFCs are approved), migration from a bespoke transpiler to Babel -&gt; 6 -&gt; 7 (transparently to users)</li>
</ul>
<!-- alex ignore basically -->
<ul>
<li>SSR with rehydration with only mild strictness restrictions like not using real DOM at the top level of your module (also idiomatic, basically necessary for tests to function well)</li>
</ul>
<p>All of this has been achieved, and more! 🤯 And as Yehuda points out, all of this doesn't even include our amazing progress on governance and release cadence.</p>
<p>What's more, in honor of the occasion <a href="https://github.com/MelSumner">Mel Sumner (@MelSumner)</a> created an amazing website tribute to the framework we know and 💛💙💜💚🧡 l️ove 💛💙💜💚🧡. The <a href="https://whyember.com/">Why Ember</a> site is now live! The site contains a ton of information about what makes Ember such a great choice, including resources for those new to the framework or considering migrating and a list of some awesome addons.</p>
<p>There have been many, many achievements over the last decade, and our core teams and community members alike deserve to be proud of what we have accomplished - congratulations to all and we can't wait to see what's next! 🎉🚀</p>
<hr />
<h2 id="emberaddonroundup">Ember Addon Roundup 🌎</h2>
<p>We’ve had several addons across the Ember ecosystem release updates recently, here’s what you may have missed and reasons to upgrade!</p>
<ul>
<li><a href="https://github.com/jkusa">Jon Kilroy (@jkusa)</a> released <a href="https://twitter.com/jonkilroy/status/1461089358338039815">ember-arg-types v0.4.0</a> which provides the <strong>forbidExtraArgs</strong> decorator for checking that only arguments with the <code>arg</code> decorator are provided to a component (useful for incorrect invocations).</li>
<li><a href="https://github.com/lukemelia">Luke Miela (@lukemiela)</a> and <a href="https://github.com/SergeAstapov">Sergey Astapov (@SergeAstapov)</a> released <a href="https://github.com/adopted-ember-addons/ember-keyboard/releases/tag/v7.0.0-beta.0">ember-keyboard 7.0.0-beta.0</a> which dropped deprecated features in the 6.x series.</li>
<li><a href="https://github.com/mansona">Chris Manson (@mansona)</a> released the <a href="https://twitter.com/real_ate/status/1464596213781704713">first version of the ember-cli-addon-docs migrator</a> named <a href="https://github.com/empress/ecad-migrator">ecad-migrator</a> which helps move your documentation to <a href="https://github.com/empress/field-guide">Field Guide</a>.</li>
<li><a href="https://github.com/snewcomer">Scott Newcomer (@snewcomer)</a> released <a href="https://github.com/adopted-ember-addons/ember-sortable/blob/master/CHANGELOG.md#v300-2021-11-29">ember-sortable v3.0</a> which removes the component version of the addon (only allows using the modifier version).</li>
<li><a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a> released <a href="https://github.com/ijlee2/ember-container-query/releases/tag/2.0.0-alpha.0">ember-container-query v2.0.0-alpha.0</a> which drops support for Node v10 and Ember v3.16 LTS, replaces ember-did-resize-modifier with ember-on-resize-modifier and upgrades to be an Embroider v2 addon. If you've been using this addon, please provide any feedback you might have to the maintainer.</li>
<li><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> released <a href="https://github.com/tracked-tools/tracked-built-ins/releases/tag/v2.0.1">tracked-built-ins v2.0.1</a> which updates to the latest ember-cli-babel.</li>
</ul>
<hr />
<h2 id="firstclasscomponenttemplatesrfchttpsgithubcomemberjsrfcspull779"><a href="https://github.com/emberjs/rfcs/pull/779">First-Class Component Templates RFC 📖</a></h2>
<p>Following his fantastic <a href="https://v5.chriskrycho.com/journal/ember-template-imports/">blog series on Ember Template Imports</a>, <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> has opened a <a href="https://github.com/emberjs/rfcs/pull/779">RFC covering First-Class Component Templates</a>.</p>
<p>The RFC proposes that we adopt <code>&lt;template&gt;</code> tags as a format for making component templates first-class participants in JavaScript and TypeScript with strict mode template semantics. As Chris mentions, doing so would help provide a number of new capabilities to Ember and Glimmer users:</p>
<ul>
<li>accessing local JavaScript values with no ceremony and no backing class, enabling much easier use of existing JavaScript ecosystem tools, including especially styling libraries—standard CSS Modules will “just work,” for example</li>
<li>authoring more than one component in a single file, where colocation makes sense—and thereby providing more control over a component’s public API</li>
<li>likewise authoring locally-scoped helpers, modifiers, and other JavaScript functionality</li>
</ul>
<p>Go ahead and check out <a href="https://github.com/emberjs/rfcs/pull/779">the RFC</a> today.</p>
<hr />
<h2 id="authorbuiltinblueprintsintypescriptrfcinfcphttpsgithubcomemberjsrfcspull776"><a href="https://github.com/emberjs/rfcs/pull/776">Author Built-In Blueprints in TypeScript RFC in FCP ⌛️</a></h2>
<p>There's another ✨ awesome ✨ RFC that's recently entered its final comment period. This one is on enabling blueprints to be written in TypeScript and was written by <a href="https://github.com/cafreeman">Chris Freeman (@cafreeman)</a>.</p>
<p>So if you are interested in contributing please head on over and comment on <a href="https://github.com/emberjs/rfcs/pull/776">the RFC</a> before time runs out!</p>
<hr />
<h2 id="defaultsinitialvaluesinoctanehttpstwittercomknownasilyastatus1465902331753644041"><a href="https://twitter.com/knownasilya/status/1465902331753644041">Defaults & Initial Values in Octane 🔥</a></h2>
<p>There's a cool new video on Defaults &amp; Initial Values in Octane by <a href="https://github.com/knownasilya">Ilya Radchenko (@knownasilya)</a>! 😎</p>
<p>This video continues <a href="https://www.youtube.com/user/knownasilya/featured">the series</a> that Ilya has been producing on features and patterns in developing with Ember Octane. In this episode Ilya checks out use of the <code>localCopy</code> decorator from <a href="https://github.com/tracked-tools/tracked-toolbox">tracked-toolbox</a> to define class properties.</p>
<p>If you haven't seen the video you can find it <a href="https://www.youtube.com/watch?v=lLQ7r1w1Ud4">here</a>.</p>
<hr />
<h2 id="uploadingimagestos3inemberhttpsbalinterdicomblogimageuploadstos3inemberjs"><a href="https://balinterdi.com/blog/image-uploads-to-s3-in-ember-js/">Uploading images to S3 in Ember 📸</a></h2>
<p>Ever wanted to learn more about what it takes to upload files to a service like AWS S3 with Ember? Fortunately, there's a great new article by <a href="https://github.com/balinterdi">Balint Erdi (@balinterdi)</a> on exactly that!</p>
<p>Balint walks us through the high-level architecture, setting up AWS for direct uploads, how to make a request for a pre-signed url, and implementing things in Ember (and a backend).</p>
<p>Take a look at <a href="https://balinterdi.com/blog/image-uploads-to-s3-in-ember-js/">the article</a> when you get a chance!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/kumkanillam" rel="noopener noreferrer" target="_blank">@kumkanillam</a>, <a href="https://github.com/michaelbdai" rel="noopener noreferrer" target="_blank">Bing Dai (@michaelbdai)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/MahemaS27" rel="noopener noreferrer" target="_blank">Mahema Singh (@MahemaS27)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/chiragpat" rel="noopener noreferrer" target="_blank">Chirag Patel (@chiragpat)</a>, <a href="https://github.com/Turbo87" rel="noopener noreferrer" target="_blank">Tobias Bieniek (@Turbo87)</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/jfdnc" rel="noopener noreferrer" target="_blank">Jacob (@jfdnc)</a>, <a href="https://github.com/tarinrickett" rel="noopener noreferrer" target="_blank">@tarinrickett</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/mixonic" rel="noopener noreferrer" target="_blank">Matthew Beale (@mixonic)</a>, and <a href="https://github.com/skaterdav85" rel="noopener noreferrer" target="_blank">David Tang (@skaterdav85)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-193</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-193</guid><pubDate>Sun, 19 Dec 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 194]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember 4.0 and 4.1 released 🐹,
Ember Ignite virtual mini conference 🔥,
Ember at LinkedIn Eng 2022 🎉,
Why Ember at Gavant 💛,
ember-template-lint 4.0 released 🧹,
ember-focus-trap 1.0 released 🛳,
Polyfill for Plain Functions as Modifiers ✨,
Ember Templates in Glimmer Cheatsheet 📚,
Whiskey, Web and Whatnot Episodes 🎙</p>
<hr />
<h2 id="ember40and41releasedhttpsblogemberjscomember40released"><a href="https://blog.emberjs.com/ember-4-0-released">Ember 4.0 and 4.1 released 🐹</a></h2>
<p>Ember released version 4.0 of Ember.js, Ember Data, and Ember CLI. Ember's 4.0 release focuses the framework by removing long-deprecated APIs and support for legacy platforms.</p>
<p>While <a href="https://emberjs.com/editions/octane/">Ember Octane</a> APIs have been the default for new applications since Ember 3.15, the framework has continued to support "Classic" framework features in accordance with its semantic versioning commitment. Ember 4.0 takes a step forward and drops already-deprecated classic APIs, however the foundational <a href="https://api.emberjs.com/ember/release/classes/Component">EmberComponent</a> and <a href="https://api.emberjs.com/ember/release/classes/EmberObject">EmberObject</a>/<a href="https://api.emberjs.com/ember/release/classes/@ember%2Fobject%2Fcomputed/methods">computed</a> APIs are not removed in this release.</p>
<p>Notable changes in the Ember 4.0 release includes:</p>
<ul>
<li>Dropping Internet Explorer (IE) <a href="https://emberjs.com/browser-support/">browser support</a></li>
<li><a href="https://github.com/ef4/ember-auto-import">ember-auto-import</a> is a required dependency</li>
<li><code>Ember.assign</code> is deprecated in Ember 4.0 and will be removed in Ember 5.0</li>
<li>No new public APIs, only bug fixes and removal of previously <a href="https://deprecations.emberjs.com/v3.x/">deprecated public APIs</a></li>
<li>Ember Data also removed previously <a href="https://deprecations.emberjs.com/ember-data/v3.x/">deprecated public APIs</a></li>
</ul>
<p>For more details on the changes in Ember.js 4.0, please review the <a href="https://github.com/emberjs/ember.js/releases/tag/v4.0.0">Ember.js 4.0.0 release page</a>.</p>
<p>Want to hear about an added bonus? Hot 🔥 on the heels of 4.0, Ember 4.1 was also released this week and it introduced 3 features <code>service</code> export, <code>refresh</code> method from <code>RouterService</code>, and a <code>cached</code> decorator. It also introduced the deprecation of <code>AutoLocation</code>. Ember Data and Ember CLI did not introduce notable changes. See more about the 4.1 release <a href="https://blog.emberjs.com/ember-4-1-released/">at</a>.</p>
<hr />
<h2 id="emberignitevirtualminiconferencehttpswwweventbritecomeemberignitetickets232969998537"><a href="https://www.eventbrite.com/e/ember-ignite-tickets-232969998537">Ember Ignite virtual mini conference 🔥</a></h2>
<p>Ember Ignite is an international virtual mini conference scheduled for Wednesday, February 23rd!</p>
<p>Many teams talk about the challenges of hiring and training Ember developers, and this conference tackles those challenges directly.
Attendees will level up their training and teaching skills in order to build strong teams.</p>
<p>Tickets are donation-based with a suggested amount of $30 USD. Proceeds will go towards creating an open source curriculum for teaching Ember to junior developers and taking a live cohort of 10 junior engineers (with no experience) and teaching them Ember so well, that they'll go toe-to-toe against mid-level UI engineer candidates. This effort is led by <a href="https://twitter.com/ChaiWithJai">Jai Bhagat</a>.</p>
<p><a href="https://www.eventbrite.com/e/ember-ignite-tickets-232969998537">Register here</a> today!</p>
<hr />
<h2 id="emberatlinkedineng2022httpstwittercomaxlehellfirestatus1478186542954733568"><a href="https://twitter.com/AxleHellfire/status/1478186542954733568">Ember at LinkedIn Eng 2022 🎉</a></h2>
<p>If you're interested in hearing about how Ember is being used at LinkedIn in the LTS UI Infra team, you should check out the recent tweet thread 🧵 by <a href="https://github.com/elwayman02">Jordan Hawker (@elwayman02)</a>.</p>
<p>Jordan calls out many of the impressive achievements that the team has been able to deliver thus far, in part due to the power of Ember 🔥, and what is in store for 2022, including Embroider builds in production, completing Octane migrations, leveraging yarn workspaces and rolling out SSR!</p>
<p>You may want to check out <a href="https://twitter.com/AxleHellfire/status/1478186542954733568">the thread</a> for all of these reasons, but an added bonus is that this team at LinkedIn is hiring so take a look if you're in the market for a new position!</p>
<hr />
<h2 id="whyemberatgavanthttpswwwgavantcomlibraryemberasafrontendframework"><a href="https://www.gavant.com/library/ember-as-a-frontend-framework/">Why Ember at Gavant 💛</a></h2>
<p>There's a nice article by <a href="https://github.com/billdami">Bill Dami (@billdami)</a> at Gavant describing why they chose Ember for their project and how it has benefited them! 👏</p>
<p>Topics covered are the benefits of using a "batteries included" framework like Ember, how Ember contributes to developer happiness and some great detail on what made Ember the right fit for their project.</p>
<p>It's always inspiring to read about how Ember benefits teams around the world and this article does provide some detailed and excellent points on the matter that really demonstrate how joyful it can be to develop with the right tools.</p>
<p>Check out the post <a href="https://www.gavant.com/library/ember-as-a-frontend-framework/">here</a> today!</p>
<hr />
<h2 id="embertemplatelint400releasedhttpsgithubcomembertemplatelintembertemplatelintreleasestagv400"><a href="https://github.com/ember-template-lint/ember-template-lint/releases/tag/v4.0.0">ember-template-lint 4.0.0 released 🧹</a></h2>
<p><a href="https://github.com/ember-template-lint/ember-template-lint/releases/tag/v4.0.0">Version 4.0</a> has been released for <a href="https://github.com/ember-template-lint/ember-template-lint">ember-template-lint</a>, the linter for best practices with Ember handlebars templates. Check out the <a href="https://github.com/ember-template-lint/ember-template-lint/blob/v4.0.0/docs/migration/v4.md">migration guide</a>.</p>
<p>The key changes include:</p>
<ul>
<li>Converting the entire package to ESM</li>
<li>Adding over a dozen rules to the <code>recommended</code> config</li>
<li>Removing deprecated rules, options, and behaviors</li>
<li>Dropping support for old versions of Node</li>
<li>Enforcing stricter default behavior for a few rules</li>
<li>Enforcing stricter validation of configuration files and rule tests</li>
<li>Enforcing a strictly-defined public Node API</li>
</ul>
<hr />
<h2 id="emberfocustrap10releasedhttpsgithubcomjosemarluedkeemberfocustrapreleasestagv100"><a href="https://github.com/josemarluedke/ember-focus-trap/releases/tag/v1.0.0">ember-focus-trap 1.0 released 🛳</a></h2>
<p><a href="https://github.com/josemarluedke/ember-focus-trap/releases/tag/v1.0.0">Version v1.0.0</a> of <code>ember-focus-trap</code> was released recently by <a href="https://github.com/josemarluedke">Josemar Luedke (@josemarluedke)</a> bringing some upgrades (to Ember 4!), enhancements (moving to v2 addon format and a monorepo setup) and bug fixes (removal of redundant code for return focus node).</p>
<hr />
<h2 id="polyfillforplainfunctionsasmodifiershttpstwittercomnullvoxpopulistatus1479971937707245568s20"><a href="https://twitter.com/nullvoxpopuli/status/1479971937707245568?s=20">Polyfill for Plain Functions as Modifiers ✨</a></h2>
<p>There's a cool 😎 new polyfill for <a href="https://github.com/NullVoxPopuli/ember-functions-as-modifiers-polyfill">plain functions as modifiers</a> by <a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> you might want to check out!</p>
<hr />
<h2 id="embertemplatesinglimmercheatsheethttpstwittercomnullvoxpopulistatus1474037335583080449"><a href="https://twitter.com/nullvoxpopuli/status/1474037335583080449">Ember Templates in Glimmer Cheatsheet 📚</a></h2>
<p>There's more content available at the great ✨ Glimmer Cheatsheet ✨ <a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> has put together!</p>
<p>The cheatsheet has expanded its coverage of how templates work in Ember.js along with some super nice examples of the syntax and notation.</p>
<p>If you haven't had a chance to check it out yet, go ahead and have a look, <a href="https://cheatsheet.glimmer.nullvoxpopuli.com/docs/templates">here</a>!</p>
<hr />
<h2 id="whiskeywebandwhatnotepisodeshttpstwittercomshipshapecodestatus1468948885104115725"><a href="https://twitter.com/shipshapecode/status/1468948885104115725">Whiskey, Web and Whatnot Episodes 🎙</a></h2>
<p>There's a few new episodes of the Whiskey, Web and Whatnot that cover Ember related topics and include Ember Learning Core Team members! 🔥</p>
<p>First up is an <a href="https://www.whiskeywebandwhatnot.fm/ember-vs-react-jamstack-and-holes-in-the-hiring-process-with-chris-manson/">awesome episode</a> that features <a href="https://github.com/mansona">Chris Manson (@mansona)</a>. Creators <a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a> and <a href="https://github.com/chuckcarpenter">Chuck Carpenter (@chuckcarpenter)</a> of Ship Shape sat down with Chris and discussed a wide range of topics, including how Chris was introduced to Ember, Husky in open source, what Chris is working on now, <code>ember-cli-addon-docs</code>, the complexities of hiring developers and more.</p>
<p>In <a href="https://www.whiskeywebandwhatnot.fm/robbies-origin-story-learning-to-code-learning-to-hire-and-taking-the-entrepreneurial-leap/">another episode</a>, the gang behind Whiskey Web and Whatnot also had a chance to chat with each other and talk about the trajectory of Robert's career and how he was introduced to Ember.js, how Robert's fondness for Ember has grown over time through the strength of the community 💛🧡💜💚💙, how he got involved with the Ember Learning Team and a whole lot more!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/patocallaghan" rel="noopener noreferrer" target="_blank">Pat O'Callaghan (@patocallaghan)</a>, <a href="https://github.com/ddzz" rel="noopener noreferrer" target="_blank">Darius D. (@ddzz)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/lolmaus" rel="noopener noreferrer" target="_blank">Andrey Mikhaylov (lolmaus) (@lolmaus)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, and <a href="https://github.com/AmilKey" rel="noopener noreferrer" target="_blank">Ivan (@AmilKey)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Bryan Mishkin, Jen Weber, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-194</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-194</guid><pubDate>Sun, 09 Jan 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 195]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Submit your questions for the Ember Framework AMA, Feb 4th 🙋‍♀,
RFC: Add Ember Cookbook 🍳,
Ember.js Triaging Office Hours 📚,
Ember v4 TypeScript Support Update ✨,
Pass me the remote - meetup recordings about V2 addon format and teaching Ember 📹,
Mel Sumner on the ShopTalkShow Podcast 🎙,
Router Analysis Survey 🚀,
How to's with Ember 🔥,
Ember Addon Roundup 🌎</p>
<hr />
<h2 id="submityourquestionsfortheemberframeworkamafeb4thhttpsbitlyaskembercore"><a href="https://bit.ly/ask-ember-core">Submit your questions for the Ember Framework AMA, Feb 4th 🙋‍♀️</a></h2>
<p>On February 4th at 2 pm Eastern Time, the Ember.js Framework team will livestream some community questions and answers.
Would you like to submit a question or two?</p>
<p>Use the Ember Times reader question form, <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>.
"AMA" stands for "ask me anything - the team would love to hear what you are wondering about!</p>
<p>Livestream details will be posted on the <a href="https://twitter.com/emberjs">Ember.js Twitter</a>.
The session will be recorded and published online, so if you miss the livestream, don't sweat it.</p>
<hr />
<h2 id="rfcaddembercookbookhttpsgithubcomemberjsrfcspull786"><a href="https://github.com/emberjs/rfcs/pull/786">RFC: Add Ember Cookbook 🍳</a></h2>
<p><a href="https://github.com/ketakideo">Ketaki Deo (@ketakideo)</a> opened an <a href="https://github.com/emberjs/rfcs/pull/786">RFC</a> to add a cookbook section to our learning resources that will help Ember developers to learn maintainable, accessible patterns for common tasks.</p>
<p>Today, the Ember docs are missing <a href="https://documentation.divio.com/how-to-guides/">how-to guides</a> that would provide goal-oriented answers and patterns to common problems Ember developers face on a daily basis. This <a href="https://guides.emberjs.com/v1.12.0/cookbook/">used to be available in v1.12</a> but was removed in v1.13.</p>
<p>These types of content exist today in the form of blogs, stackoverflow answers and efforts like <a href="https://www.notion.so/emberatlas/The-Ember-Atlas-4094f81c86c34badb4a562ed29414ae1">Ember Atlas</a> but they are not discoverable and can sometimes be incorrect. The proposed Ember Cookbook will be managed and curated by the Ember Learning team which will work closely with the Ember Core team on upgrades to add, modify or delete information as needed.</p>
<p>Read, comment, and discuss this proposal in the <a href="https://github.com/emberjs/rfcs/pull/786">RFC on Github</a>!</p>
<hr />
<h2 id="emberjstriagingofficehourshttpsdiscordcomchannelsme514450883774382122936050318259662938"><a href="https://discord.com/channels/@me/514450883774382122/936050318259662938">Ember.js Triaging Office Hours 📚</a></h2>
<p><a href="https://github.com/locks">@locks</a>, a member of the <a href="https://emberjs.com/teams/">Framework and Learning core teams</a>, has started weekly office hours for anyone that was to help triage issues and pull requests on Ember core projects, like <a href="https://github.com/emberjs/ember.js/">ember.js</a>, <a href="https://github.com/ember-cli/ember-cli">ember-cli</a>, <a href="https://github.com/emberjs/data">ember-data</a>, and many others.
If you want to learn how to reproduce bugs, learn how to figure out if issues are still relevant, or you want to help Ember keep their project tidy, join locks at the <code>#issue-triage</code> channel of Ember's Discord every <a href="https://meetingzone.app/utc/thursday/1500">Thursday at 15h GMT</a>.</p>
<hr />
<h2 id="emberv4typescriptsupportupdatehttpsblogemberjscomemberv4typescriptsupportupdate"><a href="https://blog.emberjs.com/ember-v4-typescript-support-update">Ember v4 TypeScript Support Update ✨</a></h2>
<p>If you didn't notice, there's a new blog post by <a href="https://github.com/chriskrycho/">Chris Krycho (@chriskrycho)</a> on the Ember blog about support for TypeScript in Ember 4.x!</p>
<p>The Typed Ember team has provided a ton of great detail on the latest in using TypeScript in Ember so go give <a href="https://blog.emberjs.com/ember-v4-typescript-support-update">the post</a> a read today!</p>
<hr />
<h2 id="passmetheremotemeetuprecordingsaboutv2addonformatandteachingemberhttpswwwyoutubecomchannelucfj7cvutjgo1pt78syarklg"><a href="https://www.youtube.com/channel/UCfj7cVutJgO1PT78syaRkLg">Pass me the remote - meetup recordings about V2 addon format and teaching Ember 📹</a></h2>
<p>With the new year and a new major version of Ember, remote events are in full swing, with recordings available so that Ember developers around the world can participate.</p>
<p>Earlier this month, the Boston Ember Community meetup gathered remotely to learn about V2 addon formats and how Ember is a great tool for teaching junior developers. Check out the videos!</p>
<p><a href="https://www.youtube.com/watch?v=5m40BCh3BGk">Ember CLI Addon Evolution</a> - Robert Jackson</p>
<p><a href="https://www.youtube.com/watch?v=1QoHyJUwZyk">Why new developers should learn Ember.js</a> - Ankush Dharkar</p>
<hr />
<h2 id="melsumnerontheshoptalkshowpodcasthttpsshoptalkshowcom499"><a href="https://shoptalkshow.com/499/">Mel Sumner on the ShopTalkShow Podcast 🎙</a></h2>
<p>Ember Core team member <a href="https://github.com/melsumner">Melanie Sumner (@melsumner)</a> recently appeared on <a href="https://shoptalkshow.com/499/">the Shop Talk Show podcast</a> and shared experiences involving Ember, the importance of accessibility, and the web. ✨✨✨</p>
<p>If you haven't had a chance to check it out, give it a <a href="https://shoptalkshow.com/499/">listen</a>.</p>
<hr />
<h2 id="routeranalysissurveyhttpstwittercommelaniersumnerstatus1483476954926002182"><a href="https://twitter.com/melaniersumner/status/1483476954926002182">Router Analysis Survey 🚀</a></h2>
<p>If you're interested in providing feedback about Ember's router there's a cool <a href="https://airtable.com/shrtkMbAydgP7ecNK">survey</a> you can participate in. You may end up helping shape the future of the Ember router by doing so! 😎</p>
<hr />
<h2 id="howtoswithember">How to's with Ember 🔥</h2>
<p><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> announced several new awesome example Ember repo's for <a href="https://twitter.com/nullvoxpopuli/status/1485438520604909575">Wordle</a>, <a href="https://twitter.com/nullvoxpopuli/status/1485438520604909575">Tailwind</a> and <a href="https://twitter.com/nullvoxpopuli/status/1485281759415738372?s=20">Embroider</a>.</p>
<p>Be sure to check them out when you have a chance!</p>
<hr />
<h2 id="emberaddonroundup">Ember Addon Roundup 🌎</h2>
<p>We’ve had several addons across the Ember ecosystem release updates recently, here’s what you may have missed and reasons to upgrade!</p>
<ul>
<li><a href="https://github.com/mansona">Chris Manson (@mansona)</a> and <a href="https://github.com/SergeAstapov">Sergey Astapov (@SergeAstapov)</a> released <code>ember-get-config</code> <a href="https://twitter.com/real_ate/status/1480910700088287239">v1.0.0</a> which adds embroider support;</li>
<li><a href="https://github.com/lukemelia">Luke Melia (@lukemelia)</a> released <code>ember-keyboard</code> <a href="https://twitter.com/lukemelia/status/1481002644508397572">7.0.0</a> which is compatible with Ember 4;</li>
<li><a href="https://github.com/lifeart">Alex Kanunnikov (@lifeart)</a> released <code>UELS</code> <a href="https://github.com/lifeart/vscode-ember/releases/tag/v3.0.11">v3.0.11</a> with ember-template-lint v4 support;</li>
<li><a href="https://github.com/cah-briangantzler">Brian Gantzler (@cah-briangantzler)</a>, <a href="https://github.com/ef4">Edward Faulkner (@ef4)</a>, <a href="https://github.com/whatthewhat">Mikhail Topolskiy (@whatthewhat)</a>, <a href="https://github.com/rahulk94">Rahul Kumar (@rahulk94)</a>, <a href="https://github.com/SergeAstapov">Sergey Astapov (@SergeAstapov)</a> released <code>ember-cli-mirage</code> <a href="https://github.com/miragejs/ember-cli-mirage/releases/tag/v2.3.0">v2.3.0</a>;</li>
<li><a href="https://github.com/Turbo87">Tobias Bieniek (@Turbo87)</a> announced <a href="https://twitter.com/TobiasBieniek/status/1481664901231910918">new documentation</a> for <code>ember-error-route</code>;</li>
<li><a href="https://github.com/knownasilya">Ilya Radchenko (@knownasilya)</a> released <code>ember-toggle</code> <a href="https://twitter.com/knownasilya/status/1481436036802793472">v9.0.0</a> which adds caching to some getters performance and also drops support for Ember &lt; 3.24; and</li>
<li><a href="https://github.com/st-h">Steve (@st-h)</a> released an octane ready <a href="https://discord.com/channels/480462759797063690/480499624663056390/931947161476825118">version of <code>ember-content-editable</code></a> and an Ember 4.x compatible version of <a href="https://www.npmjs.com/package/@adopted-ember-addons/ember-stripe-elements"><code>ember-stripe-elements</code></a>.</li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/shamrt" rel="noopener noreferrer" target="_blank">Shane Martin (@shamrt)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/sandstrom" rel="noopener noreferrer" target="_blank">@sandstrom</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/cafreeman" rel="noopener noreferrer" target="_blank">Chris Freeman (@cafreeman)</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/st-h" rel="noopener noreferrer" target="_blank">Steve (@st-h)</a>, <a href="https://github.com/linearza" rel="noopener noreferrer" target="_blank">@linearza</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/knownasilya" rel="noopener noreferrer" target="_blank">Ilya Radchenko (@knownasilya)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/denik1981" rel="noopener noreferrer" target="_blank">Demian Caldelas (@denik1981)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/jrjohnson" rel="noopener noreferrer" target="_blank">Jonathan Johnson (@jrjohnson)</a>, <a href="https://github.com/vihai" rel="noopener noreferrer" target="_blank">Daniele Orlandi (@vihai)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/boris-petrov" rel="noopener noreferrer" target="_blank">Boris Petrov (@boris-petrov)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/charlesfries" rel="noopener noreferrer" target="_blank">Charles Fries (@charlesfries)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, and <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jared Galanis, Chris Ng, Jen Weber, Ricardo Mendes and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-195</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-195</guid><pubDate>Wed, 26 Jan 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 196]]></title><description><![CDATA[<p>👋 Emberistas! 🐹
Extended CFP deadline for Ember conf 📢,
Ember.js Framework Core Team AMA 🙋‍♀️,
Chris Krycho is added to the Framework Core Team 🎉,
Ember Addon Roundup 🌎,
Whiskey, Web and Whatnot with guest Chris Thoburn 🔊,
Ember Ignite Reminder 🔥</p>
<hr />
<h2 id="extendedcfpdeadlineforemberconfhttpstwittercomemberconfstatus1493204657568636933"><a href="https://twitter.com/EmberConf/status/1493204657568636933">Extended CFP deadline for Ember conf 📢</a></h2>
<p>If you're still thinking about submitting a talk for Ember Conf you should know that the call for CFP's has been extended by 48 hours (end of 2/16), so you still have a little more time to get your talk idea submitted. 🎉</p>
<p>For talk ideas or to get feedback on your talk head on over to <a href="https://discord.com/channels/480462759797063690/480524456603680768">#talks</a> or chat more about EmberConf in <a href="https://discord.com/channels/480462759797063690/480502413917421570">#emberconf</a>.</p>
<hr />
<h2 id="emberjsframeworkcoreteamamahttpswwwyoutubecomwatchvic_dgloha5i"><a href="https://www.youtube.com/watch?v=Ic_dGloHa5I">Ember.js Framework Core Team AMA 🙋‍♀️</a></h2>
<p>If you did not get a chance to listen to the live awesome Ember.js Framework Core Team Ask Me Anything (AMA) live stream event hosted by <a href="https://github.com/karlbecker">Karl Becker (@karlbecker)</a> and <a href="https://twitter.com/jwwweber">Jen Weber (@jwwweber)</a>, <strong>don't</strong> worry! You can listen to the <a href="https://www.youtube.com/watch?v=Ic_dGloHa5I">recorded session</a> today! 🔥</p>
<p>Ember Core Team members <a href="https://github.com/wycats">Yehuda Katz (@wycats)</a>, <a href="https://github.com/tomdale">Tom Dale (@tomdale)</a>, <a href="https://github.com/melsumner">Melanie Sumner (@melsumner)</a>, <a href="https://github.com/rwjblue">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/kategengler">Katie Gengler (@kategengler)</a>, <a href="https://github.com/ef4">Edward Faulkner (@ef4)</a>, <a href="https://github.com/mixonic">Matthew Beale (@mixonic)</a> and <a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a> all got together to answer questions submitted to the Ember Times by readers.</p>
<p>It's an especially insightful peek into what these team members are working on and how they are thinking about the future of Ember.</p>
<p>They talk about Ember Editions, how to get involved, the direction of the framework and more. If you're interested please go check out the video!</p>
<p>Also look out for additional answers to questions asked during the AMA here in the Ember Times. 💛</p>
<hr />
<h2 id="chriskrychoisaddedtotheframeworkcoreteamhttpstwittercomemberjsstatus1493351627864133637"><a href="https://twitter.com/emberjs/status/1493351627864133637">Chris Krycho is added to the Framework Core Team 🎉</a></h2>
<p>Please join us in welcoming the newest framework core team member, <a href="https://github.com/chriskrycho/">Chris Krycho (@chriskrycho)</a>! 🥳 👏 🎉  Chris has contributed an amazing amount to the framework already and we can't wait to see what else is in store! 💜</p>
<hr />
<h2 id="emberaddonroundup">Ember Addon Roundup 🌎</h2>
<p>We’ve had several addons across the Ember ecosystem release updates recently, here’s what you may have missed and reasons to upgrade!</p>
<ul>
<li><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> has released <a href="https://github.com/NullVoxPopuli/ember-resources/releases/tag/v4.2.0">v4.2.0</a>, <a href="https://github.com/NullVoxPopuli/ember-resources/releases/tag/v4.3.0">v4.3.0</a>, and <a href="https://github.com/NullVoxPopuli/ember-resources/releases/tag/v4.3.1">v4.3.1</a> of <code>ember-resources</code> which include an <code>@use</code> decorator, and <code>async-data</code> example and a bug fix for <code>useTask</code>;</li>
<li><a href="https://github.com/betocantu93">Beto Cantú (@betocantu93)</a> has released several new versions of <code>ember-eui</code> (elastic's ui styleguide for ember). The releases include a MarkdownEditor and a MarkdownFormat component, which you can extend to render real ember components from markdown;</li>
<li><a href="https://github.com/chriskrycho/">Chris Krycho (@chriskrycho)</a> has released <a href="https://github.com/typed-ember/ember-cli-typescript/releases/tag/v5.0.0">v5.0.0</a> of <code>ember-cli-typescript</code> which includes Ember v4 blueprints, requires Node 12+, a fix for addons which supply both <code>.name</code> and <code>.moduleName()</code> and a number of documentation improvements;</li>
<li><a href="https://github.com/simonihmig">Simon Ihmig (@simonihmig)</a> has released <a href="https://github.com/kaliber5/ember-bootstrap/releases/tag/v5.0.0">v5.0.0</a> of <code>ember-bootstrap</code> which adds official support for Bootstrap 5, keeps BS4 but drops BS3, is fully Ember 4 compatible, drops support for Ember &lt; 3.24, node 10 and IE11, many other updates, and some smaller breaking changes;</li>
<li><a href="https://github.com/melsumner">Melanie Sumner (@melsumner)</a> has released <a href="https://github.com/ember-a11y/ember-a11y-refocus/releases/tag/v2.3.0">v2.3.0</a> of <code>ember-a11y-refocus</code> which adds support for customizing the definition of a route change;</li>
<li><a href="https://github.com/simonihmig">Simon Ihmig (@simonihmig)</a> has released <a href="https://github.com/simonihmig/tracked-redux/releases/tag/v1.0.0">v1.0.0</a> of <code>tracked-redux</code> after taking over maintainership and the release includes compatability with Ember 4+, requires Ember 3.24+, makes the library a native v2 addon; and</li>
<li><a href="https://github.com/MichalBryxi">Michal Bryxí (@MichalBryxi)</a> has released <a href="https://twitter.com/MichalBryxi/status/1492603804554084356">v4.0.0</a> of <code>ember-intl-changeset-validations</code> which includes some upkeep, updated dependencies and drops suppor for node 10.</li>
</ul>
<hr />
<h2 id="whiskeywebandwhatnotwithguestchristhoburnhttpswwwwhiskeywebandwhatnotfmdiscoveringemberadoptingorbitandunlockingoptimizationwithchristhoburnrunspired"><a href="https://www.whiskeywebandwhatnot.fm/discovering-ember-adopting-orbit-and-unlocking-optimization-with-chris-thoburn-runspired/">Whiskey, Web and Whatnot with guest Chris Thoburn 🔊</a></h2>
<p><a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a> and <a href="https://github.com/chuckcarpenter">Chuck Carpenter (@chuckcarpenter)</a> of Ship Shape sit down with <a href="https://github.com/runspired">Chris Thoburn, A.K.A. Runspired, (@runspired)</a> in their latest <a href="https://www.whiskeywebandwhatnot.fm/discovering-ember-adopting-orbit-and-unlocking-optimization-with-chris-thoburn-runspired/">Whiskey, Web and Whatnot podcast episode</a>. Runspired elaborates on his initial difficulties in picking up Ember, as well as the discoveries that led him to sticking with this framework for the long haul. The trio also discuss the unique benefits of Orbit.js, why Runspired finds JSON:API and GraphQL to be a perfect match, and how Ember data cares about making data cacheable, but not necessarily how that data is structured within the cache.</p>
<hr />
<h2 id="emberignitereminderhttpswwweventbritecomeemberignitetickets232969998537"><a href="https://www.eventbrite.com/e/ember-ignite-tickets-232969998537">Ember Ignite Reminder 🔥</a></h2>
<p>This is an additional reminder for the Ember Ignite international virtual mini conference scheduled for Wednesday, February 23rd!</p>
<p>We mentioned this conference several issues back, but we're highlighting the event again as it's coming up soon.</p>
<p>Tickets are donation-based with a suggested amount of $30 USD. Proceeds will go towards creating an open source curriculum for teaching Ember to junior developers and taking a live cohort of 10 junior engineers (with no experience) and teaching them Ember so well, that they'll go toe-to-toe against mid-level UI engineer candidates. This effort is led by <a href="https://twitter.com/ChaiWithJai">Jai Bhagat</a>.</p>
<p><a href="https://www.eventbrite.com/e/ember-ignite-tickets-232969998537">Register here</a> today!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank our <a href="https://github.com/michaelbdai" rel="noopener noreferrer" target="_blank">Bing Dai (@michaelbdai)</a>, <a href="https://github.com/patocallaghan" rel="noopener noreferrer" target="_blank">Pat O'Callaghan (@patocallaghan)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/genisd" rel="noopener noreferrer" target="_blank">Daniel (@genisd)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/jkeen" rel="noopener noreferrer" target="_blank">Jeff Keen (@jkeen)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/m1073496" rel="noopener noreferrer" target="_blank">Jessica Justice (@m1073496)</a>, <a href="https://github.com/miguelcobain" rel="noopener noreferrer" target="_blank">Miguel Andrade (@miguelcobain)</a>, <a href="https://github.com/ctjhoa" rel="noopener noreferrer" target="_blank">Camille TJHOA (@ctjhoa)</a>, <a href="https://github.com/jrjohnson" rel="noopener noreferrer" target="_blank">Jon Johnson (@jrjohnson)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/Windvis" rel="noopener noreferrer" target="_blank">Sam Van Campenhout (@Windvis)</a>, <a href="https://github.com/mixonic" rel="noopener noreferrer" target="_blank">Matthew Beale (@mixonic)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/webdev0415" rel="noopener noreferrer" target="_blank">@webdev0415</a>, <a href="https://github.com/colinfkennedy" rel="noopener noreferrer" target="_blank">Colin Kennedy (@colinfkennedy)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/mehulkar" rel="noopener noreferrer" target="_blank">Mehul Kar (@mehulkar)</a>, <a href="https://github.com/asakusuma" rel="noopener noreferrer" target="_blank">Asa Kusuma (@asakusuma)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/cafreeman" rel="noopener noreferrer" target="_blank">Chris Freeman (@cafreeman)</a>, and <a href="https://github.com/muziejus" rel="noopener noreferrer" target="_blank">Moacir P. de Sá Pereira (@muziejus)</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jared Galanis, Jessica Justice and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-196</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-196</guid><pubDate>Mon, 14 Feb 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 197]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember Annual Community Survey is here 🙋‍♀️,
First-Class Component Templates RFC is merged 🎉,
Official TypeScript Support in Ember RFC is merged 🥳,
TypeScript Adoption Plan RFC is open 📓,
Add Ember Cookbook RFC is in FCP ⌛️,
State of Frontend calls for you ❓,
Ember 4.2 Released 🔥,
Mocks with MSW Demo 🤖,
Whiskey Web and Whatnot Episodes 🎙,
EmberFest 2021 Videos 📹,
Component Architecture Talk Slides 📽,
ember-eui releases 🚀</p>
<hr />
<h2 id="emberannualcommunitysurveyisherehttpstwittercomemberjsstatus1500855711311478786"><a href="https://twitter.com/emberjs/status/1500855711311478786">Ember Annual Community Survey is here 🙋‍♀️</a></h2>
<p>It’s that time of year again 😀, the <strong>annual official 2022 Ember Community Survey</strong> is here! Once again we would love your help to learn about who is in the Ember community and how they work with the framework.</p>
<p>Last year over 1000 people participated in the survey. As always, your participation is invaluable so please do consider participating.</p>
<p>If you're ready, you can go ahead and fill out the <a href="https://emberjs.com/survey/2022/">survey here now</a>. 🔥🔥🔥</p>
<p>If you have any questions, feel free to email the survey team via survey@emberjs.com, or ping us in #dev-ember-learning on the <a href="https://discordapp.com/invite/emberjs">Discord chat</a>.</p>
<p>Please share with your friends and colleagues! We want to hear from everyone who uses Ember!</p>
<hr />
<h2 id="firstclasscomponenttemplatesrfcismergedhttpsgithubcomemberjsrfcspull779"><a href="https://github.com/emberjs/rfcs/pull/779">First-Class Component Templates RFC is merged 🎉</a></h2>
<p><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> who <a href="https://twitter.com/chriskrycho/status/1493295356368470019">recently joined</a> the Ember Framework Core Team has been hard at work authoring many RFC's, including the <a href="https://github.com/emberjs/rfcs/pull/779">RFC on First-Class Component Templates</a>. We're happy to report this RFC is now merged! This follows Chris' detailed blog series on <a href="https://v5.chriskrycho.com/journal/ember-template-imports/">Ember Template Imports</a>.</p>
<p>The RFC proposed that we adopt <code>&lt;template&gt;</code> tags as a format for making component templates first-class participants in JavaScript and TypeScript with strict mode template semantics. As Chris mentions, doing so would help provide a number of new capabilities to Ember and Glimmer users:</p>
<!--alex ignore just-->
<ul>
<li>accessing local JavaScript values with no ceremony and no backing class, enabling much easier use of existing JavaScript ecosystem tools, including especially styling libraries—standard CSS Modules will “just work,” for example</li>
<li>authoring more than one component in a single file, where colocation makes sense—and thereby providing more control over a component’s public API</li>
<li>likewise authoring locally-scoped helpers, modifiers, and other JavaScript functionality</li>
</ul>
<p>Go ahead and check out <a href="https://github.com/emberjs/rfcs/pull/779">the merged RFC</a> on GitHub.</p>
<hr />
<h2 id="officialtypescriptsupportinemberrfcismergedhttpsgithubcomemberjsrfcspull724"><a href="https://github.com/emberjs/rfcs/pull/724">Official TypeScript Support in Ember RFC is merged 🥳</a></h2>
<p>As if one merged RFC weren't exciting enough, <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> is also the author of a second recently merged <a href="https://github.com/emberjs/rfcs/pull/724">RFC on Official TypeScript Support in Ember</a>!</p>
<p>This RFC declares the intent to officially support TypeScript as a peer to JavaScript, in a way which makes the developer experience better for all Ember developers.</p>
<p>The RFC says that:</p>
<blockquote>
  <p>Ember officially supporting TypeScript means: All libraries which are installed as part of the default blueprint must ship accurate and up-to-date type definitions for the current edition. These types will uphold a Semantic Versioning commitment which includes a definition of SemVer for TypeScript types as well as a specification of supported compiler versions and settings, so that TypeScript will receive the same stability commitments as the rest of Ember.</p>
</blockquote>
<p>This is a really exciting development for the support of TypeScript in Ember and you can read up on <a href="https://github.com/emberjs/rfcs/pull/724">the merged RFC</a> on Github.</p>
<hr />
<h2 id="typescriptadoptionplanrfcisopenhttpsgithubcomemberjsrfcspull800"><a href="https://github.com/emberjs/rfcs/pull/800">TypeScript Adoption Plan RFC is open 📓</a></h2>
<p>And that's not all, <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> has also opened the <a href="https://github.com/emberjs/rfcs/pull/800">TypeScript Adoption Plan RFC</a> which offers a detailed implementation plan for officially supporting TypeScript in Ember (which is in follow up to the aforementioned Official TypeScript Support RFC and covers the overall philosophy for what official support means).</p>
<p>The RFC covers a lot, but a short-list includes:</p>
<ul>
<li>the SemVer policies Ember packages should adopt</li>
<li>how we will migrate users from depending on the <code>@types</code> definitions on DefinitelyTyped to Ember packages</li>
<li>test infrastructure to catch regressions early</li>
<li>updates to Ember CLI to support TypeScript</li>
<li>release "channel" testing analogous to Ember's existing feature flag system for runtime code</li>
<li>a basic communication plan for the rollout</li>
<li>updates to our guides, API docs, and even the version release blog post announcement</li>
</ul>
<p>Please head on over to <a href="https://github.com/emberjs/rfcs/pull/800">the RFC</a> and give it a read or participate in the comments!</p>
<hr />
<h2 id="addembercookbookrfcisinfcphttpstwittercomemberjsstatus1496897870762553346"><a href="https://twitter.com/emberjs/status/1496897870762553346">Add Ember Cookbook RFC is in FCP ⌛️</a></h2>
<p>If you have not had the time to checkout the exciting <a href="https://github.com/emberjs/rfcs/pull/786">Add Ember Cookbook RFC</a> by <a href="https://github.com/ketakideo">Ketaki Deo (@ketakideo)</a>, now is the time do so because it's well into the FCP and time is running out!</p>
<p>The RFC proposes adding a cookbook section to our learning resources that will help Ember developers to learn maintainable, accessible patterns for common tasks.</p>
<p>These types of content exist today in the form of blogs, stackoverflow answers and efforts like <a href="https://www.notion.so/emberatlas/The-Ember-Atlas-4094f81c86c34badb4a562ed29414ae1">Ember Atlas</a> but they are not discoverable and can sometimes be incorrect. The proposed Ember Cookbook will be managed and curated by the Ember Learning team which will work closely with the Ember Core team on upgrades to add, modify or delete information as needed.</p>
<p>Read, comment, and discuss this proposal in the <a href="https://github.com/emberjs/rfcs/pull/786">RFC on Github</a>!</p>
<hr />
<h2 id="stateoffrontendsurveycallsforyouhttpstshiostateoffrontend"><a href="https://tsh.io/state-of-frontend/">State of Frontend survey calls for you❓</a></h2>
<p>The <a href="https://tsh.io/state-of-frontend/">State of Frontend 2022 survey</a> hosted by <a href="https://tsh.io">The Software House</a> is open. There is no known deadline. It actually takes 8 minutes to fill in as they claim and you can select EmberJS from the options. So show the world some EmberJS representation and fill in the survey.</p>
<p>The survey asks about the tools, processes and solutions you use, like your editor and libraries. It also asks for your opinion on the future of certain topics like accessibility and technical concepts. Their call to you is: “We want to hear as many voices of the frontend people as possible. Too much happened over the last two years, and we want to talk about it. <strong>No matter how your frontend experience looks like, your voice is exactly what we’re looking for</strong>.”</p>
<hr />
<h2 id="ember42releasedhttpsblogemberjscomember42released"><a href="https://blog.emberjs.com/ember-4-2-released">Ember 4.2 Released 🔥</a></h2>
<p>In case you missed it, Ember 4.2 was released last week! There were several bug fixes for different parts of the framework and 1 new feature in Ember CLI. Head on over to <a href="https://blog.emberjs.com/ember-4-2-released">the blog post</a> to check out the details.</p>
<hr />
<h2 id="mockswithmswdemohttpstwittercomnullvoxpopulistatus1494427319552905216"><a href="https://twitter.com/nullvoxpopuli/status/1494427319552905216">Mocks with MSW Demo 🤖</a></h2>
<p>Been curious about how to test against a fake API? Are you looking for a new library to do this? And do want to use the network tab for debugging? And do you also want a straightforward way to define mock data that doesn't get shipped to customers?</p>
<p><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> created a nice demo of how to get started using the <a href="https://mswjs.io/">Mock Service Worker (MSW)</a> library with Ember.</p>
<p>Go ahead and check out <a href="https://github.com/NullVoxPopuli/ember-msw-development/commits/main">the demo repo</a> today!</p>
<hr />
<h2 id="whiskeywebandwhatnotepisodeshttpswwwwhiskeywebandwhatnotfm"><a href="https://www.whiskeywebandwhatnot.fm/">Whiskey Web and Whatnot Episodes 🎙</a></h2>
<p>There are two new awesome episodes of the Whiskey Web and Whatnot podcast featuring several Ember core team members! 🔥</p>
<!--alex ignore of-course-->
<p>First, creators <a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a> and <a href="https://github.com/chuckcarpenter">Chuck Carpenter (@chuckcarpenter)</a> of Ship Shape sit down with <a href="https://github.com/melsumner">Melanie Sumner (@melsumner)</a> and they discuss work-life balance, Ember vs React, and of course #a11y! 💖 Check out the episode <a href="https://www.whiskeywebandwhatnot.fm/work-life-balance-react-and-why-accessibility-is-everything-with-melanie-sumner/">here</a>.</p>
<p>Next up is an episode with <strong>both</strong> <a href="https://github.com/mansona">Chris Manson (@mansona)</a> and <a href="https://github.com/runspired">Chris Thoburn (@runspired)</a> chatting with Robbie and Chuck about how to best get contributors on opensource projects and how TypeScript fits into that process! Check out the episode <a href="https://www.whiskeywebandwhatnot.fm/runspired-vs-chris-manson-on-solving-the-number-one-ember-issue/">here</a>.</p>
<hr />
<h2 id="emberfest2021videoshttpstwittercomemberfeststatus1499747403846586372"><a href="https://twitter.com/EmberFest/status/1499747403846586372">EmberFest 2021 Videos 📹</a></h2>
<p>The EmberFest 2021 videos of talks are now available for your ✨viewing pleasure✨!</p>
<!--alex ignore just-->
<p>If you did not have a chance to attend EmberFest 2021, and want to catch up on what happened last fall, or if you just want to re-live some of the moments, head on over and check out <a href="https://www.youtube.com/playlist?list=PLN4SpDLOSVkR_vDs4_gKbYlzb5fFMMRex">the videos</a> today!</p>
<hr />
<h2 id="componentarchitecturetalkslideshttpstwittercomunistylerstatus1500064502607491076"><a href="https://twitter.com/unistyler/status/1500064502607491076">Component Architecture Talk Slides 📽</a></h2>
<p><a href="https://github.com/gossi">Thomas Gossmann (@gossi)</a> recently released slides about Component Architecture from a recent talk at Ember Ignite!</p>
<p>The slides discuss the basics for component invocation and get into blocks, including named blocks, and yielded components as well. If you're looking for a nice overview of component architecture then <a href="https://component-architecture-slides.netlify.app/">look no further</a>.</p>
<hr />
<h2 id="embereuireleaseshttpstwittercombetocantu93status1500187028524343309"><a href="https://twitter.com/betocantu93/status/1500187028524343309">ember-eui releases 🚀</a></h2>
<p><a href="https://github.com/betocantu93">Beto Cantú (@betocantu93)</a> has released several new versions of <code>ember-eui</code> (elastic's ui styleguide for ember). The releases include support for <code>staticComponents</code> and <code>splitAtRoutes</code> from embroider, meaning "tree shaking" or not bundling unused code out of the box is now possible!</p>
<p>Go ahead and check out <a href="https://github.com/prysmex/ember-eui/releases">the latest releases</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/jaswilli" rel="noopener noreferrer" target="_blank">Jason Williams (@jaswilli)</a>, <a href="https://github.com/Weismann9" rel="noopener noreferrer" target="_blank">Vyacheslav Karpovych (@Weismann9)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/jherdman" rel="noopener noreferrer" target="_blank">James Herdman (@jherdman)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/jeffdaley" rel="noopener noreferrer" target="_blank">Jeff Daley (@jeffdaley)</a>, <a href="https://github.com/duyngle" rel="noopener noreferrer" target="_blank">Duy Le (@duyngle)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/jelhan" rel="noopener noreferrer" target="_blank">Jeldrik Hanschke (@jelhan)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/gnclmorais" rel="noopener noreferrer" target="_blank">Gonçalo Morais (@gnclmorais)</a>, <a href="https://github.com/nwhittaker" rel="noopener noreferrer" target="_blank">Nathan Whittaker (@nwhittaker)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/nruth" rel="noopener noreferrer" target="_blank">Nicholas Rutherford (@nruth)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/esbanarango" rel="noopener noreferrer" target="_blank">Esteban Arango Medina (@esbanarango)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/josephdsumner" rel="noopener noreferrer" target="_blank">Joseph D. Sumner (@josephdsumner)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/patocallaghan" rel="noopener noreferrer" target="_blank">Pat O'Callaghan (@patocallaghan)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, and <a href="https://github.com/cafreeman" rel="noopener noreferrer" target="_blank">Chris Freeman (@cafreeman)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jared Galanis, Chris Ng, Anne-Greeth Schot-van Herwijnen and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-197</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-197</guid><pubDate>Mon, 07 Mar 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 198]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Fill out the Ember Community Survey by April 7th! 🗳,
Hybrid Ember.js Europe Meetup, featuring Ember Data 📽,
Ember TypeScript Core Team 🔥,
Upcoming free technical writing workshop 📝,
EmberConf on April 19th 🐹,
Blog post: Making your dynamic Ember components work with Embroider 💥,
lint-to-the-future demo video 📹,
Glimmer component Signature type RFC in FCP ⌛️,
Ember Addon Roundup 🌎</p>
<hr />
<h2 id="fillouttheembercommunitysurveybyapril7thhttpsemberjscomsurvey2022"><a href="https://emberjs.com/survey/2022/">Fill out the Ember Community Survey by April 7th! 🗳</a></h2>
<p>The annual <a href="https://emberjs.com/survey/2022/">Ember Community Survey</a> helps guide direction in the Ember ecosystem. The data informs project prioritization, sparks new ideas, and reveals opportunities for growth. The Ember core teams would love to hear from you!</p>
<p>The survey is primarily intended for developers who use the Ember JavaScript framework, either for work or personal use, although any developer is welcome to fill out this survey. The survey should take approximately 15 minutes to complete in full, though all questions are optional.</p>
<p><a href="https://emberjs.com/survey/2022/">Learn more about the survey and fill it out</a> by April 7th!</p>
<hr />
<h2 id="hybridemberjseuropemeetupfeaturingemberdatahttpstwittercomembereurope"><a href="https://twitter.com/embereurope">Hybrid Ember.js Europe Meetup, featuring Ember Data 📽</a></h2>
<p>March 31st is the first Ember.js Meetup event!</p>
<p>There will be an AMA (ask-me-anything) with Chris Thoburn and Scott Newcomer from the Ember Data Core team.</p>
<p>For more details, visit <a href="https://twitter.com/embereurope">Ember Europe on Twitter</a> or <a href="https://www.meetup.com/de-DE/ember-europe/events/283625821/">RSVP on Meetup</a>.</p>
<hr />
<h2 id="embertypescriptcoreteamhttpsblogemberjscomtypedemberisnowtheembertypescriptcoreteam"><a href="https://blog.emberjs.com/typed-ember-is-now-the-ember-type-script-core-team">Ember TypeScript Core Team 🔥</a></h2>
<p>In case you didn't know, the Ember project recently merged <a href="https://emberjs.github.io/rfcs/0724-road-to-typescript.html">RFC #0724: Official TypeScript Support</a>, committing to make TypeScript an officially-supported language for Ember.js.</p>
<p>To facilitate this support and following a lot of fantastic work over the last 5 years the Typed Ember team is becoming an official Ember core team. The Typed Ember team joins the Framework, Learning, CLI, and Data Core teams as a new Core sub-team: the Ember TypeScript Core Team! 🎉</p>
<p>The team's initial members are the current Typed Ember team: <a href="https://github.com/jamescdavis">James C. Davis (@jamescdavis)</a>, <a href="https://github.com/dfreeman">Dan Freeman (@dfreeman)</a>, and <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a>.</p>
<p>You can read more about the TypeScript Core Team announcement in the <a href="https://blog.emberjs.com/typed-ember-is-now-the-ember-type-script-core-team">Ember blog post</a>.</p>
<hr />
<h2 id="upcomingfreetechnicalwritingworkshophttpsformsgleavqfjjrjjozhbr529"><a href="https://forms.gle/AvQFjjrJjozHBr529">Upcoming free technical writing workshop 📝</a></h2>
<p>What are the elements of great technical articles or examples? What are some tips for writing for a global audience? How do you find a place to begin when there are so many different directions you could go? How should your writing style change depending on where it will be published? Join the Ember Learning team for this workshop! It will be half instruction, half hands-on activities.</p>
<p>If there is enough interest, the workshop will be offered in two sessions:</p>
<ul>
<li>April 23rd - aimed at Western Hemisphere time zone participants</li>
<li>April 30th - aimed at Eastern Hemisphere time zone participants</li>
</ul>
<p>To receive announcements about specific times and event details, please <a href="https://forms.gle/AvQFjjrJjozHBr529">fill out this form</a>.</p>
<hr />
<h2 id="emberconfonapril19thhttps2022emberconfcom"><a href="https://2022.emberconf.com/">EmberConf on April 19th 🐹</a></h2>
<p>EmberConf registration is open! Join the community remotely on April 19th for an <a href="https://2022.emberconf.com/">amazing lineup of talks</a>.</p>
<hr />
<h2 id="blogpostmakingyourdynamicembercomponentsworkwithembroiderhttpssimplabscomblog20220317dynamiccomponentsembroider"><a href="https://simplabs.com/blog/2022/03/17/dynamic-components-embroider/">Blog post: Making your dynamic Ember components work with Embroider 💥</a></h2>
<p><a href="https://github.com/nickschot">Nick Schot (@nickschot)</a> wrote a blog post on <a href="https://simplabs.com/blog/2022/03/17/dynamic-components-embroider/">making your dynamic Ember components work with Embroider</a>. <a href="https://github.com/embroider-build/embroider">Embroider</a> is the future build system for Ember apps which unlocks features like splitting code per route by statically analyzing your codebase and dependencies. Dynamic components are components that are resolved at run-time rather than hardcoding the component to use using the <a href="https://api.emberjs.com/ember/release/classes/Ember.Templates.helpers/methods/component?anchor=component">component helper</a> (e.g. <code>{{component "my-component"}}</code>).</p>
<p>Dynamic components are not by default compatible with Embroider's route-splitting feature since Embroider needs to be able to statically resolve components at build time. In the blog Nick discusses how they migrated <a href="https://github.com/simplabs/ember-promise-modals">ember-promise-modals</a>, an addon that relies on dynamic components, to be compatible with Embroider. They first used the <code>packageRules</code> as a compatibility feature to tell Embroider that an argument in the addon represents a component name.</p>
<p>To fully leverage Embroider’s code splitting, they used the <code>ensure-safe-component</code> helper that <a href="https://github.com/embroider-build/embroider/blob/main/REPLACING-COMPONENT-HELPER.md">Embroider provides</a> to turn a component class into a component definition that can be invoked in the template. This way the app code can be updated to actually import the component class so that Embroider can statically resolve this component.</p>
<hr />
<h2 id="linttothefuturedemovideohttpstwittercomreal_atestatus1500839305878642692"><a href="https://twitter.com/real_ate/status/1500839305878642692">lint-to-the-future demo video 📹</a></h2>
<p><code>lint-to-the-future</code> helps facilitate adding new linting rules in projects progressively, where adding such rules without a tool like this can otherwise be a struggle and lead to linter error explosions. <code>lint-to-the-future</code> has a plugin system that enables it to work for a variety of platforms, but there is already a <a href="https://github.com/mansona/lint-to-the-future-ember-template">plugin for Ember</a> available if you want to use it in your Ember project today!</p>
<p>If you haven't had a chance to check out <a href="https://github.com/mansona">Chris Manson's (@mansona)</a> new demo video on this awesome new <a href="https://github.com/mansona/lint-to-the-future">tool</a>, you may want to give it a watch. 😎</p>
<p>You can find the video on <a href="https://www.youtube.com/watch?v=bsDFXjDKjPc">YouTube</a> or read a little about it on the <a href="https://simplabs.com/blog/2022/03/07/better-code-with-lint-to-the-future/">Simplabs blog</a>. If you want to check out the repo, you can find it <a href="https://github.com/mansona/lint-to-the-future">here</a>.</p>
<hr />
<h2 id="glimmercomponentsignaturetyperfcinfcphttpstwittercomemberjsstatus1504891469752160260"><a href="https://twitter.com/emberjs/status/1504891469752160260">Glimmer component Signature type RFC in FCP ⌛️</a></h2>
<p><a href="https://github.com/emberjs/rfcs/pull/748">RFC 748 "Glimmer component Signature type"</a> is now well into the final comment period!</p>
<p>This RFC proposes to change GlimmerComponent's Args type parameter to a Signature type that can capture richer information about how a component can be invoked.</p>
<p>Now's your last chance to review and comment before the RFC is accepted so head on over to the RFC and contribute any thoughts you may have.</p>
<hr />
<h2 id="emberaddonroundup">Ember Addon Roundup 🌎</h2>
<p><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> and <a href="https://github.com/ZoeBijl">Zoë Bijl (@ZoeBijl)</a> have released an awesome new <a href="https://ember-aria.pages.dev/examples/aria-grid">aria-grid demo site</a> for <a href="https://github.com/CrowdStrike/ember-aria">ember-aria</a>!</p>
<p>We’ve also had several addons across the Ember ecosystem converted to v2 format recently!</p>
<ul>
<li><a href="https://github.com/lukemelia">Luke Melia (@lukemelia)</a> released <code>ember-keyboard</code> <a href="https://github.com/adopted-ember-addons/ember-keyboard/releases/tag/v8.0.0">8.0.0</a></li>
<li><a href="https://github.com/miguelcobain">Miguel Andrade (@miguelcobain)</a> released <code>ember-css-transitions</code> <a href="https://github.com/peec/ember-css-transitions/releases/tag/v4.0.0">4.0.0</a></li>
<li><a href="https://github.com/ef4">Edward Faulkner (@ef4)</a> released <a href="https://github.com/ember-animation/ember-animated/releases/tag/v1.0.0">ember-animated v1.0.0</a></li>
<li><a href="https://github.com/ef4">Edward Faulkner (@ef4)</a> released <a href="https://github.com/ember-animation/ember-animated-tools/releases/tag/v1.0.0">ember-animated-tools v1.0.0</a></li>
</ul>
<p>Many thanks to <a href="https://github.com/SergeAstapov">Sergey Astapov (@SergeAstapov)</a> for their work on many of these releases!</p>
<p>There is a number of benefits to users of addons published in v2 format, some of which include:</p>
<ul>
<li>faster builds and faster NPM installs</li>
<li>"zero-config import from NPM — both static and dynamic" as a first-class feature that works for both third-party libraries and Ember addons</li>
<li>support for arbitrary code splitting</li>
<li>tree-shaking of unused modules, components, helpers, etc. from the app and all addons</li>
</ul>
<p>To read more about v2 Addon Format, please check out <a href="https://github.com/emberjs/rfcs/blob/master/text/0507-embroider-v2-package-format.md">RFC 507</a>.</p>
<p>If you'd like to help the ecosystem move forward and convert more addons to v2 format, you may follow the great guide <a href="https://github.com/embroider-build/embroider/blob/main/PORTING-ADDONS-TO-V2.md">Porting an Addon to V2</a> made by <a href="https://github.com/ef4">Edward Faulkner (@ef4)</a> or try <a href="https://github.com/NullVoxPopuli/ember-addon-migrator">ember-addon-migrator</a> by <a href="https://github.com/NullVoxPopuli">NullVoxPopuli</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/hakilebara" rel="noopener noreferrer" target="_blank">Frédéric Soumaré (@hakilebara)</a>, <a href="https://github.com/lcoq" rel="noopener noreferrer" target="_blank">Louis Coquio (@lcoq)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/fozy81" rel="noopener noreferrer" target="_blank">Tim (@fozy81)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/Mithrilhall" rel="noopener noreferrer" target="_blank">Eric (@Mithrilhall)</a>, <a href="https://github.com/joshuabremer" rel="noopener noreferrer" target="_blank">Josh Bremer (@joshuabremer)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/Windvis" rel="noopener noreferrer" target="_blank">Sam Van Campenhout (@Windvis)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/chadhietala" rel="noopener noreferrer" target="_blank">Chad Hietala (@chadhietala)</a>, <a href="https://github.com/gossi" rel="noopener noreferrer" target="_blank">Thomas Gossmann (@gossi)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/mkszepp" rel="noopener noreferrer" target="_blank">@mkszepp</a>, and <a href="https://github.com/VincentMolinie" rel="noopener noreferrer" target="_blank">Vincent Molinié (@VincentMolinie)</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jared Galanis, Jen Weber, Chris Ng, Sergey Astapov and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-198</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-198</guid><pubDate>Sun, 20 Mar 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 199]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Fill out the Ember Community Survey by April 7th! 🗳,
EmberConf on April 19th 🐹,
Upcoming free technical writing workshop 📝,
Chris Ng is added to the Learning Core Team 🥳,
Decorators are in TC39 Stage 3 🎉,
Whiskey Web and Whatnot Episodes 🎙,
Dynamic component import demo 😎,
Ember Addon Roundup 🌐</p>
<hr />
<h2 id="fillouttheembercommunitysurveybyapril7thhttpsemberjscomsurvey2022"><a href="https://emberjs.com/survey/2022/">Fill out the Ember Community Survey by April 7th! 🗳</a></h2>
<p>The annual Ember Community Survey is open for only a few more days (until 4/7)! This is another reminder that the Ember core teams would love to hear from you!</p>
<p>The annual <a href="https://emberjs.com/survey/2022/">Ember Community Survey</a> helps guide direction in the Ember ecosystem. The data informs project prioritization, sparks new ideas, and reveals opportunities for growth.</p>
<p>The survey is primarily intended for developers who use the Ember JavaScript framework, either for work or personal use, although any developer is welcome to fill out this survey. The survey should take approximately 15 minutes to complete in full, though all questions are optional.</p>
<p><a href="https://emberjs.com/survey/2022/">Learn more about the survey and fill it out</a> by April 7th!</p>
<hr />
<h2 id="emberconfonapril19thhttps2022emberconfcom"><a href="https://2022.emberconf.com/">EmberConf on April 19th 🐹</a></h2>
<p>Here's another friendly 🤠 reminder that EmberConf registration is open! Register now and join the community remotely on April 19th for an <a href="https://2022.emberconf.com/">amazing lineup of talks</a>.</p>
<hr />
<h2 id="upcomingfreetechnicalwritingworkshophttpsformsgleavqfjjrjjozhbr529"><a href="https://forms.gle/AvQFjjrJjozHBr529">Upcoming free technical writing workshop 📝</a></h2>
<p>What are the elements of great technical articles or examples? What are some tips for writing for a global audience? How do you find a place to begin when there are so many different directions you could go? How should your writing style change depending on where it will be published? This is also another reminder if you want to join the Ember Learning team for a workshop that covers all of this! It will be half instruction, half hands-on activities.</p>
<p>If there is enough interest, the workshop will be offered in two sessions:</p>
<ul>
<li>April 23rd - aimed at Western Hemisphere time zone participants</li>
<li>April 30th - aimed at Eastern Hemisphere time zone participants</li>
</ul>
<p>To receive announcements about specific times and event details, please <a href="https://forms.gle/AvQFjjrJjozHBr529">fill out this form</a>.</p>
<hr />
<h2 id="chrisngisaddedtothelearningcoreteamhttpstwittercomchrisrngstatus1510280206879186952"><a href="https://twitter.com/chrisrng/status/1510280206879186952">Chris Ng is added to the Learning Core Team 🥳</a></h2>
<p>Please join us in welcoming the newest Learning Core team member, <a href="https://github.com/chrisrng">Chris Ng (@chrisrng)</a>! 🥳 👏 🎉  Chris has contributed an amazing amount to Learning team efforts, like the Ember Times, already, and we can't wait to see what else is in store!</p>
<hr />
<h2 id="decoratorsareintc39stage3httpstwittercompzuraqstatus1508518807438082060s20tskr9rilfylohesyysysw"><a href="https://twitter.com/pzuraq/status/1508518807438082060?s=20&t=skr-9rILFYLOh-eSyySySw">Decorators are in TC39 Stage 3 🎉</a></h2>
<p>Decorators have been a thing in Ember for some time now, but recently TC39 advanced decorators to <a href="https://tc39.es/process-document/">Stage 3</a>! 🎉 This is a step closer to the features of non-Angular-style decorators shipping natively in browsers rather than needing various degrees of expensive transpilation. Many thanks and congratulations to <a href="https://github.com/pzuraq">Chris Garrett (@pzuraq)</a> for championing this effort!</p>
<hr />
<h2 id="whiskeywebandwhatnotepisodeshttpswwwwhiskeywebandwhatnotfm"><a href="https://www.whiskeywebandwhatnot.fm/">Whiskey Web and Whatnot Episodes 🎙</a></h2>
<p>There are two more new awesome episodes of the Whiskey Web and Whatnot podcast! 🔥</p>
<p>First, creators <a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a> and <a href="https://github.com/chuckcarpenter">Chuck Carpenter (@chuckcarpenter)</a> of Ship Shape sit down with <a href="https://github.com/karaluton">Kara Luton (@karaluton)</a> and they discuss Kara's experience learning and relearning Ember, why she loves the Ember community, and her advice for those looking to switch careers. Check out the episode <a href="https://www.whiskeywebandwhatnot.fm/transitioning-to-tech-and-writing-what-you-know-with-kara-luton/">here</a>.</p>
<p>Next up is an episode with Ember Learning Core Team member <a href="https://github.com/jenweber">Jen Weber (@jenweber)</a> chatting with Robbie and Chuck about how to standardize an ever-evolving industry, the struggle to measure developer expertise, and why the Ember community is largely responsible for Jen's growth, career, and overall outlook on tech. Check out the episode <a href="https://www.whiskeywebandwhatnot.fm/setting-standards-community-lifelines-and-the-beauty-of-open-source-with-jen-weber/">here</a>.</p>
<hr />
<h2 id="dynamiccomponentimportdemohttpstwittercomnullvoxpopulistatus1507715367581462531"><a href="https://twitter.com/nullvoxpopuli/status/1507715367581462531">Dynamic component import demo 😎</a></h2>
<p>Recently <a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> put together a cool demo on how to dynamically import a component via <code>await import</code>. Check out the <a href="https://github.com/NullVoxPopuli/demo-ember-dynamic-component-import">repo</a> and <a href="https://twitter.com/nullvoxpopuli/status/1507716424546062340">further tweeted examples</a> today!</p>
<hr />
<h2 id="emberaddonroundup">Ember Addon Roundup 🌐</h2>
<ul>
<li><a href="https://github.com/runspired">Chris Thoburn (@runspired)</a> released <a href="https://github.com/html-next/flexi">Flexi 3.0 beta</a> after almost 5 years of hiatus! Flexi is a responsive-design layout framework focused on performance and maintainability, utilizing Ember for greater configuration and convenience. This release supports Ember 3.28+.</li>
<li><a href="https://github.com/josemarluedke">Josemar Luedke (@josemarluedke)</a> released <a href="https://github.com/josemarluedke/frontile/releases/tag/v0.14.00">Frontile v0.14.0</a>. Frontile aims to provide the legos (components, helpers, modifiers, and styles) necessary for building consistent and powerful Ember.js apps while following best practices from the community and providing both low-level and high-level components for your application. This release adds Embroider support!</li>
<li><a href="https://github.com/gilest">Giles Thompson (@gilest)</a> released <a href="https://github.com/adopted-ember-addons/ember-file-upload/releases/tag/v5.0.0">Ember File Upload v5</a>. Ember File Upload is an Ember addon that helps upload files by managing uploads through queues in the background. This release provides Ember Octane, v4 and Embroider support. Check the <a href="https://ember-file-upload.pages.dev/docs/upgrade-guide#upgrading-to-v5">upgrade guide</a> for more information.</li>
<li><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> released <a href="https://github.com/ember-modifier/ember-modifier/releases/tag/v3.2.0">ember-modifier v3.2.0</a> which aligns the modifier design with the rest of the Ember ecosystem and improves its TypeScript support (including with Glint). Check the <a href="https://github.com/ember-modifier/ember-modifier/releases/tag/v3.2.0">changelog</a> for full details and the <a href="https://github.com/ember-modifier/ember-modifier/blob/master/MIGRATIONS.md#40">migration guide</a> for how to upgrade your code!</li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/jurgenwerk" rel="noopener noreferrer" target="_blank">Matic Jurglič (@jurgenwerk)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/wondersloth" rel="noopener noreferrer" target="_blank">Matt Edwards (@wondersloth)</a>, <a href="https://github.com/deanmarano" rel="noopener noreferrer" target="_blank">Dean Marano (@deanmarano)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/kaermorchen" rel="noopener noreferrer" target="_blank">Stanislav Romanov (@kaermorchen)</a>, <a href="https://github.com/MathijsPeerlings" rel="noopener noreferrer" target="_blank">@MathijsPeerlings</a>, <a href="https://github.com/scalvert" rel="noopener noreferrer" target="_blank">Steve Calvert (@scalvert)</a>, <a href="https://github.com/jelhan" rel="noopener noreferrer" target="_blank">Jeldrik Hanschke (@jelhan)</a>, <a href="https://github.com/cafreeman" rel="noopener noreferrer" target="_blank">Chris Freeman (@cafreeman)</a>, <a href="https://github.com/gzurbach" rel="noopener noreferrer" target="_blank">Pedro Zurbach (@gzurbach)</a>, <a href="https://github.com/Mithrilhall" rel="noopener noreferrer" target="_blank">Eric (@Mithrilhall)</a>, <a href="https://github.com/AddisonG" rel="noopener noreferrer" target="_blank">Addison G (@AddisonG)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/jeffdaley" rel="noopener noreferrer" target="_blank">Jeff Daley (@jeffdaley)</a>, <a href="https://github.com/snewcomer" rel="noopener noreferrer" target="_blank">Scott Newcomer (@snewcomer)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, and <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-199</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-199</guid><pubDate>Sun, 03 Apr 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 200]]></title><description><![CDATA[<p>👋 Emberistas! 🐹
TypeScript in Ember 🤝,
Addon Roundup 🌐,
Time to watch some movies 🍿,
Using Ember in 2022 🏙,
<SOME-INTRO-HERE-TO-KEEP-THEM-SUBSCRIBERS-READING></p>
<hr />
<h2 id="typescriptinemberhttps2022emberconfcomtalkstheroadtotypescript"><a href="https://2022.emberconf.com/talks/the-road-to-typescript">TypeScript in Ember 🤝</a></h2>
<p>As you might have noticed during <a href="https://2022.emberconf.com/talks">EmberConf 2022</a> TypeScript and Ember are becoming more and more a thing. <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> gave <a href="https://2022.emberconf.com/talks/the-road-to-typescript">a talk about Ember's road towards TypeScript</a>. He wrote multiple interesting blogposts about TypeScript: <a href="https://v5.chriskrycho.com/journal/misusing-typescript-assertion-functions-for-fun-and-profit/">Misusing TypeScript Assertion Functions for Fun and Profit</a> and <a href="https://v5.chriskrycho.com/journal/semver-for-ts-in-practice/">SemVer for TS in Practice</a>. <a href="https://github.com/gitKrystan">Krystan Huffmeme (@gitKrystan)</a> updated her <a href="https://blog.skylight.io/ts-extends-confidence-2-2022/">blog post about TypeScript</a> with the latest and greatest Ember + TypeScript practices. Not only in the realm of blogposts is TypeScript hot and happening, <a href="https://github.com/kaliber5/ember-responsive-image/releases/tag/v3.4.0">ember-responsive-image latest update (v3.4.0)</a> adds Glint support to the add-on.</p>
<hr />
<h2 id="addonroundup">Addon Roundup 🌐</h2>
<ul>
<li><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> released several minor versions of  <a href="https://github.com/NullVoxPopuli/ember-resources">ember-resources</a>, an addon that implements the <a href="https://www.pzuraq.com/blog/introducing-use">Resource pattern</a>, which added a <a href="https://ember-resources.pages.dev/modules/util_function_resource">simplified API</a> (in v4.7) for creating inline, one-off, resources -- using "plain functions". Additionally, a couple of sample utilities have been added  to demonstrate how folks might want to use ember-resources in their own projects: <a href="https://ember-resources.pages.dev/modules/util_remote_data"><code>RemoteData</code></a> (in v4.8) for performing vastly simplified, yet reactive, <code>fetch</code> requests -- using the function-based <code>resource</code>. And lastly, a <a href="https://ember-resources.pages.dev/modules/util_debounce"><code>debounce</code></a> (in v4.9) utility that aims to demonstrate a minimal/low-effort situation in which the function-based <code>resource</code> can be used.</li>
<li><a href="https://github.com/Turbo87">Tobias Bieniek (@Turbo87)</a> published a new version of <a href="https://github.com/Turbo87/intellij-emberjs">intellij-emberjs</a> which is a plugin that provides basic Ember.js support to all JetBrains IDEs that support JavaScript. This release fixes the annoying <code>LineMarkerInfo</code> deprecation warning that was introduced in 2021.3.</li>
<li><a href="https://github.com/Turbo87">Tobias Bieniek (@Turbo87)</a> also released v1.0.0 of <a href="https://github.com/simplabs/ember-hbs-minifier">ember-hbs-minifier</a> which shrinks your templates by removing unnecessary text nodes and collapsing them into single space characters.</li>
<li><a href="https://github.com/betocantu93">Alberto Cantú Gómez (@betocantu93)</a> released <a href="https://github.com/prysmex/ember-eui">ember-eui</a> which provides Ember components for the <a href="https://github.com/elastic/eui">Elastic design system</a>. Check out the <a href="https://ember-eui.netlify.app/docs/introduction">demo</a> to try it out!</li>
<li><a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a> released <a href="https://github.com/ijlee2/ember-container-query">ember-container-query</a> which is an addon that provides a component and several helpers to leverage container queries in your Ember app. Open the <a href="https://ember-container-query.netlify.app/">demo</a> app to see it in action!</li>
<li><a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a> also released <a href="https://github.com/ijlee2/ember-workshop">ember-workshop</a> which is a demo app to illustrate core and latest concepts in Ember. Try it out today at the <a href="https://ember-workshop.netlify.app/">demo</a> page!</li>
<li><a href="https://github.com/BoussonKarel">Karel Bousson (@BoussonKarel)</a> released a ✨ new ✨ add-on <a href="https://github.com/BoussonKarel/ember-promise-worker"><code>ember-promise-worker</code></a> to leverage the power of web workers in your Ember app.</li>
<li><a href="https://github.com/joegaudet">Joe Gaudet (@joegaudet)</a> released v2.28.0 of <a href="https://github.com/Foodee/ember-foxy-forms/releases/tag/v2.28.0"><code>ember-foxy-forms</code></a> with two new features.<ul>
<li><code>#willSubmit</code> and <code>#willReset</code> are now asynchronous allowing for back end calls or dialogs to be popped up.</li>
<li><code>#confirmSubmit</code> and <code>#confirmReset</code> which allow for explicitly confirming submission and resetting of the form, will eventually add hooks into this process by default that allow for swapping out confirmation services from your own application.</li></ul></li>
<li>Version 4.0.0 and 4.1.0 of <a href="https://ember-scroll-modifiers.jhawk.co">Ember-Scroll-Modifiers</a> have been released including the breaking change to Ember 4. Version 4.1.0 brings you offset support for <code>scroll-into-view</code>.</li>
<li>With the release of v.6.0.0 of <a href="https://github.com/adopted-ember-addons/ember-file-upload">Ember-File-Upload</a>  <code>File.upload</code> will now resolve with a <code>Response</code> object, for more breaking changes checkout <a href="https://github.com/adopted-ember-addons/ember-file-upload/releases/tag/v6.0.0">the release guide</a>.</li>
<li><a href="https://github.com/mansona">Chris Manson (@mansona)</a> added a section to the <a href="https://github.com/mansona/lint-to-the-future">Lint to the Future</a> documentation that describes how to build a plugin. Lint to the future is something that <a href="https://www.youtube.com/watch?v=Nl8gHDdkI0Y">Chris talked about at EmberConf</a> and if you want to learn how to write your own plugin for Lint to the Future you can <a href="https://github.com/mansona/lint-to-the-future/blob/main/docs/plugin-development.md">now check out the Plugin Development Guide</a>.</li>
</ul>
<hr />
<h2 id="embervideoshttps2022emberconfcomtalks"><a href="https://2022.emberconf.com/talks">Ember videos 🎞️</a></h2>
<p>EmberConf 2022 was remote, so all <a href="https://2022.emberconf.com/talks">the videos</a> are already available, including the <a href="https://www.youtube.com/watch?v=huGc98lrLRk">AMA with Robert Jackson (@rwjblue)</a> that happened the week after the conference. The <a href="https://www.youtube.com/channel/UCyloIQk1MS_kWEZOvUz8deg">Ember Ignite videos are also on Youtube</a>, including that talk by <a href="https://github.com/gossi">Thomas Gossmann (@gossi)</a> about <a href="https://gos.si/blog/frontend-component-architecture/">Component Architecture</a>. <strong>Have fun</strong> watching all these amazing speakers 🍿!</p>
<hr />
<h2 id="whyuseemberatyourcompany">Why use Ember at your company? 🏙</h2>
<p><a href="https://dev.to/otainsight">Kenny De Pauw from OTA insight</a> and <a href="https://github.com/hakilebara">Frédéric Soumaré (@hakilebara)</a> from Qonto both wrote a blog post about the benefits and relevance of EmberJS to their companies.</p>
<p><a href="https://dev.to/otainsight/why-we-use-emberjs-at-ota-insight-4oai">According to Kenny</a> they are able to create new features quickly, have a codebase that’s scalable, and have a good developer experience.</p>
<p><a href="https://medium.com/qonto-way/stability-without-stagnation-using-ember-at-qonto-b221b52b917b">Frédéric says</a>: “Convention over configuration, Stability over stagnation, Climbing the mountain together, these are cardinal principles of the Ember framework. Beyond the tech, these principles are the reason we chose Ember and decided to stick with it.”</p>
<p>If you want to know more, check out the following blog posts:</p>
<ul>
<li><a href="https://dev.to/otainsight/why-we-use-emberjs-at-ota-insight-4oai">Why we use Ember.js at OTA Insight</a></li>
<li><a href="https://medium.com/qonto-way/stability-without-stagnation-using-ember-at-qonto-b221b52b917b">Stability without stagnation — Using Ember at Qonto</a></li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank our <a href="https://github.com/ddzz" rel="noopener noreferrer" target="_blank">Darius Dzien (@ddzz)</a>, <a href="https://github.com/charlesfries" rel="noopener noreferrer" target="_blank">Charles Fries (@charlesfries)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">@patricklx</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/gabrielcsapo" rel="noopener noreferrer" target="_blank">Gabriel Csapo (@gabrielcsapo)</a>, <a href="https://github.com/Swannerino" rel="noopener noreferrer" target="_blank">Steven Wan (@Swannerino)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/Aierie" rel="noopener noreferrer" target="_blank">@Aierie</a>, <a href="https://github.com/jakesjews" rel="noopener noreferrer" target="_blank">Jacob Jewell (@jakesjews)</a>, <a href="https://github.com/Windvis" rel="noopener noreferrer" target="_blank">Sam Van Campenhout (@Windvis)</a>, <a href="https://github.com/nlfurniss" rel="noopener noreferrer" target="_blank">Nathaniel Furniss (@nlfurniss)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/cloke" rel="noopener noreferrer" target="_blank">Cory Loken (@cloke)</a>, <a href="https://github.com/msaaddev" rel="noopener noreferrer" target="_blank">Saad Irfan ⚡️ (@msaaddev)</a>, <a href="https://github.com/eltociear" rel="noopener noreferrer" target="_blank">Ikko Ashimine (@eltociear)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/kprasadpvv" rel="noopener noreferrer" target="_blank">Krishna Prasad P V V (@kprasadpvv)</a>, <a href="https://github.com/fsmanuel" rel="noopener noreferrer" target="_blank">Manuel Wiedenmann (@fsmanuel)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/dfreeman" rel="noopener noreferrer" target="_blank">Dan Freeman (@dfreeman)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/steveszc" rel="noopener noreferrer" target="_blank">Steve Szczecina (@steveszc)</a>, <a href="https://github.com/arrudadev" rel="noopener noreferrer" target="_blank">Alexandre Monteiro (@arrudadev)</a>, <a href="https://github.com/janzenisaac" rel="noopener noreferrer" target="_blank">Isaac Janzen (@janzenisaac)</a>, <a href="https://github.com/harshith-venkatesh" rel="noopener noreferrer" target="_blank">Harshith Venkatesh (@harshith-venkatesh)</a>, <a href="https://github.com/fullsailor" rel="noopener noreferrer" target="_blank">Andrew Smith (@fullsailor)</a>, <a href="https://github.com/VincentMolinie" rel="noopener noreferrer" target="_blank">Vincent Molinié (@VincentMolinie)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/rahulk94" rel="noopener noreferrer" target="_blank">Rahul Kumar (@rahulk94)</a>, <a href="https://github.com/tniezurawski" rel="noopener noreferrer" target="_blank">Tomek Nieżurawski (@tniezurawski)</a>, <a href="https://github.com/halfbyte" rel="noopener noreferrer" target="_blank">Jan Krutisch (@halfbyte)</a>, <a href="https://github.com/kirtan-desai" rel="noopener noreferrer" target="_blank">Kirtan Desai (@kirtan-desai)</a>, <a href="https://github.com/Turbo87" rel="noopener noreferrer" target="_blank">Tobias Bieniek (@Turbo87)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/deanmarano" rel="noopener noreferrer" target="_blank">Dean Marano (@deanmarano)</a>, and <a href="https://github.com/CuriousCorrelation" rel="noopener noreferrer" target="_blank">@CuriousCorrelation</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jared Galanis, Anne-Greeth Schot-van Herwijnen, Chris Ng, NullVoxPopuli, Chris Manson, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-200</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-200</guid><pubDate>Sun, 26 Jun 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 201]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>EmberFest 2022 🇫🇷,
Embroider is legit 🧵,
Starbeam 🤩,
Testing Tasks and Flexible Components Posts 📖,
Advanced template support in Intellij Idea 💻,
ember-statechart-component 6.0.0 📊,
Whiskey, Web and Whatnot Episodes 🔊</p>
<hr />
<h2 id="emberfest2022httpsemberfesteu"><a href="https://emberfest.eu/">EmberFest 2022 🇫🇷</a></h2>
<p>EmberFest 2022 is happening on September 22-23 in Paris 🇫🇷, and tickets are now on sale! 😊</p>
<p>If you’re looking for updates on the latest and greatest in Ember and Glimmer this is the place to be. EmberFest is also a great opportunity to get in touch with the European Ember Community (and friends from abroad) and hiring Ember talent.</p>
<p>Don't wait too long to book your ticket and travel as September will be here before we know it!</p>
<hr />
<h2 id="embroiderislegithttpsgithubcomembroiderbuildembroider"><a href="https://github.com/embroider-build/embroider">Embroider is legit 🧵</a></h2>
<p>Embroider has been <em>declared</em> stable since v1.0.0, or around 6 months ago (released mid-January 2022). Embroider is the 2nd generation build pipeline to Ember Apps that enables the usage of “Standard JavaScript” and leverages standard JavaScript packagers such as Webpack.</p>
<p>Since even before v1.0.0, addon-authors have been adding <strong>two</strong> embroider-centric tests in C.I. for both "maximum compatibility" and "maximum strictness" to their ember-try configs.
<code>ember-cli</code> has even added an <code>--embroider</code> flag out of the box for starting new projects with embroider.
Try embroider out today in a new app!</p>
<pre><code class="bash language-bash">ember new my-app --embroider
</code></pre>
<p>Or, add embroider to an existing app via this codemod:</p>
<pre><code class="bash language-bash">npx ember-apply embroider
</code></pre>
<p>This <a href="https://github.com/NullVoxPopuli/ember-apply/"><code>ember-apply</code></a> command automates the setup instructions in the <a href="https://github.com/embroider-build/embroider#how-to-try-it">embroider README</a>.</p>
<p>And speaking of the README, it has a section of if <em>you</em> should use embroider or not, today.</p>
<blockquote>
  <p>Several large, heavily-tested Ember apps are shipping to production with Embroider. So if you are excited to adopt Embroider, it is a reasonable choice. The main risks to be aware of if you choose to use Embroider in production are:</p>
  <ul>
  <li>you're likely to discover some Ember addons don't work or break your build</li>
  <li>Embroider's own configuration options are subject to change, so you'll need to read the CHANGELOG.md when updating the Embroider packages.</li>
  </ul>
  <p>Alternatively, it is totally safe to stick with the traditional build pipeline and wait for the official cutover point when EmberCLI starts generating new apps with Embroider by default.</p>
</blockquote>
<p>Note that while some addons may break your build, this may be for the greater good. For example, instead of relying on ember-specific solutions to certain build-time behaviors, you may now follow heavily documented, and asked about, and iterated on Webpack plugins. Additionally, removing addons with build-time behavior will speed up your overall dev-server start time.</p>
<hr />
<h2 id="starbeamhttpstwittercomwycatsstatus1538888835064442880"><a href="https://twitter.com/wycats/status/1538888835064442880">Starbeam 🤩</a></h2>
<p>If you haven't had a chance to check out <a href="https://github.com/starbeamjs/starbeam">Starbeam</a> from <a href="https://github.com/wycats">Yehuda Katz (@wycats)</a>, you're going to want to give it a look!</p>
<p>The TL;DR on Starbeam is that it's the best parts of the Ember auto-tracking system cleaned up and extracted into a standalone library optimized for universality. This means you can use the 🔥 Ember reactivity system 🔥 in frameworks like React, Vue and Svelte. Note, Starbeam should be available in Ember.js as well.</p>
<p>An <a href="https://starbeamjs.com/">in-progress docs site</a> is up now, go check it out!</p>
<hr />
<h2 id="testingtasksandflexiblecomponentspostshttpsmfeckiedev"><a href="https://mfeckie.dev/">Testing Tasks and Flexible Components Posts 📖</a></h2>
<p><a href="https://github.com/mfeckie">Martin Feckie (@mfeckie)</a> has written two great new blog posts. One is on <a href="https://mfeckie.dev/testing-tasks/">testing ember-concurrency tasks</a> and the other is about how to write <a href="https://mfeckie.dev/flexible-components/">flexible components</a>! ✨</p>
<p>For testing tasks, Martin shows you how to write a fake task helper to support writing tests that test tasks in the happy path. For flexible components, Martin makes the case for an alternative approach to flexible components.</p>
<p>Go ahead and give the posts a read today!</p>
<hr />
<h2 id="advancedtemplatesupportinintellijideahttpsgithubcompatricklxintellijemberjsexperimental"><a href="https://github.com/patricklx/intellij-emberjs-experimental">Advanced template support in Intellij Idea 💻</a></h2>
<p>In Intellij Idea Ember.js templates haven't been fully supported. This is notable when compared to vscode where the <a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-ember-unstable">(Un)Stable Ember Language Server</a> is available.</p>
<p>With <a href="https://github.com/patricklx/intellij-emberjs-experimental">intellij-emberjs-experimental</a>, <a href="https://github.com/patricklx">@patricklx</a> has added many features to the fantastic <a href="https://github.com/Turbo87/intellij-emberjs">original plugin</a> to improve the UX of working/coding with templates.</p>
<p>If you're interested in trying out these new features give the experimental plugin a try. Note, you will need to disable or remove the original intellij-emberjs plugin to prevent conflicts.</p>
<p>This plugin adds:</p>
<ul>
<li><strong>Smart</strong> Handlebars references for tags/mustache paths and tag attributes. This means that it handles ember helpers such as <code>let</code>, <code>hash</code>, <code>or</code>, <code>each</code>, <code>yield</code>. References to javascript/typescript and it is able to resolve array item type in <code>each</code>.</li>
<li>Handlebars <strong>auto-completion</strong> for tags (coming from blocks), tag attributes, mustache paths (js/ts) and named blocks. Also validates if attributes are valid and if required ones are missing.</li>
<li>Handlebars <strong>parameter hints</strong> for helpers/modifiers and components.</li>
<li>Handlebars <strong>renaming</strong> for mustache ids and Html tags.</li>
<li>Support for Ember.js internal Components and Helpers with documentation and support for attributes and parameter hints.</li>
<li>It also resolves <code>{{or x y z}}</code> to the first resolvable option, this makes <code>{{component (or x y)}}</code> work (e.g in <code>power-select</code>).</li>
<li>Support for inline templates.</li>
<li>Some initial support for <a href="https://github.com/ember-template-imports/ember-template-imports">.gjs</a> files.</li>
</ul>
<hr />
<h2 id="emberstatechartcomponent600httpstwittercomnullvoxpopulistatus1543449217351442438"><a href="https://twitter.com/nullvoxpopuli/status/1543449217351442438">ember-statechart-component 6.0.0 📊</a></h2>
<p><code>ember-statechart-component</code> 6.0.0 has been <a href="https://github.com/NullVoxPopuli/ember-statechart-component/releases/tag/v6.0.0">released</a> by <a href="https://github.com/NullVoxPopuli">@NullVoxPopuli</a> and now includes support for Glint! There are also some breaking changes around the required versions of Ember involved so be sure to check out the release notes.</p>
<p>There's also been several patch and minor releases of the library since 6.0.0 was released so the latest is actually now v6.1.1. Those releases include a few bug fixes and one new feature (automatic glint registration).</p>
<hr />
<h2 id="whiskeywebandwhatnotepisodeshttpswwwwhiskeywebandwhatnotfm"><a href="https://www.whiskeywebandwhatnot.fm/">Whiskey Web and Whatnot Episodes 🔊</a></h2>
<p>There are two new awesome episodes of the Whiskey Web and Whatnot podcast featuring two Ember core team members! 🔥</p>
<p>First, <a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a> and <a href="https://github.com/chuckcarpenter">Chuck Carpenter (@chuckcarpenter)</a> of Ship Shape sit down with <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> of the Ember Framework and Typescript Core Teams in <a href="https://www.whiskeywebandwhatnot.fm/bringing-types-to-ember-with-chris-krycho/">this episode</a> of Whiskey, Web and Whatnot. Chris shares his initial work on getting TypeScript into Ember, how Typed-Ember got established, and further explains the need and long-term benefits of TypeScript.</p>
<p>They also discuss the enthusiasm of newbies to use TypeScript and the complexities that might arise, factors to consider when deciding to use TypeScript, and how learning the Rust programming can help broaden you as a developer.</p>
<p>Next up is an episode with Ember Framework Core Team member <a href="https://github.com/chancancode">Godfrey Chan @chancancode</a> who chats with Robbie and Chuck about StarBeam and the Polaris Edition and the future of Ember.js! Check out the episode <a href="https://www.whiskeywebandwhatnot.fm/polaris-starbeam-and-the-future-of-ember-with-godfrey-chan/">here</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/dhanush027" rel="noopener noreferrer" target="_blank">Dhanush Kumar (@dhanush027)</a>, <a href="https://github.com/maxwondercorn" rel="noopener noreferrer" target="_blank">maxwondercorn (@maxwondercorn)</a>, <a href="https://github.com/naveensrinivasan" rel="noopener noreferrer" target="_blank">Naveen (@naveensrinivasan)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/geneukum" rel="noopener noreferrer" target="_blank">Geordan Neukum (@geneukum)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/kuldipem" rel="noopener noreferrer" target="_blank">KULDIP PIPALIYA (@kuldipem)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/fsmanuel" rel="noopener noreferrer" target="_blank">Manuel Wiedenmann (@fsmanuel)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">@patricklx</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, and <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Anne-Greeth Schot-van Herwijnen, NullVoxPopuli, patricklx, Dhanush Kumar, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-201</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-201</guid><pubDate>Sun, 10 Jul 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 202]]></title><description><![CDATA[<p>👋 Emberistas! 🐹
Ember 4.5 Released 🚀,
RFC: Evolving Ember's Major Version Process 🌲,
RFC: Standardize npm yarn use ✨,
RFC: public types for Owner, Transition, RouteInfo in FCP ⌛️,
Ember Addon Roundup 🌐,
Whiskey Web and Whatnot Episode with Dan Gebhardt 🔊,
Modern CSS in an embroider enabled app 📖,
Ember Chessboard Videos 📼</p>
<hr />
<h2 id="ember45releasedhttpsblogemberjscomember45released"><a href="https://blog.emberjs.com/ember-4-5-released">Ember 4.5 Released 🚀</a></h2>
<p>Ember 4.5 was recently released and it included a few new features for Ember.js around using plain functions as helpers and a new <code>renderSettled</code> test helper. Ember CLI also introduced a few deprecations and various bug fixes.</p>
<p>Head on over to the <a href="https://blog.emberjs.com/ember-4-5-released">release post</a> to get more details.</p>
<hr />
<h2 id="rfcevolvingembersmajorversionprocesshttpsgithubcomemberjsrfcspull830"><a href="https://github.com/emberjs/rfcs/pull/830">RFC: Evolving Ember's Major Version Process 🌲</a></h2>
<p><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> published an RFC on <a href="https://github.com/emberjs/rfcs/pull/830">Evolving Ember’s Major Version Process</a>. The RFC proposes to put major versions on a predictable 60-week cadence, similar to the <a href="https://emberjs.com/releases/">6-week minor release cadence</a>.</p>
<p>The RFC argues that while <a href="https://emberjs.com/releases/">Ember mentions</a> that it aims to "make major releases as rare as possible” since it forces development teams to spend time researching the changes and modifying their codebase before they can upgrade, it actually makes upgrades more painful rather than less painful. For Ember users, while the major releases may be more rare, they actually become harder over time and for Ember maintainers the planning and coordination required for a major release happens on an ad hoc basis with no ability to plan for it in advance.</p>
<p>Chris presents an alternate way to use SemVer by clarifying how we use major releases and editions, namely: never couple the addition of new features to breaking changes, Ember major versions should only remove deprecated features, and Ember's big releases are labeled as "Editions” and lands as a minor release and are therefore always backwards compatible.</p>
<p>Read more about the RFC and add your comments on <a href="https://github.com/emberjs/rfcs/pull/830">GitHub</a>!</p>
<hr />
<h2 id="rfcstandardizenpmyarnusehttpsgithubcomemberjsrfcspull831"><a href="https://github.com/emberjs/rfcs/pull/831">RFC: Standardize npm yarn use ✨</a></h2>
<p><a href="https://github.com/MehulKChaudhari">Mehul Chaudhari (@MehulKChaudhari)</a> and <a href="https://github.com/dhanush027">Dhanush Kumar
 (@dhanush027)</a> have co-authored a 😎 new RFC that focuses on standardizing the use of yarn and npm scripts in the Ember experience rather than using Ember-specific commands. This could better align Ember with norms in the larger JavaScript community.</p>
<p>If you're interested in this subject please head over to <a href="https://github.com/emberjs/rfcs/pull/831">the RFC</a>, give it a read, and participate by commenting!</p>
<hr />
<h2 id="rfcpublictypesforownertransitionrouteinfoinfcphttpstwittercomemberjsstatus1550796034049277953"><a href="https://twitter.com/emberjs/status/1550796034049277953">RFC: public types for Owner, Transition, RouteInfo in FCP ⌛️</a></h2>
<p>The RFC for introducing public types for Owner, Transition, RouteInfo is now in its final comment period so if you're interested in participating in that discussion hurry over to the <a href="https://github.com/emberjs/rfcs/pull/821">RFC</a> and leave a comment!</p>
<hr />
<h2 id="emberaddonroundup">Ember Addon Roundup 🌐</h2>
<p>We’ve had several addons across the Ember ecosystem release updates recently, here’s what you may have missed:</p>
<ul>
<li><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a>'s released <a href="https://github.com/NullVoxPopuli/eslint-plugin-decorator-position/blob/main/CHANGELOG.md#500-2022-07-15">v5.0.0</a> of <code>eslint-plugin-decorator-position</code> which <a href="https://twitter.com/nullvoxpopuli/status/1547769958230155269">now supports es-lint 8</a>.</li>
<li><a href="https://github.com/nickschot">Nick Schot (@nickschot)</a> <a href="https://twitter.com/nickschot/status/1550438922882371584">announced the v3 release</a> of <code>ember-mobile-menu</code> which includes support for PointerEvents so gestures for mouse or pen users can be enabled. Check the <a href="https://github.com/nickschot/ember-mobile-menu/releases/tag/v3.0.0">release notes</a> for a bunch of other modernizations.</li>
<li>Not a release, but <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> announced <a href="https://github.com/emberjs/ember-test-helpers/pull/1234">a draft PR</a> that introduces public TypeScript support in <code>ember-test-helpers</code>. This is the first official library publishing types under the TypeScript support policy adopted earlier this year.</li>
<li><a href="https://github.com/ijlee2/">Isaac Lee (@ijlee2)</a> introduced <a href="https://github.com/ijlee2/ember-codemod-pod-to-octane"><code>ember-codemod-pod-to-octane</code></a>, a codemod to help you un-pod Ember apps, addons, and engines.</li>
</ul>
<hr />
<h2 id="whiskeywebandwhatnotepisodewithdangebhardthttpstwittercomshipshapecodestatus1547916152055091208"><a href="https://twitter.com/shipshapecode/status/1547916152055091208">Whiskey Web and Whatnot Episode with Dan Gebhardt 🔊</a></h2>
<!--alex ignore alumnae-alumni-->
<p>There's another new episode of Whiskey Web and Whatnot that you might want to check out and it features Ember core team alumni <a href="https://github.com/dgeb">Dan Gebhardt (@dgeb)</a>! 🔥</p>
<p><a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a> and <a href="https://github.com/chuckcarpenter">Chuck Carpenter (@chuckcarpenter)</a> of Ship Shape chat with Dan about syncing data sources and handling spotty network connections, how Orbit.js helps to address these issues, and more!</p>
<p>Listen to <a href="https://www.whiskeywebandwhatnot.fm/developing-orbit-and-the-future-of-cross-framework-solutions-with-dan-gebhardt/">the episode</a> today.</p>
<hr />
<h2 id="moderncssinanembroiderenabledapphttpstwittercomevo1status1547312309185511426"><a href="https://twitter.com/evo1/status/1547312309185511426">Modern CSS in an embroider enabled app 📖</a></h2>
<p><a href="https://github.com/evoactivity">Liam Potter (@evoactivity)</a> wrote a nice article about how to best use modern approaches to handling CSS in an embroider-enabled Ember app! 🙌</p>
<p>The article covers setting up PostCSS and Tailwind configs, using Webpack, and more! Go check out <a href="https://github.com/evoactivity/ember-modern-css/blob/main/README.md">the article</a> today!</p>
<hr />
<h2 id="emberchessboardvideoshttpstwittercomknownasilyastatus1545585741073420288"><a href="https://twitter.com/knownasilya/status/1545585741073420288">Ember Chessboard Videos 📼</a></h2>
<p><a href="https://github.com/knownasilya">Ilya Radchenko (@knownasilya)</a> released a couple of ✨ awesome new videos ✨ that run through building an Ember.js chessboard.js app using an exciting new (alpha) scaffolding library called <a href="https://github.com/warp-drive-engineering/engage">Engage</a> that's authored by <a href="https://github.com/runspired">Chris Thoburn (@runspired)</a>!</p>
<p>Head on over to YouTube and check out <a href="https://www.youtube.com/watch?v=4Yt98vPyfv4">part 1</a> and <a href="https://www.youtube.com/watch?v=WLGwOKD9PXo">part 2</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/donaldsonjulia" rel="noopener noreferrer" target="_blank">Julia Donaldson (@donaldsonjulia)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/dhanush027" rel="noopener noreferrer" target="_blank">Dhanush Kumar (@dhanush027)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/cdransf" rel="noopener noreferrer" target="_blank">Cory Dransfeldt (@cdransf)</a>, <a href="https://github.com/maxwondercorn" rel="noopener noreferrer" target="_blank">maxwondercorn (@maxwondercorn)</a>, and <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">@patricklx</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jared Galanis, Chris Ng, the crowd and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-202</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-202</guid><pubDate>Sat, 23 Jul 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 203]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember 4.6 Released 🔥,
Plain Old Functions as Helpers 😎,
Deprecate Proxies in Ember Data RFC ✨,
Speed Improvements in Ember Data Tests 🏎,
eslint-plugin-ember 11.0 Released 🧹,
Ember Addon Roundup 🌐,
Whiskey Web and Whatnot Episode with NullVoxPopuli 🔊,
Ember Chessboard Videos Part 3 📼,
Migrate ember-data models to Octane 📓,
Effects in Ember 🙌,
Prevent Load Flashing ⚡️</p>
<hr />
<h2 id="ember46releasedhttpsblogemberjscomember46released"><a href="https://blog.emberjs.com/ember-4-6-released">Ember 4.6 Released 🔥</a></h2>
<p>Ember 4.6 was recently released!</p>
<p>This release included a few bug fixes for Ember.js, 1 deprecation for Ember CLI, and 9 bug fixes for Ember Data. The release also includes 8 deprecations for Ember Data and improvements to Ember Data's build size!</p>
<p>Head on over to the <a href="https://blog.emberjs.com/ember-4-6-released">4.6 release blog post</a> and give it a read today!</p>
<hr />
<h2 id="plainoldfunctionsashelpershttpsblogemberjscomplainoldfunctionsashelpers"><a href="https://blog.emberjs.com/plain-old-functions-as-helpers">Plain Old Functions as Helpers 😎</a></h2>
<p>In case you missed it, there's a <a href="https://blog.emberjs.com/plain-old-functions-as-helpers">new post</a> by <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> that covers a long-awaited feature that was released recently in Ember 4.5, plain old JavaScript functions as helpers! 😎</p>
<p>As the post indicates, this means two things today:</p>
<ol>
<li>You can use (bound) methods on your backing class as helpers directly.</li>
<li>You can define function-based helpers without importing and using helper().</li>
</ol>
<p>Also, in the future, there should be even better support when the <code>template</code> feature lands!</p>
<hr />
<h2 id="deprecateproxiesinemberdatarfchttpsgithubcomemberjsrfcspull846"><a href="https://github.com/emberjs/rfcs/pull/846">Deprecate Proxies in Ember Data RFC ✨</a></h2>
<p><a href="https://github.com/runspired">Chris Thoburn (@runspired)</a> also recently opened <a href="https://github.com/emberjs/rfcs/pull/846">an RFC that proposes deprecating proxies in Ember Data</a>!</p>
<p>When proxies in Ember Data were introduced Native Proxies did not yet exist. This is no longer the case and the RFC describes how Ember Data can be simplified and improve performance by deprecating them.</p>
<p>Additionally, <a href="https://twitter.com/not_runspired/status/1560375248498876417?s=20&t=xvBGa68l4S5ePSbkOopadA">this may mean Ember Data can be portable and potentially used outside of Ember in the future</a>! As the RFC indicates, "Importantly, this simplification will allow for us to address the performance of the most expensive costs of managing and presenting data. It will also sever one of the last entanglements the core of EmberData has with the Framework. While this RFC does not in itself enable Ember-less usage of EmberData, it does in effect make this a near possibility."</p>
<p>Go ahead and head on over to <a href="https://github.com/emberjs/rfcs/pull/846">the RFC</a> and give it a read or leave a comment today!</p>
<hr />
<h2 id="speedimprovementsinemberdatatestshttpstwittercomnot_runspiredstatus1559336272484655104s20tel5ptwrjerm6cmanfedjwa"><a href="https://twitter.com/not_runspired/status/1559336272484655104?s=20&t=el5PTWrJeRm6cMAnFEDJWA">Speed Improvements in Ember Data Tests 🏎</a></h2>
<p><a href="https://github.com/runspired">Chris Thoburn (@runspired)</a> recently announced that there are some ✨ significant speed improvements ✨ coming to tests that set up records in Ember Data!</p>
<p>Significant as in there are a large number of scenarios that are 75-90% faster in Ember Data 4.8 than 4.6. These improvements, along with other performance improvements, should land in Ember Data 4.8. 😎</p>
<hr />
<h2 id="eslintpluginember110releasedhttpsgithubcomemberclieslintpluginemberreleasestagv1100"><a href="https://github.com/ember-cli/eslint-plugin-ember/releases/tag/v11.0.0">eslint-plugin-ember 11.0 Released 🧹</a></h2>
<p><a href="https://github.com/bmish">Bryan Mishkin (@bmish)</a> has released <a href="https://github.com/ember-cli/eslint-plugin-ember/releases/tag/v11.0.0">v11.0.0</a> of <a href="https://github.com/ember-cli/eslint-plugin-ember">eslint-plugin-ember</a>. Aside from housekeeping, there's better support for ESLint v8 and improvements to the <a href="https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/no-array-prototype-extensions.md">ember/no-array-prototype-extensions</a> rule.</p>
<p>👋 If you would like to get involved with linting and open source, there are a lot of options for contributing:</p>
<ul>
<li>Suggest an idea for a new lint rule to catch a common mistake or enforce a best practice (<a href="https://github.com/ember-cli/eslint-plugin-ember/issues/new">file new issue for eslint-plugin-ember</a> or <a href="https://github.com/ember-template-lint/ember-template-lint/issues/new">file new issue for ember-template-lint</a>)</li>
<li>Implement a new lint rule (see <a href="https://github.com/ember-cli/eslint-plugin-ember/issues?q=is%3Aissue+is%3Aopen+label%3A%22New+Rule%22">list of 25+ ideas for eslint-plugin-ember</a> or <a href="https://github.com/ember-template-lint/ember-template-lint/issues?q=is%3Aissue+is%3Aopen+label%3A%22New+Rule%22">list of 20+ ideas for ember-template-lint</a>)</li>
<li>Implement an autofixer for an existing rule (see <a href="https://github.com/ember-cli/eslint-plugin-ember/issues/1556">list of 5+ ideas for eslint-plugin-ember</a> or <a href="https://github.com/ember-template-lint/ember-template-lint/issues/2571">list of 10+ ideas for ember-template-lint</a>)</li>
</ul>
<!-- alex ignore just -->
<ul>
<li>Even just tweaking the documentation for a rule or fixing a small bug can have an impact and is always appreciated!</li>
</ul>
<hr />
<h2 id="emberaddonroundup">Ember Addon Roundup 🌐</h2>
<p>We’ve had several other addons and libraries across the Ember ecosystem release updates recently, here’s what you may have missed:</p>
<ul>
<li><a href="https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases/tag/v0.1.12">v0.1.12</a> of <a href="https://github.com/tailwindlabs/prettier-plugin-tailwindcss"><code>prettier-plugin-tailwindcss</code></a> now supports Glimmer / Handlebars.</li>
<li><a href="https://github.com/ember-engines/ember-engines/releases/tag/v0.8.23">v0.8.23</a> of <code>ember-engines</code> has been released by <a href="https://github.com/runspired">Chris Thoburn (@runspired)</a> with an improved testing API.</li>
<li><a href="https://github.com/NullVoxPopuli/ember-resources/releases">v5.1.0, v5.1.1, v5.2.0, v5.2.1</a> of <code>ember-resources</code> have been released by <a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> and the releases include a <code>cell</code> new utility for helping with more focused reactivity usage, a new <code>keepLatest</code> util and some bug fixes.</li>
<li><a href="https://github.com/Foodee/ember-foxy-forms/releases/tag/v2.31.0">v2.31.0</a> of <code>ember-foxy-forms</code> has been released by <a href="https://github.com/joegaudet">Joe Gaudet (@joegaudet)</a> with a new attribute that allows the form to scroll its parent container to the first field with an error and relaxation for the comparison in ff-abstract-select to allow for fuzzy comparison.</li>
<li><a href="https://github.com/prysmex/ember-eui/releases">v5.9.2, v5.10.0</a> of <code>ember-eui</code> have been released by <a href="https://github.com/betocantu93">Alberto Cantú Gómez (@betocantu93)</a> with a new super date picker component and css and checkbox validations.</li>
<li><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> has announced some improvements to <a href="https://github.com/NullVoxPopuli/limber"><code>limber</code></a>, an editor that allows live runnable demos for Ember and Glimmer. Using @codemirror as the main editor shortens the time-to-edit by a good amount and is more accessible for keyboard users, and even works on mobile.</li>
</ul>
<hr />
<h2 id="whiskeywebandwhatnotepisodewithnullvoxpopulihttpstwittercomshipshapecodestatus1553426907261292544"><a href="https://twitter.com/shipshapecode/status/1553426907261292544">Whiskey Web and Whatnot Episode with NullVoxPopuli 🔊</a></h2>
<p>There's another new episode of Whiskey Web and Whatnot that you might want to check out and it features <a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a>! 🔥</p>
<p><a href="https://github.com/rwwagner90">Robert Wagner (@rwwagner90)</a> and <a href="https://github.com/chuckcarpenter">Chuck Carpenter (@chuckcarpenter)</a> of Ship Shape chat with NullVox about NullVox's journey into Ember, comparing Ember to React without angering either side, why NullVox values Ember resources and has worked to create various libraries, what emerging tech NullVox is thrilled to be working, and more!</p>
<p>Listen to <a href="https://www.whiskeywebandwhatnot.fm/emerging-tech-a-resource-renaissance-and-embracing-ember-with-preston-sego/">the episode</a> today.</p>
<hr />
<h2 id="emberchessboardvideospart3httpstwittercomknownasilyastatus1552290159424569349s20ted_l2nyvrljuxydy2jkdxw"><a href="https://twitter.com/knownasilya/status/1552290159424569349?s=20&t=ED_L2NyVRLJuxYdY2jKdXw">Ember Chessboard Videos Part 3 📼</a></h2>
<p><a href="https://github.com/knownasilya">Ilya Radchenko (@knownasilya)</a> released the third part of his video series that runs through building an Ember.js chessboard.js app using an exciting new (alpha) scaffolding library called <a href="https://github.com/warp-drive-engineering/engage">Engage</a> that's authored by <a href="https://github.com/runspired">Chris Thoburn (@runspired)</a>!</p>
<p>Head on over to YouTube and check out <a href="https://www.youtube.com/watch?v=Lsbk9IAYFSk">part 3</a>!</p>
<hr />
<h2 id="migrateemberdatamodelstooctanehttpsdevtomichalbryximigrateemberdatamodelstooctaneipb"><a href="https://dev.to/michalbryxi/migrate-ember-data-models-to-octane-ipb">Migrate ember-data models to Octane 📓</a></h2>
<p>In case you haven't had a chance to check it out, you might want to look at a super helpful new blog post by <a href="https://github.com/MichalBryxi">Michal Bryxí (@MichalBryxi)</a> about how to migrate Ember Data models to Octane syntax given that codemods don't support this area of conversion.</p>
<p>Give <a href="https://dev.to/michalbryxi/migrate-ember-data-models-to-octane-ipb">the post</a> a read today!</p>
<hr />
<h2 id="effectsinemberhttpstwittercomnullvoxpopulistatus1553417252594241543"><a href="https://twitter.com/nullvoxpopuli/status/1553417252594241543">Effects in Ember 🙌</a></h2>
<p><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> recently tweeted about how to do Effects in Ember! Nullvox says they are essentially they are function calls, but with auto-tracking, but without the need to specify a list of dependencies.</p>
<hr />
<h2 id="preventloadflashinghttpstwittercomnullvoxpopulistatus1553184820418805762"><a href="https://twitter.com/nullvoxpopuli/status/1553184820418805762">Prevent Load Flashing ⚡️</a></h2>
<p><a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> also recently shared a one-line function, that prevents loading flashing when refreshing or loading new data. 😎</p>
<p>Checkout <a href="https://t.co/rUswdpKwlN">the example</a> today!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/dfreeman" rel="noopener noreferrer" target="_blank">Dan Freeman (@dfreeman)</a>, <a href="https://github.com/jalexakos" rel="noopener noreferrer" target="_blank">Josh Alexakos (@jalexakos)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/maxwondercorn" rel="noopener noreferrer" target="_blank">Gregg Martell (@maxwondercorn)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/StreakInTheSky" rel="noopener noreferrer" target="_blank">Ross Baquir (@StreakInTheSky)</a>, <a href="https://github.com/VincentMolinie" rel="noopener noreferrer" target="_blank">Vincent Molinié (@VincentMolinie)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/chadhietala" rel="noopener noreferrer" target="_blank">Chad Hietala (@chadhietala)</a>, <a href="https://github.com/halfbyte" rel="noopener noreferrer" target="_blank">Jan Krutisch (@halfbyte)</a>, <a href="https://github.com/CvX" rel="noopener noreferrer" target="_blank">Jarek Radosz (@CvX)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/ardeliatay" rel="noopener noreferrer" target="_blank">@ardeliatay</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/silentkdev" rel="noopener noreferrer" target="_blank">Andrew Knox (@silentkdev)</a>, <a href="https://github.com/kaermorchen" rel="noopener noreferrer" target="_blank">Stanislav Romanov (@kaermorchen)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/deanylev" rel="noopener noreferrer" target="_blank">Dean Levinson (@deanylev)</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/Sadeedpv" rel="noopener noreferrer" target="_blank">Sadeed pv (@Sadeedpv)</a>, <a href="https://github.com/ben-hamel" rel="noopener noreferrer" target="_blank">Ben Hamel (@ben-hamel)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/aliHafizji" rel="noopener noreferrer" target="_blank">Kauserali (@aliHafizji)</a>, <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">@patricklx</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/krisselden" rel="noopener noreferrer" target="_blank">Kris Selden (@krisselden)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/law-rence" rel="noopener noreferrer" target="_blank">@law-rence</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/charlesfries" rel="noopener noreferrer" target="_blank">Charles Fries (@charlesfries)</a>, and <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jared Galanis, Bryan Mishkin, the crowd and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-203</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-203</guid><pubDate>Sun, 21 Aug 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 204]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember Security Releases Blog Post 🔒,
Ember 4.8 released 🐹,
prettier-plugin-ember-template-tag released 🙌,
more-confetti-addon released 🥳,
Dive into modern <code>@ember-data</code> 🏗️,
Learn how to overwrite the default transition after authentication 🗝️,
Deprecation of Ember array prototype extensions 🧹,
Watch the movies 🎞,
Evolving Ember’s Major Version Process ⭕,
Announcing the Official TypeScript Types Public Preview 🔥,
Ember Resources Release 🎉</p>
<hr />
<h2 id="embersecurityreleasesblogposthttpsblogemberjscomember481released"><a href="https://blog.emberjs.com/ember-4-8-1-released">Ember Security Releases Blog Post 🔒</a></h2>
<p>Ember.js 3.24.7, 3.28.10, 4.4.4, 4.8.1, and 4.9.0-beta.3 were recently released to patch a security vulnerability for apps that pass untrusted input as paths to <code>EmberObject.setProperties</code> or <code>EmberObject.set</code>, or the corresponding standalone functions <code>setProperties</code> or <code>set</code>. Apps that do this may get surprising results that, in combination with other application bugs, could lead to cross-site scripting vulnerabilities.</p>
<p>Head on over to the <a href="https://blog.emberjs.com/ember-4-8-1-released">blog post</a> to read more about the security patch.</p>
<hr />
<h2 id="ember48releasedhttpsblogemberjscomember48released"><a href="https://blog.emberjs.com/ember-4-8-released">Ember 4.8 released 🐹</a></h2>
<p>Ember 4.8 was recently released!</p>
<p>This release included 1 new feature for Ember.js that provides an opt-in preview of Ember's official TypesScript types, one bug fix for Ember.js, adds a few new features for EmberCLI and 4 bug fixes for Ember CLI.</p>
<p>Ember Data 4.8 was also recently released and includes a number of bug fixes and several new features including preventing backtracking render errors, adding <code>identifier</code> data to the <code>Reference</code> public API, and enhanced logging options for debugging. The release details can be found <a href="https://github.com/emberjs/data/releases/tag/v4.8.2">here</a>.</p>
<p>Head on over to the <a href="https://blog.emberjs.com/ember-4-8-released">4.8 release blog post</a> and give it a read today!</p>
<hr />
<h2 id="prettierpluginembertemplatetagreleasedhttpstwittercomhm_krystanstatus1588313200919216129"><a href="https://twitter.com/HM_Krystan/status/1588313200919216129">prettier-plugin-ember-template-tag released 🙌</a></h2>
<!-- alex ignore just-->
<p><a href="https://github.com/gitKrystan">Krystan HuffMenne (@gitKrystan)</a> just released <code>prettier-plugin-ember-template-tag</code> for prettifying your <code>&lt;template&gt;</code> tags in both <code>.gjs</code> and <code>.gts</code> files!</p>
<p>Go check out the <a href="https://github.com/gitKrystan/prettier-plugin-ember-template-tag">repo</a> today.</p>
<hr />
<h2 id="moreconfettiaddonreleasedhttpstwittercomagvanherwijnenstatus1588260038107226112s46t2kcbfrqjichoravvi3uwsa"><a href="https://twitter.com/agvanherwijnen/status/1588260038107226112?s=46&t=2KcBfrqJichoraVvI3uWSA">more-confetti-addon released 🥳</a></h2>
<p><a href="https://github.com/MinThaMie">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a> announced the release of <code>more-confetti-addon</code>, an addon that provides a helper to call the <a href="https://www.npmjs.com/package/canvas-confetti">canvas-confetti package</a> in your Ember templates!</p>
<p>Check out the <a href="https://github.com/MinThaMie/more-confetti-addon#readme">repo</a> and the <a href="https://more-ember-confetti.netlify.app/">docs page</a> today!</p>
<hr />
<h2 id="diveintomodernemberdatapart1httpsblogluxname2diveintoemberdata1"><a href="https://blog.lux.name/2-dive-into-ember-data-1/">🏗️ Dive into modern <code>@ember-data</code> - part 1</a></h2>
<p>In a series of blog posts, <a href="https://github.com/luxferresum">Lukas Kohler (@luxferrsum)</a> talks about the future of <code>@ember-data</code> and how to use it from the perspective of someone that didn’t develop it. In the <a href="https://blog.lux.name/2-dive-into-ember-data-1/">first blog post</a>, <a href="https://github.com/luxferresum">Lukas</a> explains how to build your <strong>own</strong> <code>@ember-data/model</code> and use the new <code>@ember-data</code> APIs: <code>Schema</code> and <code>RecordData</code>.</p>
<hr />
<!-- alex ignore simple -->
<h2 id="embersimpleauthhowtooverwritethedefaulttransitionafterauthenticationhttpssabindevembersimpleauthhowtooverwritethedefaulttransitionafterauthentication"><a href="https://sabin.dev/ember-simple-auth-how-to-overwrite-the-default-transition-after-authentication">🗝️ Ember Simple Auth - how to overwrite the default transition after authentication</a></h2>
<!-- alex ignore simple -->
<p>This blog post by <a href="https://github.com/herzzanu">Sabin Hertanu (@herzzanu)</a> will cover how to protect your routes, get rid of Ember Simple Auth mixins and how you can overwrite the default transitions defined in Ember Simple Auth. If you are still using the Ember Simple Auth mixins follow the steps in the <a href="https://sabin.dev/ember-simple-auth-how-to-overwrite-the-default-transition-after-authentication">blog post</a> to migrate away from them and get rid of <strong>all</strong> deprecation warnings.</p>
<hr />
<h2 id="deprecationofemberarrayprototypeextensionshttpsrfcsemberjscomid0848deprecatearrayprototypeextensions"><a href="https://rfcs.emberjs.com/id/0848-deprecate-array-prototype-extensions/">Deprecation of Ember array prototype extensions 🧹</a></h2>
<!-- alex ignore Hang -->
<p>A long-awaited <a href="https://rfcs.emberjs.com/id/0848-deprecate-array-prototype-extensions/">RFC</a> written by <a href="https://github.com/smilland">Hang Li (@smilland)</a> to deprecate Ember array prototype extensions was recently <a href="https://github.com/emberjs/rfcs/pull/848">merged</a>. Prototype extensions now come <a href="https://github.com/ember-cli/ember-cli/pull/10017">disabled</a> by default as of ember-cli <a href="https://github.com/ember-cli/ember-cli/releases/tag/v4.9.0-beta.0">v4.9.0-beta.0</a>.</p>
<p><a href="https://github.com/tgvrssanthosh">Santhosh Venkata Rama Siva Thanakala Gani (@tgvrssanthosh)</a> has implemented an auto-fixer for the <a href="https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/no-array-prototype-extensions.md">ember/no-array-prototype-extensions</a> lint rule which works for all Ember array prototype extensions that do not involve reactivity in <a href="https://github.com/ember-cli/eslint-plugin-ember/releases/tag/v11.1.0">v11.1.0</a> of <a href="https://github.com/ember-cli/eslint-plugin-ember">eslint-plugin-ember</a>. Try enabling the rule in your codebase and running the autofixer. There's also an auto-fixable <a href="https://github.com/ember-template-lint/ember-template-lint">ember-template-lint</a> version of <a href="https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-array-prototype-extensions.md">no-array-prototype-extensions</a> to try out.</p>
<hr />
<h2 id="emberfestvideosarelivehttpsyoutubecomplaylistlistpln4spdlosvkta8pygcgklo5asqnz0fiwv"><a href="https://youtube.com/playlist?list=PLN4SpDLOSVkTA8pYgcgKlo5AsQnZ0fiWV">🎞 EmberFest videos are live!</a></h2>
<p>Last September a group of Emberistas gathered in Paris to enjoy the <a href="https://emberfest.eu">latest edition of EmberFest</a>. The talks of this awesome hybrid event are now live on <a href="https://youtube.com/playlist?list=PLN4SpDLOSVkTA8pYgcgKlo5AsQnZ0fiWV">YouTube</a>. So if you missed a talk because of timezone struggles, want to watch your own amazing performance or are interested in the talks in general, go check <a href="https://youtube.com/playlist?list=PLN4SpDLOSVkTA8pYgcgKlo5AsQnZ0fiWV"><strong>them</strong></a> out right now!</p>
<hr />
<h2 id="evolvingembersmajorversionprocesshttpsblogemberjscomevolvingembersmajorversionprocess"><a href="https://blog.emberjs.com/evolving-embers-major-version-process">Evolving Ember’s Major Version Process ⭕</a></h2>
<p>Starting in the current 4.0 cycle, Ember major versions will be 18 months long, running from the <code>.0</code> release up to the <code>.12</code> release, and then starting a new major version as outlined in <a href="https://rfcs.emberjs.com/id/0830-evolving-embers-major-version-process/">RFC 0830</a>. This means that you can expect 5.0 in May 2023, 6.0 in November 2024, 7.0 in May 2026, and so on.</p>
<p>While this is a significant shift in how we think about <em>major</em> versions in Ember, there are a lot of things which remain unchanged:</p>
<ul>
<li><strong>Our approach to minor releases is not changing.</strong> We will keep releasing on the same steady cadence. Features will be in, or not, based on whether they’re ready.</li>
<li><strong>Our approach to Long Term Support releases is not changing.</strong> That means that every major version will have 3 LTS releases over its life: the <code>.4</code>, <code>.8</code>, and <code>.12</code> releases.</li>
<li><strong>Our approach to Editions is not changing.</strong> Similar to what we did with Octane, we will release Polaris and any future edition in a minor release, when it is fully ready.</li>
<li><strong>Our approach to breaking changes is not changing.</strong> We will not be making more breaking changes because of this policy, and we will not make breaking changes without clear migration paths. We have also committed not to introduce new deprecations targeting the next major after the <code>.10</code> release of the current major.</li>
</ul>
<p>This change enables Ember to have a predictable cadence for major versions similar to what we have had for minor versions. Read more about this change in the full <a href="https://blog.emberjs.com/evolving-embers-major-version-process">blog post</a>.</p>
<hr />
<h2 id="announcingtheofficialtypescripttypespublicpreviewhttpsblogemberjscomannouncingofficialtypescripttypespublicpreview"><a href="https://blog.emberjs.com/announcing-official-typescript-types-public-preview/">Announcing the Official TypeScript Types Public Preview 🔥</a></h2>
<p><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> wrote a <a href="https://blog.emberjs.com/announcing-official-typescript-types-public-preview/">post</a> on how Ember is shipping a public preview of the official TypeScript support for the framework itself. Anyone using TypeScript with Ember 4.8.0 Beta 2 or later can opt into using these preview types by removing the corresponding <code>@types</code> packages and adding the following import in your <code>types/&lt;your app&gt;/index.d.ts</code> file:</p>
<pre><code class="js language-js">import 'ember-source/types';
import 'ember-source/types/preview';
</code></pre>
<p>Note there is a known issue when using the <code>@types/ember-data</code> packages which are not compatible with these types because they assume the presence of many of the Ember Classic types that were removed in this migration. If you are using Ember Data with TypeScript, you will need to wait for a future update. The key difference between the stable and preview types is: our stable types must be generated from Ember's own TypeScript source code, while the preview types are hand-written type definitions. All public API remains supported however there will only be minimal support for Ember Classic APIs around class definitions (see <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan/">RFC 800</a> for more details).</p>
<hr />
<h2 id="emberresourcesreleasehttpstwittercomnullvoxpopulistatus1568694246521319424"><a href="https://twitter.com/nullvoxpopuli/status/1568694246521319424">Ember Resources Release 🎉</a></h2>
<p><a href="https://github.com/gossi">Thomas Gossmann (@gossi)</a> together with <a href="https://github.com/NullVoxPopuli">NullVoxPopuli (@NullVoxPopuli)</a> released a new version of <a href="https://github.com/NullVoxPopuli/ember-resources">ember-resources</a>, an addon that implements the <a href="https://ember-resources.pages.dev/#what-is-a-resource">Resource pattern</a>. The new release starting in <a href="https://github.com/NullVoxPopuli/ember-resources/releases/tag/v5.4.0">v5.4.0</a> adds the "owner" (app/engine instance) to function-based resources so now resources can access services, or whatever else is in the registry.</p>
<pre><code class="js language-js">const myResource = resource(({ on, owner }) =&gt; {
  let foo = owner.lookup('service:foo');

  return () =&gt; foo.someValue;
});
</code></pre>
<p>Try it out today by <a href="https://ember-resources.pages.dev/#installation">installing</a> it in your app!</p>
<hr />
<h2 id="emberqunit600releasehttpsgithubcomemberjsemberqunitreleasestagv600"><a href="https://github.com/emberjs/ember-qunit/releases/tag/v6.0.0">Ember QUnit 6.0.0 Release 🚀</a></h2>
<p><a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> along with <a href="https://github.com/bertdeblock">Bert De Block (@bertdeblock)</a> and <a href="https://github.com/mydea">Francesco Novy (@mydea)</a> released ember-qunit v6.0.0, which adds full support for Ember v4, including <a href="https://github.com/ef4/ember-auto-import">ember-auto-import</a> v2, and drops support for Ember versions before v3.24, and fixes bugs around focus related tests.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/richgt" rel="noopener noreferrer" target="_blank">Rich Glazerman (@richgt)</a>, <a href="https://github.com/halfbyte" rel="noopener noreferrer" target="_blank">Jan Krutisch (@halfbyte)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/tniezurawski" rel="noopener noreferrer" target="_blank">Tomek Nieżurawski (@tniezurawski)</a>, <a href="https://github.com/jsantos42" rel="noopener noreferrer" target="_blank">João Almeida Santos (@jsantos42)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/arafatiqbal" rel="noopener noreferrer" target="_blank">Arafat Iqbal (@arafatiqbal)</a>, <a href="https://github.com/zhanwang626" rel="noopener noreferrer" target="_blank">Zhan Wang (@zhanwang626)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/tben" rel="noopener noreferrer" target="_blank">Ben Tidy (@tben)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/WoodLeg" rel="noopener noreferrer" target="_blank">@WoodLeg</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/knownasilya" rel="noopener noreferrer" target="_blank">Ilya Radchenko (@knownasilya)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/zeppelin" rel="noopener noreferrer" target="_blank">Gabor Babicz (@zeppelin)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/redlizard" rel="noopener noreferrer" target="_blank">@redlizard</a>, <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">Patrick Pircher (@patricklx)</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/rondale-sc" rel="noopener noreferrer" target="_blank">Jonathan (@rondale-sc)</a>, <a href="https://github.com/tgvrssanthosh" rel="noopener noreferrer" target="_blank">Santhosh Venkata Rama Siva Thanakala Gani (@tgvrssanthosh)</a>, <a href="https://github.com/geneukum" rel="noopener noreferrer" target="_blank">Geordan Neukum (@geneukum)</a>, <a href="https://github.com/Windvis" rel="noopener noreferrer" target="_blank">Sam Van Campenhout (@Windvis)</a>, <a href="https://github.com/chadhietala" rel="noopener noreferrer" target="_blank">Chad Hietala (@chadhietala)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/misterbyrne" rel="noopener noreferrer" target="_blank">Adam Byrne (@misterbyrne)</a>, <a href="https://github.com/SkoebaSteve" rel="noopener noreferrer" target="_blank">Steef Janssen (@SkoebaSteve)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/hjdivad" rel="noopener noreferrer" target="_blank">David J. Hamilton (@hjdivad)</a>, and <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jared Galanis, Anne-Greeth Schot-van Herwijnen, Bryan Mishkin, Chris Ng and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-204</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-204</guid><pubDate>Sun, 06 Nov 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 205]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Ember 4.10 released 🐹,
ember-template-lint 5.0 released 🧹,
EmberConf News 🎤,
New addons ✨,
Updated addons 📬,
Ember 4.0+ upgrade survey 🐹,
Call for support with TS support in Ember 📦,
Wacky Tricks We Use in Publishing TypeScript Types ▶️,
A new codemod to migrate addons to v2 format 📣</p>
<hr />
<h2 id="ember410releasedhttpsblogemberjscomemberreleased410"><a href="https://blog.emberjs.com/ember-released-4-10">Ember 4.10 released 🐹</a></h2>
<p>Ember 4.10 was recently released!</p>
<p>This release included several new features for Ember.js including the introduction of the <code>@ember/owner</code> package as specified in the <a href="https://rfcs.emberjs.com/id/0821-public-types/">API for Type-Only Imports RFC</a>, 2 bug fixes for Ember.js and several deprecations. The release also includes 5 new features for Ember CLI.</p>
<p>Head on over to the <a href="https://blog.emberjs.com/ember-released-4-10">4.10 release blog post</a> and give it a read today!</p>
<hr />
<h2 id="embertemplatelint500releasedhttpsgithubcomembertemplatelintembertemplatelintreleasestagv500"><a href="https://github.com/ember-template-lint/ember-template-lint/releases/tag/v5.0.0">ember-template-lint 5.0.0 released 🧹</a></h2>
<p><a href="https://github.com/ember-template-lint/ember-template-lint/releases/tag/v5.0.0">Version 5.0</a> has been released for <a href="https://github.com/ember-template-lint/ember-template-lint">ember-template-lint</a>, the linter for best practices with Ember handlebars templates.</p>
<p>The key changes include:</p>
<ul>
<li>Linting embedded templates by default</li>
<li>Adding nearly a dozen rules to the <code>recommended</code> config</li>
<li>Changing a few rule names and option defaults</li>
<li>Dropping support for old versions of Node</li>
</ul>
<hr />
<h2 id="emberconfnews">🎤 EmberConf News</h2>
<p>We know folks are getting excited about EmberConf and might be wondering when it's happening. Currently, we're still getting our ducks in a row. After three years of virtual EmberConf, we're working out a way to match everybody's expectations around a possible hybrid conference. In the meantime, you can definitely keep working on those proposals and we’ll release more details as soon as we can. Historically, EmberConf has happened in March, but this time it will be later in the year. Hope to see you there!</p>
<hr />
<h2 id="thenewaddonsontheblock">✨ The new addons on the block</h2>
<ul>
<li><a href="https://ember-blur.netlify.app/">ember-blur</a> - <a href="https://github.com/geneukum">Geordan Neukum (@geneukum)</a> provides us an Ember modifier that allows you to blur an element dynamically.</li>
<li><a href="https://github.com/IgnaceMaes/ember-tsparticles">ember-tsparticles</a> - <a href="https://github.com/IgnaceMaes">Ignace Maes (@IgnaceMaes)</a> made this addon that creates an Ember.js component for using tsParticles. This allows you to create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as animated backgrounds for your website.</li>
</ul>
<!-- alex ignore simple -->
<ul>
<li><a href="https://github.com/mrloop/ember-metrics-simple-analytics">ember-metrics-simple-analytics</a> - <a href="https://github.com/mrloop">Ewan McDougall (@mrloop)</a> released the first version of this ember-metrics adapter for <a href="https://simpleanalytics.com/">Simple Analytics</a>.</li>
</ul>
<hr />
<h2 id="addonupdates">📬 Addon updates</h2>
<ul>
<li><a href="https://github.com/esbanarango/ember-model-validator/releases/tag/v4.4.0">ember-model-validator v4.4.0</a> is now fully compatible with EmberJS 4.0+, the latest ember-data and adds Typescript support.</li>
<li><a href="https://github.com/ijlee2/ember-container-query/releases">ember-container-query v3.2.0</a> now supports Glint users. The PR commits (<a href="https://github.com/ijlee2/ember-container-query/pull/140/commits">#140</a> &amp; <a href="https://github.com/ijlee2/ember-container-query/pull/141/commits">#141</a>) serve as learning material along with the <a href="https://typed-ember.gitbook.io/glint/">official documentation</a>.</li>
<li><a href="https://github.com/emberjs/ember-test-helpers/releases/tag/v2.9.3">ember-test-helpers v2.9.3</a> brings you TS support, performance improvements, bug fixes and documentation improvements.</li>
<li><a href="https://github.com/elwayman02/ember-user-activity">ember-user-activity v7.0.0</a> adds EmberJS 4.0+ support thanks to <a href="https://github.com/mrloop">Ewan McDougall (@mrloop)</a> helping with the maintainance.</li>
<li><a href="https://github.com/elwayman02/ember-scroll-modifiers">ember-scroll-modifiers v5.0.0</a> supports Ember 4.9, is fully migrated to the <a href="https://github.com/ember-modifier/ember-modifier">ember-modifier v4 API</a>, and adds a new feature for specifying a nested scroll container target for the scroll-into-view modifier.</li>
</ul>
<hr />
<h2 id="ember40whatisblockingyouhttpsdocsgooglecomformsde1faipqlsd6eb519glph_bpdrrouqkhh1kjcqqdbra6c_vgtuq6l7qhqviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLSd6EB519gLpH_bpDRrOUQkHH1kJcqqdbRA6c_-vGTUq6L7QHQ/viewform">🐹 Ember 4.0: What is blocking you?</a></h2>
<p>Ember 4.0 has been around for a bit now and we would love to know what is keeping you from upgrading. Fill in this <a href="https://docs.google.com/forms/d/e/1FAIpQLSd6EB519gLpH_bpDRrOUQkHH1kJcqqdbRA6c_-vGTUq6L7QHQ/viewform">short survey</a> so that we might be able to improve the experience.</p>
<hr />
<h2 id="weneedyoufortypescriptsupporthttpsgithubcomemberjsemberjsissues20162"><a href="https://github.com/emberjs/ember.js/issues/20162">📦 We need you for TypeScript support!</a></h2>
<p>Want to help get Ember’s official TS support out the door? <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan">RFC 800</a> describes the Typescript adoption plan and you can <a href="https://github.com/emberjs/ember.js/issues/20162">sign up</a> to help with issues all across our codebase! You can always check the <a href="https://discord.com/channels/480462759797063690/484421406659182603"><code>#topic-typescript</code> channel</a> on our <a href="https://discord.gg/emberjs">Discord server</a>.</p>
<hr />
<h2 id="acceleratingcodedeliveryby97withyarnworkspaceshttpsengineeringlinkedincomblog2022acceleratingcodedeliveryby97withyarnworkspaces"><a href="https://engineering.linkedin.com/blog/2022/accelerating-code-delivery-by-97--with-yarn-workspaces">🚀 Accelerating Code Delivery By 97% With Yarn Workspaces</a></h2>
<p><a href="https://github.com/elwayman02">Jordan Hawker (@elwayman02)</a> details in this <a href="https://engineering.linkedin.com/blog/2022/accelerating-code-delivery-by-97--with-yarn-workspaces">blogpost</a> how they moved to Yarn Workspaces and how it improved the lead time for delivering commits to their deployment pipeline, from 39 hours to 125 mins. Yarn workspaces enabled the evolution of the application architecture without sacrificing the benefits of their previous multi-repo strategy. This <a href="https://engineering.linkedin.com/blog/2022/accelerating-code-delivery-by-97--with-yarn-workspaces">post</a> will give you the insight to see if this solution might benefit you.</p>
<blockquote>
  <p>"While one approach may serve well at a given point in time, there is no one-size-fits-all solution."</p>
</blockquote>
<hr />
<h2 id="wackytricksweuseinpublishingtypescripttypeshttpswwwyoutubecomwatchvvuf3gyhos"><a href="https://www.youtube.com/watch?v=VuF3GY-Ho-s">▶️ Wacky Tricks We Use in Publishing TypeScript Types</a></h2>
<p>In this <a href="https://www.youtube.com/watch?v=VuF3GY-Ho-s">YouTube video</a>, <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> and <a href="https://github.com/asakusuma">Asa Kusuma (@asakusuma)</a> discussed how we are publishing TypeScript types for Ember. Chris discusses how it is difficult for TypeScript to resolve types for <a href="https://www.npmjs.com/package/ember-source">ember-source</a> given the public API for Ember is usually not imported directly from <code>ember-source</code> but from packages such as <code>@ember/utils</code> or <code>@ember/object</code>. Learn more by watching the full video on <a href="https://www.youtube.com/watch?v=VuF3GY-Ho-s">YouTube</a> where “despite all the shenanigans” we are able to get Ember’s type to be “stable” and publish from Ember’s own TS source code.</p>
<p>Do you want to contribute to help get Ember’s <a href="https://rfcs.emberjs.com/id/0800-ts-adoption-plan/">official TypeScript support</a> out the door? Check out this <a href="https://github.com/emberjs/ember.js/issues/20162">quest issue</a> on GitHub and sign up for a task!</p>
<hr />
<h2 id="anewcodemodtomigrateaddonstov2formathttpsgithubcomijlee2embercodemodv1tov2"><a href="https://github.com/ijlee2/ember-codemod-v1-to-v2">📣 A new codemod to migrate addons to v2 format</a></h2>
<p>With one command, you can get started with migrating Ember addons to v2 format:</p>
<pre><code class="sh language-sh">npx ember-codemod-v1-to-v2
</code></pre>
<p><a href="https://github.com/ijlee2/ember-codemod-v1-to-v2">ember-codemod-v1-to-v2</a> helps you meet the latest standards set by <a href="https://github.com/embroider-build/addon-blueprint">@embroider/addon-blueprint</a>. The codemod takes care of moving files and updating references to the moved files, while you remain in charge of re-configuring the packages.</p>
<p><a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a> hopes that <code>ember-codemod-v1-to-v2</code>, along with <a href="https://github.com/NullVoxPopuli/ember-addon-migrator">ember-addon-migrator</a>, can help you push Embroider forward. Check out <a href="https://github.com/ijlee2/ember-container-query/pull/151">ember-container-query</a> for a real-life example.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/SkoebaSteve" rel="noopener noreferrer" target="_blank">Steef Janssen (@SkoebaSteve)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/jiangzj1008" rel="noopener noreferrer" target="_blank">@jiangzj1008</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/Windvis" rel="noopener noreferrer" target="_blank">Sam Van Campenhout (@Windvis)</a>, <a href="https://github.com/rwjblue" rel="noopener noreferrer" target="_blank">Robert Jackson (@rwjblue)</a>, <a href="https://github.com/geneukum" rel="noopener noreferrer" target="_blank">Geordan Neukum (@geneukum)</a>, <a href="https://github.com/arafatiqbal" rel="noopener noreferrer" target="_blank">Arafat Iqbal (@arafatiqbal)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/hjdivad" rel="noopener noreferrer" target="_blank">David J. Hamilton (@hjdivad)</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/mikrostew" rel="noopener noreferrer" target="_blank">Michael Stewart (@mikrostew)</a>, <a href="https://github.com/emberjs-rfcs-bot" rel="noopener noreferrer" target="_blank">@emberjs-rfcs-bot</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/dknutsen" rel="noopener noreferrer" target="_blank">Dan Knutsen (@dknutsen)</a>, <a href="https://github.com/candunaj" rel="noopener noreferrer" target="_blank">Stanislav Dunajcan (@candunaj)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/gitKrystan" rel="noopener noreferrer" target="_blank">Krystan HuffMenne (@gitKrystan)</a>, <a href="https://github.com/tniezurawski" rel="noopener noreferrer" target="_blank">Tomek Nieżurawski (@tniezurawski)</a>, <a href="https://github.com/rpemberton" rel="noopener noreferrer" target="_blank">rpemberton (@rpemberton)</a>, <a href="https://github.com/BoussonKarel" rel="noopener noreferrer" target="_blank">@BoussonKarel</a>, <a href="https://github.com/olenderhub" rel="noopener noreferrer" target="_blank">Hubert Olender (@olenderhub)</a>, <a href="https://github.com/joancc" rel="noopener noreferrer" target="_blank">Joan Cejudo (@joancc)</a>, <a href="https://github.com/rwwagner90" rel="noopener noreferrer" target="_blank">Robert Wagner (@rwwagner90)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/canrozanes" rel="noopener noreferrer" target="_blank">Can Rozanes (@canrozanes)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/mkszepp" rel="noopener noreferrer" target="_blank">@mkszepp</a>, <a href="https://github.com/leoeuclids" rel="noopener noreferrer" target="_blank">Leo Euclides (@leoeuclids)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/boris-petrov" rel="noopener noreferrer" target="_blank">Boris Petrov (@boris-petrov)</a>, <a href="https://github.com/fivetanley" rel="noopener noreferrer" target="_blank">Stanley Stuart (@fivetanley)</a>, <a href="https://github.com/jelhan" rel="noopener noreferrer" target="_blank">Jeldrik Hanschke (@jelhan)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/charlesfries" rel="noopener noreferrer" target="_blank">Charles Fries (@charlesfries)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, and <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jared Galanis, Bryan Mishkin, Anne-Greeth Schot-van Herwijnen, Chris Ng, Isaac Lee and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-205</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-205</guid><pubDate>Sun, 29 Jan 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 206]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Polaris Update 🚀,
EmberConf 2023 🎙️,
EmberFest 2023 🇪🇸,
Open Core Team Meetings 💻 ,
a modern way to write codemods 🤖,
a codemod to help introduce Glint ✨,
Ember Inspector in Safari 🔎,
release of prettier-plugin-ember-template-tag 🔥,
make VS Code ready for EmberJS 📦,
Europe Ember.js Video 🇪🇺,
start contributing today 🐹</p>
<hr />
<h2 id="updatethepolariseditionofemberhttpsgithubcomorgsemberjsprojects9"><a href="https://github.com/orgs/emberjs/projects/9">🚀 Update: The Polaris Edition of Ember</a></h2>
<p>We’re trying something new with this edition of Ember-- using a GitHub Project! <a href="https://github.com/orgs/emberjs/projects/9">The Polaris Project</a> is not only a great way to keep track of the active updates to the work being done for this edition, but also look for ways that you can participate!</p>
<p>While we are still working to define success for this edition (stay tuned for that!), using standard project management has been an improved way to give more transparency to our work and our hypothesis is that it will also increase community member participation as a result.</p>
<p>The Polaris edition intends not only to continue deprecating Ember features that now have native web equivalents, but also re-work the router to better suit the needs of the modern web application. We’ll also see a new, long-requested framework feature come to life: a CSS solution! Yet one more thing you won’t have to worry about (unless you want to!).</p>
<p>Anyway, check out the <a href="https://github.com/orgs/emberjs/projects/9">Polaris Project</a> board for yourself, and join the open meetings (look for the <a href="https://discord.gg/VzKEzH8Q?event=1137029571976372284">EmberJS Spec Meeting</a> event on Discord) if you want to get involved! If we all participate, we can make these ideas happen.</p>
<hr />
<h2 id="emberconf2023httpswwwemberconfcom"><a href="https://www.emberconf.com">🎙️ EmberConf 2023</a></h2>
<p>Two weeks ago, on the 20th and 21st of July about <strong>150 Emberistas</strong> met in Portland (OR) for the first in-person EmberConf since COVID-19. It was amazing to see so many people getting to know each other and sharing knowledge about our framework, EmberJS. Hopefully, you’ve enjoyed the live stream with the <a href="https://www.emberconf.com/speakers">great line-up of speakers</a>. If you have missed it or want to watch something back, the <a href="https://www.youtube.com/playlist?list=PL4eq2DPpyBbn9eFgZIxo23_q9sAtqGtvt">playlist with all talks is released on YouTube</a>. On the <a href="https://discord.gg/wks7HMrG">Discord server</a>, each talk got its own channel, in case you want to get in contact about that talk specifically. Let's get <strong>inspired</strong>!</p>
<hr />
<h2 id="emberfest2023httpsemberfesteu"><a href="https://emberfest.eu">🇪🇸 EmberFest 2023</a></h2>
<p>After a great EmberConf, next up is <a href="https://emberfest.eu">EmberFest</a> on the 21st and 22nd of September in <strong>Madrid, Spain</strong>. EmberFest is the European Community Ember Conference. If you’re looking for updates on the latest and greatest in Ember and Glimmer this is the place to be. Do you want to get an impression of EmberFest, check out the <a href="https://youtu.be/hvg35gS1Xjo">Paris highlight video of last year's EmberFest</a>. You can attend this conference in person and remotely, so get your <a href="https://emberfest.eu/?tito=%2Femberfest%2Femberfest-2023%2Fen%2Fregistrations%2Fnew%3Fprefill%3D%257B%257D">tickets</a> <strong>now</strong>! Ed Faulkner (<a href="https://github.com/ef4">@ef4</a>) and Mel Sumner (<a href="https://github.com/melsumner">@melsumner</a>) are already confirmed speakers.</p>
<hr />
<h2 id="opencoreteammeetings">💻 Open Core Team Meetings</h2>
<!--alex ignore easy-->
<p>Starting last week, the EmberJS team meetings are open to the public on our <a href="https://discord.gg/emberjs">Discord server</a>. This will increase the <strong>visibility</strong> and <strong>transparency</strong> around the process and progress within the framework and community. It will also allow you to work together more easily, provide input and get up to date. Check out the events in the <a href="https://discord.gg/emberjs">Discord server</a> for the time (in your timezone) and dates.</p>
<ul>
<li>Monday - <a href="https://discord.gg/jRGtH96JfS?event=1135596295210410024">Learning team</a></li>
<li>Tuesday - <a href="https://discord.gg/jRGtH96JfS?event=1136304805673971793">Tooling team (combination of CLI & Embroider)</a></li>
<li>Thursday - <a href="https://discord.gg/jRGtH96JfS?event=1137029571976372284">Spec meeting</a></li>
<li>Friday - <a href="https://discord.gg/jRGtH96JfS?event=1134855271823441960">RFC review</a>, <a href="https://discord.gg/jRGtH96JfS?event=1134855268480602113">EmberData meeting</a></li>
</ul>
<hr />
<h2 id="amodernwaytowritecodemodshttpsgithubcomijlee2codemodutils"><a href="https://github.com/ijlee2/codemod-utils">🤖 A modern way to write codemods</a></h2>
<p>A few EmberConf talks brought up the need for more codemods. Isaac Lee (<a href="https://github.com/ijlee2">@ijlee2</a>) has been working on <a href="https://github.com/ijlee2/codemod-utils"><code>@codemod-utils</code></a>, a set of tools and conventions for writing codemods, and a CLI (command-line interface) to help you get started:</p>
<pre><code class="sh language-sh">npx @codemod-utils/cli --name &lt;your-codemod-name&gt;
</code></pre>
<!-- alex ignore simple -->
<p><code>@codemod-utils</code> encourages taking small and simple steps, as they are key to writing codemods that can be maintained and extended. Isaac, in the talk "<a href="https://crunchingnumbers.live/2023/07/20/in-1-year">In 1 Year</a>," explained:</p>
<blockquote>
  <p>My hope is, we can lower the [entry] barrier enough that, if a person can write a function in Node.js, then they can start writing a codemod.</p>
</blockquote>
<p>To learn how to write a codemod, check out <a href="https://github.com/ijlee2/codemod-utils#tutorials">the main tutorial</a> and <a href="https://github.com/ijlee2/codemod-utils#codemods-written-with-codemod-utils">the codemods written with <code>@codemod-utils</code></a>. If you want to learn from Isaac on how to utilize codemods to bring your projects up to date, check out Isaac's <a href="https://www.youtube.com/watch?v=qXq67sQxdCU&list=PL4eq2DPpyBbn9eFgZIxo23_q9sAtqGtvt&index=10">amazing talk at EmberConf 2023</a>!</p>
<hr />
<h2 id="codemodtohelpintroduceglinthttpsgithubcomijlee2embercodemodargstosignature"><a href="https://github.com/ijlee2/ember-codemod-args-to-signature">✨ Codemod to help introduce Glint</a></h2>
<p>To introduce Glint, you will need to write the <a href="https://typed-ember.gitbook.io/glint/environments/ember/component-signatures">signature</a> and <a href="https://typed-ember.gitbook.io/glint/environments/ember/template-registry">template registry</a> for each component. This can be an error-prone, onerous task for large projects.</p>
<p>You can automate the required change by running <a href="https://github.com/ijlee2/ember-codemod-args-to-signature"><code>ember-codemod-args-to-signature</code></a>.</p>
<pre><code class="sh language-sh"># Apps
npx ember-codemod-args-to-signature --src app/components

# V1 addons
npx ember-codemod-args-to-signature --src addon/components

# V2 addons
npx ember-codemod-args-to-signature --src src/components
</code></pre>
<p>The codemod will partially fill out signatures and template registries. It will also fix related code so that your project is consistent in syntax and follows Ember's naming conventions. If you've previously taken the effort to add <code>Args</code> to your components (the former way of defining the signature), the codemod will use what you already know to create <code>Signature</code>.</p>
<hr />
<h2 id="emberjsinspectorinsafarihttpsappsapplecomusappemberjsinspectorid6451499514mt12"><a href="https://apps.apple.com/us/app/emberjs-inspector/id6451499514?mt=12">🔎 EmberJS Inspector in Safari</a></h2>
<p><a href="https://github.com/robbiethewagner">Robbie Wagner (@RobbieTheWagner)</a> released our trusted EmberJS inspector to the <a href="https://apps.apple.com/us/app/emberjs-inspector/id6451499514?mt=12">Mac App Store</a>, so you can now also use it in <strong>Safari</strong>. If you run into bugs or have improvements, please reach out on <a href="https://github.com/emberjs/ember-inspector">GitHub</a>. You can contribute to the <a href="https://github.com/emberjs/ember-inspector">Ember Inspector</a> because it's an Ember app!</p>
<hr />
<h2 id="100releaseofprettierpluginembertemplatetaghttpsgithubcomgitkrystanprettierpluginembertemplatetagreleasestagv100"><a href="https://github.com/gitKrystan/prettier-plugin-ember-template-tag/releases/tag/v1.0.0">🔥 1.0.0 Release of prettier-plugin-ember-template-tag</a></h2>
<p><a href="https://github.com/gitKrystan">Krystan HuffMenne (@gitKrystan)</a> released 1.0.0 of <a href="https://github.com/gitKrystan/prettier-plugin-ember-template-tag">prettier-plugin-ember-template-tag</a> which supports <a href="https://prettier.io/blog/2023/07/05/3.0.0.html">Prettier 3.0.0</a>. The project, prettier-plugin-ember-template-tag, is a prettier plugin for formatting <a href="https://rfcs.emberjs.com/id/0779-first-class-component-templates/">Ember template tags</a> for both <code>.gjs</code> and <code>.gts</code> files.</p>
<p>If you are interested in contributing please check out the <a href="https://github.com/gitKrystan/prettier-plugin-ember-template-tag/issues">GitHub of this project</a>!</p>
<hr />
<h2 id="vscodeemberjsextensionpackhttpsmarketplacevisualstudiocomitemsitemnameembertoolingemberjs"><a href="https://marketplace.visualstudio.com/items?itemName=EmberTooling.emberjs">📦 VS Code EmberJS Extension Pack</a></h2>
<p>Is Visual Studio Code your editor of choice, <a href="https://github.com/evoactivity">Liam Potter (@evoactivity)</a> released a new version of the EmberJS Extension Pack.</p>
<p>This Extension Pack includes the following extensions:</p>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-glimmer-syntax">Glimmer Syntax for VS Code</a></li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=lifeart.vscode-ember-unstable">Stable Ember Language Server</a></li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint">ESLint</a></li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode">Prettier</a></li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig">Editor Config</a></li>
</ul>
<p>You can checkout the <a href="https://github.com/ember-tooling/vscode-ember-pack">extension pack on GitHub</a>. Time to make VS Code ready for EmberJS with one extension!</p>
<hr />
<h2 id="embereuropevideohttpswwwyoutubecomwatchv0kzm3ahgk84listpld8z0vnqiaiu6hjoe4h27djzpcwkmks"><a href="https://www.youtube.com/watch?v=0kzm3ahGK84&list=PLD-8Z0-VnQIAIU6hJoE4H27DjzpcWkMks">🇪🇺 Ember Europe Video</a></h2>
<p>If you didn't get a chance to watch the live-streamed Europe Ember.js meetup event from June 2023, you can now watch the ✨ awesome ✨ <a href="https://www.youtube.com/watch?v=0kzm3ahGK84&list=PLD-8Z0-VnQIAIU6hJoE4H27DjzpcWkMks">recorded video</a>.</p>
<p>The talk features a really cool talk by <a href="https://github.com/rlivsey">Richard Livsey (@rlivsey)</a> who shares the journey of building Intercom's Inbox! 🚀</p>
<p>Many thanks to the organizers and members of Europe Ember.js meetup for continuing to bring great Ember content!</p>
<hr />
<h2 id="contributingtotheframeworkandthecommunity">🐹 Contributing to the Framework and the Community</h2>
<p>If you are looking for a way to start contributing to EmberJS, check out the new <a href="https://discord.com/channels/480462759797063690/1131610462207873025">#new-contributors channel on Discord</a>. This channel is made for everyone who is looking for something to contribute to, and some guidance on how to get started. Does working on code feel a bit too overwhelming you can always reach out to the <a href="https://discord.com/channels/480462759797063690/485450546887786506">EmberTimes editors</a> to start writing for the <a href="https://github.com/ember-learn/ember-blog/">EmberTimes on GitHub</a>.</p>
<blockquote>
  <p>Ember works best when we <strong>all</strong> participate - Mel Sumner</p>
</blockquote>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank  <a href="https://github.com/halfbyte" rel="noopener noreferrer" target="_blank">Jan Krutisch (@halfbyte)</a>, <a href="https://github.com/leepfrog" rel="noopener noreferrer" target="_blank">Andy Tran (@leepfrog)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/robinborst95" rel="noopener noreferrer" target="_blank">Robin Borst (@robinborst95)</a>, <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">Patrick Pircher (@patricklx)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/RobbieTheWagner" rel="noopener noreferrer" target="_blank">Robbie Wagner (@RobbieTheWagner)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/boris-petrov" rel="noopener noreferrer" target="_blank">Boris Petrov (@boris-petrov)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/VincentMolinie" rel="noopener noreferrer" target="_blank">Vincent Molinié (@VincentMolinie)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/gitKrystan" rel="noopener noreferrer" target="_blank">Krystan HuffMenne (@gitKrystan)</a>, <a href="https://github.com/lifeart" rel="noopener noreferrer" target="_blank">Alex Kanunnikov (@lifeart)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/a13o" rel="noopener noreferrer" target="_blank">Andrew Pellerano (@a13o)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/jrjohnson" rel="noopener noreferrer" target="_blank">Jon Johnson (@jrjohnson)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/deanmarano" rel="noopener noreferrer" target="_blank">Dean Marano (@deanmarano)</a>, <a href="https://github.com/gabrielcsapo" rel="noopener noreferrer" target="_blank">Gabriel Csapo (@gabrielcsapo)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/survesh-vrl" rel="noopener noreferrer" target="_blank">Survesh (@survesh-vrl)</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/wycats" rel="noopener noreferrer" target="_blank">Yehuda Katz (@wycats)</a>, <a href="https://github.com/dhochbaum-dcp" rel="noopener noreferrer" target="_blank">@dhochbaum-dcp</a>, and <a href="https://github.com/nickschot" rel="noopener noreferrer" target="_blank">Nick Schot (@nickschot)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Anne-Greeth Schot-van Herwijnen, Isaac Lee, Melanie Sumner, Chris Ng, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-206</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-206</guid><pubDate>Fri, 04 Aug 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 207]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>EmberFest 2023 is a wrap 🇪🇸, Ember 5.3 is released 🚀, ember-shiki 🌈, Ember videos 🎞️, Whiskey, Web and Whatnot 🎙️, Addon releases ✨, Embroider addon audits 🧀</p>
<hr />
<h2 id="emberfest2023isawraphttpsemberfesteu"><a href="https://emberfest.eu/">🇪🇸 EmberFest 2023 is a wrap!</a></h2>
<p>EmberFest 2023 happened this past week and it was full of exciting talks that hopefully you were able to see in person or remotely. There were talks from Ed Faulkner (<a href="https://github.com/ef4">@ef4</a>), Chris Thoburn (<a href="https://github.com/runspired">@runspired</a>), Preston Sego (<a href="https://github.com/NullVoxPopuli">@NullVoxPopuli</a>) and more!</p>
<p>A huge thank you to all who were involved in coordinating and presenting and otherwise helping to put EmberFest together. We are already excited for next year's event 🎉🐹🔥🇪🇺!</p>
<p>EmberFest videos may be forthcoming at some point in the not too distant future hopefully 🤞. We'll post here in the Times if and when they are, so keep an eye out!</p>
<hr />
<h2 id="ember53isreleasedhttpsblogemberjscomemberreleased53"><a href="https://blog.emberjs.com/ember-released-5-3">🚀 Ember 5.3 is released</a></h2>
<p>Ember 5.3 has been released. There were a few deprecations for Ember and Ember CLI. Ember CLI now officially supports <code>--pnpm</code>🔥. EmberData shipped quite a bit of work around <code>RequestManager</code>.  For EmberData, 5.3 introduced builder utils, builders for <code>REST</code>, <code>ActiveRecord</code> and <code>JSON:API</code> requests as well as serialization utils for <code>JSON:API</code> requests ✨✨✨. There were also several deprecations for EmberData. For more detailed information go check out the <a href="https://blog.emberjs.com/ember-released-5-3">release blog post</a>!</p>
<hr />
<h2 id="rfcemberdatadeprecatelegacyfindersupporthttpsgithubcomemberjsrfcspull964"><a href="https://github.com/emberjs/rfcs/pull/964">RFC EmberData | deprecate legacy finder support</a></h2>
<p>The EmberData related RFC that proposes deprecating legacy finder support has been moved to exploring status! This is a significant change that deprecates methods on <code>store</code> and <code>model</code> that utilize non-request-manager request paradigms. These methods are no longer recommended in the face of the greater utility of <code>store.request</code> and the <code>RequestManager</code>. Head over to the <a href="https://github.com/emberjs/rfcs/pull/964">RFC</a> to participate and/or learn more!</p>
<p>This is also a friendly reminder that there are not one, but two (to accommodate as many schedules as possible), EmberJS RFC Review meetings that occur every week on Fridays and are open to the community. If you are interested in learning more, you should attend! Checkout the Events section of the Ember Discord server for specific times and information.</p>
<hr />
<h2 id="newaddonforsyntaxhighlightinginemberhttpsgithubcomignacemaesembershiki"><a href="https://github.com/IgnaceMaes/ember-shiki">🌈 New addon for syntax highlighting in Ember</a></h2>
<p>Have you ever wanted to show pretty code snippets in your Ember apps? Then today you're in luck. The new <a href="https://github.com/IgnaceMaes/ember-shiki">ember-shiki</a> addon was just released by Ignace Maes (<a href="https://github.com/IgnaceMaes">@IgnaceMaes</a>) which makes using the <a href="https://github.com/shikijs/shiki">Shiki</a> syntax highlighter in Ember a breeze. It is a modern v2 addon with TypeScript and Glint interfaces and has support for Fastboot. On top of that it comes with theming options, code block grouping, and line highlighting. Ember's new <code>.gjs</code> and <code>.gts</code> file formats are also supported out of the box.</p>
<p>Give it a try, for all your syntax highlighting needs!</p>
<hr />
<h2 id="learnmoreaboutemberwithvideos">🎞️ Learn more about Ember with videos</h2>
<p>When talking about the new things in Ember, Glint is a favourite topic. <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a>, together with <a href="https://github.com/dfreeman">Dan Freeman (@dfreeman)</a> are publishing a series of screencasts on this topic. Their first screencast has the amazing title: <a href="https://youtu.be/MLpP8D3cY7M?si=7ro6801LQZtkjaVT">You did WHAT with TypeScript?—Glint Architecture Overview</a>, and will explain the big picture of how the Glint project works. In their second screencast, <a href="https://www.youtube.com/watch?v=Xhv1jAV5cZI">Vacuous Lies: How the Glint/TypeScript transform works</a>, they dig into the details of how Glint transforms EmberJS and GlimmerJS templates into TypeScript and in the third installment, <a href="https://www.youtube.com/watch?v=6-TWGx8j9RU">Big Gamma Energy</a>, Chris and Dan go over components and the types that power them.</p>
<p>If you like more short bits of information checkout <a href="https://github.com/NullVoxPopuli">Preston</a>’s <a href="https://www.tiktok.com/@nullvoxpopuli">TikTok videos</a> or <a href="https://www.youtube.com/channel/UCOZ7i6NiYjG0NyH9_fQ6xfg">YouTube Shorts</a>, on <code>template-tag</code>, OTP component and publishing to NPM, dynamically render components in Ember Polaris, how to use Effects and more!</p>
<hr />
<h2 id="whiskeywebandwhatnotemberconfpodcastshttpswhiskeywebandwhatnotfm"><a href="https://whiskeywebandwhatnot.fm">🎙️ Whiskey, Web and Whatnot EmberConf podcasts</a></h2>
<!-- alex ignore hosts his -->
<p>The <a href="https://whiskeywebandwhatnot.fm">Whiskey, Web and Whatnot podcast</a> released three new Ember-related episodes, recorded at EmberConf. The <a href="https://whiskeywebandwhatnot.fm/polaris-vite-and-exploring-the-future-of-ember-with-jared-galanis-and-preston-sego">first episode</a> covers <a href="https://emberjs.com/editions/polaris/">Polaris (the upcoming Ember edition)</a>, <a href="https://vitejs.dev">Vite</a> and the workings of learning team in these exciting times. <a href="https://github.com/NullVoxPopuli">Preston Sego III (@NullVoxPopuli)</a> and <a href="https://github.com/jaredgalanis">Jared Galanis (@jaredgalanis)</a> discussed all this and more with the hosts <a href="https://github.com/robbiethewagner">Robbie Wagner (@RobbieTheWagner)</a> and <a href="https://github.com/chuckcarpenter">Chuck Carpenter (@chuckcarpenter)</a>. In the <a href="https://whiskeywebandwhatnot.fm/vite-debugging-and-pnpm-with-ed-faulkner">second episode</a> dives <a href="https://github.com/ef4">Ed Faulkner (@ef4)</a> into the depts of <a href="https://vitejs.dev">Vite</a>, a build tool known for its speed and user-friendliness. If you want to know more about what <a href="https://pnpm.io">PNPM (a package manager)</a> and <a href="https://vitejs.dev">Vite</a> can bring to your Ember experience, check it out! In the <a href="https://whiskeywebandwhatnot.fm/hot-takes-ember-data-and-open-source-with-chris-thoburn-runspired">third episode</a> <a href="https://github.com/runspired">Chris Thoburn (@runspired)</a> chats with Robbie and Chuck about working in open source and finding a balance between innovation and stability, and his vision for EmberData.</p>
<hr />
<h2 id="audityouraddonsforembroidercompatibilityhttpsgithubcomachambersxcheese"><a href="https://github.com/achambers/xcheese">🧀 Audit your addons for Embroider compatibility</a></h2>
<p>Recently, <a href="https://github.com/achambers">Aaron Chambers (@achambers)</a> published a <a href="https://github.com/achambers/xcheese">small package</a> to help audit an app's addons to see which are V1 vs V2. When run from the terminal using <code>npx</code>, it will print a table showing which of the addons in your app are already V2, which are V1, and of those, which ones have a V2 version available. This should make it easier to keep track of which addons you have left to update to V2 on your journey to adopting <a href="https://github.com/embroider-build/embroider">Embroider</a>.</p>
<p>To try it out, run <code>npx github:achambers/xcheese -h</code> in your Ember app directory to for instructions on how to use it.</p>
<hr />
<h2 id="addonreleasessectionurl"><a href="section-url">✨ Addon releases</a></h2>
<p>The Ember ecosystem is not standing still and below you can see some of the latest updates to addons.</p>
<ul>
<li><a href="https://github.com/typed-ember/glint/releases/tag/1.1.0"><code>typed-ember/glint</code> v1.1.0</a> updates the documentation, fixes a bug concerning the LinkTo component type and exposes the <code>loadConfig</code> function.</li>
<li><a href="https://github.com/adopted-ember-addons/ember-file-upload/releases/tag/v8.2.0"><code>ember-file-upload</code> v8.2.0</a> adds Glint types to the addon and documentation for this.</li>
<li><a href="https://github.com/elwayman02/ember-scroll-modifiers/releases/tag/v7.1.0"><code>ember-scroll-modifiers</code> v7.1.0</a> supports <code>Additional state</code> to be passed as the <code>IntersectionObserverEntry</code>.</li>
<li><a href="https://github.com/embroider-build/addon-blueprint/releases/tag/v2.5.0"><code>embroider-build/addon-blueprint</code> v2.5.0</a> fixes a bug to now propely handle <code>.gts</code> files and more enhancements.</li>
<li><a href="https://github.com/ijlee2/ember-codemod-v1-to-v2/releases"><code>ember-codemod-v1-to-v2</code> v1.0.0</a> downstreams changes from the <code>addon-blueprint</code> (in version 0.10.0) up to v2.2.0. In <a href="https://github.com/ijlee2/ember-codemod-v1-to-v2/releases/tag/1.0.0">v1.0.0</a> support for Node 16 is dropped and the changes from <code>addon-blueprint</code> are downstreamed up to version 2.5.0.</li>
<li><a href="https://github.com/jmurphyau/ember-truth-helpers/releases"><code>ember-truth-helpers</code> v4.0.3</a> converted to V2 Embroider native format, adds Glint types and provides imports for usage in <code>gts</code> or <code>gjs</code> files.</li>
<li><a href="https://github.com/ijlee2/ember-container-query/releases/tag/5.0.0"><code>ember-container-query</code> 5.0.0</a> dropped Node 16 support. Checkout the release notes for migration paths from version 4.</li>
<li><a href="https://github.com/ijlee2/embroider-css-modules/releases/tag/1.0.0"><code>embroider-css-modules</code> 1.0.0</a> also dropped Node 16 support and was marked stable!</li>
<li><a href="https://github.com/ember-intl/ember-intl/blob/main/CHANGELOG.md"><code>ember-intl</code> 6.1.0</a> 6.1.0 has been released and marks the beginning of the <code>6.x</code> series. Many thanks to those who have continued to use <code>ember-intl</code> and even tried out <code>6.0.0-beta.x</code>. If you run into a breaking change that hasn't been documented, please let the maintainers know by opening an issue and/or creating a pull request. Also, checkout the helpful <a href="https://ember-intl.github.io/ember-intl/docs/guide/migration-5-0-to-6-1">migration guide</a>.</li>
</ul>
<p>If you want your addon to be mentioned here, post about your releases in the <a href="https://discord.com/channels/480462759797063690/480499624663056390">#news-and-announcement</a> channel on our <a href="https://discord.gg/emberjs">Discord server</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/jersmithkarbon" rel="noopener noreferrer" target="_blank">Jeremy Smith (@jersmithkarbon)</a>, <a href="https://github.com/22a" rel="noopener noreferrer" target="_blank">Peter Meehan (@22a)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/Shishouille" rel="noopener noreferrer" target="_blank">Shirin (@Shishouille)</a>, <a href="https://github.com/jasonbekolay" rel="noopener noreferrer" target="_blank">Jason Bekolay (@jasonbekolay)</a>, <a href="https://github.com/Baltazore" rel="noopener noreferrer" target="_blank">Kirill Shaplyko (@Baltazore)</a>, <a href="https://github.com/haswinraj" rel="noopener noreferrer" target="_blank">Haswin Raj (@haswinraj)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/francois2metz" rel="noopener noreferrer" target="_blank">François de Metz (@francois2metz)</a>, <a href="https://github.com/lukasnys" rel="noopener noreferrer" target="_blank">Lukas Nys (@lukasnys)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/okan-instrumentl" rel="noopener noreferrer" target="_blank">Okan Binli (@okan-instrumentl)</a>, <a href="https://github.com/RobbieTheWagner" rel="noopener noreferrer" target="_blank">Robbie Wagner (@RobbieTheWagner)</a>, <a href="https://github.com/rameshvoodi" rel="noopener noreferrer" target="_blank">ramesh voodi (@rameshvoodi)</a>, <a href="https://github.com/jenweber" rel="noopener noreferrer" target="_blank">Jen Weber (@jenweber)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/emberjs-rfcs-bot" rel="noopener noreferrer" target="_blank">@emberjs-rfcs-bot</a>, <a href="https://github.com/charlesfries" rel="noopener noreferrer" target="_blank">Charles Fries (@charlesfries)</a>, <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">Patrick Pircher (@patricklx)</a>, <a href="https://github.com/anshikjain18" rel="noopener noreferrer" target="_blank">Anshik Jain (@anshikjain18)</a>, <a href="https://github.com/IgnaceMaes" rel="noopener noreferrer" target="_blank">Ignace Maes (@IgnaceMaes)</a>, <a href="https://github.com/locks" rel="noopener noreferrer" target="_blank">Ricardo Mendes (@locks)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/pipoarks" rel="noopener noreferrer" target="_blank">@pipoarks</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/HeroicEric" rel="noopener noreferrer" target="_blank">Eric Kelly (@HeroicEric)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/barryofguilder" rel="noopener noreferrer" target="_blank">Jason Barry (@barryofguilder)</a>, and <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Ignace Maes, Aaron Chambers, Anne-Greeth Schot-van Herwijnen, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-207</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-207</guid><pubDate>Sun, 24 Sep 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 208]]></title><description><![CDATA[<p>👋 Welcome to 2024, Emberistas! 🐹</p>
<p>EmberFest 2023 videos 🇪🇸, Ember Europe meet-up video 🇪🇺, Glint Deep Dives 🤿,  Practicle Blogposts 📝, Addons since 1st of January
<SOME-INTRO-HERE-TO-KEEP-THEM-SUBSCRIBERS-READING></p>
<hr />
<h2 id="welcometo2024">Welcome to 2024!</h2>
<p>It's been an irregular year when it comes to this amazing blog/newsletter. This edition does its best to wrap up some of the important resources released in the last quarter of 2023. It will not cover all the releases of the addons we usually cover. Starting this February we'll try to send out the Ember Times bi-weekly again and we could use your help. If you are interested in writing for the Ember Times, please reach out on <a href="https://discord.com/channels/480462759797063690/485450546887786506">Discord (#support-ember-times)</a>!</p>
<p>If you are interested in keeping up with all that is going on within the Ember Core teams, you can join the meetings on our <a href="https://discord.gg/emberjs">Discord server</a>. Since the last time we published this list, two things changed. The RFC meeting happens twice on Friday to make it more accessible for people in/around the EU timezone. With <a href="https://emberjs.com/editions/polaris/">Polaris</a> coming up, on Monday you can join this meeting to see how you can contribute to making Polaris a reality.</p>
<ul>
<li>Monday - Learning team, <strong>Polaris shepperding meeting</strong></li>
<li>Tuesday - Tooling team (combination of CLI &amp; Embroider)</li>
<li>Thursday - Spec meeting</li>
<li>Friday - RFC review <strong>(twice)</strong>, EmberData meeting</li>
</ul>
<hr />
<h2 id="emberfest2023videoshttpswwwyoutubecomemberfest"><a href="https://www.youtube.com/@emberfest">🇪🇸 EmberFest 2023 videos</a></h2>
<p>On the 21st and 22nd of September about 150 Emberistas got together for <a href="https://emberfest.eu">EmberFest 2023</a> in Madrid. A great variety of talks is now available on <a href="https://www.youtube.com/@emberfest">YouTube</a>. Check out all the amazing speakers, both those on the <a href="https://emberfest.eu/schedule/day/1/">schedule</a>, as well as a surprise <a href="https://www.youtube.com/watch?v=oY289Gk6NcY">Q&A</a> with <a href="https://github.com/ef4">Ed Faulkner (@ef4)</a> and the <a href="https://www.youtube.com/watch?v=VVvRxAOBCVQ">lightning talks</a>.</p>
<hr />
<h2 id="embereuropeupdateonembroiderinitiativehttpswwwyoutubecomwatchvgpmzrqzryzi"><a href="https://www.youtube.com/watch?v=gPMzrQzryZI">🇪🇺 Ember Europe: Update on Embroider initiative</a></h2>
<p><a href="https://github.com/mansona">Chris Manson (@mansona)</a> provided an update on the <a href="https://mainmatter.com/embroider-initiative/">Embroider Initiative</a>'s progress during his talk at Ember Europe’s final 2023 Meetup.</p>
<p>He addressed the <a href="https://vitejs.dev">Vite</a> support and demonstrated an Ember app on Vite, explaining the importance of using ESM-compatible dependencies. He also discussed the challenges faced during the integration process, such as add-ons not being fully converted to ESM.</p>
<p>Chris introduced what will be in the <a href="https://github.com/embroider-build/embroider/pull/1701">next major release of Embroider</a> and encouraged users to remain optimistic despite encountering issues due to cache busting by showcasing debugging techniques and the advantages of Vite's network tab.</p>
<hr />
<h2 id="glintdeepdiveshttpswwwyoutubecomplaylistlistplelyiwkwhhapkoexqjwkphpahgkxzyl3t"><a href="https://www.youtube.com/playlist?list=PLelyiwKWHHApkoeXQjwKPHPAHgKXZyl3t">🤿 Glint Deep Dives</a></h2>
<p>Time to start binging, <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a> and <a href="https://github.com/dfreeman">Dan Freeman (@dfreeman)</a> have released their 6th, and final, screencast on Glint. The last three episodes cover <a href="https://www.youtube.com/watch?v=9RjaREOmFAA&list=PLelyiwKWHHApkoeXQjwKPHPAHgKXZyl3t&index=4&pp=iAQB">how to turn Handlebars into TypeScript</a>, <a href="https://www.youtube.com/watch?v=oqIAyLbp6Rc&list=PLelyiwKWHHApkoeXQjwKPHPAHgKXZyl3t&index=5&pp=iAQB">actually invoking TypeScript in the Glint pipeline</a>, and <a href="https://www.youtube.com/watch?v=VUXROd82Ljk&list=PLelyiwKWHHApkoeXQjwKPHPAHgKXZyl3t&index=6&pp=iAQB">language server shenanigans</a>. Enjoy the dynamic duo, while they cover all you need to know and more about Glint.</p>
<hr />
<h2 id="crispyblogpoststohelpyoualong">📝 Crispy blog posts to help you along</h2>
<ul>
<li><a href="https://dev.to/michalbryxi/context-leaking-in-emberjs-tests-52nm">Context leaking in EmberJS tests</a> by <a href="https://github.com/MichalBryxi">Michal Bryxí (MichalBryxi)</a> explains why tests might be floppy when it comes to state and what you can do about it.</li>
<li><a href="https://dev.to/nullvoxpopuli/what-to-use-instead-of-emberstring-34mo">What to use instead of <code>@ember/string</code></a> by <a href="https://github.com/NullVoxPopuli">Preston Sego (@NullVoxPopuli)</a> shows you how to migrate from <code>@ember/string</code> to <a href="https://www.npmjs.com/package/change-case"><code>change-case</code></a></li>
<li><a href="https://dev.to/nullvoxpopuli/setting-up-tailwind-the-easy-way-5843">Setting up Tailwind, the easy way</a> by <a href="https://github.com/NullVoxPopuli">Preston Sego (@NullVoxPopuli)</a> helps you to set up Tailwind in 8 steps, or if you are on node 18 with <code>npx ember-apply tailwind</code>.</li>
<li><a href="https://hackernoon.com/troubleshooting-ci-test-failures-in-ember-js-with-jenkins-a-journey-of-discoveries">Troubleshooting CI test failures with Jenkins</a> by <a href="https://github.com/vasind">Vasanth Kumar (@vasind)</a> demystifies the problem where errors only show up in CI and how to learn from that.</li>
</ul>
<hr />
<h2 id="addonreleasessincethe1stofjanuary">🐹 Addon releases since the 1st of January</h2>
<ul>
<li><a href="https://github.com/jelhan/ember-style-modifier/releases/tag/v4.0.0">ember-style-modifier v4</a>. This addon provides a {{style}} element modifier to set the element's style. This allows to set custom CSS of an element without requiring a Content Security Policy style-src-attr: "unsafe-inline". The breaking changes for v4 are dropping support for node versions 14 and 16 and all Ember versions below 4.12.</li>
<li><a href="https://github.com/prysmex/ember-eui/releases/tag/v8.0.1">ember-eui v8.0.1</a> is now a v2 addon with glint signatures, single file components, and pnpm. This addon provides Ember JS components for the Elastic design system.</li>
<li><a href="https://github.com/ember-cli/ember-page-title/releases/tag/v8.2.0">ember-page-title v8.2.0</a> now ships its own types! This addon provides a helper for changing the title of the page you're on.</li>
<li><a href="https://github.com/yoavbls/pretty-ts-errors/releases/tag/v0.5.3">pretty-ts-errors v0.5.3</a>. This VSCode extension makes TypeScript errors prettier and human-readable. The latest version added support for Ember template tag components in <code>.gjs</code> and <code>.gts</code> files reported by Glint.</li>
<li><a href="https://github.com/lifeart/vsc-ember-syntax/releases/tag/v1.0.27">vsc-ember-syntax v1.0.27</a> The latest release of the "Glimmer Templates Syntax for VS Code" extension added support for template tags in markdown files. This means you can now use <code>gjs</code> and <code>gts</code> for code fence blocks and get proper syntax highlighting in your editor.</li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/ellnix" rel="noopener noreferrer" target="_blank">ellnix (@ellnix)</a>, <a href="https://github.com/emberjs-rfcs-bot" rel="noopener noreferrer" target="_blank">@emberjs-rfcs-bot</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/wycats" rel="noopener noreferrer" target="_blank">Yehuda Katz (@wycats)</a>, <a href="https://github.com/achambers" rel="noopener noreferrer" target="_blank">Aaron Chambers (@achambers)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">Patrick Pircher (@patricklx)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/Gaurav0" rel="noopener noreferrer" target="_blank">Gaurav Munjal (@Gaurav0)</a>, <a href="https://github.com/awesomerobot" rel="noopener noreferrer" target="_blank">Kris (@awesomerobot)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/IgnaceMaes" rel="noopener noreferrer" target="_blank">Ignace Maes (@IgnaceMaes)</a>, <a href="https://github.com/gitKrystan" rel="noopener noreferrer" target="_blank">Krystan HuffMenne (@gitKrystan)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/bartocc" rel="noopener noreferrer" target="_blank">Julien Palmas (@bartocc)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/wagenet" rel="noopener noreferrer" target="_blank">Peter Wagenet (@wagenet)</a>, <a href="https://github.com/jelhan" rel="noopener noreferrer" target="_blank">Jeldrik Hanschke (@jelhan)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/lolmaus" rel="noopener noreferrer" target="_blank">Andrey Mikhaylov (lolmaus) (@lolmaus)</a>, <a href="https://github.com/aklkv" rel="noopener noreferrer" target="_blank">Alexey Kulakov (@aklkv)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/andreyfel" rel="noopener noreferrer" target="_blank">Andrey Fel (@andreyfel)</a>, <a href="https://github.com/evoactivity" rel="noopener noreferrer" target="_blank">Liam Potter (@evoactivity)</a>, <a href="https://github.com/pzuraq" rel="noopener noreferrer" target="_blank">Kristen (@pzuraq)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/callpri" rel="noopener noreferrer" target="_blank">@callpri</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, <a href="https://github.com/AmauryD" rel="noopener noreferrer" target="_blank">Amaury (@AmauryD)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/jahrock" rel="noopener noreferrer" target="_blank">Jah Rock (@jahrock)</a>, <a href="https://github.com/lifeart" rel="noopener noreferrer" target="_blank">Alex Kanunnikov (@lifeart)</a>, <a href="https://github.com/Mikek2252" rel="noopener noreferrer" target="_blank">Michael Kerr (@Mikek2252)</a>, and <a href="https://github.com/RobbieTheWagner" rel="noopener noreferrer" target="_blank">Robbie Wagner (@RobbieTheWagner)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Anne-Greeth Schot-van Herwijnen, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-208</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-208</guid><pubDate>Fri, 26 Jan 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 209]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Modern EmberData 📜, faster components 🚀, v2 addons, learning EmberJS at AuditBoard, help the adopted-ember-addons</p>
<p><SOME-INTRO-HERE-TO-KEEP-THEM-SUBSCRIBERS-READING></p>
<hr />
<h2 id="modernemberdatahttpsrunspiredcom20240131modernemberdatahtml"><a href="https://runspired.com/2024/01/31/modern-ember-data.html">📜 Modern EmberData</a></h2>
<p><a href="https://github.com/runspired">Chris Thoburn (@runspired)</a> walks you through one of the key changes that come with RequestManager that highlights the advantages of the changing architecture, as well as tease a bit of what is still to come: <strong>All requests should use EmberData</strong>. The <a href="https://runspired.com/2024/01/31/modern-ember-data.html">blog post</a> will highlight what's to come and what has happened over the last years to set EmberData up to be ready for the future that is schema and spec-driven.</p>
<hr />
<h2 id="aretemplateonlycomponentsfasterhttpsnullvoxpopulicom20231220templateonlyvsclasscomponents"><a href="https://nullvoxpopuli.com/2023-12-20-template-only-vs-class-components/">🚀 Are template-only components faster?</a></h2>
<p><a href="https://github.com/NullVoxPopuli">Preston Sego (@NullVoxPopuli)</a> puts components to the test in this clear blog post and explains how you can test your components. So if you are interested in the answer to the question "Are template-only components faster?", check out their <strong><a href="https://nullvoxpopuli.com/2023-12-20-template-only-vs-class-components/">blog post</a></strong>!</p>
<hr />
<h2 id="alladdonstov2">✨ All addons to v2</h2>
<p>With all the work on embroider more and more addons are publishing major versions in which they upgrade to be a v2 addon.</p>
<p>This week we highlight:</p>
<ul>
<li><a href="https://github.com/adopted-ember-addons/ember-cli-flash/releases/tag/v5.0.0-ember-cli-flash">ember-cli-flash (v5.0.0)</a> is an Ember addon that adds a flash message service and component to your app and is now also a v2 addon.</li>
<li><a href="https://github.com/adopted-ember-addons/ember-set-helper/releases/tag/v3.0.0-ember-set-helper">ember-set-helper (v3.0.0)</a>. The <code>{{set}}</code> helper returns a function that sets a value. This can be used in combination with Ember's <code>{{on}}</code> modifier or component actions to update the state without having to write your own custom action.</li>
<li><a href="https://github.com/machty/ember-concurrency/releases/tag/4.0.0">ember-concurrency (v4.0.0)</a> has been converted to a v2 addon and ships Glint types.</li>
</ul>
<hr />
<h2 id="learningemberjsatauditboardhttpsabengineeringmediumcomlearningemberjsatauditboardaebb8ade97b1"><a href="https://abengineering.medium.com/learning-emberjs-at-auditboard-aebb8ade97b1">📚 Learning EmberJS at AuditBoard</a></h2>
<p><a href="https://github.com/jacob-beltran">Jacob Beltran (@jacob-beltran)</a> joined AuditBoard about 1,5 years ago and was surprised to find EmberJS being used "still". In this <a href="https://abengineering.medium.com/learning-emberjs-at-auditboard-aebb8ade97b1">blog post</a>, he will highlight why he decided to work with Ember.</p>
<ol>
<li>Good people make you better.</li>
<li>Interesting problems are framework-agnostic.</li>
</ol>
<p>And he leaves us with an important lesson: "Sometimes <strong>leveling up</strong> means taking a step back and <strong>becoming a beginner</strong> again.".</p>
<hr />
<h2 id="helptheadoptedemberaddonshttpsgithubcomadoptedemberaddonsprogramguidelinesissues28"><a href="https://github.com/adopted-ember-addons/program-guidelines/issues/28">🐹 Help the adopted-ember-addons</a></h2>
<p><a href="https://github.com/MelSumner">Melanie Sumner (@MelSumner)</a> asks for your help! In the Ember community, we believe that it's important to care for addons that need a new maintainer. This is why we have the <a href="https://github.com/adopted-ember-addons/program-guidelines">Adopted Ember addons program</a>. Currently, this program is caring for a lot of addons that are not all in line when it comes to release processes, their CI workflow, and branch names. If you are willing to help review PRs, submit PRs to improve addons, or even evaluate addons for retirement, please reach out to <a href="https://github.com/MelSumner">Mel</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/IgnaceMaes" rel="noopener noreferrer" target="_blank">Ignace Maes (@IgnaceMaes)</a>, <a href="https://github.com/lolmaus" rel="noopener noreferrer" target="_blank">Andrey Mikhaylov (lolmaus) (@lolmaus)</a>, <a href="https://github.com/achambers" rel="noopener noreferrer" target="_blank">Aaron Chambers (@achambers)</a>, <a href="https://github.com/Duder-onomy" rel="noopener noreferrer" target="_blank">Greg Larrenaga (@Duder-onomy)</a>, <a href="https://github.com/MelSumner" rel="noopener noreferrer" target="_blank">Melanie Sumner (@MelSumner)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/mkszepp" rel="noopener noreferrer" target="_blank">@mkszepp</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/johanrd" rel="noopener noreferrer" target="_blank">@johanrd</a>, <a href="https://github.com/dwickern" rel="noopener noreferrer" target="_blank">Derek Wickern (@dwickern)</a>, <a href="https://github.com/geneukum" rel="noopener noreferrer" target="_blank">Geordan Neukum (@geneukum)</a>, <a href="https://github.com/Baltazore" rel="noopener noreferrer" target="_blank">Kirill Shaplyko (@Baltazore)</a>, <a href="https://github.com/CvX" rel="noopener noreferrer" target="_blank">Jarek Radosz (@CvX)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">Patrick Pircher (@patricklx)</a>, <a href="https://github.com/bendemboski" rel="noopener noreferrer" target="_blank">Ben Demboski (@bendemboski)</a>, and <a href="https://github.com/MichalBryxi" rel="noopener noreferrer" target="_blank">Michal Bryxí (@MichalBryxi)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Anne-Greeth Schot-van Herwijnen and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-209</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-209</guid><pubDate>Thu, 15 Feb 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 210]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>News 🗞️, EmberData updates 🛸,  Addons ✨, EmberEurope Q1 videos 🇪🇺, Webpack Subresource Integrity plugin for Embroider 📦, ember-serviceable-helper 🚚, Generate Glint template registry 🗂️ and Gember 🫚
<SOME-INTRO-HERE-TO-KEEP-THEM-SUBSCRIBERS-READING></p>
<hr />
<h2 id="noteworthynews">🗞️ Noteworthy news</h2>
<ul>
<li>GitHub now has full support for syntax highlighting the template tag component authoring format. (<code>.gjs</code>/<code>.gts</code>). Thanks to everyone who contributed by converting their files 👏.</li>
<li><a href="https://discord.gg/emberjs">Ember's Discord server</a> has now an amazing <a href="https://discord.com/channels/480462759797063690/1221113538396028938">showcase channel</a>. The goal of this place is to share amazing apps or addons build with Ember!</li>
<li>EmberConf is happening in New York City 🗽 on the 31st of May. With this short timeline, the <a href="https://forms.gle/k6MDnSomcyB4XZueA">opened CFP</a> will close on the 17th of April and talks will be accepted on a rolling basis. So do you want to share your Ember story from the Big 🍎, <a href="https://forms.gle/k6MDnSomcyB4XZueA">send your CFP now</a>!</li>
</ul>
<hr />
<h2 id="emberdataupdateshttpsgithubcomemberjsdatareleases"><a href="https://github.com/emberjs/data/releases">🛸 EmberData updates</a></h2>
<p><a href="https://github.com/emberjs/data">EmberData</a> has made some exciting updates recently. A <a href="https://github.com/emberjs/data/blob/main/guides/index.md">TypeScript Guide</a> has been added to their in-repo guides, along with badges that show the latest published versions for each active channel to every README. They have also updated the <a href="https://github.com/emberjs/data?tab=readme-ov-file#compatibility">Compatibility table</a> and made it auto-update versions of associated EmberData channels.</p>
<p>In addition, EmberData has published mirror packages and types packages, which unlock a new migration path. This allows for two completely distinct versions of EmberData in your app at once, making it possible to incrementally migrate smaller regions of your app to new patterns independent from the state in the rest of your app. The mirror package equivalents can be installed alongside the regular packages, and a second store can be configured.</p>
<p>EmberData has also added types for older EmberData versions, allowing experimentation with the native types alphas in older versions of EmberData. The types will match the types for the version number they publish under, but for the most part, they will be more accurate for 4.7+ than the DT types, and nearly exact for 4.12.</p>
<p>Finally, EmberData has released a new v2 addon, <a href="https://github.com/emberjs/data/blob/main/packages/ember/README.md">@warp-drive/ember</a>, containing various utils and components to make it simpler to work with promises and requests reactively. The <code>&lt;Request /&gt;</code> component will pull <code>store</code> from a context if the <a href="https://github.com/customerio/ember-provide-consume-context">library</a> is present in your app.</p>
<p>If you are looking for a place to contribute, EmberData has opened a <a href="https://github.com/emberjs/data/issues/9337">Polaris tracking issue</a>, so check this out!</p>
<hr />
<h2 id="addonupdates">✨ Addon updates</h2>
<p>Check out the list of updated addons, and all they bring!</p>
<ul>
<li><a href="https://github.com/cibernox/ember-power-select/releases/tag/v8.1.0">ember-power-select (v8.1.0)</a> is since v8.0.0 a v2 addon, brings accesibility and type improvements</li>
<li><a href="https://github.com/ember-bootstrap/ember-bootstrap/releases/tag/v6.2.0">ember-bootstrap (v6.2.0)</a> is starting with the effort of converting Ember Bootstrap to Typescript, so it's currently shipping some types, but they are neither complete nor considered stable. Check out the <a href="https://github.com/ember-bootstrap/ember-bootstrap/issues/2053">TypeScript tracking issue</a> if you want to help with the effort.</li>
<li><a href="https://github.com/adopted-ember-addons/ember-popper-modifier/blob/main/CHANGELOG.md#v410-2024-02-26">ember-popper-modifier (v4.1.0)</a> migrates the addon to TypeScript and results in published Glint types.</li>
<li><a href="https://github.com/nickschot/ember-mobile-menu/blob/master/CHANGELOG.md#release-2024-02-16">ember-mobile-menu (v5.1.1)</a> is since v5.0.0 a v2 addon, with a plain CSS approach instead of SCSS. It also dropped support for the <code>mm.LinkTo</code> component. In v5.1.0 the scroll lock library is added inline because it's unmaintained and this also opens up fastboot possibilities.</li>
<li><a href="https://github.com/ember-cli-deploy/ember-cli-deploy-s3/releases">ember-cli-deploy-s3 (v5.0.0-beta)</a> is as mentioned a beta release. This version upgrades the <code>aws-sdk</code> to v3. In theory, it is not breaking, but in practice, there seem to be some credential setups that have issues. Please try it on your configuration and open issues or PRs so they can get it solid for everyone.</li>
<li><a href="https://github.com/ember-codemods/ember-native-class-codemod/blob/main/CHANGELOG.md#release-2024-02-26">ember-native-class-codemode (v4.1.1)</a> adds the option to run in <code>NO_TELEMETRY</code> mode, with the inherent risks. This codemod converts Ember objects to es6 native classes.</li>
<li><a href="https://github.com/typed-ember/ember-cli-typescript/releases/tag/v5.3.0">ember-cli-typescript (v5.3.0)</a> drops support for Node 12 and loosens the version check against ember-cli-babel.</li>
</ul>
<!-- alex ignore whitelist -->
<ul>
<li><a href="https://github.com/mainmatter/ember-intl-analyzer/releases/tag/v4.6.0">ember-intl-analyzer (v4.6.0)</a> now supports custom <code>t</code> wrappers and a new option to flag redundant whitelist entries.</li>
<li><a href="https://github.com/ember-intl/ember-intl/releases">ember-intl (v6.5.3)</a> fixes a memory leak introduced in v6.3. The <a href="https://ember-intl.github.io/ember-intl/versions/v6.5.3/docs/quickstart-addons">documentation</a> now also shows how to use ember-intl in your v2 addons. In v6.5 the <code>intl</code> service was refactored, it removes unused code and makes what should be private, private. This could be breaking if you overwrote a method from the service.</li>
</ul>
<p>The group of addons below has joined the evergrowing v2 addon ecosystem.</p>
<ul>
<li><a href="https://github.com/cibernox/ember-basic-dropdown/releases/tag/v8.0.0">ember-basic-dropdown (v8.0.0)</a> is a very minimal dropdown. That means that it is agnostic about what it is going to contain. It is intended to be a building block for more complex components.</li>
<li><a href="https://github.com/cibernox/ember-power-calendar/releases/tag/v1.0.0">ember-power-calendar (v1.0.0)</a> is a customizable calendar component.</li>
<li><a href="https://github.com/nickschot/ember-gesture-modifiers/blob/master/CHANGELOG.md">ember-gesture-modifiers (v6.0.0)</a> is an addon that provides gestures as modifiers.</li>
</ul>
<hr />
<h2 id="embereuropeq1httpswwwyoutubecomplaylistlistpld8z0vnqib6dblbsfy4mcxwzgglilw4"><a href="https://www.youtube.com/playlist?list=PLD-8Z0-VnQIB6dblBSFy4MCXWzggLIlW4">🇪🇺 Ember Europe Q1</a></h2>
<p>The first Ember Europe of 2024 is a fact. On the 21st of March, a group of Ember enthusiasts gathered remotely to hear the talks of <a href="https://github.com/machty">Alex Matchneer (@matchy)</a> about <a href="https://www.youtube.com/watch?v=6zy4nLHj83g&list=PLD-8Z0-VnQIB6dblBSFy4MCXWzggLIlW4&index=3&pp=iAQB">language tooling</a>, <a href="https://github.com/mansona">Chris Manson</a>'s update on <a href="https://www.youtube.com/watch?v=SCWpDNE0IaA&list=PLD-8Z0-VnQIB6dblBSFy4MCXWzggLIlW4&index=2&pp=iAQB">Embroider (and maybe something about Vite 🤫)</a>, and <a href="https://github.com/ijlee2/">Isaac Lee (@ijlee2)</a> about <a href="https://www.youtube.com/watch?v=J64q5SxY8rE&list=PLD-8Z0-VnQIB6dblBSFy4MCXWzggLIlW4&index=1&pp=iAQB">CSS modules and internationalization</a>.
Join the <a href="https://www.meetup.com/ember-europe/">Meetup Ember.js Europe group</a> to get updates on the next edition!</p>
<hr />
<h2 id="webpacksubresourceintegritypluginforembroiderhttpsgithubcomjelhanwebpacksubresourceintegrityembroider"><a href="https://github.com/jelhan/webpack-subresource-integrity-embroider">📦 Webpack Subresource Integrity plugin for Embroider</a></h2>
<p><a href="https://github.com/jelhan">Jeldrik Hanschke (@jelhan)</a> published the <a href="https://github.com/jelhan/webpack-subresource-integrity-embroider">Webpack Subresource Integrity plugin for Embroider</a>. The <a href="https://github.com/jonathanKingston/ember-cli-sri">ember-cli-sri</a> addon provided Subresource Integrity support for Ember applications. With the migrations to Embroider, which uses Webpack as a bundler, the ember-cli-sri addon does not work anymore. <a href="https://github.com/jelhan/webpack-subresource-integrity-embroider">This webpack plugin</a> will make that possible again.</p>
<hr />
<h2 id="emberserviceablehelperhttpsgithubcomchancancodeemberserviceablehelper"><a href="https://github.com/chancancode/ember-serviceable-helper">🚚 ember-serviceable-helper</a></h2>
<p><a href="https://github.com/chancancode">Godfrey Chan (@chancancode)</a> released an API for writing functions that need access to Ember services. This will help your functions to stay plain, even if they need to access some app-wide global state via services. Check out the <a href="https://github.com/chancancode/ember-serviceable-helper/blob/main/ember-serviceable-helper/README.md">documentation</a> to learn more about this convenient helper.</p>
<hr />
<h2 id="generateglinttemplateregistryhttpsgithubcombertdeblockgeneratetemplateregistry"><a href="https://github.com/bertdeblock/generate-template-registry">🗂️ Generate Glint template registry</a></h2>
<p><a href="https://github.com/bertdeblock">Bert De Block (@bertdeblock)</a> released a new package to make a <a href="https://typed-ember.gitbook.io/glint/environments/ember/template-registry">template registry</a> for <a href="https://typed-ember.gitbook.io/glint">Glint</a> easy.
You can run the package <code>npx @bertdeblock/generate-template-registry@latest</code> and it will give you your registry. Be aware that if your app or addon has components, helpers, or modifiers with the same name, duplicate template registry entries will be generated, which will need to be fixed manually.</p>
<hr />
<h2 id="gemberhttpsgithubcombertdeblockgember"><a href="https://github.com/bertdeblock/gember">🫚 Gember</a></h2>
<p><a href="https://github.com/bertdeblock">Bert De Block (@bertdeblock)</a> released this new package called <a href="https://github.com/bertdeblock/gember">gember</a>. This package allows you to generate components, helpers, modifiers, and services in v2 addons. It only supports <code>.gjs</code> and <code>.gts</code> files for components.</p>
<p>If you are wondering about the 🫚 icon, gember is the Dutch word for ginger.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">Patrick Pircher (@patricklx)</a>, <a href="https://github.com/bitxplora" rel="noopener noreferrer" target="_blank">'Dayo Olutayo (@bitxplora)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/elwayman02" rel="noopener noreferrer" target="_blank">Jordan Hawker (@elwayman02)</a>, <a href="https://github.com/chriskrycho" rel="noopener noreferrer" target="_blank">Chris Krycho (@chriskrycho)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/gitKrystan" rel="noopener noreferrer" target="_blank">Krystan HuffMenne (@gitKrystan)</a>, <a href="https://github.com/sly7-7" rel="noopener noreferrer" target="_blank">Sylvain Mina (@sly7-7)</a>, <a href="https://github.com/VincentHardouin" rel="noopener noreferrer" target="_blank">Vincent Hardouin (@VincentHardouin)</a>, <a href="https://github.com/Baltazore" rel="noopener noreferrer" target="_blank">Kirill Shaplyko (@Baltazore)</a>, <a href="https://github.com/geneukum" rel="noopener noreferrer" target="_blank">Geordan Neukum (@geneukum)</a>, <a href="https://github.com/grayt0r" rel="noopener noreferrer" target="_blank">Ross Grayton (@grayt0r)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/bmish" rel="noopener noreferrer" target="_blank">Bryan Mishkin (@bmish)</a>, <a href="https://github.com/romgere" rel="noopener noreferrer" target="_blank">Jérôme Mestres (@romgere)</a>, <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a>, <a href="https://github.com/andreyfel" rel="noopener noreferrer" target="_blank">Andrey Fel (@andreyfel)</a>, <a href="https://github.com/IgnaceMaes" rel="noopener noreferrer" target="_blank">Ignace Maes (@IgnaceMaes)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/achambers" rel="noopener noreferrer" target="_blank">Aaron Chambers (@achambers)</a>, <a href="https://github.com/MehulKChaudhari" rel="noopener noreferrer" target="_blank">Mehul Kiran Chaudhari (@MehulKChaudhari)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/chancancode" rel="noopener noreferrer" target="_blank">Godfrey Chan (@chancancode)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/Yelinz" rel="noopener noreferrer" target="_blank">Yelin Zhang (@Yelinz)</a>, <a href="https://github.com/leoeuclids" rel="noopener noreferrer" target="_blank">Leo Euclides (@leoeuclids)</a>, <a href="https://github.com/jahrock" rel="noopener noreferrer" target="_blank">Jah Rock (@jahrock)</a>, <a href="https://github.com/aklkv" rel="noopener noreferrer" target="_blank">Alexey Kulakov (@aklkv)</a>, <a href="https://github.com/dwickern" rel="noopener noreferrer" target="_blank">Derek Wickern (@dwickern)</a>, <a href="https://github.com/kdagnan" rel="noopener noreferrer" target="_blank">Kyle D. (@kdagnan)</a>, <a href="https://github.com/RobbieTheWagner" rel="noopener noreferrer" target="_blank">Robbie Wagner (@RobbieTheWagner)</a>, <a href="https://github.com/gilest" rel="noopener noreferrer" target="_blank">Giles Thompson (@gilest)</a>, and <a href="https://github.com/crypto" rel="noopener noreferrer" target="_blank">Roman Shafigullin (@crypto)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>The Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-210</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-210</guid><pubDate>Wed, 10 Apr 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 211]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>EmberConf 2024 videos 🗽, Live coding WarpDrive 🌌, Ember Europe Q2 🇪🇺, Games with Ember 👾, New addons &amp; libraries 🎊, Updated addons 🌟, EmberData v5.3.x 📦, Security fix for ember-cli-polyfill-io 🔓, read up on template tag &amp; named blocks in the guides 🧱
<SOME-INTRO-HERE-TO-KEEP-THEM-SUBSCRIBERS-READING></p>
<hr />
<h2 id="emberconf2024videoshttpsyoutubecomplaylistlistpl4eq2dppybbljznstmjnoda0nzm61yceqsicwnifanxg_z9pbyw"><a href="https://youtube.com/playlist?list=PL4eq2DPpyBbljzNStMjnoDA0NZM61yCEq&si=cWNIFAnxg_Z9pbYW">🗽 EmberConf 2024 videos</a></h2>
<p>We enjoyed an energizing EmberConf on the 31st of May in New York City. If you missed the conference or want to watch specific talks back, you can check out the <a href="https://youtube.com/playlist?list=PL4eq2DPpyBbljzNStMjnoDA0NZM61yCEq&si=cWNIFAnxg_Z9pbYW">playlist on YouTube</a>.</p>
<hr />
<h2 id="livecodingatemberconf2024warpdrivelegacyrelationshipssupporthttpswwwyoutubecomwatchvyagbvhaq_nm"><a href="https://www.youtube.com/watch?v=YagBVhaq_NM">🌌 Live Coding at EmberConf 2024: WarpDrive Legacy Relationships Support</a></h2>
<p>Join us as we dive into the exciting world of <a href="https://www.youtube.com/watch?v=YagBVhaq_NM">WarpDrive (previously known as EmberData) live</a> from New York City! Despite the hustle and bustle, we're tackling some critical updates and sharing our progress with you. Apologies for the background noise, we couldn't find a quiet spot, but the energy of the city is all part of the experience. Stay tuned for insights, discussions, and a peek into our development process in this vibrant atmosphere!</p>
<hr />
<h2 id="embereuroperemoteevent18thofjulyhttpswwwmeetupcomembereuropeevents301437560"><a href="https://www.meetup.com/ember-europe/events/301437560/">🇪🇺 Ember Europe remote event - 18th of July</a></h2>
<p>Join a group of enthousiastic Emberistas for an informative and inspiring fully remote <a href="https://www.meetup.com/ember-europe/events/301437560/">meet-up</a>. On the 18th of July, Ember Europe will host their <a href="https://www.meetup.com/ember-europe/events/301437560/">Q2 event</a>. On the program are <a href="https://github.com/mansona">Chris Manson (@mansona)</a> &amp; <a href="https://github.com/marcoow">Marco Otte-Witte</a> to inform you about the Embroider Initiative and what's next, after that <a href="https://github.com/void-mAlex">Alex (@void-mAlex)</a> will tell us about <code>&lt;template&gt;template&lt;/template&gt;🪞</code>s and to close it off there is the mingling part of the event!</p>
<hr />
<h2 id="gamesbuiltwithemberhttpswwwlinkedincomgames"><a href="https://www.linkedin.com/games/">👾 Games built with Ember</a></h2>
<p>Are you looking for a few minutes to distract yourself from all work challenges, check out the <a href="https://www.linkedin.com/games/">LinkedIn games</a>. They are built with Ember and are fun to solve!</p>
<hr />
<h2 id="newaddonslibraries">🎊 New addons &amp; libraries</h2>
<ul>
<li><a href="https://ember-flash-notifications.vercel.app/">ember-flash-notifications</a> is a new addon that brings flash messages using the native <a href="https://developer.mozilla.org/en-US/docs/Web/API/Popover_API">Popover API</a>. This means it works across all latest browsers, but might not work for older devices or browsers.</li>
<li>[ember-awesome-icons] is just like the previous addon created by <a href="https://github.com/alexeipanov">Alexei Panov (@alexeipanov)</a> and allows you to easily create components for free FontAwesome icons. This way you don't need to include all the icons in your bundle. Just the icons you need, fast as HTML and highly customizable with CSS, and SVG powers!</li>
<li><a href="https://github.com/IgnaceMaes/ember-phosphor-icons">ember-phosphor-icons</a> created by <a href="https://github.com/IgnaceMaes">Ignace Maes (@IgnaceMaes)</a> to give you access to the <a href="https://phosphoricons.com">phosphor icon set</a>. The addon has TypeScript &amp; Glint support. When used with Embroider it gives you all the benefits of tree shaking to keep your bundle size small.</li>
<li><a href="https://github.com/NullVoxPopuli/form-data-utils">form-data-utils</a> is now its own thing and has been extracted from <code>ember-primitives</code>. It's a utility function for extracting the FormData as an object from the native <code>&lt;form&gt;</code> element, allowing more ergonomic usage of default forms and fields. You can check out the example in the <a href="https://ember-primitives.pages.dev/6-utils/data-from-event.md">documentation</a>.</li>
<li><a href="https://github.com/ijlee2/ember-codemod-remove-inject-as-service">ember-codemod-remove-inject-as-service</a> created by <a href="https://github.com/ijlee2">Isaac Lee (@ijlee2)</a> helps you to standardize how you inject service. Replace <code>inject</code> with <code>service</code>, <code>!</code> with <code>declare</code> in TS files, and remove <code>private</code> and <code>readonly</code> keywords in TS files. You can use <code>service</code> since Ember 4.1 and <code>inject</code> is planned to be deprecated in Ember v6.</li>
<li><a href="https://github.com/villander/ember-engines-router-service">ember-engines-router-service</a> created by <a href="https://github.com/villander">Michael Villander (@villander)</a> provides an API for authoring a Router service when using <code>ember-engines</code>. You will have the full <code>RouterService</code> API inside each engine. That means you can use APIs such as <code>transitionTo</code> and <code>isActive</code>, plus the new "external routing" APIs such as <code>transitionToExternal</code> and <code>isActiveExternal</code> which help link <code>externalRoutes</code> together.</li>
<li><a href="https://github.com/IgnaceMaes/ember-addon-v2-scanner">ember-addon-v2-scanner</a> created by <a href="https://github.com/IgnaceMaes">Ignace Maes (@IgnaceMaes)</a> is a CLI tool to scan your Ember project for addons that have a v2 version available. Just run <code>npx ember-addon-v2-scanner@latest</code> and check out the results!</li>
</ul>
<hr />
<h2 id="addonupdates">🌟 Addon updates</h2>
<ul>
<li><a href="https://github.com/emberjs/ember-qunit/releases/tag/v8.1.0">ember-qunit v8.1.0</a> now ships with a <code>theme</code> config option that allows you to use the <code>qunit-theme-ember</code> to give your tests a real EmberJS look.</li>
<li><a href="https://github.com/ember-a11y/ember-a11y-refocus">ember-a11y-refocus v4.1.0</a> provides some dependency updates, updated documentation (in the README), and a new flag called <code>excludeAllQueryParams</code>, an optional flag that will allow you to opt completely out of route evaluation (for transition announcements or focus management) if query params are involved. The new feature will allow some older apps to use the addon while they refactor code to allow them to simply use the addon w/o any customizations.</li>
<li><a href="https://github.com/minutebase/ember-can/releases/tag/v5.0.0">ember-can v5</a> converts the addon to v2 and it now supports TypeScript!</li>
<li><a href="https://github.com/emberjs/ember-string/releases/tag/v4.0.0-%40ember%2Fstring">ember-string v4</a> converts the addon to v2.</li>
<li><a href="https://github.com/ember-intl/ember-intl/releases/tag/v7.0.0">ember-intl v7.x</a> has entered a new era with its 7.x series. This new major brings you a minimized API (to improve onboarding and project maintainability), provides native types for improved TS and Glint support and adds better documentation. To upgrade check out the <a href="https://ember-intl.github.io/ember-intl/docs/migration/v7">migration guide</a>.</li>
<li>To support your developer experience you can use the <code>Ember Language Server</code> VSCode extention. The latest update supports template-lint configs in <code>mjs</code> format. Are you still using <code>lifeart.vscode-ember-unstable</code> then you can migrate to <code>embertooling.vscode-ember</code>.</li>
<li><a href="https://github.com/NullVoxPopuli/eslint-configs">NullVoxPopuli/eslint-configs v4</a> are <a href="https://github.com/NullVoxPopuli">Preston Sego (@NullVoxPopuli)</a>'s preferred ESLint configs for all their projects. They use only overrides so that they're easy to maintain and update. Version 4 now supports <code>gjs</code> and <code>gts</code> out of the box.</li>
<li><a href="https://github.com/adopted-ember-addons/ember-sortable/releases/tag/v5.1.0-ember-sortable">ember-sortable v5.1.0</a> adds the feature that allows you to create a sortable list that works with a grid. Items can be moved up, down, right, or left within the same list.</li>
</ul>
<hr />
<h2 id="emberdatav53xhttpsgithubcomemberjsdatareleasestagv534"><a href="https://github.com/emberjs/data/releases/tag/v5.3.4">📦 EmberData v5.3.x</a></h2>
<p>We are happy to inform you about this massive improvement that shipped to EmberData. Since v5.3.4:</p>
<ul>
<li>It ships fully as v2-addons,</li>
<li>All packages ship native types,</li>
<li>Mirror packages are now available for 5.3,</li>
<li>A new cli tool has been added to help you quickly configure your 4.x project for typescript,</li>
<li><code>ember-inflector</code> and <code>@ember/string</code> are no longer project dependencies.</li>
</ul>
<p>Dive into the details of the <a href="https://github.com/emberjs/data/releases/tag/v5.3.4">latest release</a> now.</p>
<hr />
<h2 id="securityfixforemberclipolyfilliohttpsgithubcomalexlafrosciaemberclipolyfilliopull10"><a href="https://github.com/alexlafroscia/ember-cli-polyfill-io/pull/10">🔓 Security fix for ember-cli-polyfill-io</a></h2>
<p>Delivering polyfills from <code>polyfill.io</code> has turned into a service provider attack against users of your apps. An update to <a href="https://github.com/alexlafroscia/ember-cli-polyfill-io">ember-cli-polyfill</a> will be released to fix this. You can also right now change your config by changing the <code>src</code> for <code>polyfill-io config</code> in <code>ember-cli-build.js</code> to <code>https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js</code>. Also make sure you need this dependency, removing it removes the risk completely!</p>
<hr />
<h2 id="documentationontemplatetagformathttpsguidesemberjscomreleasecomponentstemplatetagformat"><a href="https://guides.emberjs.com/release/components/template-tag-format/">📚 Documentation on Template Tag Format</a></h2>
<p>The <a href="https://guides.emberjs.com/">Ember guides</a> now include extensive information about our <a href="https://guides.emberjs.com/release/components/template-tag-format/"><code>&lt;template&gt;</code> tag format</a>. The template tag format is a powerful, new way to write components in Ember. It's a single-file format that combines the component's JavaScript and Glimmer template code. The <code>&lt;template&gt;</code> tag keeps a clear separation between the template language and the JavaScript around it. If you want to know more about this, check out the <a href="https://guides.emberjs.com/release/components/template-tag-format/">documentation</a>.</p>
<hr />
<h2 id="documentationonnamedblockshttpsguidesemberjscomreleasecomponentsblockcontenttoc_namedblocks"><a href="https://guides.emberjs.com/release/components/block-content/#toc_named-blocks">🧱 Documentation on Named Blocks</a></h2>
<p>If you want to yield content to different spots in the same component, you can use named blocks. However, our guides were lacking information on how to do this. Thanks to <a href="https://github.com/Shishouille">Shirin Boomi (@Shishouille)</a> you can now learn how to use it and make the most of <code>yield</code>ing information throughout your components.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">👏 Contributors' corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/achambers" rel="noopener noreferrer" target="_blank">Aaron Chambers (@achambers)</a>, <a href="https://github.com/NullVoxPopuli" rel="noopener noreferrer" target="_blank">@NullVoxPopuli</a>, <a href="https://github.com/scotttball" rel="noopener noreferrer" target="_blank">Scott Ball (@scotttball)</a>, <a href="https://github.com/davidtaylorhq" rel="noopener noreferrer" target="_blank">David Taylor (@davidtaylorhq)</a>, <a href="https://github.com/kiwiupover" rel="noopener noreferrer" target="_blank">Dave Laird (@kiwiupover)</a>, <a href="https://github.com/ijlee2" rel="noopener noreferrer" target="_blank">Isaac Lee (@ijlee2)</a>, <a href="https://github.com/bertdeblock" rel="noopener noreferrer" target="_blank">Bert De Block (@bertdeblock)</a>, <a href="https://github.com/gitKrystan" rel="noopener noreferrer" target="_blank">Krystan HuffMenne (@gitKrystan)</a>, <a href="https://github.com/kellyselden" rel="noopener noreferrer" target="_blank">Kelly Selden (@kellyselden)</a>, <a href="https://github.com/IgnaceMaes" rel="noopener noreferrer" target="_blank">Ignace Maes (@IgnaceMaes)</a>, <a href="https://github.com/Techn1x" rel="noopener noreferrer" target="_blank">Brad Overton (@Techn1x)</a>, <a href="https://github.com/SergeAstapov" rel="noopener noreferrer" target="_blank">Sergey Astapov (@SergeAstapov)</a>, <a href="https://github.com/ef4" rel="noopener noreferrer" target="_blank">Edward Faulkner (@ef4)</a>, <a href="https://github.com/richgt" rel="noopener noreferrer" target="_blank">Rich Glazerman (@richgt)</a>, <a href="https://github.com/Herover" rel="noopener noreferrer" target="_blank">Leonora (@Herover)</a>, <a href="https://github.com/chrisrng" rel="noopener noreferrer" target="_blank">Chris Ng (@chrisrng)</a>, <a href="https://github.com/raspberri05" rel="noopener noreferrer" target="_blank">Vedant Singhania (@raspberri05)</a>, <a href="https://github.com/Rashmi-N-Sahoo" rel="noopener noreferrer" target="_blank">@Rashmi-N-Sahoo</a>, <a href="https://github.com/ArunPragadeeswar007" rel="noopener noreferrer" target="_blank">Arun Pragadeeswar (@ArunPragadeeswar007)</a>, <a href="https://github.com/jaredgalanis" rel="noopener noreferrer" target="_blank">Jared Galanis (@jaredgalanis)</a>, <a href="https://github.com/wozny1989" rel="noopener noreferrer" target="_blank">Adam Woźny (@wozny1989)</a>, <a href="https://github.com/runspired" rel="noopener noreferrer" target="_blank">Chris Thoburn (@runspired)</a>, <a href="https://github.com/MehulKChaudhari" rel="noopener noreferrer" target="_blank">Mehul Kiran Chaudhari (@MehulKChaudhari)</a>, <a href="https://github.com/MinThaMie" rel="noopener noreferrer" target="_blank">Anne-Greeth Schot-van Herwijnen (@MinThaMie)</a>, <a href="https://github.com/Baltazore" rel="noopener noreferrer" target="_blank">Kirill Shaplyko (@Baltazore)</a>, <a href="https://github.com/mansona" rel="noopener noreferrer" target="_blank">Chris Manson (@mansona)</a>, <a href="https://github.com/cabarney" rel="noopener noreferrer" target="_blank">Adam Barney (@cabarney)</a>, <a href="https://github.com/patricklx" rel="noopener noreferrer" target="_blank">Patrick Pircher (@patricklx)</a>, <a href="https://github.com/deanylev" rel="noopener noreferrer" target="_blank">Dean Levinson (@deanylev)</a>, <a href="https://github.com/mkszepp" rel="noopener noreferrer" target="_blank">Markus Sanin (@mkszepp)</a>, <a href="https://github.com/simonihmig" rel="noopener noreferrer" target="_blank">Simon Ihmig (@simonihmig)</a>, <a href="https://github.com/LucasHill" rel="noopener noreferrer" target="_blank">Lucas Hill (@LucasHill)</a>, <a href="https://github.com/BlueCutOfficial" rel="noopener noreferrer" target="_blank">Marine Dunstetter (@BlueCutOfficial)</a>, and <a href="https://github.com/kategengler" rel="noopener noreferrer" target="_blank">Katie Gengler (@kategengler)</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="connectwithushttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">🤓 Connect with us</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

  <p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discord.gg/emberjs">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>

  <p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://embertimes.substack.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://blog.emberjs.com/tag/newsletter">Ember blog</a>. See you in two weeks!</p>
</div>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-211</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-211</guid><pubDate>Thu, 04 Jul 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 52]]></title><description><![CDATA[<p>Emberistas שלום! 🐹</p>
<p>Read either on the <a href="https://www.emberjs.com/blog/2018/06/22/the-ember-times-issue-52.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/2018/06/22/the-ember-times-issue-52">e-mail newsletter</a> what has been going on in Emberland this week.</p>
<p>Those <strong>Request for Comments (RFCs)</strong> keep coming and this is why we present <strong>4 entirely new</strong> proposals
that you shouldn't miss this week.
We also have an amazing <strong>tutorial</strong> for creating <strong>accessible web applications</strong> for you, to give you a head start in developing, shipping and testing your apps for <strong>a11y</strong> 👭</p>
<p>Check out what's been going in Emberland 🐹 these days:</p>
<!-- READMORE -->
<hr />
<h2 id="anobjectupgradewithclasshttpsgithubcomemberjsrfcspull338"><a href="https://github.com/emberjs/rfcs/pull/338">An Object Upgrade with Class 🌟</a></h2>
<div class="blog-row">
  <img class="transparent padded pad-l0" alt="ES Class Syntax in Ember Code Example" title="Example Class Syntax in Ember" src="/images/blog/emberjstimes/esclassexample.png" />
</div>
<p>For Ember the road ahead is beset with <strong>native ES classes</strong>.
Last summer the first <a href="https://emberjs.github.io/rfcs/0240-es-classes.html">Request for Comments (RFC) for making ES classes</a>
a real thing in Ember had been merged and changed the future outlook for Ember's public API drastically.
The proposal crafted the idea of making the well-aged <code>EmberObject</code> model cross-compatible with the more modern ES Class syntax.
This paved the way for Ember to evolve with the latest state of the JavaScript ecosystem in mind.
Since then, early adopters in the community have been able to <a href="http://ember-decorators.github.io/ember-decorators/latest/">experiment with ES Class syntax</a> in their apps
by making use of the addon <code>ember-decorators</code> - seeing the classy ✨ future of Ember for themselves.</p>
<p>Now the follow-up <a href="https://github.com/emberjs/rfcs/pull/338">Native Class Roadmap RFC</a> from the author of <a href="https://emberjs.github.io/rfcs/0240-es-classes.html">RFC#240</a> has made its debut.
It explains how several changes to the current API of <code>EmberObject</code></p>
<ul>
<li>including an <a href="#toc_a-href-https-github-com-emberjs-rfcs-pull-337-native-class-constructor-update-a">update</a> to how the <code>constructor</code> method operates -
will be necessary to make ES Classes true first-class citizens in the Ember ecosystem
and how <code>EmberObject</code> can be safely deprecated in the further future.
It highlights that this will reinvent Ember's <strong>learning story</strong> and
therefore it'll facilitate the <strong>adoption</strong> of the framework <strong>in the wider JavaScript community</strong>.</li>
</ul>
<p>Still, not sure what all the fuzz is about? 🤔
Be sure to check out <a href="https://medium.com/build-addepar/es-classes-in-ember-js-63e948e9d78e">this great introduction into ES Classes in Ember</a>
and the original <a href="https://github.com/emberjs/rfcs/pull/338">RFC proposal</a> - we'd like to hear your thoughts! 💬</p>
<hr />
<h2 id="nativeclassconstructorupdatehttpsgithubcomemberjsrfcspull337"><a href="https://github.com/emberjs/rfcs/pull/337">Native Class Constructor Update 🛠</a></h2>
<p>In the same context as the <a href="#toc_a-href-https-github-com-emberjs-rfcs-pull-338-an-object-upgrade-with-class-a">Native Class Roadmap</a> there is currently an open RFC proposing to change the behavior of <code>EmberObject</code>'s constructor.</p>
<p>Native class syntax with <code>EmberObject</code> has almost reached full feature parity, meaning soon Ember will be able to ship native classes.
However, early adopters of native classes have experienced some serious issues due to the current behaviour of the class constructor. The issue is caused by the fact that properties passed to <code>EmberObject.create</code> are assigned to the instance in the root class <code>constructor</code>. Due to the way that native class fields work, this means that they are assigned <em>before</em> any subclasses' fields are assigned, causing subclass fields to overwrite any value passed to <code>create</code>.</p>
<p>The new implementation of the <code>EmberObject</code> would look like the following:</p>
<pre><code class="javascript language-javascript">class EmberObject {
  constructor(props) {
    // ..class setup things
  }

  static create(props) {
    let instance = new this(props);

    Object.assign(instance, props);
    instance.init();

    return instance;
  }
}
</code></pre>
<p>This would assign the properties <em>after</em> all of the class fields for any subclasses have been assigned.</p>
<p>One thing worth mentioning is that the RFC claims that <code>EmberObject</code> might not be necessary in the future.
The RFC states that, in this possible scenario, users would drop <code>EmberObject</code> ideally for non-Ember classes (things that aren’t Components, Services, etc.) altogether and that they would use native classes only.</p>
<p>👉 As always, all comments to this <a href="https://github.com/emberjs/rfcs/pull/337">RFC</a> are more than welcome, so let's help out in order to finalize it! ✨</p>
<hr />
<h2 id="newtutorialonaccessibilityhttpsemberjscomblog20180617emberaccessibilityanda11ytoolshtml"><a href="https://emberjs.com/blog/2018/06/17/ember-accessibility-and-a11y-tools.html">New Tutorial on Accessibility</a></h2>
<p>Ever wondered how to write accessible Ember apps? Jen Weber wrote a <a href="https://emberjs.com/blog/2018/06/17/ember-accessibility-and-a11y-tools.html">great tutorial</a> explaining all you need to get started. She takes you through setting up <code>ember-a11y-testing</code>, a tool made to do automated accessibility testing, adding accessibility checks to rendering tests and how to fix the issues found.</p>
<p>The tutorial ends with a nice section on what to do next. One thing is automated testing but as developers our responsibility is much bigger than that.</p>
<hr />
<h2 id="hellolinkwakeupthegreatrouterwantstotalktoyouhttpsgithubcomemberjsrfcspull339"><a href="https://github.com/emberjs/rfcs/pull/339">Hello, Link. Wake up. The Great Router wants to talk to you! 🎆</a></h2>
<p>Ever wondered how many and in which order you have to pass in parameters to the popular <code>link-to</code> helper
to make your transition work?</p>
<p>With lots of inspiration 💭 from routing solutions in Reactland ⚛️ another new RFC made it in this week
to help you in this exact situation: It proposes the introduction of a <code>Link</code> component to Ember's public API.
With dedicated <strong>named arguments</strong> it should be clearer what your links have to do to make that <strong>route transition</strong> a success.</p>
<p>Would you like to see how linking in future Ember apps might become much clearer?
Then check out the <a href="https://github.com/emberjs/rfcs/pull/339">original proposal</a> and leave <strong>your thoughts</strong> in the comments below!</p>
<hr />
<h2 id="farewellembermergeohaiemberassignhttpsgithubcomemberjsrfcspull340"><a href="https://github.com/emberjs/rfcs/pull/340">Farewell, Ember.merge 👋…Ohai, Ember.assign 😍</a></h2>
<p>Another RFC this week proposes the <strong>deprecation</strong> of the <code>Ember.merge</code> method in favor of the
functionally equivalent <code>Ember.assign</code>.
This means <strong>less duplication</strong> in Ember's codebase
and also less confusion on what either method does for any Ember users which is 💯.</p>
<p>Read the <a href="https://github.com/emberjs/rfcs/pull/340">full proposal</a> to learn more about
the deprecation story and comment on the pull request what you think about it. 📣</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv320contributingrepositories"><a href="https://guides.emberjs.com/v3.2.0/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/mfeckie" target="gh-user">@mfeckie</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/wagenet" target="gh-user">@wagenet</a>, <a href="https://github.com/rondale-sc" target="gh-user">@rondale-sc</a>, <a href="https://github.com/ampatspell" target="gh-user">@ampatspell</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/Mi6u3l" target="gh-user">@Mi6u3l</a>, <a href="https://github.com/GreatWizard" target="gh-user">@GreatWizard</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/mdbiscan" target="gh-user">@mdbiscan</a>, <a href="https://github.com/yashwin" target="gh-user">@yashwin</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/andreavaghi" target="gh-user">@andreavaghi</a>, <a href="https://github.com/s-pylypenko-mobilunity" target="gh-user">@s-pylypenko-mobilunity</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/lhoBas" target="gh-user">@lhoBas</a>, <a href="https://github.com/dnalagatla" target="gh-user">@dnalagatla</a>, <a href="https://github.com/pcambra" target="gh-user">@pcambra</a>, <a href="https://github.com/knownasilya" target="gh-user">@knownasilya</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/gossi" target="gh-user">@gossi</a>, <a href="https://github.com/happycollision" target="gh-user">@happycollision</a>, <a href="https://github.com/lifeart" target="gh-user">@lifeart</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/cyk" target="gh-user">@cyk</a> and
<a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a> for their contributions to Ember and related repositories! 💕
</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="theembertimesiswhatwemakeithttpsembercommunityslackcommessagesc8p6upwnn"><a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">The Ember Times is What We Make It 🙌</a></h2>
<p>The <strong>The Ember Times</strong> is a <strong>weekly news editorial</strong> featuring all the new things that are going on in Emberland.
<a href="https://the-emberjs-times.ongoodbits.com/">Subscribe to our e-mail newsletter</a> to get the next edition <strong>right to your inbox</strong>.
And if you've always wanted to be an OSS journalist yourself,
drop by <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">#topic-embertimes</a>
on the Ember Community <a href="https://ember-community-slackin.herokuapp.com/">Slack Chat</a>
and <strong>write</strong> the next edition of the Ember Times <strong>together with us</strong>!</p>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Miguel Braga Gomes, Kenneth Larsen, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-52</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-52</guid><pubDate>Fri, 22 Jun 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 53]]></title><description><![CDATA[<p>Mholweni Emberistas! 🐹</p>
<p>Read either on the <a href="https://www.emberjs.com/blog/2018/06/29/the-ember-times-issue-53.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/2018/06/29/the-ember-times-issue-53">e-mail newsletter</a> what has been going on in Emberland this week.</p>
<!-- alex disable easy -->
<p>And this week we not only have an insider tip on how to dramatically <strong>reduce</strong> your <strong>app build times</strong> 🕐 for you,
but we're also reporting back on <strong>easy-peasy module imports</strong> 🙌 and - last, but not least! - presenting you a <strong>brand-new Readers' Question</strong> 💯 in this edition of the Ember Times.
Check it out!</p>
<!-- alex enable easy -->
<!-- READMORE -->
<hr />
<h2 id="needforspeedembereditionspeedupemberbuildshttpsgithubcomembercliembercliissues7645"><a href="https://github.com/ember-cli/ember-cli/issues/7645">Need for Speed: Ember Edition - Speed Up Ember Builds</a></h2>
<p>Have Ember CLI build times been causing you <span style="font-style: italic;">grief</span>? Do you want to shave 20 seconds from your rebuilds?</p>
<p><a href="https://github.com/tomaszs">Tomasz Smykowski</a> has been experimenting with building on <a href="https://emberjs-developer.quora.com/How-to-make-Ember-js-CLI-ember-s-32-times-faster">SSD vs RAM Disk</a>. He has seen up to <strong>32x</strong> speed improvements! Speedups were found when upgrading to a faster processor and using an SSD.</p>
<p>Upgrading RAM wasn't found to be helpful however the biggest gain was found by using a <strong>RAM disk</strong> to hold the project folder which allowed 3x speed gains during builds. The drawback of this is that when the computer shuts down the RAM disk is wiped clean (so make sure you commit often!).
<a href="https://github.com/Turbo87">Tobias Bieniek</a> chimed in that current efforts to integrate Broccoli 2 into Ember CLI are underway and that most platforms would get this speedup by default once the usually RAM Disk powered, system temporary folder instead of the current <em>in-project</em> <code>tmp</code> folder is used due to the Broccoli update.</p>
<p>Look for this speedup soon in an Ember App near you!</p>
<hr />
<h2 id="ohnodehedidnthttpsgithubcomef4emberautoimport"><a href="https://github.com/ef4/ember-auto-import">Oh, No(de) He Didn't!</a></h2>
<p><a href="https://github.com/ef4">Edward Faulkner</a> has released version 1.0 of <code>ember-auto-import</code>. This addon allows you to add dependencies using NPM or Yarn with <strong>zero configuration</strong>. It can be used both in apps and addons and deduplicates correctly across all addons and the app itself.</p>
<p>All you have to do is type <code>ember install ember-auto-import</code> and you’re ready to add whatever dependency you want to your project using NPM or yarn.</p>
<p>Read all about the version 1.0 release on the <a href="https://discuss.emberjs.com/t/ember-auto-import-1-0-released/14997">forum</a>.</p>
<hr />
<h2 id="campinginillinoiswithembercampchicagohttpembercampcom"><a href="http://embercamp.com/">Camping in Illinois with EmberCamp Chicago 🏕</a></h2>
<p><img class="float-left extra-small transparent padded" alt="Chicago Zoey Mascot" title="Zoey Chicago Mascot" src="/images/tomsters/chicago-zoey.png" /></p>
<p><strong>EmberCamp Chicago</strong> is coming! Join over one hundred other Emberistas ✨ for a one day camping trip ⛺️ to Chicago's Chase Tower
on September 21st!
Read more about the event on <a href="http://embercamp.com/">the official website</a>.</p>
<!-- alex disable easy -->
<p>And also important:
Among the motto <em>"It's Easy In Ember"</em> the event organizers are curious about <strong>your talk ideas</strong>; and more than happy
to support you in making your proposal a real success! 🌟
The <a href="https://cfp.emberconf.com/events/embercamp-chicago-2018">Call for Proposals</a> for talk submissions is still <strong>open until July 22</strong>.
Unsure if you can <strong>see yourself speaking</strong> in the first place but curious what public speaking is about?</p>
<!-- alex enable easy -->
<!--alex ignore gal-guy-->
<p>Find ideas,
inspiration, answers to your questions and support in the
<a href="https://embercommunity.slack.com/archives/C9RSE508J/p1530056392000168">#topic-talks</a> channel
on the <a href="https://ember-community-slackin.herokuapp.com/">Ember Community Slack</a>, as well as in the <a href="https://embercommunity.slack.com/archives/C0851DA22/p1530137047000189">#women-in-ember</a> chat room if
you're a developer who is also a lady 👩🏻‍💻 !</p>
<blockquote>
  <p>"So, what do you want to be when you grow up?"</p>
  <p>"I don't know…I want go on adventures I think--not get stuck in one place. How about you?"</p>
</blockquote>
<hr />
<h2 id="transformsmorethanmeetstheeyehttpsgithubcomemberjsrfcspull343"><a href="https://github.com/emberjs/rfcs/pull/343">Transforms: More than Meets the Eye 👀</a></h2>
<p><a href="https://github.com/Alonski">@Alonski</a> composed an RFC to deprecate the usage of Transforms in Ember Data.  The RFC gathered some attention. Although the core reason for the RFC was discussed, <a href="https://github.com/emberjs/rfcs/pull/343#issuecomment-400382952">a comment</a> by <a href="https://github.com/runspired" target="gh-user">@runspired</a>, one of the maintainers of Ember Data, stands out from the rest:
Recently the Ember Data team has met and discussed deprecating the transforms, yet leaving them as a feature of the <strong>current</strong> model layer. <strong>Current model layer?</strong> There is another model layer? Yes! Because of the most recent <a href="https://github.com/emberjs/rfcs/pull/293">RecordData RFC</a>, Ember Data is now poised to accept alternative model layers.</p>
<p>If you are interested in what an alternative model layer looks like, check out <a href="https://github.com/hjdivad/ember-m3">ember-m3</a>. That's not all, the comments on this RFC also give us a glimpse into Ember Data's future - there are RFCs coming (not yet published) that  will eventually split up Ember Data into multiple packages.</p>
<p>Interested in the whole conversation? Checkout <a href="https://github.com/Alonski">@Alonski's</a> RFC <a href="https://github.com/emberjs/rfcs/pull/343">here</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv320contributingrepositories"><a href="https://guides.emberjs.com/v3.2.0/contributing/repositories/">Contributors' Corner</a></h2>
<p>A warm thank you 💛 goes to <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/lennyburdette" target="gh-user">@lennyburdette</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/hakilebara" target="gh-user">@hakilebara</a>, <a href="https://github.com/ryanto" target="gh-user">@ryanto</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a> and <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>
</span> for contributing to Ember and related repositories this week! 💕
</p>
<hr />
<h2 id="readersquestionscanistartusingmoduleunificationinmyapphttpsdiscussemberjscomtreadersquestionscanistartusingmoduleunificationinmyapp15029"><a href="https://discuss.emberjs.com/t/readers-questions-can-i-start-using-module-unification-in-my-app/15029">Readers' Questions: “Can I start using Module Unification in my app?”</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>This week's Readers' Question dives into the realm of cutting-edge Ember features: The avid Ember Times
  reader <code>sandstrom</code> asks if and how you're able to <strong>use Module Unification (MU)</strong> - a reformed way to structure your app's project directory - in your Ember application today.
  Is it true that you can have your own, MU-structured project already?</p>

   <p>In her detailed answer to this question, Ember Learning team member <a href="https://github.com/jenweber" target="githubjen">@jenweber</a> explains which <strong>benefits</strong> MU brings to your Ember app
   and also if it can be used today already. You can <a href="https://discuss.emberjs.com/t/readers-questions-can-i-start-using-module-unification-in-my-app/15029" target="rq2">read the full answer on the official Ember Forum</a>.</p>
  <p>
</div>
<div class="blog-row">
  <a class="es-button" href="https://discuss.emberjs.com/t/readers-questions-can-i-start-using-module-unification-in-my-app/15029">Read more</a>
</div>
<div class="blog-row">
  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🙂</p>
</div>
<hr />
<h2 id="theembertimesiswhatwemakeithttpsembercommunityslackcommessagesc8p6upwnn"><a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">The Ember Times is What We Make It 🙌</a></h2>
<p>The <strong>Ember Times</strong> is a <strong>weekly news editorial</strong> featuring all the new things that are going on in Emberland.
<a href="https://the-emberjs-times.ongoodbits.com/">Subscribe to our e-mail newsletter</a> to get the next edition <strong>right to your inbox</strong>.
And if you've always wanted to be an OSS journalist yourself,
drop by <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">#topic-embertimes</a>
on the Ember Community <a href="https://ember-community-slackin.herokuapp.com/">Slack Chat</a>
and <strong>write</strong> the next edition of the Ember Times <strong>together with us</strong>!</p>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Kenneth Larsen, Sivakumar Kailasam, Alon Bukai, Ryan Mark, Jen Weber, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-53</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-53</guid><pubDate>Fri, 29 Jun 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 54]]></title><description><![CDATA[<p>привет Emberistas! 🐹</p>
<p>Read either on the <a href="https://www.emberjs.com/blog/2018/07/06/the-ember-times-issue-54.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/2018/07/06/the-ember-times-issue-54">e-mail newsletter</a> what has been going on in Emberland this week.</p>
<p>This week you can read all about the <strong>📦 Ember 3.2</strong> and how the <strong>🐹 Core Team has reorganised</strong>.
There's also a great tip on how you can improve your testing with the new and improved <strong>🚀QUnit DOM</strong>.
At last, there's news about <strong>👩‍💻 Twiddle</strong> as well as a nice <strong>📹 video on the Ember Styleguide</strong>. Enjoy!</p>
<!-- READMORE -->
<hr />
<h2 id="organisingtheorganisershttpsemberjscomblog20180630organizingourcontributorshtml"><a href="https://emberjs.com/blog/2018/06/30/organizing-our-contributors.html">Organising the Organisers</a></h2>
<p>The Ember Team has published a new blog post outlining some <strong>structural changes</strong> to the <strong>Core teams</strong>. It contains two changes: A new Steering Committee and a renaming of some of the existing teams.</p>
<p>The Steering Committee will be responsible for areas like community guidelines, managing Ember’s brand, dealing with legal questions and much more.</p>
<p>The renaming of the <strong>Ember teams</strong> means that moving forward, all the official teams will be known as Core teams: Ember.js Core, Ember CLI Core, Ember Data Core, and Ember Learning Core.</p>
<p>The intent here is to make it clear that all members of the teams are peers.</p>
<p>You can read all about the changes in the <a href="https://emberjs.com/blog/2018/06/30/organizing-our-contributors.html">Ember blog post</a>.</p>
<hr />
<h2 id="qunitdomontypescriptforeasypeasyassertionshttpsgithubcomsimplabsqunitdompull96"><a href="https://github.com/simplabs/qunit-dom/pull/96">QUnit DOM on TypeScript for Easy-Peasy Assertions</a></h2>
<p>Are you fond of writing tests in QUnit? Are you a fan of expressive test assertions? Do you 💙 <strong>TypeScript</strong>?
Then we'll guarantee you that this update to <a href="https://github.com/simplabs/qunit-dom">qunit-dom</a> -
a library that helps you to write <strong>high-level DOM assertions</strong> - will make your heart beat faster 💕:</p>
<p>The library is now using TypeScript for compilation to ES5 and features lots of new type declarations,
making it possible for you to explore the <a href="https://github.com/simplabs/qunit-dom/blob/master/API.md">API</a>
in your editor as you type.</p>
<p>Check out the <a href="https://github.com/simplabs/qunit-dom/blob/v0.7.0/CHANGELOG.md">latest v0.7 release</a> to
get all the TypeScript neatness to your test suite today and type on! ⌨</p>
<hr />
<h2 id="twiddleyourthumbsnomorehttpsembertwiddlecom"><a href="https://ember-twiddle.com/">Twiddle Your Thumbs No More</a></h2>
<p><a href="https://ember-twiddle.com/">Ember Twiddle</a> support for the latest (v3.2.2) release of Ember and Ember Data is here! With the great efforts of <a href="https://github.com/Gaurav0">@Gaurav0</a>, <a href="https://github.com/rwjblue">@rwjblue</a> and <a href="https://github.com/gokatz">@gokatz</a> you can now use the latest and greatest in Ember Land in your favorite browser Ember environment.</p>
<p>Some cool updates are <strong>new keyboard shortcuts</strong> for <code>run now</code> and <code>save</code> as well as a shortcut for quickly commenting JavaScript code.
There are also some updates to the contribution guide, and it now supports Ember 3.0 - 3.2 out of the box!</p>
<p>Ember Twiddle, currently at <code>v0.15.0</code> is a great tool that allows creating Ember apps to showcase ideas, bugs, issues, demos and more. It allows using addons with the included <code>twiddle.json</code> and has a built-in generator like Ember-CLI. There are even different keyboard layouts such as Vim, Emacs, Sublime and more.</p>
<p>Now is a great time to check out this amazing tool!</p>
<hr />
<h2 id="upgradeyourappupto11withember32httpswwwemberjscomblog20180702ember32releasedhtml"><a href="https://www.emberjs.com/blog/2018/07/02/ember-3-2-released.html">Upgrade ⬆️ Your App up to 11 with Ember 3.2 🐹</a></h2>
<p>The time has come. The long awaited <a href="https://www.emberjs.com/blog/2018/07/02/ember-3-2-released.html">version 3.2 release of Ember, Ember CLI and Ember Data</a> is out in the wild!</p>
<p>A little later than previously planned, this release makes up for the waiting with neat new features,
including the handy <a href="https://emberjs.github.io/rfcs/0286-block-let-template-helper.html">let helper for on the spot creation of bindings in your templates</a> or
the ✨ testing assertion library <a href="https://github.com/simplabs/qunit-dom">qunit-dom</a>
which is now added to your v3.2+ app on your very first <code>ember new</code>.</p>
<p>Ember Data's latest release
<a href="https://www.emberjs.com/blog/2018/07/02/ember-3-2-released.html#toc_ember-data-feature-flag-removal-2-of-4">removes</a> several <strong>stale feature flags</strong> -
put into place to allow users an opt-in to experimental features which have now become outdated
to make way for more recent developments of the addon.
If you're relying on any of these features in your app, be sure to
<strong>reach out</strong> to the Ember Data team for support with the transition <a href="https://github.com/emberjs/data/issues">by opening an issue here</a>.</p>
<p>You can also check out the release blog post's <strong>Deprecations</strong> sections to ensure that you're app is prepared for the
next major release. Read all about 👀 it on the Ember Blog:</p>
<div class="blog-row">
  <a class="es-button"
    href="https://www.emberjs.com/blog/2018/07/02/ember-3-2-released.html"
    target="blog"
    aria-label="Read more about the 3.2 Ember release on the Ember blog">Read more</a>
</div>
<hr />
<h2 id="opensourcelivehttpswwwyoutubecomwatchvdx0vfmyqjmufeatureyoutube"><a href="https://www.youtube.com/watch?v=Dx0vfMyQJMU&feature=youtu.be">Open Source Live</a></h2>
<p>Now that the Guides and Deprecations have been moved into Ember apps, <a href="https://emberjs.com/">emberjs.com</a> needs to be moved to an Ember app too! <a href="https://github.com/mansona">Chris Manson</a> and <a href="https://github.com/MelSumner">Melanie Sumner</a> recorded their <strong>latest pairing session</strong>, where they are working on <strong>adding the beta</strong> <a href="https://github.com/ember-learn/ember-styleguide">ember-learn/ember-styleguide</a> to the new <a href="https://github.com/ember-learn/ember-website">ember-learn/ember-website</a> (a rewrite of <a href="https://github.com/emberjs/website">emberjs/website</a> in Ember, so as to make it easier to contribute to). Check out the video to learn more about Learning Team happenings and pair programming for knowledge sharing!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv320contributingrepositories"><a href="https://guides.emberjs.com/v3.2.0/contributing/repositories/">Contributors' Corner</a></h2>
<p>A warm thank you 💕 goes to <a href="https://github.com/krisselden">@krisselden</a>, <a href="https://github.com/Alonski">@Alonski</a>, <a href="https://github.com/kennethlarsen">@kennethlarsen</a>, <a href="https://github.com/jessica-jordan">@jessica-jordan</a>, <a href="https://github.com/MelSumner">@MelSumner</a>, <a href="https://github.com/pete-the-pete">@pete-the-pete</a>, <a href="https://github.com/hakilebara">@hakilebara</a>, <a href="https://github.com/teddyzeenny">@teddyzeenny</a>, and <a href="https://github.com/oskarrough">@oskarrough</a>.</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="theembertimesiswhatwemakeithttpsembercommunityslackcommessagesc8p6upwnn"><a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">The Ember Times is What We Make It 🙌</a></h2>
<p>The <strong>Ember Times</strong> is a <strong>weekly news editorial</strong> featuring all the new things that are going on in Emberland.
<a href="https://the-emberjs-times.ongoodbits.com/">Subscribe to our e-mail newsletter</a> to get the next edition <strong>right to your inbox</strong>.
And if you've always wanted to be an OSS journalist yourself,
drop by <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">#topic-embertimes</a>
on the Ember Community <a href="https://ember-community-slackin.herokuapp.com/">Slack Chat</a>
and <strong>write</strong> the next edition of the Ember Times <strong>together with us</strong>!</p>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Sivakumar Kailasam, Jessica Jordan, Alon Bukai, Amy Lam, Kenneth Larsen and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-54</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-54</guid><pubDate>Fri, 06 Jul 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 55]]></title><description><![CDATA[<p>nuqneH Emberistas! 🐹</p>
<p>Read either on the <a href="https://www.emberjs.com/blog/2018/07/13/the-ember-times-issue-55.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/2018/07/13/issue-55">e-mail newsletter</a> what has been going on in Emberland this week.</p>
<p>This week you can learn about <strong>updating</strong> your Ember app 💁🏻. Learn from firsthand experience how to become an <strong>addon maintainer</strong> 💪. Get some tips on writing your own <strong>RFCs</strong> ✨. Check out the new <strong>SEO tactics</strong> of Ember 🔎 and last but not least learn about the potential move of Ember to a new <strong>chat platform</strong> 💬. Go ahead and enjoy!</p>
<!-- READMORE -->
<hr />
<h2 id="dontworryembercligotyoucoveredhttpsgithubcomembercliembercliupdate"><a href="https://github.com/ember-cli/ember-cli-update">Don't Worry, Ember CLI Got You Covered 💻</a></h2>
<p>The <strong>number one</strong> tool for updating Ember.js apps or addons got <strong>even better</strong>. The <a href="https://github.com/ember-cli/ember-cli-update/releases">newest version</a> of <code>ember-cli-update</code> now runs <code>qunit-dom-codemod</code> for you. This means that you, with close to no effort at all, can utilize this great addon for your tests.</p>
<p>And the cool thing is that <code>ember-cli-update</code> fetches new codemods <strong>during runtime</strong> - so no need to update to get this nice codemod! To run the codemod, type <code>ember-cli-update --run-codemods</code> and magic will take care of the rest for you.</p>
<p>You can visit the addon page for <a href="https://github.com/ember-cli/ember-cli-update">ember-cli-update</a> to read all about it or visit <a href="https://github.com/simplabs/qunit-dom">qunit-dom</a> to learn about all the nice features it provides.</p>
<hr />
<h2 id="startsmallhowibecameanemberaddonmaintainerbyryanmarkhttpsgithubcomtylerturdenpants"><a href="https://github.com/tylerturdenpants">Start Small - How I Became an Ember Addon Maintainer by Ryan Mark</a> 💪</h2>
<p><a href="https://github.com/elwayman02/ember-user-activity/">ember-user-activity</a> is a great addon.  It fit my needs and worked perfectly…until I needed to use <strong>Fastboot</strong>. Seeing how others had solved Fastboot related compatibility issues, I cloned <a href="https://github.com/elwayman02/ember-user-activity/"><code>ember-user-activity</code></a> and got to work. After a few suggested tweaks by the author, my PR was merged, and a new version was released.  A few weeks later, a new version of ember-cli was released. I've always updated my own app, but I had never done an addon.  Excited about this new <strong>challenge</strong>, I updated <a href="https://github.com/elwayman02/ember-user-activity/"><code>ember-user-activity</code></a> to the latest ember-cli version. Moments later, after submitting my PR, the author sent me an invitation to <strong>collaborate</strong>. The author asked if I could <strong>help</strong> him maintain the addon, and I <strong>enthusiastically</strong> agreed. As of today, I have published a handful of releases. Even though I didn't create the addon, I had <strong>ownership</strong>, and it was exciting to be a part of the addon <strong>community</strong>.</p>
<p>TL;DR, one of the easiest ways to contribute, and possibly becoming a collaborator/maintainer of an addon, is doing small, chore like work for the author. Authors, and even current maintainers, always appreciate the help. Not only does it keep the addon fresh, but often the addon needs a fix or two to be compatible, allowing for even more contributing.</p>
<p>Interested in contributing in a hurry? According to <a href="https://twitter.com/mixonic">@mixonic</a>, an Ember.js Core team member, the version of Ember.js used in <a href="http://todomvc.com/examples/emberjs/">TodoMVC</a> has been out of date and he's asking for help. Check out the <a href="https://github.com/tastejs/todomvc/pull/1790">conversation</a> and lend a helping hand!</p>
<hr />
<h2 id="haveyoueverdreamtaboutcreatingyourveryownrfchttpsgithubcomemberjsrfcspulls"><a href="https://github.com/emberjs/rfcs/pulls">Have you ever dreamt about creating your very own RFC? ✨</a></h2>
<!-- alex ignore dad-mom -->
<p>If you've ever wondered how <strong>Request for Comments</strong> come about, now you have a great chance to peak into its thought process. It might look like they pop up overnight, but there is actually a lot of work and support that goes into them before they are ready.</p>
<p>As an example, our beloved contributor <a href="https://github.com/jenweber">@jenweber</a> is doing an amazing job by putting together tutorials for <code>ember-cli</code>. 👏 More specifically these tutorials will explain basic commands and how to make your first addon.</p>
<p>In order for this specific RFC to be ready the following steps are being taken:</p>
<ul>
<li><p>Brainstorm about which parts of Ember need more documentation 🤔</p></li>
<li><p>Find a co-inspirator to iterate your ideas with 👭</p></li>
<li><p>Reach out to the CLI Teams to get more ideas and feedback 💡</p></li>
<li><p>Get a couple of early reviewers 🤓</p></li>
<li><p>Draft the RFC and get more feedback from all the stakeholders 📖</p></li>
<li><p>Make a proof of concept 👨‍💻</p></li>
<li><p>Publish it 🚀</p></li>
<li><p>❔❔❔</p></li>
<li><p>Profit 🤑</p></li>
</ul>
<p>Not all the above steps are mandatory, but it gives you a pretty good notion of what might be involved.</p>
<p>And now that you know, why not stay tuned for this specific RFC and make your contribution? All comments and new writers are more than welcome! <a href="https://github.com/sivakumar-kailasam/cli-guides/pull/4" target="_blank">Click here to learn more!</a> 📢</p>
<hr />
<h2 id="findemberontheinterwebswiththepowerofseohttpsembercommunityslackcomarchivescaheztmbk"><a href="https://embercommunity.slack.com/archives/CAHEZTMBK">Find Ember on the Interwebs with the Power of SEO 🔎</a></h2>
<p>These past days, weeks and months lots of efforts have been focused on improving the
<strong>discoverability of official Ember resources</strong> including the website, the Guides or the API docs.
The visibility of these sites to various search engines 🔍 , for example, DuckDuckGo, Baidu, AOL Search, Dogpile or Google
plays a major role in helping developers find the information they are looking for.
To improve Ember's visibility on the web, <strong>Search-Engine Optimization (SEO)</strong> of these pages is one of the most effective measures.</p>
<!-- alex ignore simple -->
<p>Simple, yet effective improvements for Ember sites included tests of functional redirects (<a href="https://github.com/emberjs/website/pull/3394">1</a>) and fixes for broken links (<a href="https://github.com/emberjs/website/pull/3271">2</a>, <a href="https://github.com/emberjs/website/pull/3183">3</a>, <a href="https://github.com/emberjs/website/pull/3182">4</a>).
Other high-impact efforts included a <a href="https://github.com/ember-learn/guides-app/pull/135">new meta data structure for the new Guides</a>
and the continuous evaluation of web crawler data.</p>
<p>If you have previous experience with SEO and you're interested in casting some keyword magic ✨🎩 for Ember sites,
check out the <a href="https://embercommunity.slack.com/archives/CAHEZTMBK">#st-website</a> channel on the
<a href="https://ember-community-slackin.herokuapp.com/">Ember Community Slack Chat</a>
and join other SEO analysts in their quest to make Ember the No. 1 search result on <a href="https://ask.com/web?o=0&l=dir&qo=serpSearchTopBox&q=the+most+ambitious+JS+mvc+framework+must+have+a+cute+mascot">Ask.com</a>.</p>
<hr />
<h2 id="rfcgoodbyeslackhellodiscordhttpsgithubcomemberjsrfcspull345"><a href="https://github.com/emberjs/rfcs/pull/345">RFC: Goodbye Slack, Hello Discord 💬</a></h2>
<p><a href="https://github.com/MelSumner">@MelSumner</a> has proposed an <a href="https://github.com/emberjs/rfcs/pull/345">RFC</a> recommending that the Ember community chat moves from Slack to Discord. Ever had a message on the Ember Slack disappear on you in a channel or DM? Discord stores chat logs forever, so losing history would no longer be an issue. Better communication and transparency FTW!</p>
<p>Our one gripe with the potential move is the confusion between <a href="https://discuss.emberjs.com/">Discourse</a> and <a href="https://discordapp.com/">Discord</a>… 😅</p>
<!--alex ignore host-hostess-->
<p>Discord is the chat host to <a href="https://discordapp.com/open-source">many open source projects</a>, such as Yarn, Vue.js, and Reactiflux.</p>
<p>Have some thoughts on the proposal? Get involved on the <a href="https://github.com/emberjs/rfcs/pull/345">RFC</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv320contributingrepositories"><a href="https://guides.emberjs.com/v3.2.0/contributing/repositories/">Contributors' Corner</a> 🤝</h2>
<p>This week we'd like to thank <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/thoov" target="gh-user">@thoov</a>, <a href="https://github.com/DanielRosenwasser" target="gh-user">@DanielRosenwasser</a>, <a href="https://github.com/stopdropandrew" target="gh-user">@stopdropandrew</a>, <a href="https://github.com/ijlee2" target="gh-user">@ijlee2</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/bmac" target="gh-user">@bmac</a>, <a href="https://github.com/pete-the-pete" target="gh-user">@pete-the-pete</a>, <a href="https://github.com/john-griffin" target="gh-user">@john-griffin</a>, <a href="https://github.com/gabrielgrant" target="gh-user">@gabrielgrant</a>, <a href="https://github.com/localpcguy" target="gh-user">@localpcguy</a>, <a href="https://github.com/kasunvp" target="gh-user">@kasunvp</a>, <a href="https://github.com/mike-north" target="gh-user">@mike-north</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/jrock2004" target="gh-user">@jrock2004</a>, <a href="https://github.com/ryanto" target="gh-user">@ryanto</a>, <a href="https://github.com/wagenet" target="gh-user">@wagenet</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/ThiefZero" target="gh-user">@ThiefZero</a>, <a href="https://github.com/jpadilla" target="gh-user">@jpadilla</a> and <a href="https://github.com/heqian" target="gh-user">@heqian</a> for their contributions to Ember and related repositories! 💕
</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="theembertimesiswhatwemakeithttpsembercommunityslackcommessagesc8p6upwnn"><a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">The Ember Times is What We Make It 🙌</a></h2>
<p>The <strong>Ember Times</strong> is a <strong>weekly news editorial</strong> featuring all the new things that are going on in Emberland.
<a href="https://the-emberjs-times.ongoodbits.com/">Subscribe to our e-mail newsletter</a> to get the next edition <strong>right to your inbox</strong>.
And if you've always wanted to be an OSS journalist yourself,
drop by <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">#topic-embertimes</a>
on the Ember Community <a href="https://ember-community-slackin.herokuapp.com/">Slack Chat</a>
and <strong>write</strong> the next edition of the Ember Times <strong>together with us</strong>!</p>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Kenneth Larsen, Amy Lam, Miguel Braga Gomes, Ryan Mark, Sivakumar Kailasam, Jessica Jordan, Alon Bukai and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-55</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-55</guid><pubDate>Fri, 13 Jul 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 56]]></title><description><![CDATA[<p>Ia orana Emberistas! 🐹</p>
<p>Read either on the <a href="https://www.emberjs.com/blog/2018/07/20/the-ember-times-issue-56.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/2018/07/20/issue-56">e-mail newsletter</a> what has been going on in Emberland this week.</p>
<p>Learn more about <strong>lazily loaded</strong> dependencies with <strong>ember-auto-import</strong> ✨, the latest <strong>update of Ember in TodoMVC</strong>, the obligatory
<strong>"Hello World" example</strong> for JavaScript libraries 📝, and the latest <strong>Ember 3.3 release</strong> ⬆️.
Be sure to also join us on a tour 🚌 through recent <strong>RFCs (Request for Comments)</strong> proposing features that will land
in an Ember app near you soon! 🚀</p>
<!-- READMORE -->
<hr />
<h2 id="gotdependencieshttpsgithubcomef4emberautoimportdynamicimport"><a href="https://github.com/ef4/ember-auto-import#dynamic-import">Got Dependencies? 📦</a></h2>
<p>We’ve previously highlighted the great <code>ember-auto-import</code> by the wizardly <a href="https://github.com/ef4">Edward Faulkner</a>🌟 as a way to import npm packages into your Ember app. With the latest update, it got way cooler.</p>
<p>As he demonstrates in this <a href="https://eaf4.com/dynamic-import-into-your-ember-app/">nice screencast</a>, with v1.2.0 you can now lazy load dependencies via <code>import()</code>! The dynamic <code>import()</code> will load the dependency as well as all its recursive dependencies via a separate JavaScript file <strong>at runtime</strong>. That’s really awesome.</p>
<p>To get started, watch the screencast or dive into the <a href="https://github.com/ef4/ember-auto-import#dynamic-import">documentation</a>.</p>
<hr />
<h2 id="todomvcemberjsupdatehttpsgithubcomtastejstodomvcpull1912"><a href="https://github.com/tastejs/todomvc/pull/1912">TodoMVC Ember.js Update ✨</a></h2>
<p>Last week, <a href="https://github.com/mixonic">@mixonic</a> was looking for a helping hand to contribute to the <a href="https://twitter.com/mixonic/status/1017487614121684992">TodoMVC Ember.js update</a>. The <a href="https://github.com/tastejs/todomvc/pull/1912">PR</a> is now merged and the bump to Ember 3.2 was a success. A big thank you from the community to <a href="https://github.com/zoltan-nz">@zoltan-nz</a> and everyone involved.</p>
<p><a href="http://todomvc.com/">TodoMVC</a> helps you decide what MV* framework to use for your projects by providing the classic todo app built in a number of different frameworks and therefore exposing each frameworks' capabilities.</p>
<p>We all know which one is our favorite…🐹, so why not stop by and see it in action at <a href="http://todomvc.com/examples/emberjs">http://todomvc.com/emberjs</a>, or maybe become a <a href="https://github.com/tastejs/todomvc/blob/master/contributing.md">contributor</a> yourself.</p>
<p>Have fun with the "Speed-dating of MV" frameworks"!</p>
<hr />
<h2 id="ontheheelsof32ember33releasedhttpsemberjscomblog20180716ember33releasedhtml"><a href="https://emberjs.com/blog/2018/07/16/ember-3-3-released.html">On the Heels of 3.2: Ember 3.3 Released 🎉</a></h2>
<p><img class="float-right small transparent padded" alt="Release Bust Tomster" title="Ember Stable Release" src="/images/tomsters/3-release.png" /></p>
<p>Although you might remember a not too far away, <a href="https://emberjs.com/blog/2018/07/02/ember-3-2-released.html">previous 3.2 release</a>, this week the <strong>latest 3.3 releases</strong> of Ember.js, Ember CLI and Ember Data have been <a href="https://emberjs.com/blog/2018/07/16/ember-3-3-released.html">published</a>.
This will guarantee that the publishing of Ember.js in particular stays in sync with the planned schedule of the overall release cycle.</p>
<p>The new minor release of Ember.js includes several <strong>new deprecations</strong> that you shouldn't miss to make your Ember app ready for the future! ⏰
<strong>Read more</strong> about these and other details of the 3.3 release in <a href="https://emberjs.com/blog/2018/07/16/ember-3-3-released.html">the official release blog post</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://emberjs.com/blog/2018/07/16/ember-3-3-released.html" target="threedotthreerelease">Read more</a></p>
<hr />
<h2 id="rfcroundupwithrwjbluehttpsemberweekendcomepisodesrfcroundupwithrwjblue"><a href="https://emberweekend.com/episodes/rfc-roundup-with-rwjblue">RFC Roundup with @rwjblue</a></h2>
<p>The Ember Weekend podcast is back on the mic! Want to hear more about some recent RFCs? <a href="https://github.com/rwjblue">@rwjblue</a> discusses <a href="https://github.com/emberjs/rfcs/blob/master/text/0276-named-args.md">RFC #276: Named Arguments Syntax (<code>@foo</code>)</a>, <a href="https://github.com/emberjs/rfcs/pull/213">RFC #213: Custom Components API</a>, and <a href="https://github.com/emberjs/rfcs/blob/master/text/0311-angle-bracket-invocation.md">RFC #311: Introduce <code>&lt;AngleBracketInvocationSyntax /&gt;</code></a> in <a href="https://emberweekend.com/episodes/rfc-roundup-with-rwjblue">the latest episode</a>. Entertaining and informative! TIL rest parameters are also known as "splatributes". Subscribe to Ember Weekend <a href="https://itunes.apple.com/us/podcast/ember-weekend/id981719021">here</a> on iTunes. 🎙</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv320contributingrepositories"><a href="https://guides.emberjs.com/v3.2.0/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week a warm thank you goes out to <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/ef4" target="gh-user">@ef4</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/Mi6u3l" target="gh-user">@Mi6u3l</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/Gabbyjose" target="gh-user">@Gabbyjose</a>, <a href="https://github.com/bmac" target="gh-user">@bmac</a>, <a href="https://github.com/jelhan" target="gh-user">@jelhan</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/2hu12" target="gh-user">@2hu12</a> and <a href="https://github.com/oligriffiths" target="gh-user">@oligriffiths</a>
</span> for their contributions to Ember and related repositories! 💕
</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<!-- alex ignore dad-mom -->
<p>Have a suggestion for next week's Ember Times? Want to write for us? Pop into <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">#topic-embertimes</a>
on the Ember Community <a href="https://ember-community-slackin.herokuapp.com/">Slack</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Kenneth Larsen, Amy Lam, Miguel Braga Gomes, Ryan Mark, Jessica Jordan, Alon Bukai and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-56</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-56</guid><pubDate>Fri, 20 Jul 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 57]]></title><description><![CDATA[<p>~ Γεια σου Emberistas! 🐹</p>
<p>Read either on the <a href="https://www.emberjs.com/blog/2018/07/27/the-ember-times-issue-57.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/2018/07/27/issue-57">e-mail newsletter</a> what has been going on in Emberland this week.</p>
<p>This week you can learn about how to make <strong>ember-inspector</strong> best inspector ever ✨, <strong>single word angle-bracket invocation</strong>, and how <strong>Ember + WebAssembly</strong> are now the best of friends 👐. Find out when to grab a snack 🍿 and join the <strong>ember-data</strong> live streams 🎥 . Confused about <strong>ember-lifeline</strong> and <strong>ember-concurrency</strong>? Checkout the brand-new Readers' Question 💯 in this edition of the Ember Times to unravel the mystery.</p>
<!-- READMORE -->
<hr />
<h2 id="emberinspectorhelpshapethefuturehttpsgithubcomemberjsemberinspector"><a href="https://github.com/emberjs/ember-inspector">Ember Inspector - Help shape the future! 🔍</a></h2>
<p>We're pushing hard to make Ember Inspector the world class DevTools you deserve, and would love to get your input and help!</p>
<p>We would like to hear about feature requests and ideas you have, pain points you have experienced, and anything and everything you can think of, that you would like to see make it into future iterations of Ember Inspector. Please check out the <a href="https://discuss.emberjs.com/t/ember-inspector-call-for-feature-requests-pain-points-and-contributors/15187">discuss post</a> and leave your thoughts, and feel free to stop by the <a href="https://embercommunity.slack.com/messages/C04ENQPFW/">#ember-inspector</a> channel on Slack to chat about things or let us know you want to help contribute!</p>
<hr />
<h2 id="pointysinglewordcomponentsavailablehttpsgithubcomrwjblueemberanglebracketinvocationpolyfill"><a href="https://github.com/rwjblue/ember-angle-bracket-invocation-polyfill">Pointy single word components available 👈</a></h2>
<p>Since last Monday single word component names are now possible with the <strong>angle bracket invocation syntax</strong>. Invoking components via angle brackets was already available, the novelty is that you can now use this syntax with single word components as well.</p>
<p>For example, the polyfill supports components names such as <code>&lt;Button&gt;</code>, <code>&lt;Modal&gt;</code> and <code>&lt;Tab&gt;</code>.</p>
<p>To find out more, check out the relevant RFC section <a href="https://github.com/emberjs/rfcs/blob/master/text/0311-angle-bracket-invocation.md#tag-name">here</a>.</p>
<hr />
<h2 id="gettoknowemberdatainternalsliveandinactionhttpswwwtwitchtvrunspired"><a href="https://www.twitch.tv/runspired">Get to know Ember Data internals live and in action 🎥</a></h2>
<p><strong>Live streams</strong> are amazing for sharing knowledge about the internals of your favorite libraries. On his <a href="https://www.twitch.tv/runspired">Twitch channel</a>, Ember Data contributor <a href="https://github.com/runspired">@runspired</a> will take you on a <strong>tour through Ember Data</strong> and highlight characteristics of the project.</p>
<p>The first stream about writing and refactoring Ember Data's test suite already went live past Sunday, but there'll be more to come in the future! ✨ You can check out and comment on the <a href="https://twitter.com/Runspired/status/1020528036762988544">announcement thread on Twitter</a> and tune into <a href="https://www.twitch.tv/runspired">@runspired's stream channel</a> for future streaming sessions, broadcasting <strong>every Tuesday & Friday</strong> at <strong>1pm Pacific Time / 4pm Eastern Time / 8pm UTC</strong>.</p>
<hr />
<!-- alex ignore just -->
<h2 id="emberwebassemblyjustgotwayeasierhttpsmediumcomlukedenistonemberwebassemblyjustgotwayeasier1e4ec6ca40ab"><a href="https://medium.com/@lukedeniston/ember-webassembly-just-got-way-easier-1e4ec6ca40ab">Ember + WebAssembly just got way easier</a></h2>
<p>Thanks to @ef4's <a href="https://github.com/ef4/ember-auto-import">ember-auto-import</a>, importing Wasm modules is now a breeze! <a href="https://github.com/luketheobscure">@luketheobscure</a> wrote about his experience and created a <a href="https://github.com/luketheobscure/wasm-example">wasm-example app</a> in Ember. Check out his writeup on <a href="https://medium.com/@lukedeniston/ember-webassembly-just-got-way-easier-1e4ec6ca40ab">Medium</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank the work and effort made by <a href="https://github.com/mike-north" target="gh-user">@mike-north</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/Mi6u3l" target="gh-user">@Mi6u3l</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/bmac" target="gh-user">@bmac</a>, <a href="https://github.com/sumeetattree" target="gh-user">@sumeetattree</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/bgentry" target="gh-user">@bgentry</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/arthirm" target="gh-user">@arthirm</a>, <a href="https://github.com/astronomersiva" target="gh-user">@astronomersiva</a>, <a href="https://github.com/SparshithNR" target="gh-user">@SparshithNR</a>, <a href="https://github.com/dependabot[bot]" target="gh-user">@dependabot[bot]</a>, <a href="https://github.com/dfreeman" target="gh-user">@dfreeman</a>, <a href="https://github.com/savvymas" target="gh-user">@savvymas</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/ef4" target="gh-user">@ef4</a>, <a href="https://github.com/hakilebara" target="gh-user">@hakilebara</a>, <a href="https://github.com/maciej-ka" target="gh-user">@maciej-ka</a>, <a href="https://github.com/melaniespath" target="gh-user">@melaniespath</a> and <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>. We appreciate your contributions to Ember and related repositories 💖!</p>
<hr />
<h2 id="readersquestionwhatsthedifferencebetweenemberlifelineandemberconcurrencyandwhichoneshouldbeusedhttpsdiscussemberjscomtreadersquestionswhatsthedifferencebetweenemberlifelineandemberconcurrencyandwhichoneshouldbeused15197"><a href="https://discuss.emberjs.com/t/readers-questions-whats-the-difference-between-ember-lifeline-and-ember-concurrency-and-which-one-should-be-used/15197">Readers' Question: "What's the difference between ember-lifeline and ember-concurrency and which one should be used?" 🤔</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>This week's Readers' Question operates <strong>asynchronously</strong>: Both <code>ember-concurrency</code> and
  <code>ember-lifeline</code> are popular addons for managing async behaviour in your Ember applications
  as smoothly as possible. But what's the <strong>difference</strong> between those two?

   <p>In his detailed answer to this question, Ember developer and writer <a href="https://github.com/chrisrng" target="githubchris">@chrisrng</a> presents the <strong>strengths of either addon</strong> to handle application state. You can <a href="https://discuss.emberjs.com/t/readers-questions-whats-the-difference-between-ember-lifeline-and-ember-concurrency-and-which-one-should-be-used/15197" target="rq3">read the full answer on the official Ember Forum</a>.</p>
  <p>
</div>
<p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem? Ask away at <a href="https://bit.ly/ask-ember-core">bit.ly/ask-ember-core</a> and we'll present the answer in a future Ember Times. There are no silly questions! 🐹</p>
<hr />
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">#topic-embertimes</a> on Slack or tweet us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Amy Lam, Miguel Braga Gomes, Ryan Mark, Sivakumar Kailasam, Jessica Jordan, Robert Wagner, Chris Ng, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-57</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-57</guid><pubDate>Fri, 27 Jul 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 58]]></title><description><![CDATA[<p>Xin chào Emberistas! 🐹</p>
<p>Read either on the <a href="https://www.emberjs.com/blog/2018/08/03/the-ember-times-issue-58.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com">e-mail newsletter</a> what has been going on in Emberland this week.</p>
<!--alex ignore special-->
<p>This time we have a call-to-action to shape the future of the <strong>new Ember homepage</strong> 🎨👩‍🎨 for you, as well as a brand-new <strong>RFC for the Ember CLI Docs</strong> 📖,
important <strong>accessibility</strong> updates for <strong>ember-toggle</strong> 🔘 and a special <strong>thank you note</strong> for some of our dedicated contributors ✨</p>
<!-- READMORE -->
<hr />
<h2 id="thequestforbetterdocumentationhttpsgithubcomemberclirfcspull120"><a href="https://github.com/ember-cli/rfcs/pull/120">The Quest for Better Documentation</a></h2>
<p>There’s a <a href="https://github.com/jenweber/rfcs-1/blob/cli-guides/active/0000-cli-guides.md">brand new RFC (Request for Comments)</a> for restructuring and refreshing the Ember CLI docs. <a href="https://twitter.com/jwwweber">Jen Weber</a> prepared a great overview of what needs to change to improve <strong>Ember CLI documentation</strong>. This is especially important since these changes could empower new contributors, correct outdated information and make the learning process way easier.</p>
<p>Besides a restructure of the information architecture, Jen proposes to use personas as a way of understanding what changes are needed, as well as transforming the site into an Ember app.</p>
<p>Community feedback is as always appreciated. Head over to the <a href="https://github.com/ember-cli/rfcs/pull/120">proposal</a> and <strong>leave your comments</strong> below.</p>
<hr />
<h2 id="emberhomepagesurveyhttpswwwemberjscomblog20180730emberhomepagesurveyhtml"><a href="https://www.emberjs.com/blog/2018/07/30/ember-homepage-survey.html">Ember Homepage Survey</a></h2>
<p>We're <strong>redesigning</strong> <a href="https://emberjs.com/">emberjs.com</a> and we need your help.</p>
<p>We want to find out what makes you continue to use Ember in a world full of alternatives, so we can better communicate Ember's value proposition to others who might find similar success.</p>
<p>By taking a <strong>few minutes</strong> to <a href="https://www.emberjs.com/homepage-survey">answer these questions</a>, you can <strong>help influence</strong> the messaging behind Ember's future homepage and any other marketing materials we create.</p>
<hr />
<h2 id="embertoggleupdatedhttpsgithubcomknownasilyaembertoggleblobmasterchangelogmd53020180731"><a href="https://github.com/knownasilya/ember-toggle/blob/master/CHANGELOG.md#530-2018-07-31">Ember-Toggle Updated 🛠</a></h2>
<p>The <strong>accessibilty</strong> on <a href="https://github.com/knownasilya/ember-toggle">ember-toggle</a> has stepped up.</p>
<p>According to its changelog, the new version <a href="https://github.com/knownasilya/ember-toggle/compare/v5.2.4…v5.3.0">5.3.0</a> was released last Tuesday, making it possible to use the spacebar to change the state of the toggle once highlighted.</p>
<p>Awesome news! We love Ember addons. 🐹 ❤️ 📦</p>
<hr />
<!--alex ignore special-->
<h2 id="aspecialthankyouforallyoureffortshttpsgithubcomemberlearn"><a href="https://github.com/ember-learn">A Special Thank You For All Your Efforts 🙇</a></h2>
<div class="blog-row">
  <img class="float-left transparent" alt="" title="Ember Style Guide Docs" src="/images/blog/emberjstimes/styleguide-docs-screenshot.png" />
</div>
<!--alex ignore special-->
<p>Even though we're already trying to highlight the amazing and consistent efforts of community contributors in our weekly <strong>Contributors' Corner</strong>, we'd like to take the time to say a special thank you to a couple of ambitious contributors to learning resources specifically:</p>
<p>We're grateful for all the outstanding contributions <a href="https://github.com/hakilebara">@hakilebara</a> made to learning resources recently. This included a <a href="https://github.com/ember-learn/ember-styleguide/pull/76">from-the-scratch setup</a> of the <a href="https://github.com/ember-learn/ember-styleguide">ember-styleguide docs</a> and <a href="https://github.com/ember-learn/guides-source/pull/112">improvements to the offical Guides</a>.</p>
<p>We also appreciate all the efforts by <a href="https://github.com/sivakumar-kailasam">@sivakumar-kailasam</a> and <a href="https://github.com/toddjordan">@toddjordan</a>
to fix missing modules, upgrade and improve the Ember API Docs these days (<a href="https://github.com/ember-learn/algolia-index-update-scripts/pull/4">1</a>, <a href="https://github.com/emberjs/ember.js/pull/16836">2</a>, <a href="https://github.com/ember-learn/ember-jsonapi-docs/commits?author=sivakumar-kailasam&since=2018-06-30T22:00:00Z&until=2018-07-31T22:00:00Z">3</a>).</p>
<p>Thank you for all your work! ❤️</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/smfoote" target="gh-user">@smfoote</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/nlfurniss" target="gh-user">@nlfurniss</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/ryanto" target="gh-user">@ryanto</a>, <a href="https://github.com/Mi6u3l" target="gh-user">@Mi6u3l</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/jelhan" target="gh-user">@jelhan</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/teddyzeenny" target="gh-user">@teddyzeenny</a>, <a href="https://github.com/Bestra" target="gh-user">@Bestra</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/tmquinn" target="gh-user">@tmquinn</a>, <a href="https://github.com/ggayowsky" target="gh-user">@ggayowsky</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/leobugoni" target="gh-user">@leobugoni</a>, <a href="https://github.com/kanongil" target="gh-user">@kanongil</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/miguelcobain" target="gh-user">@miguelcobain</a>, <a href="https://github.com/jrowlingson" target="gh-user">@jrowlingson</a>, <a href="https://github.com/savvymas" target="gh-user">@savvymas</a>, <a href="https://github.com/chilicoder" target="gh-user">@chilicoder</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/cspanring" target="gh-user">@cspanring</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/matthewjramos" target="gh-user">@matthewjramos</a> and <a href="https://github.com/maciej-ka" target="gh-user">@maciej-ka</a> for their contributions to Ember and related repositories! 💕
</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="theembertimesiswhatwemakeithttpsembercommunityslackcommessagesc8p6upwnn"><a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">The Ember Times is What We Make It 🙌</a></h2>
<p>The <strong>Ember Times</strong> is a <strong>weekly news editorial</strong> featuring all the new things that are going on in Emberland.</p>
<p>Follow us on Twitter via <a href="https://twitter.com/embertimes">@embertimes</a> to get notified when the next edition is out and <a href="https://the-emberjs-times.ongoodbits.com/">subscribe to our e-mail newsletter</a> to get The Ember Times <strong>right to your inbox</strong>.</p>
<p>And if you've always wanted to be an OSS journalist yourself, drop by <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">#topic-embertimes</a> on the Ember Community <a href="https://ember-community-slackin.herokuapp.com/">Slack chat</a> and <strong>write</strong> the next edition of the Ember Times <strong>together with us</strong>!</p>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Ryan Toronto, Miguel Braga Gomes, Amy Lam, Ryan Mark, Kenneth Larsen, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-58</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-58</guid><pubDate>Fri, 03 Aug 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 59]]></title><description><![CDATA[<p>Merhaba Emberistas! 🐹</p>
<p>Read either on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a> what has been going on in Emberland this week.</p>
<!--alex ignore dive-->
<p>This week's edition is jammed packed! Take a journey and find out how to use Ember to create <strong>Chrome Extensions</strong>. Test drive the latest <strong>Ember-CLI beta</strong> features.  Dive deep into the <strong>Component Manager Bounds</strong> RFC. Learn how to help ship <strong>Mirage 1.0</strong>.  Need Ember powered <strong>A/B experiments</strong> ? Outdoorsy open sourced an addon that might help.</p>
<!-- READMORE -->
<hr />
<h2 id="aframeworkforambitiouschromeextensionshttpsenvoyengineeringaframeworkforambitiouschromeextensionsb08d1f4b944d"><a href="https://envoy.engineering/a-framework-for-ambitious-chrome-extensions-b08d1f4b944d">A framework for ambitious Chrome Extensions ⚙</a></h2>
<p><a href="https://github.com/esbanarango">Esteban</a> wrote an article on how he used Ember to create Chrome Extensions by combining multiple addons from around the community. He found a ton of of great <em>starter</em> and <em>boilerplate</em> projects on <a href="https://www.github.com">GitHub</a> and identified some key <a href="https://github.com/ember-cli/ember-cli">ember-cli</a> projects that make working with <a href="https://developer.chrome.com/extensions/api_index">Chrome’s Extension API</a> much easier.</p>
<p>Specifically, Esteban mentions 3 ember-cli addons: <a href="https://github.com/rmachielse/ember-cli-deploy-chrome-app">ember-cli-deploy-chrome-app</a>, <a href="https://github.com/tgsoverly/ember-cli-post-build-copy">ember-cli-post-build-copy</a>, and <a href="https://github.com/sir-dunxalot/ember-cli-concat">ember-cli-concat</a> that was instrumental in creating ambitious Chrome Extensions using Ember. He leveraged <a href="https://github.com/machty/ember-concurrency">ember-concurrency</a> (<a href="https://discuss.emberjs.com/t/readers-questions-whats-the-difference-between-ember-lifeline-and-ember-concurrency-and-which-one-should-be-used/15197">or you can use ember-lifeline</a>) to deal with the callback design structure API that Chrome provides (which was promisified using <a href="https://github.com/tfoxy/chrome-promise">chrome-promise</a>).</p>
<p>Read more about his journey at Esteban’s <a href="https://envoy.engineering/a-framework-for-ambitious-chrome-extensions-b08d1f4b944d">blog post</a>.</p>
<hr />
<h2 id="oneporttorulethemallhttpsgithubcomembercliemberclireleasestagv340beta2"><a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.4.0-beta.2">One Port to Rule Them All 💍</a></h2>
<p>With <code>ember-cli@3.4.0-beta.2</code> you now have the ability to enable the live reloading server and the normal development app server to share a <strong>single port</strong>. With the current state of Ember CLI it opens two HTTP servers - one for the assets and one to support live reloading on file changes.</p>
<p>You can already test this by <a href="https://github.com/ember-cli/ember-cli/releases/tag/v3.4.0-beta.2">getting the beta</a> and see if it works for you. Remember to also check the rest of the changelog for the beta. And if you're interested in the actual implementation for making the single port work, then check out <a href="https://github.com/ember-cli/ember-cli/pull/7940">the PR</a>.</p>
<hr />
<h2 id="knowingboundarieswiththecomponentmanagerboundsrfchttpsgithubcomemberjsrfcspull351"><a href="https://github.com/emberjs/rfcs/pull/351">Knowing Boundaries with the Component Manager Bounds RFC 📚</a></h2>
<!--alex ignore savage-->
<p>A new Request for Comments (RFC) is aiming to improve the flexibility of another previously
RFC'ed feature that is interesting for Ember addon authors who are passionate about <code>Components</code>.
The <a href="https://emberjs.github.io/rfcs/0213-custom-components.html">Component Manager™ feature</a> which had
already had been accepted by the Ember community in the <a href="https://github.com/emberjs/rfcs/pull/213#issuecomment-374981569">spring of this year</a> defines a <strong>new low-level primitive</strong> that would allow developers to create flexible, efficient, and extensible <strong>component base classes</strong>.
This can for example be leveraged by UI addons that expose
components to their parent apps and which want to allow end users to extend from these base components themselves.</p>
<p>And today the saga of the Manager of Custom Components continues:
The author of the original RFC #213 now presents a <a href="https://github.com/emberjs/rfcs/pull/351">follow-up</a>
proposing the optional <strong>exposure</strong> of <code>bounds</code> - the DOM boundaries of a component - through the Component Manager feature.
This will allow any addon authors who would like to create custom components using the
Component Manager feature to get a hold of the <strong>component's DOM</strong>, provide end users access to it via
specific life cycle hooks and allowing DOM manipulation.</p>
<p>Curious to learn more? Be sure to check out the <a href="https://github.com/emberjs/rfcs/blob/4f541c350cd4f366eed66fa80ef320bb38656b20/text/0000-Component-Manager-Bounds.md">original proposal</a>
and to not miss the <a href="https://emberweekend.com/episodes/rfc-roundup-with-rwjblue">RFC Roundup Podcast session</a> over at
our friends' at Ember Weekend in which <a href="https://github.com/rwjblue">@rwjblue</a> explains what the <strong>RFC #213</strong> for the Component Manager is about.</p>
<p><a class="ember-button ember-button--centered" href="https://github.com/emberjs/rfcs/blob/4f541c350cd4f366eed66fa80ef320bb38656b20/text/0000-Component-Manager-Bounds.md" target="compmanager">Read more</a></p>
<hr />
<h2 id="mirage10httpsgithubcomsamselikoffemberclimiragereleasestagv048"><a href="https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.4.8">Mirage 1.0 🔜</a></h2>
<p><a href="http://www.ember-cli-mirage.com/">ember-cli-mirage</a> is a popular client-side mock server to develop, test and prototype your app. <a href="https://github.com/samselikoff">@samselikoff</a> has released Mirage 0.4.8. ✨ And there are only 9 bugs to close out before shipping Mirage 1.0! Please help with the march to 1.0 by upgrading to <a href="https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.4.8">v0.4.8</a> today and reporting back any issues. Drop by <a href="https://embercommunity.slack.com/messages/C0TG21RPW/">#ec-mirage</a> if you have any trouble upgrading! Hopefully, everything will be 200 🆗.</p>
<hr />
<h2 id="emberexperimentshttpsgithubcomoutdoorsyemberexperiments"><a href="https://github.com/outdoorsy/ember-experiments">ember-experiments ⚗️</a></h2>
<p>The Outdoorsy 🌲 team was able to open source an internal library they've been using on <a href="https://www.outdoorsy.com/">Outdoorsy.com</a>. It allows you to define A/B and multivariate (A/B/C) tests in your apps to track both conversion rate improvements and feature feedback. They hook it into <a href="https://github.com/poteto/ember-metrics">ember-metrics</a> and track conversions in Mixpanel, but it's not opinionated on how you should do that. Hope it's useful to people!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 🤝</a></h2>
<p>This week we'd like to thank <a href="https://github.com/nlfurniss" target="gh-user">@nlfurniss</a>, <a href="https://github.com/smfoote" target="gh-user">@smfoote</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/ryanto" target="gh-user">@ryanto</a>, <a href="https://github.com/teddyzeenny" target="gh-user">@teddyzeenny</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/apellerano-pw" target="gh-user">@apellerano-pw</a>, <a href="https://github.com/knownasilya" target="gh-user">@knownasilya</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/dcombslinkedin" target="gh-user">@dcombslinkedin</a>, <a href="https://github.com/kanongil" target="gh-user">@kanongil</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/tomhazledine" target="gh-user">@tomhazledine</a> and <a href="https://github.com/indieNik" target="gh-user">@indieNik</a> for their contributions to Ember and related repositories 💖!</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">#topic-embertimes</a> on Slack or tweet us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Ryan Mark, Alon Bukai, Kenneth Larsen, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-59</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-59</guid><pubDate>Fri, 10 Aug 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 60]]></title><description><![CDATA[<p>Olà Emberistas! 🐹</p>
<p>Read either on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a> what has been going on in Emberland this week.</p>
<p>This week's Ember Times is all about <strong>cool web fonts</strong> 😎, community <strong>chat</strong> migrations and encouraging your inner <strong>Ember Data RFC champion</strong> 🛡. We also have lots of <strong>Ember app wizardry</strong> ✨ with <code>ember-cli-create</code>, a guide for using <strong>learning resources</strong> of all <strong>Ember versions</strong> efficiently and - last, but not least - a <strong>brand-new Readers' Question</strong> for you! 💁🏻</p>
<!-- READMORE -->
<hr />
<h2 id="takingwebfontstothenextlevelhttpsgithubcomvitchembercliwebfont"><a href="https://github.com/vitch/ember-cli-webfont">Taking Web Fonts to the Next Level 🔠</a></h2>
<p>Do you like web fonts? Then it’s a good thing that <code>ember-cli-webfonts</code> released version 1.0 🎉</p>
<p>Now you can use the <code>webfonts-generator</code> to <strong>generate web fonts</strong> as part of your ember build process. By default the addon expects to find SVG files in <code>app/webfont-svg</code> but all of this can be customised alongside with class prefixes, base selectors, font names and much more.</p>
<p>All you have to do is run <code>ember install ember-cli-webfont</code> and you’re ready to go. Check out the <a href="https://github.com/vitch/ember-cli-webfont">Github repository</a> for more information.</p>
<hr />
<h2 id="communitytalkemberdiscordrfcinfinalcommentperiodhttpsgithubcomemberjsrfcspull345"><a href="https://github.com/emberjs/rfcs/pull/345">Community Talk: Ember Discord RFC in Final Comment Period 📢</a></h2>
<p>The <strong>Request for Comments (RFC)</strong> proposing a move of the community's real-time communication from
<a href="https://ember-community-slackin.herokuapp.com/">Slack</a> to <a href="https://discordapp.com/">Discord</a> has entered the <strong>Final Comment Period (FCP)</strong> and is most likely to close this weekend.</p>
<p>A plethora of comments and suggestions from the community have already come in about the proposed migration.
If you're interested to join the discussion yourself, please take your time to
read the <a href="https://github.com/MelSumner/rfcs/blob/feature/rfc-discord/text/0000-discord.md">entire proposal here</a> and
the comments along the RFC which have <a href="https://github.com/emberjs/rfcs/pull/345">already been made</a>.</p>
<p>If you have new (and friendly! ❤️) information to add to the conversation, please do so <a href="https://github.com/emberjs/rfcs/pull/345">in the RFC's comments section</a>. And once again: Thank you all for all your feedback! ✨</p>
<hr />
<h2 id="emberdatarfcchampionswantedhttpsgithubcomemberjsrfcsissuesutf8e29c93qis3aissueis3aopenlabel3atemberdatalabel3a22needschampion22"><a href="https://github.com/emberjs/rfcs/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3AT-ember-data+label%3A%22Needs+Champion%22">Ember Data RFC champions wanted 💪</a></h2>
<p>On an Open Source diet? Or looking for moar? <a href="https://github.com/runspired">@runspired</a> <a href="https://twitter.com/Runspired/status/1030260354519982080">tweets</a> that Ember Data has a number of smaller "bite sized" RFC requests that need champions, and they'd love your help! Check it out <a href="https://github.com/emberjs/rfcs/issues?q=is%3Aissue+is%3Aopen+label%3AT-ember-data+label%3A%22Needs+Champion%22">on GitHub</a>.</p>
<hr />
<h2 id="awizardtocreateemberprojectshttpsgithubcomgossiemberclicreate"><a href="https://github.com/gossi/ember-cli-create">A wizard to create Ember projects ✨‍</a></h2>
<p><a href="https://github.com/gossi">@Gossi</a> released <code>ember-cli-create</code>, a project that allows you to create new Ember projects using a UI.</p>
<p>It visually provides options to choose from when generating the scaffold, for example:</p>
<ul>
<li>Which type of project (addon or app)</li>
<li>Features to be installed</li>
</ul>
<p>Take a peek <a href="https://github.com/gossi/ember-cli-create">here</a> 👀 or maybe ping <a href="https://twitter.com/unistyler">Gossi</a> for questions, suggestions or appreciations. ❤️</p>
<hr />
<h2 id="mustreadfornewhiresonyouremberteamhttpsmediumcomfrontendhackinghowtouseember2codeinyourember3app9ed15c28bad6"><a href="https://medium.com/front-end-hacking/how-to-use-ember-2-code-in-your-ember-3-app-9ed15c28bad6">Must Read for new hires on your Ember team! 🐹</a></h2>
<p><a href="https://github.com/jenweber">@jenweber</a> breaks down the differences between Ember 2 and 3 in her latest <a href="https://medium.com/front-end-hacking/how-to-use-ember-2-code-in-your-ember-3-app-9ed15c28bad6">Medium post</a> in an approachable and informative way! Share with coworkers, friends, and folks on the interweb that are new to Ember.</p>
<p>Ember 3 apps must use the new import-what-you-need approach. <code>this.get</code> is optional in Ember 3, except properties that are Promise proxies. (Note: If you haven't upgraded to Ember 3 yet, give <a href="https://github.com/ember-cli/ember-cli-update#readme">ember-cli-update</a> a try to take advantage of codemods!) Testing is also somewhat different. Check out <a href="https://github.com/turbo87/">@turbo87</a>'s <a href="https://www.youtube.com/watch?v=8D-O4cSteRk">2018 EmberConf talk</a> for a deeper dive.</p>
<p>For the most up-to-date Ember reference material, check out the <a href="https://guides.emberjs.com/release/">Guides</a>, the official <a href="https://guides.emberjs.com/release/tutorial/ember-cli/">Tutorials</a>, and the <a href="https://emberjs.com/api">API docs</a>. Elsewhere on the web, stick with resources from 2016 and beyond to stay current. 💯</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/camerondubas" target="gh-user">@camerondubas</a>, <a href="https://github.com/hakilebara" target="gh-user">@hakilebara</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/Mi6u3l" target="gh-user">@Mi6u3l</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/deanylev" target="gh-user">@deanylev</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/SparshithNR" target="gh-user">@SparshithNR</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a> and <a href="https://github.com/mschinis" target="gh-user">@mschinis</a> for their contributions to Ember and related repositories 💖!</p>
<hr />
<h2 id="readersquestionswhatismeantbythetermdatadownactionsuphttpsdiscussemberjscomtreadersquestionswhatismeantbythetermdatadownactionsup15311"><a href="https://discuss.emberjs.com/t/readers-questions-what-is-meant-by-the-term-data-down-actions-up/15311">Readers’ Questions: “What is meant by the term ‘Data down, actions up’?” 🤔</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>This week's Readers' Question is all about best practices in Ember apps and one of the most popular design patterns - the <strong>"Data Down, Actions Up"
  paradigm</strong> - is explained in more detail. Read this week's answer by <a href="https://github.com/jessica-jordan" target="gh-jj">@jessica-jordan</a> on the <a href="https://discuss.emberjs.com/t/readers-questions-what-is-meant-by-the-term-data-down-actions-up/15311" target="discuss">official Ember Forum here</a>.</p>

<p><a class="es-button" href="https://discuss.emberjs.com/t/readers-questions-what-is-meant-by-the-term-data-down-actions-up/15311" target="compmanager">Read more</a></p>
<br/>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">#topic-embertimes</a> on Slack or tweet us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Miguel Braga Gomes, Amy Lam, Ryan Mark, Kenneth Larsen, Jessica Jordan, Ricardo Mendes and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-60</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-60</guid><pubDate>Fri, 17 Aug 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 61]]></title><description><![CDATA[<p>Ħelow Emberistas! 🐹</p>
<p>Read either on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a> what has been going on in Emberland this week.</p>
<p>This week we have a fresh RFC for <strong>modifying</strong> your <strong>HTML elements</strong> 🛠 for you, as well as long-<strong>awaited async</strong>  news from <strong>Ember Data</strong> 🕓, an <strong>empowering podcast</strong> session ❤️ and truthful <strong>updates</strong> for <code>ember-truth-helpers</code>! Check it out ✨</p>
<!-- READMORE -->
<hr />
<h2 id="jazzupyourtagswithmodifiershttpsgithubcomemberjsrfcspull353"><a href="https://github.com/emberjs/rfcs/pull/353">Jazz Up Your Tags with Modifiers ✨</a></h2>
<p>A new <strong>Request for Comments (RFC)</strong> might bring new life to your HTML tags:
The <a href="https://github.com/emberjs/rfcs/blob/new-modifiers/text/0000-modifiers.md">proposal for Modifiers</a> presents a possible future API for components in Ember which allows to
add custom behaviour, like event listeners or styles, to DOM nodes in your components. <strong>Reliable access to DOM nodes</strong> will be guaranteed by the means of these <strong>element modifiers</strong>, alleviating issues with the <code>outerHTML</code> semantics <a href="https://github.com/emberjs/rfcs/pull/351#issuecomment-412123046">mentioned in the <code>this.bounds</code> RFC</a> which proposed a new way of accessing the root element of future Ember components.</p>
<p>This <strong>RFC is a successor</strong> of the previous <a href="https://github.com/emberjs/rfcs/pull/112">RFC#112: Element Modifiers</a> and aims to bring many of the previously mentioned ideas back into discussion.</p>
<p>Be sure to <a href="https://github.com/emberjs/rfcs/pull/353">read the original proposal over at Github</a> and share your thoughts and questions in <a href="https://github.com/emberjs/rfcs/pull/353">the comments for the RFC's pull request</a>.</p>
<hr />
<h2 id="imwillingtowaitforithttpsgithubcomemberjsdatapull5545"><a href="https://github.com/emberjs/data/pull/5545">I'm willing to wait for it 🎶</a></h2>
<p>A new PR has been merged to Ember Data that improves your use of <code>async ... await</code> while simultaneously detecting asynchronous test leaks in their data layer.</p>
<p>The feature works in non-production environments and they made sure that the test-waiter does not cause waiting by default in order to prevent breaking any apps that upgrade their version of Ember Data.</p>
<p>This new feature comes with two feature flags <code>store.shouldTrackAsyncRequests</code> and <code>store.generateStackTracesForTrackedRequests</code>. To learn all about them and some more information on this new feature, be sure to check out <a href="https://github.com/emberjs/data/pull/5545">the pull request</a>.</p>
<hr />
<h2 id="podcastmelaniesumneronempoweringjavascriptengineershttpstwittercomsamselikoffstatus1032298098901639169"><a href="https://twitter.com/samselikoff/status/1032298098901639169">Podcast: Melanie Sumner on empowering JavaScript engineers 💪</a></h2>
<p>This week <a href="https://github.com/samselikoff">@samselikoff</a> interviewed Ember Core team member Melanie Sumner (<a href="https://github.com/MelSumner">@MelSumner</a>) for <a href="https://embermap.com/">The EmberMap Podcast</a>. Melanie talked about her path from getting starting making Ember accessible to now being a leader in the Ember community as a core team member. Ember, for Melanie, was one of the first times in tech where she felt welcome. This is in huge part because of the welcoming Ember community</p>
<p>Melanie talked about empowering other people to feel included. This, to her, was the key to scaling yourself since you can only do so much as an individual. Inclusion to get other people involved will effectively create <em>“clones”</em> of yourself. This is how she participates in a vision that is shared by helping create a community.</p>
<!--alex ignore servant-->
<p>Melanie mentioned how she practices <strong>Servant Leadership</strong> which she described as “not asking anyone to do something that I wouldn’t do myself.” This goes with the ethos Ember represents which is to invest in the long term by working with others so that they may feel welcome and contribute back into the community.</p>
<p>Sam and Melanie then talked about the native accessibility story for Ember going through the <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA">ARIA spec</a> and seeing if it makes sense to implement it in Ember. There are loads of opportunities here as even having a modal or select dropdown be both accessible and customizable would be a huge leap for web developers. Having that built into Ember by default will be a game changer.</p>
<p>Click the links below watch the full interview:</p>
<ul>
<li>🎥 <a href="https://embermap.com/topics/the-embermap-podcast/melanie-sumner-on-empowering-javascript-engineers">EmberMap</a></li>
<li>🎙️ <a href="https://itunes.apple.com/us/podcast/the-embermap-podcast/id1288274408?mt=2">iTunes</a></li>
<li>📺 <a href="https://www.youtube.com/watch?v=KXFYNhNgn_Q">YouTube</a></li>
</ul>
<hr />
<h2 id="embertruthhelperswasupdatedhttpsgithubcomjmurphyauembertruthhelpers"><a href="https://github.com/jmurphyau/ember-truth-helpers">Ember-Truth-Helpers was updated 🙌</a></h2>
<p><code>Ember-truth-helpers</code> is an Ember addon that provides helpers for truth logic in <code>if</code> and <code>unless</code> statements.
As of version <code>v2.1.0</code>, <a href="https://github.com/jamesarosen">@jamesarosen</a> and <a href="https://github.com/jmurphyau">@jmurphyau</a> added the <code>is-empty</code> helper to the library. 🎉
This will make our lives easier when checking for empty values in our templates.</p>
<p>You can take a closer look at the change <a href="https://github.com/jmurphyau/ember-truth-helpers/commit/cd4147e4ed76dfc5cf585ea87c6e08fcf99b7e16">here</a>. 👀</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/smfoote" target="gh-user">@smfoote</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/Mi6u3l" target="gh-user">@Mi6u3l</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/vladucu" target="gh-user">@vladucu</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/SparshithNR" target="gh-user">@SparshithNR</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/cyk" target="gh-user">@cyk</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a> and <a href="https://github.com/miguelcobain" target="gh-user">@miguelcobain</a> for their contributions to Ember and related repositories 💖!</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">#topic-embertimes</a> on Slack or tweet us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Miguel Braga Gomes, Amy Lam, Alon Bukai, Ryan Mark, Kenneth Larsen, Jessica Jordan, Ricardo Mendes and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-61</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-61</guid><pubDate>Fri, 24 Aug 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 62]]></title><description><![CDATA[<p>Привет Emberistas! 🐹</p>
<p>Read either on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a> what has been going on in Emberland this week.</p>
<p>Have a look into the next year of Ember with the <strong>official 2018 Roadmap RFC</strong> 🌆 and read up on plans for <strong>Module Unification with Ember Addons</strong> 🐹. We also <strong>prompt</strong> ❗️you to check out <strong>Ember CLI Update</strong> for fresh ✨ updates and last, but not least, we have a <strong>brand-new 🔥 Readers' Question</strong> 🌿 in for you this week:</p>
<!-- READMORE -->
<hr />
<h2 id="rfcember2018roadmaphttpsgithubcomemberjsrfcspull364"><a href="https://github.com/emberjs/rfcs/pull/364">RFC: Ember 2018 Roadmap 🛣</a></h2>
<p><a href="https://github.com/tomdale">Tom Dale</a> published an <a href="https://github.com/emberjs/rfcs/pull/364">RFC (Request for Comments)</a> for the Ember 2018 Roadmap based on the feedback collected from the <a href="https://www.emberjs.com/blog/2018/05/02/ember-2018-roadmap-call-for-posts.html">#EmberJS2018 call for blog posts</a> earlier this year. Tom identified 3 key goals for Ember in 2018 along with 2 real world use cases to focus on.</p>
<h3 id="goals">Goals:</h3>
<p><strong>1. Improve communication and streamline decision-making, and empower new leaders.</strong>
Make users feel empowered to become contributors and at the same time expanding and refining the core team structure which includes mentoring new leaders and cross-pollinating knowledge between teams.</p>
<p><strong>2. Finish the major initiatives that we’ve already started.</strong>
Add extension points to allow popular new tools to be quickly adopted in Ember apps and standardize around ES modules and npm packages to better enable the sharing of Ember tools with the wider JavaScript community.</p>
<p><strong>3. Ship a new edition, Ember Octane, focused on performance and productivity.</strong>
Tell the story of modern Ember by shipping a new edition of Ember that has compatibility with new JavaScript language features like native classes, decorators, and async functions by default.</p>
<h3 id="usecases">Use Cases:</h3>
<p><strong>1. Productivity apps</strong>
Ember’s historical strength: sophisticated, highly interactive apps that users spend a lot of time in, getting things done.</p>
<p><strong>2. Content apps</strong>
Text-heavy pages where the first load is critical. In performance-constrained environments, Ember’s strong conventions can help developers build faster apps by default.</p>
<p>Read more in the <a href="https://github.com/emberjs/rfcs/blob/26c4d83fb66568e1087a05818fb39a307ebf8da8/text/0000-roadmap-2018.md">rendered pull request on GitHub</a>.</p>
<hr />
<h2 id="rfcipromiseyouitsgoodhttpsgithubcomfivetanleyrfcsblobdeprecatepromiseobjectsavetext0000emberdatareturnpromisefromdsmodelsavemd"><a href="https://github.com/fivetanley/rfcs/blob/deprecate-promise-object-save/text/0000-ember-data-return-promise-from-ds-model-save.md">RFC: I Promise You It's Good</a></h2>
<p><a href="https://github.com/fivetanley/rfcs/blob/deprecate-promise-object-save/text/0000-ember-data-return-promise-from-ds-model-save.md">A new proposal</a> by <a href="https://github.com/fivetanley">Stanley Stuart</a> to return a promise from <code>DS.Model.save()</code> is ready for you to read and comment.</p>
<p>The idea here is to make <code>DS.Model.save()</code> return an <code>RSVP.Promise</code> instead of a <code>PromiseObject</code>. This is to remove the dependency on promise proxies, improve async consistency and enable new functionality in Ember Data.</p>
<p>The only drawback of this is if you are already relying on this behaviour you’ll probably have to refactor your code to either use patterns like <code>async/await</code> or <a href="http://ember-concurrency.com/">ember-concurrency</a>.</p>
<p><a href="https://github.com/fivetanley/rfcs/blob/deprecate-promise-object-save/text/0000-ember-data-return-promise-from-ds-model-save.md">Read the whole proposal</a> and share your thoughts.</p>
<hr />
<h2 id="moduleunificationwithemberaddonshttpsgithubcomemberjsrfcspull367"><a href="https://github.com/emberjs/rfcs/pull/367">Module Unification with Ember Addons</a> 🎁</h2>
<p><a href="https://github.com/emberjs/rfcs/pull/367">Module Unification Packages</a> is a new RFC, created by <a href="https://github.com/mixonic">@mixonic</a>, that sets out to describe how Ember apps and addons will migrate to the new <a href="https://github.com/emberjs/rfcs/blob/master/text/0143-module-unification.md">Module Unification</a> structure from the classic structure. This RFC iterates on and is set to replace another RFC called <a href="https://github.com/emberjs/rfcs/pull/309">Module Unification Namespaces</a> which had some syntax, like the <code>::</code> syntax, that proved problematic.</p>
<p>This RFC proposes to add a new <code>{{use}}</code> helper. This helper imports components from an addon into an application's template. This helper provides a subset of the functionality of the JavaScript imports that we are used to, albeit with a slightly different syntax.</p>
<p>An example: In this template the <code>{{use}}</code> helper imports a component <code>Widget</code> from the <code>gadget</code> addon.</p>
<pre><code class="handlebars language-handlebars">{{! invokes node_modules/gadget/src/ui/components/Widget/component.js }}

{{use Widget from 'gadget'}}
&lt;Widget @options={{someOptions}} @value={{someValue}} /&gt;
</code></pre>
<p>Something else that is proposed in this RFC is the use of a template <code>prelude.hbs</code> that, <strong>at compile time</strong>, will be injected into every template in the app. This can be used to inject global components such as the widely used <code>{{t 'token'}}</code> component used for <em>internationalization</em>.</p>
<p>Services also get some <strong>appreciation</strong> in this RFC. The suggestion is that all service injections from an addon to an app will need to be explicit about their source package. This results in more verbosity, but also greater clarity and opportunity for optimizations.</p>
<p>An example:</p>
<pre><code class="javascript language-javascript">export default Ember.Component.extend({

  // inject src/services/geo.js
  geo: inject(),

  // inject node_modules/ember-stripe-service/src/services/store.js
  checkoutService: inject('stripe', { package: 'ember-stripe-service' }),

  // inject node_modules/ember-simple-auth/src/services/session.js
  session: inject({ package: 'ember-simple-auth' })

});
</code></pre>
<p>There are also some proposals regarding <code>owner</code> APIs such as <code>owner.lookup()</code> and <code>owner.factoryFor()</code> which have also become more explicit.</p>
<p>All in all this <strong>very well written</strong> RFC is a great chance to learn about possible changes to Ember and the Module Unification structure.
If you have any concerns or questions feel free to ask in the <a href="https://github.com/emberjs/rfcs/pull/367">RFC issue</a> and join in on the conversation by visiting the <a href="https://embercommunity.slack.com/messages/C5JN29NTC/"><code>#st-module-unification</code> channel</a> on the Ember.js Community Slack.</p>
<p>This RFC is not complete and is a bit rough around the edges but it is a step in the right direction and will hopefully be finalized soon so that we can start using it in an Ember version in the near future.</p>
<hr />
<h2 id="promptedtoupdatehttpstwittercomkellyseldenstatus1034197684595257345"><a href="https://twitter.com/kellyselden/status/1034197684595257345">Prompted To Update ✨</a></h2>
<p><img src="/images/blog/emberjstimes/embercliupdate-codemod-prompts.png" alt="Terminal window showing Ember CLI Update's Codemod Prompts, including ember-modules-codemod, ember-qunit-codemod, ember-test-helpers-codemod, es5-getter-ember-codemod, qunit-dom-codemod" /></p>
<p>Your favorite tool for <strong>updating your Ember app</strong>, addon or Glimmer app to any desired version is back again to make your developer life even <strong>easier</strong>: 🌟<a href="https://github.com/ember-cli/ember-cli-update"><strong>Ember CLI Update</strong></a> now <a href="https://twitter.com/kellyselden/status/1034197684595257345">offers you dedicated command-line prompts</a> to apply <strong>as many codemods as you wish</strong>.</p>
<p>Run <code>ember-cli-update --run-codemods</code>, select which codemods to run and upgrade your Ember app to the next level! ⬆️</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/smfoote" target="gh-user">@smfoote</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/kpfefferle" target="gh-user">@kpfefferle</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/fivetanley" target="gh-user">@fivetanley</a>, <a href="https://github.com/jrjohnson" target="gh-user">@jrjohnson</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/luxferresum" target="gh-user">@luxferresum</a>, <a href="https://github.com/jherdman" target="gh-user">@jherdman</a>, <a href="https://github.com/jlami" target="gh-user">@jlami</a>, <a href="https://github.com/pbishop16" target="gh-user">@pbishop16</a>, <a href="https://github.com/hybridmuse" target="gh-user">@hybridmuse</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/dcombslinkedin" target="gh-user">@dcombslinkedin</a>, <a href="https://github.com/btecu" target="gh-user">@btecu</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/ef4" target="gh-user">@ef4</a>, <a href="https://github.com/hakilebara" target="gh-user">@hakilebara</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/danwenzel" target="gh-user">@danwenzel</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/jeffhertzler" target="gh-user">@jeffhertzler</a>, <a href="https://github.com/pablobm" target="gh-user">@pablobm</a>, <a href="https://github.com/cspanring" target="gh-user">@cspanring</a> and <a href="https://github.com/mansona" target="gh-user">@mansona</a> for their contributions to Ember and related repositories 💖!</p>
<hr />
<h2 id="readersquestionswhydoesemberusebroccoliandhowisitdifferentfromwebpackrollupparcelhttpsdiscussemberjscomtreadersquestionswhydoesemberusebroccoliandhowisitdifferentfromwebpackrollupparcel15384"><a href="https://discuss.emberjs.com/t/readers-questions-why-does-ember-use-broccoli-and-how-is-it-different-from-webpack-rollup-parcel/15384">Readers' Questions: "Why does Ember use Broccoli and how is it different from Webpack, Rollup, Parcel?"</a></h2>
<div class="blog-row">
<img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

<p>The JavaScript ecosystem is full of <strong>solutions for packaging JavaScript apps</strong>, like Webpack, Rollup.js and Microbundle among others. But what differentiates one from the other? And what makes Broccoli so special to be part of Ember's build pipeline?</p>

<p>In this week's Readers' Question, Ember Learning Core team member <a href="https://github.com/jessica-jordan" target="jj">@jessica-jordan</a> will highlight the <strong>differences</strong> between some of the most <strong>popular JavaScript bundlers and build tools</strong> and explain why Ember CLI embraced <strong>Broccoli</strong> as its tool of choice early on. You can read her <a href="https://discuss.emberjs.com/t/readers-questions-why-does-ember-use-broccoli-and-how-is-it-different-from-webpack-rollup-parcel/15384" target="rq">full answer on the official Ember Forum.</a></p>

<p><a class="es-button" href="https://discuss.emberjs.com/t/readers-questions-why-does-ember-use-broccoli-and-how-is-it-different-from-webpack-rollup-parcel/15384" target="rq">Read more</a></p>
<br/>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">#topic-embertimes</a> on Slack or tweet us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Nick Schot, Frédéric Soumaré, Chris Ng, Alon Bukai, Edward Faulkner, Oli Griffiths, Kenneth Larsen, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-62</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-62</guid><pubDate>Fri, 31 Aug 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 63]]></title><description><![CDATA[<p>Sholem-aleykhem Emberistas! 🐹</p>
<!--alex ignore special-->
<p>Be sure to join the new Ember community chat on Discord 💬! This week, you can have a look into Ember Data's Meta Quest 🔜, some fresh 🍎 RFCs, thoughts on fostering the Ember community 💛, and a special thank you to @mmun 🎉.</p>
<!-- READMORE -->
<hr />
<h2 id="meetyouremberfriendsatdiscordhttpsdiscordggzt3asns"><a href="https://discord.gg/zT3asNS">Meet your Ember 🐹 friends at Discord 🗨</a></h2>
<p>The time has come: The <strong>Ember Community is starting its big move over to <a href="https://discord.gg/zT3asNS">Discord</a></strong>. As proposed in the <a href="https://github.com/emberjs/rfcs/pull/345">original and recently accepted RFC (Request For Comments) for the migration</a> you can now <strong>chat</strong> with your <strong>Ember friends</strong> 🐹👭👬👫 from all around the world on the Ember Discord server. This comes - among other benefits - with the advantage of <strong>unlimited message history</strong>.</p>
<p><a href="https://discord.gg/zT3asNS">Check out the new community chat today</a>, be sure to <strong>set up your profile</strong> as described in the <code>#setup-profile</code> channel and to join <code>#discord-server-admin</code> to gain access to your favorite discussions 💬.</p>
<hr />
<h2 id="emberdatarecorddatametaquesthttpsgithubcomemberjsdataissues5618"><a href="https://github.com/emberjs/data/issues/5618">Ember Data: RecordData Meta Quest</a></h2>
<p>The Ember Data team is looking for community help to bring RecordData to a stable release! You can read more about RecordData in <a href="https://github.com/emberjs/rfcs/pull/293">RFC #293</a>. RecordData codifies the internals of Ember Data, giving addon developers needed API access with more confidence and stability.</p>
<p>Community action items:</p>
<ul>
<li>Once <a href="https://github.com/emberjs/data/pull/5616">3.5.0-beta.2</a> is released, configure your apps/addons to test against this version!</li>
<li>Report errors encountered, and help triage/replicate as much as possible.</li>
<li>Help refactor existing addons to utilize RecordData instead of likely-removed intimate APIs. For a good starter list, see Ember Data's <a href="https://github.com/emberjs/data/blob/master/.travis.yml#L87-L103">external-partner tests</a>.</li>
</ul>
<hr />
<h2 id="rfcembereditionshttpsgithubcomemberjsrfcsblob9c7fe3f4e947b5f79050214334a98673494c25d7text0000editionsmd"><a href="https://github.com/emberjs/rfcs/blob/9c7fe3f4e947b5f79050214334a98673494c25d7/text/0000-editions.md">RFC: Ember Editions</a></h2>
<p><a href="https://github.com/davewasmer">@davewasmer</a> has written a RFC introducing the concepts of <strong>editions</strong>. The idea is that every few years Ember will declare a new edition of Ember that bundles up accumulated incremental improvements into a cohesive package.</p>
<p>The benefit of this being that this gives the Ember Community an opportunity to bring our documentation and marketing up-to-date to reflect the improvements we’ve made since the previous edition. According to the RFC, the right time to declare a new edition is when:</p>
<ul>
<li>A significant, coherent set of new features and APIs have all landed in the stable channel.</li>
<li>Error messages and the developer ergonomics of those new features have been fully polished.</li>
<li>Tooling (the Ember Inspector, blueprints, codemods, etc.) has been updated to work with these new features.</li>
<li>API documentation, guides, tutorials, and example code has been updated to incorporate the new features.</li>
</ul>
<p>Make sure to <a href="https://github.com/emberjs/rfcs/blob/9c7fe3f4e947b5f79050214334a98673494c25d7/text/0000-editions.md">read the entire RFC</a> and <a href="https://github.com/emberjs/rfcs/pull/371">leave a comment with your thoughts</a>.</p>
<hr />
<h2 id="newcomputedpropertyrfcsdeprecatingvolatilehttpsgithubcomemberjsrfcspull370andreadonlyhttpsgithubcomemberjsrfcspull3692">New computed property RFCs deprecating <a href="https://github.com/emberjs/rfcs/pull/370">volatile()</a> and <a href="https://github.com/emberjs/rfcs/pull/369">readOnly()</a> 2️⃣</h2>
<p><a href="https://github.com/pzuraq">@pzuraq</a> proposed two new RFCs on <a href="https://guides.emberjs.com/release/object-model/computed-properties/">computed properties</a>. Both RFCs are centered around deprecating functions to adjust the defaults to what the common use cases developers face and to better align with <a href="https://github.com/emberjs/rfcs/pull/338">native class syntax</a>.</p>
<p>The RFC to <a href="https://github.com/emberjs/rfcs/pull/369">deprecate computed overridability and readOnly()</a> seeks to align computed properties to the native class syntax getters and setters by deprecating computed overridability (colloquially known as "clobbering") and make computeds read-only by default turning this uncommonly used feature to an opt-in using the overridable API.</p>
<p>Similarly, the RFC to <a href="https://github.com/emberjs/rfcs/pull/370">deprecate computed().volatile()</a> was proposed to favour native accessors rather than relying on the volatile API to provide that functionality. This is to align what users expect a property does when it's value changes versus what the framework does, including notification changes.</p>
<p>Join the conversation at the respective pull requests for <a href="https://github.com/emberjs/rfcs/pull/370">volatile()</a> and <a href="https://github.com/emberjs/rfcs/pull/369">readOnly()</a>!</p>
<hr />
<!--alex ignore bigger-->
<h2 id="abiggerembertenthttpsdiscussemberjscomtabiggerembertent15383"><a href="https://discuss.emberjs.com/t/a-bigger-ember-tent/15383">A bigger Ember tent ⛺</a></h2>
<p>The expression "Ember is a big tent" was recently used by <a href="https://github.com/tomdale">@tomdale</a> in response to an Ember developer when he asked if <a href="https://discuss.emberjs.com/t/are-we-still-a-welcoming-community/15285">Ember was still a welcoming community</a>.</p>
<p>With this topic in mind, Tom Dale shares the following thoughts:</p>
<ul>
<li><p>Everyone is encouraged to share their thoughts about the framework and the path it's taking, even if it is to disagree with the core team or with the community in general, the community will fail if people believe they have to stay silent.</p></li>
<li><p>It is dangerous when developer communities create mantras that they repeat endlessly, as the original context around the why can get lost, and then people can tend to postulate the mantra without knowing its original purpose forgetting that underlying assumptions behind it can change.</p></li>
<li><p>There is no "right way" of building an Ember app, no one but the developer in question knows better what are the particular tools that are necessary to make the team more productive and a project a success.</p></li>
<li><p>We, as Ember developers would be doing a disservice to ourselves if we don't follow along with other existing frameworks and the wider JavaScript ecosystem to borrow their ideas.</p></li>
<li><p>We should put ourselves in other's shoes to understand the frustration other people experience and offer to help and provide constructive criticism, before getting defensive.</p></li>
</ul>
<p>The big tent analogy used, meant that Ember is an open community that welcomes different individuals with different thoughts and opinions about the framework and the correct way of leveraging it for our own projects.</p>
<p>Although Ember comes with a set of defaults and guidelines, it is unrealistic to think that those same defaults fit every project in every situation.</p>
<p>Quoting Tom on his final reasoning: "Let's make sure we're fostering a community that doesn't squish ideas."</p>
<hr />
<!--alex ignore special-->
<h2 id="aspecialthankyoutoalongtimecontributorhttpsgithubcomemberjswebsitepull3541"><a href="https://github.com/emberjs/website/pull/3541">A special thank you to a long-time contributor 🙇</a></h2>
<!--alex ignore alumna-alumnus-->
<p>This week we'd like to take a moment to say a huge thank you to an incredibly dedicated contributor:
<a href="https://github.com/mmun"><strong>Martin Muñoz (@mmun)</strong></a> who has not only been an active contributor to Ember for years, but also an Ember Core Team member <a href="https://github.com/emberjs/website/pull/3541">has joined the Ember <em>Alumna</em> this week</a>.</p>
<p>Since <a href="https://github.com/emberjs/ember.js/pull/9831">his first pull request to the ember.js repository</a> - submitting a bug fix for failing tests for the former <code>ember-views</code> package - Martin has been an actively contributing to Ember and related projects. In <a href="https://github.com/emberjs/website/commit/7e982770cafb7e42fce672e46f42887c093426e5#diff-0afb5ba76daf47aa6b21310bc1701cab">June 2015 Martin joined the Ember Core Team</a> and dedicated his time to help Ember become the framework and the community we ❤️ today. We're grateful for all the hard work he had put into the project, but also for all the understanding, support and compassion he has shown to anyone in the community each day. With this we'd like to say once more: thank you, Martin!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/btecu" target="gh-user">@btecu</a>, <a href="https://github.com/cibernox" target="gh-user">@cibernox</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/Dhaulagiri" target="gh-user">@Dhaulagiri</a>, <a href="https://github.com/pieter-v" target="gh-user">@pieter-v</a>, <a href="https://github.com/Mi6u3l" target="gh-user">@Mi6u3l</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/andrewpye" target="gh-user">@andrewpye</a>, <a href="https://github.com/blimmer" target="gh-user">@blimmer</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/kturney" target="gh-user">@kturney</a>, <a href="https://github.com/jrjohnson" target="gh-user">@jrjohnson</a>, <a href="https://github.com/happycollision" target="gh-user">@happycollision</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/nlfurniss" target="gh-user">@nlfurniss</a>, <a href="https://github.com/vitch" target="gh-user">@vitch</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/CodingItWrong" target="gh-user">@CodingItWrong</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/astronomersiva" target="gh-user">@astronomersiva</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/22a" target="gh-user">@22a</a>, <a href="https://github.com/veelenga" target="gh-user">@veelenga</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a> and <a href="https://github.com/anotheredward" target="gh-user">@anotheredward</a> for their contributions to Ember and related repositories 💖!</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at #support-ember-times on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jessica Jordan, Miguel Braga Gomes, Chris Ng, Kenneth Larsen, Amy Lam, Ryan Mark, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-63</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-63</guid><pubDate>Fri, 07 Sep 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 64]]></title><description><![CDATA[<p>Olá Emberistas! 🐹</p>
<p>This week we're sharing news about the 🆕 Ember community Discord chat 💬, some fresh 🥑 RFCs, the State of JavaScript 2018 Survey 📝, Ember Data Help Wanted 🏗, and welcoming new Learning Team members 👋!</p>
<!-- READMORE -->
<hr />
<h2 id="everyonesmovedmeetyouremberfriendsondiscordhttpsdiscordggzt3asns"><a href="https://discord.gg/zT3asNS">Everyone's Moved! 📦 Meet Your Ember 🐹 Friends on Discord 🗣</a></h2>
<p>It's done! 👌 The <strong>community chat has</strong> finally <strong>moved</strong> over to <a href="https://discordapp.com/">Discord</a>!
Even more <strong>modern</strong> than <em>IRC</em> and <em>ICQ</em> combined, you can now chat with other Emberistas from all around the globe in many different topic channels with <strong>unlimited message history</strong> 💌✨.</p>
<p><a href="https://discord.gg/zT3asNS">Join today</a> and be sure to get setup as described in the <code>#setup-profile</code> channel. To start chatting, request the <em>community-member</em> role in <code>#discord-server-admin</code>, so the undaunted org admins can make sure THAT YOU ARE NOT A BOT BUT A REAL HUMAN LIKE US HA-HA 🤖.</p>
<hr />
<h2 id="apublicfactoryforyourmodelshttpsgithubcomemberjsrfcspull372"><a href="https://github.com/emberjs/rfcs/pull/372">A Public Factory 🏭 for Your Models</a></h2>
<p>A brand-new 🔥 <strong>Request For Comments (RFC)</strong> makes addon authors' and Ember power users' 💪 hearts ♡ leap for joy:
The previously <a href="https://github.com/emberjs/data/blob/v3.3.1/addon/-private/system/store.js#L2083">deprecated Ember Data <code>store</code> method <code>modelFactoryFor</code></a> is making its comeback as an official, <strong>public API</strong>.
This new public method will allow users to provide any kind of <code>ModelClass</code> (and not only the default <code>DS.Model</code> provided by Ember Data) to applications if needed.</p>
<p>Curious? <a href="https://github.com/emberjs/rfcs/pull/372"><strong>Read the full proposal</strong></a> and leave your questions and suggestions in the comments below!</p>
<hr />
<h2 id="stateofjavascript2018surveyishereagainhttpsmediumfreecodecamporgtakethestateofjavascript2018surveyc43be2fcaa9"><a href="https://medium.freecodecamp.org/take-the-state-of-javascript-2018-survey-c43be2fcaa9">State of JavaScript 2018 Survey Is Here Again 🗳️</a></h2>
<!-- alex ignore just -->
<p>"Just like [the holidays] or the flu, the <strong>State of JavaScript</strong> survey comes back around every year. But unlike these, it’s something to actually look forward to!" - <a href="https://twitter.com/SachaGreif/status/1037603748917403648">Sacha Greif</a></p>
<p><a href="https://stateofjs.com/">State of JavaScript</a> is <strong>the</strong> yearly JavaScript survey that aims to gauge the whole JavaScript community across all frameworks, libraries, regional location and more. It tries to find out with which technologies developers are <strong>most happy</strong> with as well as which technologies are coming up and becoming popular in JavaScript.</p>
<p>Last year there were over <strong>20,000 entries</strong> and while Ember was known by most, many either didn't want to learn it or had used it in the past and didn't want to again. With all of the <strong>improvements to Ember</strong> these past few years, <strong>we can do better</strong>!</p>
<p>So go and <a href="https://stateofjs.com/">fill out the survey</a> and <strong>show your support for Ember</strong> in 2018! Make your <strong>voice heard</strong>! 📣</p>
<p>Check out the <a href="https://twitter.com/SachaGreif/status/1037603748917403648">Twitter</a> or <a href="https://medium.freecodecamp.org/take-the-state-of-javascript-2018-survey-c43be2fcaa9">Medium</a> post to learn more.</p>
<p>🎉 <a href="https://stateofjs.com/">Take the survey!</a> 🎉</p>
<hr />
<h2 id="elementmodifierrfcshttpsgithubcomemberjsrfcspull373"><a href="https://github.com/emberjs/rfcs/pull/373">Element Modifier RFCs ⚛️</a></h2>
<p>Ember Core Team member <a href="https://github.com/chadhietala">@chadhietala</a> proposed 2 RFCs around Element Modifiers – one for the <a href="https://github.com/emberjs/rfcs/pull/373">Modifier Manager</a> and the other for the <a href="https://github.com/emberjs/rfcs/pull/353">Element Modifier</a> itself.</p>
<p>Element Modifiers provide stable access of the DOM node they are installed on. Unlike a component, there is no template/layout for an element modifier. Unlike a helper, an element modifier does not return a value. An element modifier is invoked in "element space". This is the space between <code>&lt;</code> and <code>&gt;</code> opening an HTML tag.</p>
<p>Here is an example of the element modifier syntax in action:</p>
<pre><code class="handlebars language-handlebars">&lt;button {{effect 'fade-in'}}&gt;Save&lt;/button&gt;
</code></pre>
<!--alex ignore savage-->
<p>The <a href="https://github.com/emberjs/rfcs/pull/373">Modifier Manager RFC</a> proposes to add a low level primitive for defining an element modifier which is responsible for coordinating the lifecycle events that occurs when invoking, installing and updating an element modifier. Most app developers would not need interact with the manager but it would allow the community to experiment with and iterate on this API outside of the core framework.</p>
<p>See more in the respective RFCs for <a href="https://github.com/emberjs/rfcs/pull/353">Element Modifier</a> and <a href="https://github.com/emberjs/rfcs/pull/373">Modifier Manager</a>.</p>
<hr />
<h2 id="evenmorehelpwantedonemberdatahttpstwittercomrunspiredstatus1038659570401337345"><a href="https://twitter.com/Runspired/status/1038659570401337345">Even More Help Wanted 🚧 on Ember Data</a></h2>
<p>We talked about contributing to Ember Data last week. This week there are even more ways to get involved! Help <a href="https://github.com/runspired">@runspired</a> ship <a href="https://github.com/ember-data/json-api-validator">ember-data/json-api-validator</a>. He writes that this addon will enable you to write clearer normalization tests, catch those pesky and usually silent formatting issues, and leave you with actionable errors instead of head-scratching ones! Run the test suite or check out some of the repo issues <a href="https://github.com/ember-data/json-api-validator/issues/">here</a>.</p>
<hr />
<h2 id="newlearningteammembershttpstwittercomemberjsstatus1039542375234789377"><a href="https://twitter.com/emberjs/status/1039542375234789377">New Learning Team Members 😄</a></h2>
<p>The Ember Learning Core Team is pleased to announce two new members. <a href="https://github.com/mansona">@mansona</a> and <a href="https://github.com/amyrlam">@amyrlam</a> have both been working for over a year to make Ember more accessible to contributors. Can’t wait to see what they get up to next!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/mike-north" target="gh-user">@mike-north</a>, <a href="https://github.com/IzzatN" target="gh-user">@IzzatN</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/nathanhammond" target="gh-user">@nathanhammond</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/nlfurniss" target="gh-user">@nlfurniss</a>, <a href="https://github.com/thorsteinsson" target="gh-user">@thorsteinsson</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/dnalagatla" target="gh-user">@dnalagatla</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/ryanto" target="gh-user">@ryanto</a>, <a href="https://github.com/22a" target="gh-user">@22a</a>, <a href="https://github.com/Kerrick" target="gh-user">@Kerrick</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/thereR4lights" target="gh-user">@thereR4lights</a> and <a href="https://github.com/dependabot[bot]" target="gh-user">@dependabot[bot]</a>
for their contributions to Ember and related repositories 💖!</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at #support-ember-times on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Alon Bukai, Chris Ng, Amy Lam, Ryan Mark, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-64</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-64</guid><pubDate>Fri, 14 Sep 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 65]]></title><description><![CDATA[<p>Ahoj Emberistas! 🐹</p>
<p>In this week's edition we're sharing news about a fresh 🥒  RFC to deprecate <code>.property()</code>, exciting addon updates 🚀 for sparkles-component and ember-css-modules, and how Ember is a modern framework 🎉 - tell your friends!</p>
<!-- READMORE -->
<hr />
<h2 id="deprecateallthepropertymodifiershttpsgithubcomemberjsrfcspull375"><a href="https://github.com/emberjs/rfcs/pull/375">Deprecate All the Property 🏠 Modifiers</a></h2>
<p>Remember <code>.property()</code>?</p>
<pre><code class="javascript language-javascript">fullName: computed(function() {
  // ...
}).property('firstName', 'lastName'),
</code></pre>
<p>This <strong>modifier</strong> for <strong>computed properties</strong> in Ember has been around for quite a while.
And even though computed properties have already allowed to pass in dependent keys as an argument directly, e.g….</p>
<pre><code class="javascript language-javascript">fullName: computed('firstName', 'lastName', function() {
  // ...
}),
</code></pre>
<p>…the modifier hasn't been deprecated yet. The main obstacle for the deprecation has been
the one valid use of <code>.property()</code>: It is required for cp macros, such as <code>filter</code> or <code>map</code> which receive a callback function as their argument.</p>
<p>A <strong>brand-new 🔥 Request for Comments (RFC)</strong> 🚒 proposes to transition away from the usage of <code>.property</code> for these macros to allow the deprecation of the otherwise redundant API. Curious readers can <strong>learn more</strong> about the motivation and the design of this move <a href="https://github.com/pzuraq/emberjs-rfcs/blob/deprecate-computed-property-modifier/text/0000-deprecate-computed-property-modifier.md">in the original proposal</a>.</p>
<hr />
<h2 id="publishedsparklescomponent110httpstwittercomrwjbluestatus1042162296854925314"><a href="https://twitter.com/rwjblue/status/1042162296854925314">Published sparkles-component 1.1.0 ✨</a></h2>
<p><a href="https://github.com/rwjblue">@rwjblue</a> released version 1.1.0 of the <a href="https://github.com/rwjblue/sparkles-component">sparkles-component</a> which includes <a href="https://www.typescriptlang.org/">TypeScript</a> conversion of the library.</p>
<!--alex ignore hooks destroy-->
<p>The sparkles-component is an addon used to experiment with <a href="https://github.com/glimmerjs/glimmer.js/tree/master/packages/%40glimmer/component">glimmer component</a> style APIs in Ember apps via existing public APIs. It supports most of the <code>@glimmer/component</code> API including lifecycle hooks (constructor, didInsertElement, didUpdate, destroy), @tracked properties, ES base class, and decorator support (with the release of 1.1.0, this supports consuming via TypeScript).</p>
<p>To learn more, <a href="https://github.com/rwjblue">@rwjblue</a> together with <a href="https://github.com/mike-north">@mike-north</a> live streamed converting the library from JavaScript to TypeScript. You can watch the <a href="https://www.twitch.tv/videos/311556611">live replay on Twitch</a>.</p>
<hr />
<h2 id="emberisamodernframeworktellyourfriendshttpsdevtonullvoxpopulitheemberjsofthefuturetoday12c"><a href="https://dev.to/nullvoxpopuli/the-emberjs-of-the-future-today-12c">Ember Is a Modern Framework, Tell Your Friends 😄</a></h2>
<!--alex ignore hooks destroy-->
<p>Community member <a href="https://github.com/NullVoxPopuli">@NullVoxPopuli</a> has written a summary of a set of his favorite features that showcase how Ember is a modern framework, and can be attractive to people looking for all the shiny things. Check out <a href="https://dev.to/nullvoxpopuli/the-emberjs-of-the-future-today-12c">The EmberJS of the future… today!</a> where he discusses async lifecycle hooks, syntax for components, testing, dependency injection, keyboard accessibility and more.</p>
<hr />
<h2 id="bostonbuiltembercssmodules10akathebigdigisherehttpstwittercom__dfreemanstatus1042837440417988610"><a href="https://twitter.com/__dfreeman/status/1042837440417988610">Boston-Built ember-css-modules 1.0 AKA "The Big Dig" Is Here 🏗</a></h2>
<p><a href="https://github.com/salsify/ember-css-modules">salsify/ember-css-modules</a> has launched a 1.0 thanks to bug reports, feature ideas and pull requests from the community over the past couple years! ember-css-modules provides Ember-flavored support for <a href="https://github.com/css-modules/css-modules">CSS Modules</a>. With the addon, styling is a first-class citizen alongside templates and JavaScript, with one CSS file per component.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/anehx" target="gh-user">@anehx</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/balinterdi" target="gh-user">@balinterdi</a>, <a href="https://github.com/pixelhandler" target="gh-user">@pixelhandler</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/dcombslinkedin" target="gh-user">@dcombslinkedin</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/SparshithNR" target="gh-user">@SparshithNR</a>, <a href="https://github.com/quajo" target="gh-user">@quajo</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/smfoote" target="gh-user">@smfoote</a>, <a href="https://github.com/EndangeredMassa" target="gh-user">@EndangeredMassa</a>, <a href="https://github.com/jfdnc" target="gh-user">@jfdnc</a> and <a href="https://github.com/adityasrini" target="gh-user">@adityasrini</a> for their contributions to Ember and related repositories 💖!</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at #support-ember-times on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, L. Preston Sego III, Amy Lam, Ryan Mark, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-65</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-65</guid><pubDate>Fri, 21 Sep 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 66]]></title><description><![CDATA[<p>Emberistas سلام! 🐹</p>
<p>Don't miss brand-new 🔥 <strong>RFCs for collocated addon tests</strong> and <strong>Router</strong> served <strong>query params</strong> this week!
We also have news from <strong>Ember CLI Deprecation Workflow</strong> and a <em>Lost & Found</em> 🕵🏾‍ from the <strong>Ember API Docs</strong> for you,
as well as a <strong>Thank You note</strong> for the most amazing <strong>Issue Triaging</strong> Experts! 🙂</p>
<!-- READMORE -->
<hr />
<h2 id="theaddontestisrightwhereitbelongshttpsgithubcomemberjsrfcspull378"><a href="https://github.com/emberjs/rfcs/pull/378">The Addon Test Is Right Where It Belongs ❤️</a></h2>
<!--alex ignore host-hostess-->
<p>Spending too much time looking for the <strong>test files</strong> of your <strong>in-repo addon</strong>? Feeling too exhausted to maintain a large test suite in which addon and host app test cases are meshed together? It doesn't have to be this way.</p>
<p>Read more about how <strong>collocated in-repo test files</strong> are able to make your developer life easier in <a href="https://github.com/emberjs/rfcs/pull/378">this <strong>shiny, new Request for Comments (RFC)</strong></a>. And as always, be sure to <strong>leave your questions or ❤️ emojis</strong> right below the RFC's pull request description! ✨</p>
<hr />
<h2 id="emberclideprecationworkflow100releasehttpstwittercomrwjbluestatus1045031033274605575"><a href="https://twitter.com/rwjblue/status/1045031033274605575">ember-cli-deprecation-workflow 1.0.0 Release 🎉</a></h2>
<p>This week, <a href="https://github.com/rwjblue">@rwjblue</a> (with help from <a href="https://github.com/mixonic">@mixonic</a>, <a href="https://github.com/atsao">@atsao</a>, and <a href="https://github.com/Gaurav0">@gaurav0</a>) released <a href="https://github.com/mixonic/ember-cli-deprecation-workflow/releases/tag/v1.0.0"><strong>1.0.0 of ember-cli-deprecation-workflow</strong></a>!</p>
<p><a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> is an addon geared towards making Ember upgrades easier by allowing you to work through deprecations without massive console noise from Ember 1.x and 2.x deprecations.</p>
<p>It silences the <code>console.log</code> noise or "deprecation spew" via configuration so that <strong>only unhandled deprecations</strong> will be <strong>displayed in your console</strong>. And now that the spew has settled down, you can process one deprecation at a time while ensuring that no new deprecations are introduced.</p>
<p>Check it out on the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">GitHub repo</a>!</p>
<hr />
<!--alex ignore special-->
<h2 id="andtodaysspecialontheroutermenuqueryparamshttpsgithubcomemberjsrfcspull380"><a href="https://github.com/emberjs/rfcs/pull/380">And Today's Special on The Router Menu: Query Params 👨‍🍳</a></h2>
<p>Ever had the need to read <strong>query params (QPs)</strong> off a <code>Controller</code> and pass it down to a component to change its UI state depending on the QP value?</p>
<p>Ever had a hard time passing down QP values through layers and layers of components?</p>
<p>It doesn't have to be this way. Read <a href="https://github.com/emberjs/rfcs/pull/380">this new RFC</a> about exposing QPs as a <em>computed property</em> on the <code>RouterService</code>. It proposes that this <code>Service</code> can then be injected into components, which makes laborious passing of QP data obsolete.</p>
<p>As always, <strong>leave your comments</strong> and appreciation <a href="https://github.com/emberjs/rfcs/pull/380">below the original proposal</a> as long as it's <strong>still under discussion</strong>!</p>
<hr />
<h2 id="themissingdocshasreturnedhttpsgithubcomemberjsemberjspull17002"><a href="https://github.com/emberjs/ember.js/pull/17002">The Missing Docs Has Returned 📃</a></h2>
<p>There has been <a href="https://github.com/emberjs/ember.js/issues/16993">some documentation missing</a> from the Ember API docs from the release of 3.3 to 3.4. <a href="https://github.com/Gaurav0">@Gaurav0</a> has done some great detective work 🕵  and <a href="https://github.com/emberjs/ember.js/pull/17002">fixed these issues</a> which means that <strong>the missing documentation is now back.</strong></p>
<p>Going forward the plan is to provide better testing for cases like this so you always have access to the documentation you need.</p>
<hr />
<h2 id="projectstructureforsinglepageappshttpsdevtonullvoxpopuliageneralandflexiblefilestructurethatworksforallprojectsinanyecosystem1lp9"><a href="https://dev.to/nullvoxpopuli/a-general-and-flexible-file-structure-that-works-for-all-projects-in-any-ecosystem-1lp9">Project Structure for Single Page Apps 📂</a></h2>
<p>Inspired by <strong>Module Unification</strong>, <a href="https://github.com/NullVoxPopuli">@NullVoxPopuli</a> has
written an article on <strong>general project structure for single page apps.</strong>
In the article he explains how structure is not specific to Ember, React, Vue, or anything else,
but needs to meet a set of guidelines for some common desired goals.</p>
<p>Read it here: <a href="https://dev.to/nullvoxpopuli/a-general-and-flexible-file-structure-that-works-for-all-projects-in-any-ecosystem-1lp9"><em>A general and flexible file structure that works for all projects in any ecosystem</em></a></p>
<hr />
<h2 id="issuetriagehttpspaperdropboxcomdocemberjsissuetriageanxsbgi3nqnsti7fsmqionfoagbh6aehtj1bt4rxq0awg4r"><a href="https://paper.dropbox.com/doc/Ember.js-Issue-Triage--ANXsBgi3NQNstI7fSMQIONfOAg-Bh6AEHTj1Bt4rXq0Awg4R">Issue Triage 🕵️</a></h2>
<p>
  This week we had <strong>5 volunteers</strong> helping 🚑 &nbsp;<strong>triage old issues</strong> that were inactive,
  we closed 9 and labelled 31 of 50 from last week that need a submitter response 🙀.
  Those 31 may be closed in the next week or two. Together, we addressed 17 issues
  that were inactive (and are still open 📂). We are beginning to establish a cadence
  again of a team addressing issue triage 🛠️ on Friday mornings.
</p>
<p>
  Thanks for your
  <a href="https://paper.dropbox.com/doc/Triage-2018-09-21--ANXmzEWQ5mVFnbfufGK81Tj5Ag-BIKVPVdJqOS8q46TxJQKu">
    triage contributions
  </a> over the past two weeks 🙏…
  <a href="https://github.com/yininge" target="gh-user">@yininge</a>,
  <a href="https://github.com/ryanlabouve" target="gh-user">@ryanlabouve</a>,
  <a href="https://github.com/yohanmishkin" target="gh-user">@yohanmishkin</a>,
  <a href="https://github.com/esbanarango" target="gh-user">@esbanarango</a>,
  <a href="https://github.com/hakilebara" target="gh-user">@hakilebara</a>, and
  <a href="https://github.com/pixelhandler" target="gh-user">@pixelhandler</a>.
</p>
<p>
  The <em>@emberjs/issues-team</em> objective is to <strong>increase signal-to-noise ratio of issues</strong>
  and 🐛 &nbsp;bugs so that the core team (and contributors) can take action to resolve bugs,
  and spend less effort sorting the issues queue. Currently there are about 67 open bugs, of
  those 25 had a reproduction (e.g. using <a href="https://ember-twiddle.com">ember-twiddle.com</a>), and one with a pull request - total count about 270. Our aim is to get down to 150 in the next
  couple months. If you'd like to <strong>help</strong> see the
  <a href="https://discordapp.com/channels/480462759797063690/480523776845414412">#issue-triage</a>
  room in the community Discord chat.
</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/iezer" target="gh-user">@iezer</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/pixelhandler" target="gh-user">@pixelhandler</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/jrjohnson" target="gh-user">@jrjohnson</a>, <a href="https://github.com/tmquinn" target="gh-user">@tmquinn</a>, <a href="https://github.com/BryanCrotaz" target="gh-user">@BryanCrotaz</a>, <a href="https://github.com/mfeckie" target="gh-user">@mfeckie</a>, <a href="https://github.com/bmac" target="gh-user">@bmac</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/SparshithNR" target="gh-user">@SparshithNR</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/gandalfar" target="gh-user">@gandalfar</a>, <a href="https://github.com/CodingItWrong" target="gh-user">@CodingItWrong</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/hybridmuse" target="gh-user">@hybridmuse</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimes">#embertimes 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? <strong>Join us</strong> at <strong>#support-ember-times</strong> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by <strong>subscribing to our</strong> <a href="https://the-emberjs-times.ongoodbits.com/"><strong>e-mail newsletter</strong></a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Bill Heaton, Chris Ng, Ryan Mark, L. Preston Sego III, Amy Lam, Kenneth Larsen, Jessica Jordan, Alon Bukai and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-66</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-66</guid><pubDate>Fri, 28 Sep 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 67]]></title><description><![CDATA[<p>Hello, pleased to eat you, Emberistas! -Dracula 🦇</p>
<p>🍂 Fall is here and so is Hacktoberfest for Ember, CodeSandbox for Ember, and Storybook for Ember! We're also advertising <strong>Help Wanted</strong> for the new Ember CLI docs and the latest Ember Twiddle release! Read on in this week's issue…</p>
<!-- READMORE -->
<hr />
<h2 id="hacktoberfesthttpshacktoberfestdigitaloceancom"><a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest 🎃🍻👨‍💻</a></h2>
<p>Trick or treat! The fifth annual Hacktoberfest is here! Support open source and earn a limited edition T-shirt by making <strong>five</strong> pull requests this month to any public repos…why not all Ember ones?!</p>
<!-- alex ignore dad-mom -->
<p>Looking for something to work on? Pop into the <a href="https://discordapp.com/channels/480462759797063690/496453502298750988">#hacktoberfest</a> channel on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> and ask away with questions! Here are some issues to get you started:</p>
<ul>
<li><a href="https://github.com/ember-learn/cli-guides-source/issues">ember-learn/cli-guides-source</a></li>
<li><a href="https://github.com/ember-learn/ember-api-docs/labels/hacktoberfest">ember-learn/ember-api-docs</a></li>
<li><a href="https://github.com/ember-learn/ember-styleguide/issues?q=is%3Aissue+is%3Aopen+label%3Ahacktoberfest">ember-learn/ember-styleguide</a></li>
<li><a href="https://github.com/ember-learn/guides-source/issues?q=is%3Aopen+is%3Aissue+label%3Ahacktoberfest">ember-learn/guides-source</a></li>
<li><a href="https://github.com/emberjs/data/labels/Hacktoberfest">emberjs/data</a></li>
<li><a href="https://github.com/emberjs/website/issues?q=is%3Aissue+is%3Aopen+label%3Ahacktoberfest">emberjs/website</a></li>
<li><a href="https://github.com/kaliber5/ember-bootstrap/labels/Hacktoberfest">kaliber5/ember-bootstrap</a></li>
</ul>
<p>Want to help improve Ember Observer? Have a friend or coworker looking for their first open source pull request? A mere 977 addon repos on <a href="https://emberobserver.com/lists/invalid-repo-url">emberobserver.com/lists/invalid-repo-url</a> are missing the <code>repository</code> key from their <code>package.json</code>. For more info, reference the <a href="https://docs.npmjs.com/files/package.json#repository">npm docs</a>, and some sample pull requests [<a href="https://github.com/Addepar/addepar-ember-toolbox/pull/29">1</a>, <a href="https://github.com/Duder-onomy/ember-fetch-jsonp/pull/45">2</a>]…rinse and repeat for every addon repo. Thanks <a href="https://github.com/cah-danmonroe">@cah-danmonroe</a> and <a href="https://github.com/ctcpip">@ctpip</a> for getting this effort started! 💯</p>
<p>…and don't forget to register on the <a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest site</a>. 👻</p>
<hr />
<h2 id="comeplayintheembercodesandboxhttpsmediumcommikenorthembercommunitymeetcodesandbox10a43076b3fa"><a href="https://medium.com/@mikenorth/ember-community-meet-codesandbox-10a43076b3fa">Come Play in the Ember CodeSandbox 🏖️🏰</a></h2>
<p><a href="https://codesandbox.io">CodeSandbox</a> is an online code editor for <strong>the Web</strong>, and now for <strong>Ember</strong> as well! <a href="https://github.com/mike-north">@mike-north</a> has done a lot of work to get Ember CLI working inside of CodeSandbox so that we can <strong>develop, showcase, and share</strong> live apps on the web!</p>
<p>What allowed this to happen is that CodeSandbox released server-side evaluated sandboxes, which now allows CLI Node apps to run and be served by the site.</p>
<p>We want to give a shoutout to <a href="https://github.com/Gaurav0">@Gaurav0</a> and the rest of the <a href="https://ember-twiddle.com/">Ember Twiddle</a> team for their <strong>amazing</strong> work. The way Ember Twiddle works is by <a href="https://github.com/ember-cli/ember-twiddle/blob/ac116eb20d1e6c2152313f865159c443a9e2bd6f/app/services/ember-cli.js#L261-L295">emulating</a> a node environment. With CodeSandbox, we get <strong>real Ember CLI</strong> out of the box.</p>
<p>There are a few issues that Mike is working on fixing, but we believe that this will be stable and usable soon. For example, <code>ember new app</code> doesn't work.</p>
<p>To try this out today, use this <a href="https://codesandbox.io/s/github/mike-north/ember-new-output/tree/vanilla">starter kit</a> or if you are feeling <strong>adventurous</strong> try out this <a href="https://codesandbox.io/s/github/mike-north/ember-new-output/tree/typescript">TypeScript starter kit</a>.</p>
<p>To learn more make sure to check out the <a href="https://medium.com/@mikenorth/ember-community-meet-codesandbox-10a43076b3fa">blog post</a> and follow <a href="https://twitter.com/michaellnorth/status/1047231228020023296">Mike on Twitter</a> to stay updated!</p>
<hr />
<h2 id="introducingstorybookforemberhttpsgithubcomstorybooksstorybookpull4237"><a href="https://github.com/storybooks/storybook/pull/4237">Introducing: Storybook for Ember! 📖</a></h2>
<p>With the <a href="https://github.com/storybooks/storybook/releases/tag/v4.0.0-alpha.24">v4.0.0 alpha release</a> of Storybook, <a href="https://github.com/gabrielcsapo">@gabrielcsapo</a> helped provide an exciting addition to Ember tooling - <a href="https://github.com/storybooks/storybook/pull/4237">adding Storybook support</a>!</p>
<p><a href="https://github.com/storybooks/storybook">Storybook</a> is a separate UI <strong>development environment</strong> for your UI components. It allows you to explore your <strong>component library</strong>, work on a <strong>single component in isolation</strong>, and view the <strong>different states of each component</strong>. This enables developers to see the functioning UI of the component along with expectations on what to pass as arguments to that component to behave in a certain way.</p>
<p>There are plenty of <a href="https://storybook.js.org/examples/">featured examples</a> that you can reference to see how Storybook works. We are excited to see the productivity and convenience this tool will bring to Ember!</p>
<hr />
<h2 id="helpcreatethefreshestemberclidocshttpsgithubcomemberlearncliguidessourceissues3"><a href="https://github.com/ember-learn/cli-guides-source/issues/3">Help Create the Freshest Ember CLI Docs 🥒</a></h2>
<p>Do you ❤️ <strong>Ember CLI</strong>? And would you like to help the community to share this appreciation even further?
Then be sure, to check out this <a href="https://github.com/ember-learn/cli-guides-source/issues/3"><strong>new Quest Issue</strong> for writing the brand-new documentation for Ember CLI</a>! 💛</p>
<p><strong>Help is needed</strong> for anything ranging from copy-pasta-ing 🍝 to greenfield writing. To sign up and join the crowd, <a href="https://github.com/ember-learn/cli-guides-source/issues/3">add a comment to the Quest Issue</a> and volunteer for a task.</p>
<hr />
<h2 id="embertwiddletothenextlevelhttpsembertwiddlecom"><a href="https://ember-twiddle.com/">Ember Twiddle to the Next Level 🐹🎢</a></h2>
<p>Your favorite tool for <strong>sharing</strong> Ember specific <strong>code examples</strong> with your colleagues and friends is out with a brand-new patch release! <a href="https://github.com/ember-cli/ember-twiddle/releases/tag/v0.15.1"><strong>Ember Twiddle v0.15.1</strong></a> comes with <strong>support</strong> for the <strong>latest version of Ember</strong> and <strong>ember-decorators</strong>, improved installation instructions and much more.</p>
<p>In case you haven't twiddled yet, it's about time to <a href="https://ember-twiddle.com/">create your first Twiddle today</a>! 📝</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/kgautreaux" target="gh-user">@kgautreaux</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/jeffdaley" target="gh-user">@jeffdaley</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/RyanGee" target="gh-user">@RyanGee</a>, <a href="https://github.com/ftonato" target="gh-user">@ftonato</a>, <a href="https://github.com/ruandev" target="gh-user">@ruandev</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/patrickmcintire-viavi" target="gh-user">@patrickmcintire-viavi</a>, <a href="https://github.com/Dhaulagiri" target="gh-user">@Dhaulagiri</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/makepanic" target="gh-user">@makepanic</a>, <a href="https://github.com/hjdivad" target="gh-user">@hjdivad</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/chiragpat" target="gh-user">@chiragpat</a>, <a href="https://github.com/rondale-sc" target="gh-user">@rondale-sc</a>, <a href="https://github.com/smfoote" target="gh-user">@smfoote</a>, <a href="https://github.com/HuggableSquare" target="gh-user">@HuggableSquare</a>, <a href="https://github.com/ynotdraw" target="gh-user">@ynotdraw</a>, <a href="https://github.com/localpcguy" target="gh-user">@localpcguy</a>, <a href="https://github.com/ybakos" target="gh-user">@ybakos</a>, <a href="https://github.com/nightire" target="gh-user">@nightire</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/patocallaghan" target="gh-user">@patocallaghan</a>, <a href="https://github.com/underoot" target="gh-user">@underoot</a>, <a href="https://github.com/BradenLawrence" target="gh-user">@BradenLawrence</a>, <a href="https://github.com/Akash4927" target="gh-user">@Akash4927</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/gokatz" target="gh-user">@gokatz</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/Parrryy" target="gh-user">@Parrryy</a>, <a href="https://github.com/John-E5" target="gh-user">@John-E5</a>, <a href="https://github.com/donofriov" target="gh-user">@donofriov</a> and <a href="https://github.com/CosmicWebServices" target="gh-user">@CosmicWebServices</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Alon Bukai, Ryan Mark, Amy Lam, Chris Ng, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-67</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-67</guid><pubDate>Fri, 05 Oct 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 68]]></title><description><![CDATA[<p>Hola Emberistas! 🐹</p>
<p>EmberConf 2019 is here, is this the year for <strong>you</strong> to submit a talk idea?! 🗣 In this week's issue we're highlighting some ways to <strong>contribute to Ember</strong>: the Ember Help Wanted App 🚧, the new Ember CLI guides 📚, and Module Unification 📝. We're also celebrating <strong>some Hacktoberfest 🕸 wins</strong>. Read on!</p>
<!-- READMORE -->
<hr />
<h2 id="findwaystohelpoutwiththeemberhelpwantedappnbsphttpshelpwantedemberjscom"><a href="https://help-wanted.emberjs.com">Find Ways to Help Out with the Ember Help Wanted App&nbsp;✨</a></h2>
<p>Too much spare time at hand and don't know what to do? Wanna <strong>contribute to open-source</strong>? Then check out the sparkling ✨ <a href="https://help-wanted.emberjs.com">new <strong>Ember Help Wanted App</strong></a> ✨!!</p>
<p>The Ember Help Wanted App lists all current open issues across Ember repositories, like Ember CLI, Ember Data, the EmberJS Website and more which could use some support. The website is also a great resource if you're still looking forward to get your contributions in for <a href="https://www.emberjs.com/blog/2018/10/05/the-ember-times-issue-67.html#toc_a-href-https-hacktoberfest-digitalocean-com-hacktoberfest-a"><strong>Hacktoberfest</strong></a>, so be sure to <a href="https://help-wanted.emberjs.com">check it out</a>.</p>
<hr />
<h2 id="emberconf2019callforpapershttpsemberconfcombecomeaspeakerhtml"><a href="https://emberconf.com/become-a-speaker.html">EmberConf 2019 Call for Papers 📝</a></h2>
<p>Huzzah, the announcement is here! EmberConf 2019 will be held <strong>March 18-20</strong> in Portland, OR! <a href="https://emberconf.com/index.html">EmberConf</a> is three days of activities, sessions, talks and trainings with the Ember Core Team and community members from around the world.</p>
<!--alex ignore blind-->
<p>EmberConf is great because its speakers are great, <strong>and you could be one of them!</strong> The Call for Papers is public, starts out blind, and features a collaborative process to help applicants improve their proposals. Proposals will be accepted and reviewed from now until <strong>November 18, 2018</strong>.</p>
<p>Don't forget to check out <a href="https://discordapp.com/channels/480462759797063690/480502413917421570">#ember-conf</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Discord</a>!</p>
<hr />
<h2 id="questwritethemvpofthenewembercliguideshttpsgithubcomemberlearncliguidessourceissues3"><a href="https://github.com/ember-learn/cli-guides-source/issues/3">Quest: Write the MVP of the New Ember CLI Guides ✨</a></h2>
<p>Looking for your next challenge? We’re looking for contributors to help port over and rewrite content from <a href="https://ember-cli.com/">ember-cli.com</a> as outlined in the <a href="https://github.com/ember-cli/rfcs/pull/120">RFC</a>.</p>
<p><em>Choose a task, any task – we’ve got you covered!</em> There are <strong>plenty of opportunities to contribute</strong> from picking a markdown file without any content and adding suggested headings to it – to completely working on a greenfield rewrite of the <a href="https://ember-cli.com/user-guide/#deployments">deployments section</a>. The idea is to empower new contributors by having up-to-date and clear documentation with the goal of wrapping up the <strong>MVP by the end of 2018</strong>.</p>
<p>See the full list on the <a href="https://github.com/ember-learn/cli-guides-source/issues/3">cli-guides-source Quest issue</a>!</p>
<hr />
<h2 id="moduleunificationisinthefinalstretchhttpsgithubcomemberjsemberjsissues16373"><a href="https://github.com/emberjs/ember.js/issues/16373">Module Unification Is in the Final Stretch! 🛣</a></h2>
<p>Have you heard of <strong>Ember's future default project layout</strong>? If you haven't, you can read about it the <a href="https://github.com/emberjs/rfcs/blob/master/text/0143-module-unification.md">Module Unification RFC</a>.</p>
<p>The initial work on Module Unification is <strong>nearly complete</strong>, as <strong><a href="https://github.com/emberjs/ember.js/issues/16373">there are only a handful of tasks left</a></strong> and some of the tasks need a good amount of spelunking time.
If you can donate some of your time to help finish this up, the entire community will forever be in your debt. 💖</p>
<p>Also, if you are a user of namespaced components, <a href="https://github.com/emberjs/rfcs/pull/367">this RFC</a> is a must read. Please leave your thoughts on the <a href="https://github.com/emberjs/rfcs/pull/367">Module Unification Packages RFC</a> as nested components affect the majority of Ember projects.</p>
<p>To learn more about Module Unification, feel free to join the <a href="https://discordapp.com/channels/480462759797063690/484527343331704832">#st-module-unification channel</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Discord</a>!</p>
<p>Curious what a real project looks like with module unifcation? Checkout <a href="https://emberclear.io">emberclear</a> by <a href="http://github.com/nullvoxPopuli/">@NullVoxPopuli</a> on <a href="https://gitlab.com/NullVoxPopuli/emberclear/tree/master/packages/frontend">GitLab</a> or <a href="https://github.com/NullVoxPopuli/emberclear/tree/master/packages/frontend">GitHub</a>!</p>
<hr />
<h2 id="hacktoberfesthappeningshttpstwittercomshipshapecodestatus1048579870689771520"><a href="https://twitter.com/shipshapecode/status/1048579870689771520">Hacktoberfest Happenings 🎃</a></h2>
<p>Want to see ember-cli-addon-docs in the wild? <a href="https://github.com/rwwagner90">@rwwagner90</a> shipped an update to <a href="https://github.com/shipshapecode/ember-flatpickr">shipshapecode/ember-flatpickr</a> for Hacktoberfest, converting its docs to <a href="https://github.com/ember-learn/ember-cli-addon-docs">ember-cli-addon-docs</a>! Check out the new slick docs site <a href="https://shipshapecode.github.io/ember-flatpickr/docs">here</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/btecu" target="gh-user">@btecu</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/CodingItWrong" target="gh-user">@CodingItWrong</a>, <a href="https://github.com/NullVoxPopuli" target="gh-user">@NullVoxPopuli</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/yohanmishkin" target="gh-user">@yohanmishkin</a>, <a href="https://github.com/wifelette" target="gh-user">@wifelette</a>, <a href="https://github.com/SergeAstapov" target="gh-user">@SergeAstapov</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/jrjohnson" target="gh-user">@jrjohnson</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/oligriffiths" target="gh-user">@oligriffiths</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/SparshithNR" target="gh-user">@SparshithNR</a>, <a href="https://github.com/luxferresum" target="gh-user">@luxferresum</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/HuggableSquare" target="gh-user">@HuggableSquare</a>, <a href="https://github.com/ybakos" target="gh-user">@ybakos</a>, <a href="https://github.com/EndangeredMassa" target="gh-user">@EndangeredMassa</a>, <a href="https://github.com/prasannavijayan" target="gh-user">@prasannavijayan</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/dfreeman" target="gh-user">@dfreeman</a>, <a href="https://github.com/Techn1x" target="gh-user">@Techn1x</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/Parrryy" target="gh-user">@Parrryy</a>, <a href="https://github.com/ynotdraw" target="gh-user">@ynotdraw</a> and <a href="https://github.com/jtenclay" target="gh-user">@jtenclay</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Ryan Mark, Preston Sego, Chris Ng, Amy Lam, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-68</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-68</guid><pubDate>Fri, 12 Oct 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 69]]></title><description><![CDATA[<p>Namaste Emberistas! 🐹</p>
<p>This week we're discussing 4️⃣ fresh RFCs 🥑: bringing truth helpers to Ember core ✍️, new error handling methods 🚨, jQuery-free Ember apps by default 😄, and some improvements to relationship links 🔗. We're also highlighting test coverage for docs when Ember is upgraded 🚧, the new ember-self-focused addon 👁‍🗨, the EmberConf 2019 CFP brainstorm 🧠⛈, and more…read on!</p>
<!-- READMORE -->
<hr />
<h2 id="helpyourselvestodefaulttemplatehelpershttpsgithubcomemberjsrfcspull388"><a href="https://github.com/emberjs/rfcs/pull/388">Help Yourselves to Default Template Helpers 🍽️</a></h2>
<p>If you find yourself often reaching for the addon <a href="https://github.com/jmurphyau/ember-truth-helpers">ember-truth-helpers</a> in your templates then this <a href="https://github.com/emberjs/rfcs/pull/388">new RFC by @cibernox</a> is for you. This <strong>Request for Comments (RFC)</strong> proposes bringing in some of the <strong>template helpers</strong> in <code>ember-truth-helpers</code> into <strong>Ember Core</strong>.</p>
<p>The reasoning behind this is that a few helpers from this addon are so common in Ember apps that it makes sense to add them into Ember Core itself to <strong>reduce the friction</strong> of needing to install an addon to get them.</p>
<p>Another reason that might even be more important is that this could open up <strong>Glimmer VM low level optimizations</strong> as the Glimmer VM itself would know about these helpers.</p>
<p>The proposed helpers to add to core are: <code>eq</code>, <code>not</code>, <code>and</code>, <code>or</code>, <code>gt</code> and <code>gte</code>, <code>lt</code> and <code>lte</code>.</p>
<p>Learn more about this RFC and <a href="https://github.com/emberjs/rfcs/pull/388">join the discussion</a>.</p>
<hr />
<h2 id="anewwaytoerrorhandlinghttpsgithubcomemberjsrfcspull384"><a href="https://github.com/emberjs/rfcs/pull/384">A New Way to Error Handling 🚩</a></h2>
<p><a href="https://github.com/emberjs/rfcs/pull/384">A recent <strong>Request for Comments (RFC)</strong></a> from the magical <strong>Ember Data</strong> Land takes us on a journey through <strong>error handling</strong> in Ember: It proposes the addition of new error handling methods which do not affect the state of your data records to the <a href="https://www.emberjs.com/api/ember-data/release/classes/DS.Errors"><code>DS.Errors</code></a> class.</p>
<p>Read more about the new, proposed API and the motivation behind it <a href="https://github.com/emberjs/rfcs/pull/384">in the original proposal and feel free to discuss</a>!</p>
<hr />
<h2 id="sugarglutenjqueryfreeemberappsbydefaulthttpsgithubcomemberjsrfcspull386"><a href="https://github.com/emberjs/rfcs/pull/386">🍬 Sugar-, 🍞 Gluten- & jQuery-Free Ember Apps 🐹 by Default</a></h2>
<p>Previous RFC-driven efforts already provided an <strong>option</strong> for you to <strong>exclude jQuery</strong> from your Ember app builds (<a href="https://emberjs.github.io/rfcs/0294-optional-jquery.html">1</a>, <a href="https://www.emberjs.com/blog/2018/07/16/ember-3-3-released.html#toc_new-features-1">2</a>, <a href="https://github.com/ember-learn/guides-source/pull/64">3</a>). Now <a href="https://github.com/emberjs/rfcs/pull/386">a <strong>follow-up RFC</strong></a> takes the idea of <strong>reducing the initial bundle size</strong> of apps even further.</p>
<p>The new proposal envisions apps to provide an <strong>opt-in</strong> for the UI library, but to <strong>exclude jQuery by default</strong>. The RFC suggests that this will make it easier for developers and addon authors to provide smaller apps from the start and only include the dependency back in if it is <em>really</em> needed.</p>
<p>Curious to know more? Here's the <a href="https://github.com/emberjs/rfcs/pull/386">full proposal</a>.</p>
<hr />
<h2 id="wevegotyoucoveredhttpsgithubcomemberjsemberjspull16910"><a href="https://github.com/emberjs/ember.js/pull/16910">We've Got You Covered ⛑</a></h2>
<!-- alex ignore easy -->
<p>You might have noticed that sometimes when a new release of Ember is out some API documentation can disappear. This happens when code gets moved around in Ember, such as putting functions in their own modules, which makes it easy to make mistakes that impact the documentation parser. <a href="https://github.com/ef4">@ef4</a> added <a href="https://github.com/emberjs/ember.js/pull/16910">test coverage</a> for exactly these cases.</p>
<p>This means that when a new release is prepared these tests will most likely catch any unintentional documentation changes.</p>
<hr />
<h2 id="usingrelationshipslinksornotyourcallhttpsgithubcomemberjsrfcspull387"><a href="https://github.com/emberjs/rfcs/pull/387">Using Relationships Links or Not? Your Call! 🔗</a></h2>
<p>Fetching your data from a <a href="https://jsonapi.org/">JSON:API compliant</a> backend? Not sure how to tell Ember Data <strong>explicitly</strong> to look up an included <strong>relationship</strong> in the payload itself vs. via an additional request using the response's <code>link</code> attribute?</p>
<p>Possibly, this will be much easier very soon! <a href="https://github.com/emberjs/rfcs/pull/387">Another new, Ember Data related RFC</a> proposed the addition of a <code>shouldFindViaLink</code> method to the public API of REST <strong>adapters</strong>. According to the proposal, users may overwrite this method - which should return a <em>Boolean</em> to indicate if Ember Data should look up relationship data via links or not - themselves for custom behavior and gain full control of their relational data loading.</p>
<p>You can <strong>read more</strong> about the design of this proposed API <a href="https://github.com/emberjs/rfcs/pull/387"><strong>in the RFC itself</strong></a>!</p>
<hr />
<h2 id="newaddonreleaseemberselffocusedhttpsgithubcomlinkedinselffocusedtreemasterpackagesemberselffocused"><a href="https://github.com/linkedin/self-focused/tree/master/packages/ember-self-focused">New Addon Release: ember-self-focused 👁️</a></h2>
<!--alex ignore spa-->
<p>User interface transitions that happen in a single-page application (SPA) are problematic for <strong>screen reading software</strong> since traditionally they are reliant on reading out the text on page load. Since there are some visual changes on the screen but the page does not reload in an SPA, it makes it difficult for screen reading software users to be aware of UI changes.</p>
<p>To solve this issue, <a href="https://github.com/sarbbottam">@sarbbottam</a> released a brand new addon to enable screen reading software to speak the content of the new node by <strong>focusing on the HTML node of the dynamic content</strong>. The new addon <a href="https://github.com/linkedin/self-focused/tree/master/packages/ember-self-focused">ember-self-focused</a> provides a <strong>component</strong> and a <strong>service</strong> to keep track of the HTML nodes to be focused.</p>
<p>Check out more in <a href="https://github.com/sarbbottam">@sarbbottam</a>'s <a href="https://engineering.linkedin.com/blog/2018/10/making-ember-applications--ui-transitions-screen-reader-friendly">blog post</a> or at the <a href="https://github.com/linkedin/self-focused/tree/master/packages/ember-self-focused">GitHub repo</a>!</p>
<hr />
<h2 id="emberconf2019cfpbrainstormhttpsemberconfcomcfpbrainstormhtml"><a href="https://emberconf.com/cfp-brainstorm.html">EmberConf 2019 CFP Brainstorm 📆</a></h2>
<p>Interested in submitting a talk idea to <strong>EmberConf</strong>? Join the EmberConf team for an <strong>interactive video brainstorm</strong> on Tuesday, October 30th at 11:00am PT. They'll chat about the CFP, the topics they hope to see, and answer community questions about ideas and proposals. Mark your calendars and go to <a href="https://emberconf.com/cfp-brainstorm.html">the EmberConf website</a> for more info!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/btecu" target="gh-user">@btecu</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/ssutar" target="gh-user">@ssutar</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/KamiKillertO" target="gh-user">@KamiKillertO</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/wifelette" target="gh-user">@wifelette</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/devpuppy" target="gh-user">@devpuppy</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/pixelhandler" target="gh-user">@pixelhandler</a>, <a href="https://github.com/sduquej" target="gh-user">@sduquej</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/mydea" target="gh-user">@mydea</a>, <a href="https://github.com/mattdonnelly" target="gh-user">@mattdonnelly</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/gowthamrm" target="gh-user">@gowthamrm</a>, <a href="https://github.com/dcombslinkedin" target="gh-user">@dcombslinkedin</a>, <a href="https://github.com/SparshithNR" target="gh-user">@SparshithNR</a>, <a href="https://github.com/buschtoens" target="gh-user">@buschtoens</a>, <a href="https://github.com/chiragpat" target="gh-user">@chiragpat</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/esbanarango" target="gh-user">@esbanarango</a>, <a href="https://github.com/Ricool06" target="gh-user">@Ricool06</a>, <a href="https://github.com/aklkv" target="gh-user">@aklkv</a>, <a href="https://github.com/JonoLightning" target="gh-user">@JonoLightning</a>, <a href="https://github.com/LalithaRajanala" target="gh-user">@LalithaRajanala</a>, <a href="https://github.com/YoranBrondsema" target="gh-user">@YoranBrondsema</a>, <a href="https://github.com/worace" target="gh-user">@worace</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a> and <a href="https://github.com/joshmcrty" target="gh-user">@joshmcrty</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Alon Bukai, Kenneth Larsen, Ryan Mark, Amy Lam, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-69</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-69</guid><pubDate>Fri, 19 Oct 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 70]]></title><description><![CDATA[<p>G'day, Emberistas! 🐹</p>
<p>This week we have an Ember standard for i18n 🌍, more convenient <strong>transitions</strong> through your Ember apps with the <strong>new Router Helpers & Element Modifiers RFC</strong>, artisan ☕️ deprecations for <strong>setting</strong> your <strong>component managers</strong>, a <strong>new version of Ember</strong>, an exciting new Readers' Question 🤔 on the future of controllers, using GraphQL in Ember 💥, and more!</p>
<!-- READMORE -->
<hr />
<h2 id="emberi18ndeprecationandreleaseofemberintlhttpstwittercommiguelcambastatus1054699605865177089"><a href="https://twitter.com/MiguelCamba/status/1054699605865177089">ember-i18n Deprecation and Release of ember-intl 🌐</a></h2>
<p><a href="https://github.com/snewcomer">@snewcomer</a> and <a href="https://github.com/cibernox">@cibernox</a> <a href="https://twitter.com/MiguelCamba/status/1054699605865177089">announced</a> a new way to internationalize Ember apps, <a href="https://github.com/jamesarosen/ember-i18n">ember-i18n</a> is now deprecated in favour of <a href="https://github.com/ember-intl/ember-intl">ember-intl</a>! This will provide Ember with a standard package for internationalization.</p>
<p>There are <a href="https://twitter.com/MiguelCamba/status/1054720978478084097">many reasons</a> to make the change such as:</p>
<ul>
<li>Using the <a href="https://formatjs.io/guides/message-syntax/"><strong>ICU message format</strong></a> which is a standard in the i18n industry</li>
<li><strong>Locale-aware</strong> numbers, dates, times, currencies, decimals, and percentages!</li>
<li>Uses the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl"><strong>Native Intl API</strong></a></li>
<li>Translations are way more powerful and <strong>can contain logic</strong> (like gender-dependent translations)</li>
</ul>
<!--alex ignore host-hostess-->
<ul>
<li>Advanced <a href="https://github.com/ember-intl/ember-intl/blob/master/docs/addon-support.md"><strong>addon support</strong></a> to provide translations to the host app</li>
</ul>
<p>There is even a <a href="https://github.com/DockYard/ember-i18n-to-intl-migrator">codemod</a> to make the switch from ember-i18n to ember-intl easier! So <a href="https://github.com/ember-intl/ember-intl">check it out</a> and make the switch today!</p>
<hr />
<h2 id="routemethroughspaceandtimewiththerouterhelpersrfchttpsgithubcomemberjsrfcspull391"><a href="https://github.com/emberjs/rfcs/pull/391">Route Me Through Space 🛰 and Time 🕰 with the Router Helpers RFC</a></h2>
<p>Inspired by the <a href="https://github.com/rwjblue/ember-router-helpers">experimental addon ember-router-helpers</a> a <a href="https://github.com/emberjs/rfcs/pull/391"><strong>new RFC (Request for Comments)</strong></a> illustrates a possible, new way to <strong>route</strong> through your Ember apps.</p>
<!-- alex ignore easy -->
<p>Several <strong>new template helpers and element modifiers</strong> for routing are proposed: This includes a <code>transition-to</code> element modifier for easy route-to-route transitions <a href="https://github.com/emberjs/rfcs/blob/new-router-helpers/text/0000-router-helpers.md#motivation">surpassing some of the drawbacks</a> of the functionally similar <code>link-to</code> helper. But also the design of and the motivation behind new, useful helpers like <code>root-url</code>, <code>is-active</code> and <code>is-loading</code> among others are explained in great detail in the RFC itself.</p>
<p>Curious? Be sure to give the <a href="https://github.com/emberjs/rfcs/pull/391">proposal a read and make your thoughts known in the comments below!</a></p>
<hr />
<h2 id="originalartisandeprecationsrfcforthesetcomponentmanagerapihttpsgithubcomemberjsrfcspull392"><a href="https://github.com/emberjs/rfcs/pull/392">Original & Artisan ☕️ Deprecations RFC for the setComponentManager API</a></h2>
<p>The 🔥 brand-new <strong>Custom Component Manager API</strong> 🚒 <a href="https://emberjs.com/blog/2018/10/07/ember-3-4-released.html#toc_changes-in-ember-js-3-4">has been shipped with Ember 3.4</a> and is now available as a low-level API granting addon authors more freedom to create <strong>components from customized base classes</strong>.</p>
<p>This week a <a href="https://github.com/emberjs/rfcs/pull/392">freshly brewed RFC</a> with its first, important deprecation rolled in: The proposal suggests to replace the <strong>string-based lookup</strong> method for the <code>setComponentManager</code> function for a <strong>factory-based</strong> approach. This small change in the API provides quick wins 🏅 for future undertakings regarding tree shaking of Ember apps, module unification and more.</p>
<p>Read all about the motivation behind this deprecation in the <a href="https://github.com/emberjs/rfcs/pull/392">hand-crafted RFC on Github</a>.</p>
<hr />
<h2 id="nographtheoryrequiredemberandgraphqlinpracticehttpsmediumcomkloeckneriemberandgraphql8aa15f7a2554"><a href="https://medium.com/kloeckner-i/ember-and-graphql-8aa15f7a2554">No Graph Theory Required: Ember and GraphQL in Practice ⚡️</a></h2>
<p>Following his <a href="https://emberfest.eu/schedule/#rocky-neurock">EmberFest</a> talk with <a href="https://github.com/chadian">@chadian</a>, <a href="https://github.com/jneurock">@jneurock</a> blogged about their experience with GraphQL in Ember. If you are struggling with JSON API, or thinking about GraphQL, this article should give you an understanding of how to get started. They even created an <a href="https://github.com/chadian/ember-graphql-examples">example repo</a> that includes an Ember app demonstrating GraphQL integration with four different clients. Check out the <a href="https://medium.com/kloeckner-i/ember-and-graphql-8aa15f7a2554">article</a> and the <a href="https://graphql.org/learn/">GraphQL website</a> to learn more!</p>
<hr />
<h2 id="ember35isouthttpsemberjscomblog20181015ember35releasedhtml"><a href="https://emberjs.com/blog/2018/10/15/ember-3-5-released.html">Ember 3.5 is Out! 🚀</a></h2>
<p>Version 3.5 of Ember and it contains some pretty cool things. With this release, Ember Data has now released <strong>their first LTS release ever</strong> with Ember Data 3.4 and will now follow the same LTS cycle as Ember.</p>
<p>Ember Data 3.4 also released the new <code>RecordData</code> interfaces that give addon developers the much-needed API access with <strong>more confidence and stability</strong>.</p>
<p>With Ember CLI 3.5 you get Broccoli v2.0.0 that no longer uses your local <code>./tmp</code> in your project folder but the system <code>temp</code> directory instead. This can result in <strong>build time improvements up to 32%</strong>! 🏎</p>
<p>You can read all about all these new cool things and much more in the <a href="https://emberjs.com/blog/2018/10/15/ember-3-5-released.html">release post</a>.</p>
<hr />
<h2 id="readersquestionwhatisthefutureofcontrollershttpsdiscussemberjscomtreadersquestionswhatisthefutureofcontrollerswhenisitagoodtimetousetheminamodernemberapp15708"><a href="https://discuss.emberjs.com/t/readers-questions-what-is-the-future-of-controllers-when-is-it-a-good-time-to-use-them-in-a-modern-ember-app/15708">Readers' Question: What is the Future 🚀 of Controllers?</a></h2>
<p>Ah, the age old question: "What is the future of controllers? When is it a good time to use them in a modern Ember app?" <a href="https://github.com/jenweber">@jenweber</a> tackles this topic with some help from Framework Core Team member <a href="https://github.com/ef4">@ef4</a>. TLDR: do use them, don't lose any sleep over them, and help us decide their future. See this <a href="https://discuss.emberjs.com/t/readers-questions-what-is-the-future-of-controllers-when-is-it-a-good-time-to-use-them-in-a-modern-ember-app/15708">Ember Discuss post</a> for the article and conversation!  </p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue">@rwjblue</a>, <a href="https://github.com/chadhietala">@chadhietala</a>, <a href="https://github.com/btecu">@btecu</a>, <a href="https://github.com/amyrlam">@amyrlam</a>, <a href="https://github.com/chrisrng">@chrisrng</a>, <a href="https://github.com/jessica-jordan">@jessica-jordan</a>, <a href="https://github.com/ynotdraw">@ynotdraw</a>, <a href="https://github.com/Alonski">@Alonski</a>, <a href="https://github.com/sivakumar-kailasam">@sivakumar-kailasam</a>, <a href="https://github.com/thorsteinsson">@thorsteinsson</a>, <a href="https://github.com/YoranBrondsema">@YoranBrondsema</a>, <a href="https://github.com/runspired">@runspired</a>, <a href="https://github.com/ctcpip">@ctcpip</a>, <a href="https://github.com/wagenet">@wagenet</a>, <a href="https://github.com/rondale-sc">@rondale-sc</a>, <a href="https://github.com/toddjordan">@toddjordan</a>, <a href="https://github.com/esbanarango">@esbanarango</a>, <a href="https://github.com/mansona">@mansona</a>, <a href="https://github.com/HenryVonfire">@HenryVonfire</a>, and <a href="https://github.com/cspanring">@cspanring</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jen Weber, Chris Ng, Ryan Mark, Amy Lam, Jessica Jordan, Kenneth Larsen, Alon Bukai and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-70</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-70</guid><pubDate>Fri, 26 Oct 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 71]]></title><description><![CDATA[<p>Bonjour Emberistas! 🐹</p>
<p>This week your <strong>help is needed</strong> to bring <strong>tree-shaking</strong> 🌳 to Ember apps! RFCs on <strong>route actions</strong> and <strong>dynamic tags</strong> are ready for <strong>your comments</strong> 📢. We're also highlighting <strong>Ember for CodeSandbox</strong> ✨, and the awesome <strong>#30DaysOfEmber</strong> 📆 series. Read on!</p>
<!-- READMORE -->
<hr />
<h2 id="maketreeshakingreadyforlandingyourhelpiswantedhttpstwittercomkellyseldenstatus1050717338595745792"><a href="https://twitter.com/kellyselden/status/1050717338595745792">Make Tree-Shaking 🌲 Ready for Landing ✈️ - Your Help is Wanted!</a></h2>
<p>A promising approach to reduce the size of Ember apps dramatically is known as <strong>tree-shaking</strong>. This describes a way to <strong>exclude any code</strong> from your <strong>bundle</strong> which is ultimately not needed for your application to work as expected.</p>
<p>The <a href="https://github.com/ember-cli/rfcs/blob/master/active/0051-packaging.md#tree-shaking">Packager RFC (Request for Comments) for bringing tree-shaking</a> to Ember apps <a href="https://github.com/ember-cli/rfcs/commit/567201627bcc6baa2d70103bd5b6f9e23e8ea0d9">was accepted in April this year</a>. Since then, lots of progress has already been made on the Ember &amp; Ember CLI side of things. There is even <a href="https://github.com/kellyselden/ember-cli-tree-shaker">the experimental addon ember-cli-tree-shaker</a> that has been a tangible product of recent efforts to allow you to try out tree shaking today. But there's still a lot more to do. <strong>Your help is needed</strong>!</p>
<p>If you're feeling up to the task to help tree-shaking land in Ember and you're curious to learn more about Ember CLI internals, be sure to <strong>reach out</strong> to <a href="https://twitter.com/kellyselden/status/1050717338595745792"><strong>@kellyselden</strong> on either Twitter</a> or the <a href="https://discordapp.com/channels/480462759797063690/502098552751915008">#topic-tree-shaking Discord channel</a> to get started!</p>
<hr />
<h2 id="actionemberrouteactionsforallhttpsgithubcomemberjsrfcspull394"><a href="https://github.com/emberjs/rfcs/pull/394">Action! 🎬 Ember Route Actions for All</a></h2>
<p>Actions in Ember are usually defined in a <strong>controller</strong>. However the addon <a href="https://github.com/DockYard/ember-route-action-helper">ember-route-action-helper</a> has existed for some time and allows you to use actions, defined in the route, inside your templates. Some say that this allows less <strong>dependance</strong> on controllers. A new <a href="https://github.com/emberjs/rfcs/pull/394">RFC (Request for Comments) for Route Actions</a> has been suggested by <a href="https://github.com/vasilakisfil">@vasilakisfil</a> that proposes integrating this helper into <strong>Ember core</strong> for use in all apps without the need for the addon.</p>
<p>It is important to state that the addon has a <strong>warning</strong> about using it and that controllers are still an <strong>integral</strong> part of Ember as explained last week in our <a href="https://discuss.emberjs.com/t/readers-questions-what-is-the-future-of-controllers-when-is-it-a-good-time-to-use-them-in-a-modern-ember-app/15708">Readers' Question: What is the Future of Controllers</a>.</p>
<p>If you would like to <strong>chime in</strong> and join the discussion be sure to check out this <a href="https://github.com/emberjs/rfcs/pull/394">RFC here</a>.</p>
<hr />
<h2 id="anewanddynamicrfchttpsgithubcomcibernoxrfcsblobdynamictagnamestext0000dynamictagnamesmd"><a href="https://github.com/cibernox/rfcs/blob/dynamic-tag-names/text/0000-dynamic-tag-names.md">A New and Dynamic RFC</a></h2>
<p><a href="https://github.com/cibernox">@cibernox</a> has submitted a new RFC suggesting <strong>dynamic tag names in glimmer templates</strong>. In the transition from using inner-html semantics to using outer-html semantics in components there's one feature that has been lost: Being able to dynamically define the tag name of components.</p>
<p>To solve this issue the RFC proposes a new <code>element</code> helper that takes a tag name and generates a contextual component that, when invoked, renders the selected element. Like this:</p>
<pre><code class="handlebars language-handlebars">{{#let (element "li") as |Tag|}}
  &lt;Tag ...&gt;...&lt;/Tag&gt;
{{/let}}
</code></pre>
<p>You can try out <a href="https://github.com/tildeio/ember-element-helper">a working proof of concept on Github</a> and you can read all the details about the <a href="https://github.com/cibernox/rfcs/blob/dynamic-tag-names/text/0000-dynamic-tag-names.md">RFC in the proposal</a>.</p>
<hr />
<h2 id="emberforcodesandboxhttpstwittercomcompuivesstatus1057681015299366912"><a href="https://twitter.com/CompuIves/status/1057681015299366912">Ember for CodeSandbox! 🏖️</a></h2>
<p><a href="https://codesandbox.io/">CodeSandbox</a> is an online code editor that helps you create web applications, <strong>from prototype to deployment</strong>. It supports a variety of web frameworks, and with the latest release, now officially supports Ember. This was made possible thanks to a <a href="https://github.com/CompuIves/codesandbox-client/pull/1113">pull request</a> by <a href="https://github.com/mike-north">@mike-north</a>.</p>
<p>Try it out today by clicking on <strong>Ember</strong> under <em>server templates</em> when <a href="https://codesandbox.io/s/">creating a new sandbox</a>!</p>
<!--alex ignore execute-->
<p><em>Note: Ember is located under “server templates” because <a href="https://twitter.com/CompuIves/status/1057689363239313408">server templates are sandboxes that execute on a server instead of the browser</a>.</em></p>
<hr />
<h2 id="the30daysofemberserieshttpstwittercomposlinskinetstatus1054446639719608320"><a href="https://twitter.com/PoslinskiNet/status/1054446639719608320">The #30DaysOfEmber Series 📚</a></h2>
<p><a href="https://github.com/PoslinskiNet">@PoslinskiNet</a> published a great learning series for those starting out with Ember. The #30DaysOfEmber series goes through <strong>30 topics</strong> ranging from <a href="https://slides.com/poslinski_net/30-days-of-ember#/6">Computed Properties</a> to <a href="https://slides.com/poslinski_net/30-days-of-ember#/36">Internationalization</a> with the aim of becoming familiar with Ember at the end of it.</p>
<p>If you haven’t yet, check out the <a href="https://slides.com/poslinski_net/30-days-of-ember#/">slides for #30DaysOfEmber</a> or on <a href="https://twitter.com/i/moments/1054409226968281089">Twitter Moments</a> today!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/esquith" target="gh-user">@esquith</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/chengz" target="gh-user">@chengz</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/fiddler" target="gh-user">@fiddler</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/yaxinr" target="gh-user">@yaxinr</a>, <a href="https://github.com/spruce" target="gh-user">@spruce</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/sbatson5" target="gh-user">@sbatson5</a>, <a href="https://github.com/mike-north" target="gh-user">@mike-north</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/SergeAstapov" target="gh-user">@SergeAstapov</a>, <a href="https://github.com/abhilashlr" target="gh-user">@abhilashlr</a>, <a href="https://github.com/loganrosen" target="gh-user">@loganrosen</a>, <a href="https://github.com/sangm" target="gh-user">@sangm</a>, <a href="https://github.com/tschoartschi" target="gh-user">@tschoartschi</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/esbanarango" target="gh-user">@esbanarango</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/aklkv" target="gh-user">@aklkv</a>, <a href="https://github.com/caseywatts" target="gh-user">@caseywatts</a>, <a href="https://github.com/skyboyer" target="gh-user">@skyboyer</a>, <a href="https://github.com/jelhan" target="gh-user">@jelhan</a>, <a href="https://github.com/Parrryy" target="gh-user">@Parrryy</a>, <a href="https://github.com/theroncross" target="gh-user">@theroncross</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Ryan Mark, Kenneth Larsen, Alon Bukai, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-71</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-71</guid><pubDate>Fri, 02 Nov 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 72]]></title><description><![CDATA[<p>Kedu Emberistas! 🐹</p>
<p>We need <strong>Emberistas at JSConf EU</strong>, so submit a talk to the newly opened CFP! 🗣️ There's an update to the <strong>RFC about RFCs</strong> 📜! You can also read about <strong>more informative Routes</strong> 🤓, watch a <strong>tutorial</strong> on how to <strong>build</strong> a live updating <strong>league table</strong> ⚽️ in Ember 3.5 📹, or <strong>help</strong> upgrade the <strong>test coverage</strong> of official Ember projects! ✍️</p>
<!-- READMORE -->
<hr />
<h2 id="jsconfeucfpisnowopenhttps2019jsconfeucallforspeakers"><a href="https://2019.jsconf.eu/call-for-speakers/">JSConf EU CFP is Now Open! 👐</a></h2>
<p><a href="https://2019.jsconf.eu/">JSConf EU</a>, which will be held from <strong>June 1 – 2 2019 in Berlin</strong>, has officially opened their Call for Papers (CfP) for talks regarding JavaScript, the web, or a clever hack.</p>
<!--alex ignore blind-->
<p>This is a good opportunity for us, as Ember developers, to <strong>showcase our work to the greater JavaScript community</strong>. Similar to the <a href="https://www.emberjs.com/blog/2018/10/12/the-ember-times-issue-68.html#toc_a-href-https-emberconf-com-become-a-speaker-html-emberconf-2019-call-for-papers-a">EmberConf process</a>, the CfP starts out blind and later gets de-anonymized.</p>
<p>The call for speakers this year is <strong>open until December 23rd</strong>. JSConf’s sibling conference, CSSconf, even published a blog on <a href="https://blog.cssconf.eu/2014/06/12/how-to-write-a-great-talk-proposal-for-a-tech-conference/">How to write a great talk proposal for a tech conference</a>.</p>
<p><em>”Pick the topic you feel most passionate about. This is your conference.”</em>  is the JSConf EU saying so <a href="https://2019.jsconf.eu/call-for-speakers/">apply to be a speaker</a> today!</p>
<hr />
<h2 id="yodawgiheardyoulikerfcshttpsgithubcomemberjsrfcspull300"><a href="https://github.com/emberjs/rfcs/pull/300">Yo Dawg, I Heard You Like RFCs 📜</a></h2>
<p>There has been an update to the RFC (Request for Comments) about the RFC process itself. The RFC process has been crucial in defining <strong>the future of Ember</strong> and that is still the case. However, in the process of reading and merging all of these RFCs, the Core Team has discovered some shortcomings of the current RFC process as well as new requirements.</p>
<p>To solve some of these issues, the RFC proposes that new RFCs are assigned a <strong>Core Champion</strong> from the Core Team. It also suggests to merge <a href="https://github.com/ember-cli/rfcs">ember-cli/rfcs</a> into <a href="https://github.com/emberjs/rfcs">emberjs/rfcs</a>.</p>
<p>There are more proposed solutions in <a href="https://github.com/emberjs/rfcs/blob/rfc-process-update/text/0300-rfc-process-update.md">the RFC</a>, which we recommend you to read through and to leave a comment with your thoughts.</p>
<hr />
<h2 id="personalizeyourroutesmetadatawiththerouteinfometadatarfchttpsgithubcomemberjsrfcspull398"><a href="https://github.com/emberjs/rfcs/pull/398">Personalize Your Route's Metadata with the RouteInfo Metadata RFC 📝</a></h2>
<p>Have you ever wanted to <strong>track</strong> specific keywords for a particular route in your Ember app, but didn't know how to do so in an elegant fashion? Have you tried to update the <code>document.title</code> of a page depending on the specific point of time at which a route was visited, but realized that this couldn't be done without some effort?</p>
<p>Then a brand-new <strong>Request for Comments (RFC)</strong> is for you! The proposal <a href="https://github.com/emberjs/rfcs/pull/398"><em>RouteInfo Metadata</em></a> suggests a new way for reading and writing <strong>application-specific metadata</strong> to the corresponding <em>RouteInfo</em> object. For more context on which information routes currently provide, be sure to also check out <a href="https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md#routeinfo-type">the section about the RouteInfo type from the original RouterService RFC</a>.</p>
<p>And finally, read the full <em>RouteInfo Metadata</em> proposal to learn more and leave your thoughts and questions in the <a href="https://github.com/emberjs/rfcs/pull/398">comments below the proposal</a>.</p>
<hr />
<h2 id="premierleaguevideotutorialhttpstwittercomgavinjoycestatus1059533557130059779"><a href="https://twitter.com/gavinjoyce/status/1059533557130059779">Premier League Video Tutorial ⚽️</a></h2>
<p><a href="https://github.com/gavinjoyce">@GavinJoyce</a> made an awesome <a href="https://www.youtube.com/watch?v=vYakop2d2RI">tutorial</a> where he demonstrates how to build a live updating league table in the <strong>latest Ember 3.5</strong>! Code along with the video and you'll use <a href="https://github.com/embermap/ember-cli-tailwind">ember-cli-tailwind</a> for styling, angle bracket invocation, <code>shuffle</code> from <a href="https://github.com/DockYard/ember-composable-helpers">ember-composable-helpers</a> (TIL), <a href="https://github.com/shipshapecode/ember-math-helpers">ember-math-helpers</a> and more.</p>
<p>Check out <a href="http://ember-league-table.surge.sh">ember-league-table.surge.sh</a> to run the app and the <a href="https://github.com/GavinJoyce/ember-league-table">repo</a> for the source code. Our advice? Share the tutorial with a friend, whether they call it football or soccer…</p>
<hr />
<h2 id="helpwantedweneedyourtestingexpertisehttpsgithubcomemberlearnemberhelpwantedissues22"><a href="https://github.com/ember-learn/ember-help-wanted/issues/22">Help Wanted! We Need Your Testing Expertise 👨🏾‍🏫</a></h2>
<p>So many contributors have been putting great effort into shipping features, improvements and bug fixes for important Ember projects recently, including the <a href="https://help-wanted.emberjs.com/">spick-and-span Ember Help Wanted App</a> and our most be-❤️(loved) <a href="https://www.emberjs.com/api/ember/release">Ember API Docs</a>.</p>
<p>But with lots of new changes, also comes lots of responsibility for <strong>test coverage</strong>; and your help is needed!
Help these amazing projects to get their test coverage up to par by <strong>writing unit</strong>, <strong>integration</strong> and <strong>acceptance test</strong>:</p>
<ul>
<li><a href="https://github.com/ember-learn/ember-help-wanted">Ember Help Wanted Client</a></li>
<li><a href="https://github.com/ember-learn/ember-help-wanted-server">Ember Help Wanted Backend</a></li>
<li><a href="https://github.com/ember-learn/ember-api-docs">Ember API Docs Client</a></li>
<li><a href="https://github.com/ember-learn/ember-jsonapi-docs">Ember JSON API Docs</a></li>
</ul>
<!-- alex ignore dad-mom -->
<p>Questions? Looking for some guidance to get started? Pop by the <a href="https://discordapp.com/channels/480462759797063690/480777444203429888">#dev-ember-learning</a> channel on <a href="https://discordapp.com/invite/zT3asNS">the Ember Community Chat</a> and ask away!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/dfreeman" target="gh-user">@dfreeman</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/mikrostew" target="gh-user">@mikrostew</a>, <a href="https://github.com/caseywatts" target="gh-user">@caseywatts</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/mattselden12" target="gh-user">@mattselden12</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/rondale-sc" target="gh-user">@rondale-sc</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/spruce" target="gh-user">@spruce</a>, <a href="https://github.com/ahawkins" target="gh-user">@ahawkins</a>, <a href="https://github.com/yaxinr" target="gh-user">@yaxinr</a>, <a href="https://github.com/thorsteinsson" target="gh-user">@thorsteinsson</a>, <a href="https://github.com/mike-north" target="gh-user">@mike-north</a>, <a href="https://github.com/lifeart" target="gh-user">@lifeart</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/chengz" target="gh-user">@chengz</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/dipil-saud" target="gh-user">@dipil-saud</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/step2yeung" target="gh-user">@step2yeung</a>, <a href="https://github.com/gabrielcsapo" target="gh-user">@gabrielcsapo</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/wagenet" target="gh-user">@wagenet</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Kenneth Larsen, Jessica Jordan, Ryan Mark and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-72</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-72</guid><pubDate>Fri, 09 Nov 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 73]]></title><description><![CDATA[<p>Suilad Emberistas! 🐹</p>
<p>Last call for your <strong>talk submissions</strong> to <strong>EmberConf 2019</strong>! 📣 In this week's issue: eslint-plugin-ember v6.0.0 is out 🚓, watch all the talks from EmberFest 🎥, try out hot reloading in Ember ️🔥, and a sneak peak at <strong>DecEmber</strong> 😄…</p>
<!-- READMORE -->
<hr />
<h2 id="yourlastchancetobecomeaspeakeratemberconf2019httpsemberconfcombecomeaspeakerhtml"><a href="https://emberconf.com/become-a-speaker.html">Your Last Chance to Become a Speaker at EmberConf 2019 🎤</a></h2>
<p>Never tried public speaking before, but you're curious to share your thoughts on something interesting you learned recently? Are you already an experienced meetup speaker and looking for the next stage? Have you spoken at conferences before and want to try something new?</p>
<p>No matter what your experience level is, we're looking for you to <a href="https://emberconf.com/become-a-speaker.html"><strong>become a speaker at EmberConf 2019</strong></a>. The CFP (Call for Proposals) will be open for only another 2 days, so be sure to get your talk proposal in this very weekend <strong>before Sunday, Nov 18, 2018 at 11:59pm MST</strong>.</p>
<p>Out of ideas? Be sure to <a href="https://emberconf.com/cfp-brainstorm.html">check out the Brainstorm CFP</a> to inspire yourself!
Not feeling ready yet? Be assured, that <strong>you are ready</strong> to tell us your story - we're convinced that you'll succeed! ✨</p>
<div class="blog-row">
  <a class="es-button" style="width:260px" href="https://emberconf.com/become-a-speaker.html">Ok, let me check out the CFP</a>
</div>
<hr />
<h2 id="eslintpluginemberv600isouthttpstwittercomtobiasbieniekstatus1062700572757946368"><a href="https://twitter.com/TobiasBieniek/status/1062700572757946368">eslint-plugin-ember v6.0.0 is Out! 🚓</a></h2>
<p><a href="https://github.com/Turbo87">@Turbo87</a> announced the release of <a href="https://github.com/ember-cli/eslint-plugin-ember/releases/tag/v6.0.0">v6.0.0</a> of <a href="https://github.com/ember-cli/eslint-plugin-ember">eslint-plugin-ember</a>, which is an <a href="https://eslint.org/">ESLint</a> plugin that provides a set of rules for Ember applications based on commonly known good practices.</p>
<p>This new release includes several <strong>breaking changes</strong> to the <code>ember/recommended</code> configuration such as <a href="https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/no-restricted-resolver-tests.md">no-restricted-resolver-tests</a> and <a href="https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/no-ember-testing-in-module-scope.md">no-ember-testing-in-module</a>. Check the <a href="https://github.com/ember-cli/eslint-plugin-ember/releases/tag/v6.0.0">release notes</a> for the full list of breaking changes and enhancements.</p>
<p>Note: If you still use <a href="https://github.com/ember-cli/eslint-plugin-ember/pull/267">ESLint 3</a> or <a href="https://github.com/ember-cli/eslint-plugin-ember/pull/255">Node.js 4</a> <strong>this release will not work</strong> for you as this major version change drops support for both of them.</p>
<hr />
<h2 id="videosfromemberfestareouthttpswwwyoutubecomplaylistlistpln4spdlosvksb9034ldndp1jonbgssax9"><a href="https://www.youtube.com/playlist?list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9">Videos from EmberFest Are Out! 🎉</a></h2>
<p>The videos from EmberFest are <strong>now available</strong> on <a href="https://www.youtube.com/playlist?list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9">YouTube</a>. This means that you can experience all of the great talks even though you weren’t there! (And you know, if you were there you can now re-live it all.)</p>
<p>If you don’t know where to start, then we highly recommend the <a href="https://www.youtube.com/watch?v=oRzmDobMZ_Q&t=0s&list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9&index=2">opening keynote by Tom Dale</a> and the <a href="https://www.youtube.com/watch?v=xP-kog04lng&list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9&index=21">closing keynote by Melanie Sumner</a>.</p>
<p>Tom Dale spoke about what will happen next year when you generate a new Ember app. This involves super exciting things like the <strong>module unification app structure</strong>,  <strong>angle bracket invocation</strong>, <strong>JavaScript classes</strong>, <strong>tracked properties</strong> and much more. All of this is delivered with the usual Tom Dale dapperness and humor. Definitely worth a watch.</p>
<p>Melanie Sumner delivered a thoughtful talk about how other peoples' views on something you enjoy - especially when you’re a smaller community - can create uncertainty, and why it shouldn’t. It delivers a few helpful tools and encourages us to <strong>observe</strong>, <strong>analyse</strong> and <strong>think</strong> before responding to critical claims. The talk is a great reminder to consider how we talk to each other and to enjoy doing what we do, no matter what others may think.</p>
<p>If you want to browse through all of the great talks from EmberFest, check out the <a href="https://www.youtube.com/watch?v=xP-kog04lng&list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9&index=21">YouTube playlist</a>.</p>
<hr />
<h2 id="hotreloadinginemberhttpsgithubcomlifeartemberasthotload"><a href="https://github.com/lifeart/ember-ast-hot-load">Hot Reloading in Ember 🔃</a></h2>
<p><a href="https://github.com/lifeart/ember-ast-hot-load">ember-ast-hot-load</a> is a new attempt to bring component hot reloading into the Ember ecosystem!</p>
<p>Hot reloading only refreshes the components that were changed, without losing the state of the app. For example, if you are four routes deep into your app and save a change to a component, the updated component will appear on the page without full application reload.</p>
<p>Give <a href="https://github.com/lifeart/ember-ast-hot-load">ember-ast-hot-load</a> a try today!</p>
<hr />
<h2 id="decemberisalmostherehttpsgithubcomemberlearnguidessourcelabelsdecember"><a href="https://github.com/ember-learn/guides-source/labels/DecEmber">DecEmber is Almost Here! 📆</a></h2>
<!--alex ignore special-->
<p>Are you wondering what to do with all your vacation time in December? We got ya covered! The Core Learning Team is sponsoring Dec<strong>Ember</strong>, a hackathon event specifically targeted at learning team efforts. Look for special issues marked “Dec<strong>Ember</strong>” from December 1st-31st. There will be <strong>prizes</strong>, too! Stay tuned for more details…</p>
<p>P.S. You can also register for <a href="https://24pullrequests.com/">24 Pull Requests</a> - giving back little gifts of code for the holidays! ❄️</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/richard-viney" target="gh-user">@richard-viney</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/ctjhoa" target="gh-user">@ctjhoa</a>, <a href="https://github.com/bentleyjensen" target="gh-user">@bentleyjensen</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/nprasmussen" target="gh-user">@nprasmussen</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/marlonmarcos21" target="gh-user">@marlonmarcos21</a>, <a href="https://github.com/esquith" target="gh-user">@esquith</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/pbishop16" target="gh-user">@pbishop16</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a> and <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Melanie Sumner, Chris Ng, Jessica Jordan, Kenneth Larsen, Niels Rasmussen, Ryan Mark, Alon Bukai, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-73</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-73</guid><pubDate>Fri, 16 Nov 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 76]]></title><description><![CDATA[<p>εte sεn Emberistas? 🐹</p>
<p>Join us with your <strong>contributions</strong> for <strong>DecEmber</strong> 🐹🎄, read more about using <code>@tracked</code> in the new RFC 👣, <strong>fill out</strong> the npm JavaScript Ecosystem Survey 📝, JSON:API 🇯 is getting an update for the holiday season 🎉🎊🎈 and Ember's <strong>linting</strong> future needs your input 💬!</p>
<!-- READMORE -->
<hr />
<h2 id="jinglebellsjinglebellsdecemberallthewayhttpswwwemberjscomblog20181129decembereventhtml"><a href="https://www.emberjs.com/blog/2018/11/29/december-event.html">Jingle Bells 🔔, Jingle Bells 🔔, ✨ DecEmber 🐹🎄 All the Way!</a></h2>
<p>Find one of the issues 🔍 <br>
In the <a href="https://github.com/ember-learn">Ember Learn project</a> <br>
With the <a href="https://help-wanted.emberjs.com/learning?label=DecEmber">December label in use</a> <br>
Don't leave the <a href="https://discordapp.com/channels/480462759797063690/517914929261576212">chat unchecked</a>.</p>
<p>Send in a PR ⬅️<br>
Make the reviewer smile 🙂 <br>
What fun <a href="https://24pullrequests.com/">24PullRequests</a> are <br>
when the contribution is so <a href="https://www.emberjs.com/blog/2018/11/29/december-event.html">worthwhile</a>! 🐹</p>
<p>Jingle bells, jingle bells, <strong>DecEmber</strong> all the way! 🐹🎄</p>
<hr />
<h2 id="trackedpropertiesrfcisupforreviewhttpsgithubcomemberjsrfcspull410"><a href="https://github.com/emberjs/rfcs/pull/410">Tracked Properties RFC Is Up for Review! 👣</a></h2>
<p>The <a href="https://github.com/emberjs/rfcs/blob/be351b059f08ac0fe709bc7697860d5064717a7f/text/0000-tracked-properties.md">Tracked Properties RFC</a> introduces a simpler and more ergonomic system for tracking state change in Ember applications.</p>
<p>Developers can identify if a property or a getter should be <em>autotracked</em>  by adding a <code>@tracked</code> decorator to it. This allows that value to have its dependencies automatically detected as it is used.</p>
<!--alex ignore special-->
<p>Because tracked properties are a very thin layer on top of native JavaScript, setting and accessing tracked properties can be done using <strong>standard JavaScript syntax</strong>. With no special syntax, and leveraging existing JavaScript knowledge.</p>
<p>Comment and read more about the <a href="https://github.com/emberjs/rfcs/pull/410">RFC on GitHub</a>.</p>
<hr />
<h2 id="tenminutestoimprovejavascripthttpswwwnpmjscom2018javascriptecosystemsurvey"><a href="https://www.npmjs.com/2018-javascript-ecosystem-survey">Ten Minutes to Improve JavaScript 📈</a></h2>
<p>Represent Ember in the <a href="https://www.npmjs.com/2018-javascript-ecosystem-survey">2018 JavaScript Ecosystem Survey</a>!</p>
<p>Each winter, <a href="https://www.npmjs.com/">npm, Inc.</a> circulates a survey of software developers and npm users to solicit your feedback and ideas about how to continue supporting the world’s fastest growing developer community and the world’s most popular development language. (Review last year’s results <a href="https://www.npmjs.com/npm/state-of-javascript-frameworks-2017-part-1">here</a>.) Be sure to fill out the survey <a href="https://www.npmjs.com/2018-javascript-ecosystem-survey">here</a> in order to share what you've been working on and how you plan to use JavaScript in 2019. And spread the word!</p>
<hr />
<h2 id="jsonapiupdate11httpstwittercomjsonapistatus1069593631365959680"><a href="https://twitter.com/jsonapi/status/1069593631365959680">JSON:API Update 1.1 🇯</a></h2>
<p><strong>JSON:API 1.1 RC1</strong> is released! 🎉🎊🎈 The spec will hopefully be finalized by January 31 which is very exciting! If you use JSON:API and are able to, try out the upcoming version and give some feedback.</p>
<p>One notable feature is the addition of <strong>"profiles"</strong> which allow specifying addition semantics on top of the current spec. This could allow specifying things like filtering, pagination and more. Check out <a href="https://jsonapi.org/extensions/">profiles here</a>.</p>
<p>Another noteworthy change is the official recommendation to use camelCase for resource fields. This standardization will allow composing and parsing <strong>JSON:API</strong> with JavaScript and other languages. Check it out <a href="https://jsonapi.org/recommendations/#naming">here</a>.</p>
<p>To learn more about the rest of the features and changes in <strong>JSON:API 1.1</strong> check out the <a href="https://jsonapi.org/#update-history">Update History</a>.</p>
<hr />
<h2 id="setthefuturedirectionoflintingemberappshttpsgithubcomembercliemberclipull8219"><a href="https://github.com/ember-cli/ember-cli/pull/8219">Set the Future Direction of Linting Ember Apps 📝</a></h2>
<p>In this <a href="https://github.com/ember-cli/ember-cli/pull/8219">work-in-progress draft for restructuring the linting workflow in Ember applications</a> the implementation of
<a href="https://github.com/ember-cli/rfcs/pull/121">Ember CLI RFC (Request for Comments) #121</a> has begun -
and your <strong>guidance</strong> as part of the Ember community <strong>is needed</strong>!</p>
<p><a href="https://github.com/sangm/rfcs/blob/master/active/0000-remove-ember-cli-eslint.md#detailed-design">Based on the RFC's design strategy</a> Ember's <strong>linting</strong> story is about to be aligned with best practices used in the general JavaScript ecosystem.
And there are still decisions to be made: Do you for example expect your linting tests to run
with <code>ember build</code> and <code>ember serve</code>? How would you linting integrate best into your CI pipeline?</p>
<p>Let <a href="https://github.com/ember-cli/ember-cli/pull/8219">your thoughts on how to swap Ember CLI ESLint for ESLint be known</a> to support the delivery of the best linting solution for the community!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/Simran-B" target="gh-user">@Simran-B</a>, <a href="https://github.com/bhullarg" target="gh-user">@bhullarg</a>, <a href="https://github.com/jfdnc" target="gh-user">@jfdnc</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/esbanarango" target="gh-user">@esbanarango</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/prasannavijayan" target="gh-user">@prasannavijayan</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/zachgarwood" target="gh-user">@zachgarwood</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/thorsteinsson" target="gh-user">@thorsteinsson</a> and <a href="https://github.com/jacobq" target="gh-user">@jacobq</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Amy Lam, Alon Bukai and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-76</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-76</guid><pubDate>Fri, 07 Dec 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 77]]></title><description><![CDATA[<p>Salut Emberistas! 🐹</p>
<p>This week boolean component arguments 👻 are in for an RFC, learn more about component patterns 📚🧐, Ember 3.6 released 🚀, and the EmberConf speakers have been announced! 👏</p>
<!-- READMORE -->
<hr />
<h2 id="booleandreamscometruehttpsgithubcomemberjsrfcspull407"><a href="https://github.com/emberjs/rfcs/pull/407">Boolean Dreams Come True ☁️</a></h2>
<p>Ever wanted to pass <strong>boolean arguments</strong> to your <strong>components</strong> like you would pass boolean attributes - like checked or readonly - to an HTML element?</p>
<p>This fresh <a href="https://github.com/hakubo/rfcs/blob/component-boolean-arguments/text/0000-component-boolean-arguments.md">RFC (Request for Comments) discusses how this could become reality</a>!</p>
<p>Leave your thoughts on how boolean arguments could be implemented for Ember components in the comments <a href="https://github.com/emberjs/rfcs/pull/407">below the original proposal</a>.</p>
<hr />
<h2 id="ember36releasedhttpsemberjscomblog20181213ember36releasedhtml"><a href="https://emberjs.com/blog/2018/12/13/ember-3-6-released.html">Ember 3.6 Released 🚀</a></h2>
<p>Ember 3.6 is out and ready to use. This release contains the last step of the <strong>Native Class Constructor Update RFC</strong>.  This introduces native classes in Ember but with some caveats so remember to read the <a href="https://emberjs.com/blog/2018/12/13/ember-3-6-released.html#toc_new-features-2">release post</a> carefully before refactoring your code base.</p>
<p>Ember 3.6 also contains the final stage of the <strong>router service RFC</strong> which includes some new methods that can improve the way you deal with routing. There’s also new deprecations and some small fixes in Ember CLI so be sure to check out the complete <a href="https://emberjs.com/blog/2018/12/13/ember-3-6-released.html">release post</a>.</p>
<hr />
<h2 id="componentspatternsinemberbloghttpstwittercomthemacsourstatus1072088269742112768"><a href="https://twitter.com/TheMacsour/status/1072088269742112768">Components Patterns in Ember Blog 📚🧐</a></h2>
<p><a href="https://github.com/Exelord">@Exelord</a> published a blog post on <a href="https://medium.com/macsour/components-patterns-in-ember-js-5e6fc6eea28f">component patterns in Ember</a>. The article presents a collection of <strong>component patterns</strong> used in the Ember community for readers to better understand what kind of component pattern would best match their particular use case.</p>
<p><a href="https://github.com/Exelord">@Exelord</a> particularly outlines 4 types of components: <strong>presentational, contextual, container, and composable (or higher-order component)</strong> with code samples including references!</p>
<p>Read more about it the <a href="https://medium.com/macsour/components-patterns-in-ember-js-5e6fc6eea28f">blog post</a>!</p>
<hr />
<h2 id="emberconfscheduleannouncedhttpsemberconfcomschedulehtml"><a href="https://emberconf.com/schedule.html">EmberConf Schedule Announced 📣</a></h2>
<p>Save the date for <strong>March 18-20</strong> in Portland! The EmberConf lineup has been <a href="https://emberconf.com/schedule.html">announced</a>! We're excited for three days of learning and sharing such as "Modern Ember with Octane", to "Developing an Ember Test Strategy", to "Dealing with Data in 2019". Congratulations to all the speakers!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/izelnakri" target="gh-user">@izelnakri</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/hakilebara" target="gh-user">@hakilebara</a>, <a href="https://github.com/mike-north" target="gh-user">@mike-north</a>, <a href="https://github.com/hakubo" target="gh-user">@hakubo</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/jeffhertzler" target="gh-user">@jeffhertzler</a>, <a href="https://github.com/JoaoGFarias" target="gh-user">@JoaoGFarias</a>, <a href="https://github.com/BradenLawrence" target="gh-user">@BradenLawrence</a>, <a href="https://github.com/jbailey4" target="gh-user">@jbailey4</a>, <a href="https://github.com/rimian" target="gh-user">@rimian</a> and <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Ryan Mark, Amy Lam, Kenneth Larsen, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-77</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-77</guid><pubDate>Fri, 14 Dec 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 78]]></title><description><![CDATA[<p>مرحبا Emberistas! 🐹</p>
<p>This week: Find out what's new in Ember Inspector and Extensible Ember Inspector 👨‍💻, read about the Glimmer Components RFC ✨, register for EmberConf 2019 📆, and a new RFC on Render Element Modifiers 🔨!</p>
<!-- READMORE -->
<hr />
<h2 id="whatsnewinemberinspectorandextensibleemberinspectorhttpsgithubcomemberjsrfcspull417"><a href="https://github.com/emberjs/rfcs/pull/417">What's New in Ember Inspector and Extensible Ember Inspector 🐹</a></h2>
<p>The Ember Inspector team has been working hard over the past few months to close out lots of
super old issues (some from several years ago!), as well as adding new
features to Ember Inspector. Thanks to <a href="https://github.com/nummi">@nummi</a>
you can now keep up with the changes being made as well! When
you open a new version of Ember Inspector, you'll now be shown an info tab
with all the changes since the last version.</p>
<p><img src="https://imgur.com/BiqsmqV.png" alt="A screenshot of Ember Inspector" /></p>
<p>We also did a few third party library swaps and updates,
most notably switching from <a href="https://github.com/adopted-ember-addons/ember-pikaday">ember-pikaday</a> to
<a href="https://github.com/shipshapecode/ember-flatpickr">ember-flatpickr</a>
and using <a href="https://github.com/Addepar/ember-table">ember-table</a> for the data tab.</p>
<p><a href="https://github.com/rwwagner90">@rwwagner90</a> championed the date picker switch, which resolved several issues with
pikaday, and also removed our dependence on jQuery.</p>
<p><a href="https://github.com/thorsteinsson">@thorsteinsson</a> championed the ember-table
work and, as a result of the switch, you can now scroll the table horizontally! 🎉</p>
<p>Finally, we are working hard on the future of Ember Inspector, and have an RFC
up for making it extensible, which would allow for things like swapping out the
data tab to use Redux, etc. Please check out <a href="https://github.com/emberjs/rfcs/pull/417">the RFC</a> and let us know your
thoughts!</p>
<hr />
<h2 id="rfcglimmercomponentshttpsgithubcomemberjsrfcspull416"><a href="https://github.com/emberjs/rfcs/pull/416">RFC: Glimmer Components ✨</a></h2>
<p><a href="https://github.com/pzuraq">@pzuraq</a> put up an RFC (Request for Comments) for supporting <strong>Glimmer components</strong> – which represent a simpler, more declarative and ergonomic approach to building components – into Ember’s public API. Glimmer components will be the new default app experience in <a href="https://github.com/emberjs/rfcs/blob/26c4d83fb66568e1087a05818fb39a307ebf8da8/text/0000-roadmap-2018.md#ember-octane">Ember Octane</a>.</p>
<p>Glimmer components aim to eliminate confusion with classic components, by aligning more closely with modern template syntax and features such as:</p>
<p><strong>Outer HTML Semantics</strong> where there is no wrapping outer element by default and any dynamic values are explicitly stated in the template.</p>
<p><strong>Namespaced Arguments</strong> by having Glimmer components assign their arguments to the <code>args</code> property on their instance, preventing namespace collisions.</p>
<p><strong>Immutable Arguments</strong> for the <code>this.args</code> object, as mentioned above, which will normalize the way the data flows through the app. This will also promote the usage of the <code>{{@arg}}</code> syntax – which refers directly to the arguments passed into the invocation of the component – when appropriate since it is more predictable in nature.</p>
<!--alex ignore hooks nuts-->
<p><strong>Minimal Classes</strong> where Glimmer components won’t have any element/DOM based properties, hooks, event handler functions (which are provided instead by element modifiers) in order to reduce the mental model and enable users to be productive out of the box.</p>
<p>Read and comment on the <a href="https://github.com/emberjs/rfcs/pull/416">full RFC on GitHub</a>.</p>
<hr />
<h2 id="emberconfregistrationisopenhttpsemberconfcomindexhtml"><a href="https://emberconf.com/index.html">EmberConf Registration is Open! 💁‍♀️</a></h2>
<p>2019 is rapidly approaching, and you've got one more thing to do before EOY: buy your EmberConf ticket! This year's Early-Bird discount is significant ($50), while supplies last or until 12/31. So before anything else, here's that big shiny button! 🆗</p>
<div class="blog-row">
  <a class="es-button" style="width:260px" href="https://emberconf.com/register.html">Register Now</a>
</div>
<p>The program has been announced and is looking really great: so many new faces, and a bunch of familiar old ones! Be sure to check out the <a href="https://emberconf.com/schedule.html">full schedule</a> for all the details.</p>
<p>We're particularly excited about <a href="https://emberconf.com/inclusiveness-at-emberconf.html">Inclusiveness at EmberConf</a> this year. In an industry lacking attendee and speaker diversity, EmberConf strives to be an exception. Highlights of this year's efforts include:</p>
<!--alex ignore gals-men women kids-->
<ul>
<li><a href="https://tilde.wufoo.com/forms/emberconf-2019-scholarships/">Scholarships for students and those in need</a></li>
<li><a href="https://emberconf.com/register.html">People of Color (POC) breakfast, registration add-on</a></li>
<li><a href="https://emberconf.com/register.html">Women Helping Women luncheon, registration add-on</a></li>
<li><a href="https://tilde.wufoo.com/forms/xjkro7b1nzxczy/">Bring Your Kids to EmberConf</a></li>
</ul>
<hr />
<h2 id="newrfcrenderelementmodifiershttpsgithubcomemberjsrfcspull415"><a href="https://github.com/emberjs/rfcs/pull/415">New RFC: Render Element Modifiers 🔨</a></h2>
<!--alex ignore hooks-->
<p>A new <a href="https://github.com/pzuraq/emberjs-rfcs/blob/render-element-modifiers/text/0000-render-element-modifiers.md">RFC</a> is out by <a href="https://github.com/pzuraq">@pzuraq</a> and it’s quite amazing. It proposes adding two new generic element modifiers, <code>{{did-render}}</code> and <code>{{will-destroy}}</code>, which users can use to run code during the most common phases of any element's lifecycle. If you’ve ever used any of the component hooks such as <code>didInsertElement</code> or <code>didRender</code>, this will most likely be quite handy for you, since we can focus on the setup and teardown code without worrying about the overall lifecycle.</p>
<p>The <a href="https://github.com/pzuraq/emberjs-rfcs/blob/render-element-modifiers/text/0000-render-element-modifiers.md">RFC</a> is very detailed and has a lot of helpful code examples. Remember to leave your thoughts as a comment.</p>
<hr />
<h2 id="theembermentorshipprogramhttpswwwemberjscomblog20181217mentorshipprogramhtml"><a href="https://www.emberjs.com/blog/2018/12/17/mentorship-program.html">The Ember Mentorship Program 👨‍🎓👩‍🎓</a></h2>
<p>This week the new <strong>Ember Mentorship Program</strong> <a href="https://www.emberjs.com/blog/2018/12/17/mentorship-program.html">has been officially announced</a>!
It aims to guide the next wave of Ember developers of all experience levels into the community. By making developers succeed in <a href="https://emberconf.com/mentorship-program.html#evangelism">public speaking</a>, finding their space <a href="https://emberconf.com/mentorship-program.html#women-helping-women">in a supportive peer group</a> or <a href="https://emberconf.com/mentorship-program.html#general-mentorship">leveling up their engineering skills</a> the program is <strong>meant for you</strong>!</p>
<p>Learn all about <a href="https://emberconf.com/mentorship-program.html">the Ember Mentorship Program and join the community</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kratiahuja" target="gh-user">@kratiahuja</a>, <a href="https://github.com/sdhull" target="gh-user">@sdhull</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/smfoote" target="gh-user">@smfoote</a>, <a href="https://github.com/sonic1981" target="gh-user">@sonic1981</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/hakilebara" target="gh-user">@hakilebara</a>, <a href="https://github.com/jacobq" target="gh-user">@jacobq</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/jeffdaley" target="gh-user">@jeffdaley</a>, <a href="https://github.com/wifelette" target="gh-user">@wifelette</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/knownasilya" target="gh-user">@knownasilya</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a> and <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Robert Wagner, Amy Lam, Ryan Mark, Jessica Jordan, Kenneth Larsen and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-78</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-78</guid><pubDate>Fri, 21 Dec 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 79]]></title><description><![CDATA[<p>Blein Vie Noa, Emberistas! 🐹🎆🎇</p>
<p>The new year starts off with loads of <strong>new RFCs</strong>! Read more about suggested <strong>deprecations</strong> of <strong>Route render</strong> methods and selected <strong>ApplicationController properties</strong> 🈸! We also have a new RFC for a <strong>brand new look</strong> of emberjs.com, <strong>performance improvements</strong> 🏎 for the API Docs <strong>search</strong>, a new beta release of <strong>ember-cli-babel</strong> and an advanced testing <strong>exam</strong> for you!</p>
<!-- READMORE -->
<hr />
<h2 id="websiteredesignhttpsgithubcomemberjsrfcspull425"><a href="https://github.com/emberjs/rfcs/pull/425">Website Redesign 🎨</a></h2>
<!-- alex ignore easy -->
<p>The official Ember website is due for a new look and feel. That is why a <a href="https://github.com/wifelette/rfcs/blob/master/text/0425-website-redesign.md">new RFC</a> proposes a <strong>completely new look</strong> 💅 for emberjs.com. A side effect of not having updated the look and feel of the website for some years is that for people who aren’t involved in the day-to-day of Ember development, it’s <strong>easy to miss just how well the framework has kept up over the years</strong>.</p>
<p>The redesign aims to <strong>modernize, update and improve all the things on the website</strong> so that the impression given to the general public matches reality.</p>
<p>There’s already a good discussion going on in the <a href="https://github.com/emberjs/rfcs/pull/425">RFC comment section</a>, and we would love to hear your thoughts as well.</p>
<hr />
<h2 id="deprecatingrouteinducedrenderinghttpsgithubcomemberjsrfcspull418"><a href="https://github.com/emberjs/rfcs/pull/418">Deprecating Route Induced Rendering 🎨</a></h2>
<p>Do you remember <code>Route.render()</code> and <code>Route.renderTemplate()</code>? You might not. In fact, these route methods have been less and less emphasised in the Ember learning story and are not even mentioned in the <a href="https://guides.emberjs.com/release/">Ember Guides</a> anymore. Although these APIs were useful in the past, nowadays a component-focussed approach allows Ember developers to omit them entirely.</p>
<p>Therefore, a <strong>new RFC</strong> suggests the <strong>deprecation</strong> of <code>Route#render</code> and <code>Route#renderTemplate</code>. You can read more about the motivation behind it and how to replace these methods in your application in <a href="https://github.com/emberjs/rfcs/blob/ddbf21eaefae946a7e97573fec10334fb104e259/text/0418-deprecate-route-render-methods.md">the original proposal</a>.</p>
<p>Questions? Suggestions? Leave them right in the <a href="https://github.com/emberjs/rfcs/pull/418">comments section of the RFC</a>!</p>
<hr />
<h2 id="deprecatingrouterpropsonapplicationcontrollershttpsgithubcomemberjsrfcspull421"><a href="https://github.com/emberjs/rfcs/pull/421">Deprecating Router Props on Application Controllers 🎛</a></h2>
<p>With the introduction of <a href="https://www.emberjs.com/api/ember/release/classes/RouterService">the Router Service</a> it's been easier than ever to check on current app state, e.g. the name of the active route, anywhere in your application. This also means that the current <code>ApplicationController#currentPath</code> and <code>ApplicationController#currentRouteName</code> API has become obsolete.</p>
<p>A <strong>new RFC</strong> proposes the <a href="https://github.com/emberjs/rfcs/blob/a7ea6898280cd065cb5183d3245cceba3fd2e91b/text/0421-deprecate-application-controller-props.md">deprecation of these abundant properties</a> in the future. Be sure to <a href="https://github.com/emberjs/rfcs/pull/421">let your thoughts known in the proposal's comments section</a>!</p>
<hr />
<h2 id="apisearchperformancehttpstwittercommschinisstatus1080923571109724162"><a href="https://twitter.com/mschinis/status/1080923571109724162">API Search Performance 🏎</a></h2>
<p><img class="float-left large transparent padded pad-l0" alt="Algolia search improvements" src="/images/blog/emberjstimes/algolia-search-performance-improvements.png" /></p>
<p>The integration with our search provider, <a href="https://www.algolia.com/">Algolia</a> that powers both <a href="https://github.com/ember-learn/guides-app">Ember Guides</a> and <a href="https://github.com/ember-learn/ember-api-docs">Ember API Docs</a> has now become even more performant!</p>
<p>The work from our friends at Algolia unlocked a performance boost of the API docs search by as high as 285% for some countries in Europe! The map shows data centers where the API docs are currently stored and (on the right) the performance improvement for the top searching countries.</p>
<hr />
<h2 id="newbetareleaseforemberclibabelhttpstwittercompzuraqstatus1075856318798344192"><a href="https://twitter.com/pzuraq/status/1075856318798344192">New Beta Release for ember-cli-babel 🎉</a></h2>
<p><a href="https://github.com/pzuraq">@pzuraq</a> recently announced the release of <a href="https://github.com/babel/ember-cli-babel/tree/v7.3.0-beta.1">ember-cli-babel@v7.3.0-beta.1</a>!</p>
<p>The plugin <a href="https://github.com/babel/ember-cli-babel">ember-cli-babel</a> uses <a href="https://github.com/babel">Babel</a> and <a href="https://github.com/babel/babel-preset-env">babel-preset-env</a> to allow us to use ES6 syntax within our Ember CLI project.</p>
<p>With the 7.3.0 beta release, the <code>includeExternalHelpers</code> option is now available. This option controls deduplicating the default Babel helper functions by putting them in a shared module and lowering the payload size.</p>
<p>To read more on the <code>includeExternalHelpers</code> check out the <a href="https://github.com/babel/ember-cli-babel/#external-helpers">docs</a>!</p>
<hr />
<h2 id="improvingtestingonepartitionatatimehttpsgithubcomemberjsrfcspull426"><a href="https://github.com/emberjs/rfcs/pull/426">Improving Testing One Partition at a Time 🍰</a></h2>
<p><strong>Ember's testing story</strong> already makes testing incredibly approachable to developers, but what if it could bring even more to the table right from the start? Imagine being able to speed up your test suite with <strong>parallel testing</strong> or running tests in <strong>randomized order</strong> with an <code>ember test</code> command in your app.</p>
<p>A new <a href="https://github.com/emberjs/rfcs/pull/426">RFC proposes an update to the testing default in Ember apps and addons</a> by providing <a href="https://github.com/ember-cli/ember-exam">ember-exam</a> - an Ember addon developers can already use for advanced testing strategies - built into Ember's testing setup.</p>
<p>Be sure to <strong>read the full proposal</strong> and leave your <a href="https://github.com/emberjs/rfcs/pull/426">thoughts in the comments below</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/zeppelin" target="gh-user">@zeppelin</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/jamesgeorge007" target="gh-user">@jamesgeorge007</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/mschinis" target="gh-user">@mschinis</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a> and <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Kenneth Larsen, Michael Schinis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-79</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-79</guid><pubDate>Fri, 04 Jan 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 80]]></title><description><![CDATA[<p>Grüezi mitenand Emberistas! 🐹</p>
<p>This week you can read about the 🦄 <em>magical gifts</em> 🎁  of <strong>DecEmber</strong> ❄ and the <strong>decorators RFC</strong> moving into FCP 🎉! Check out a video on the <strong>State of Ember</strong> today 📺 and read our exclusive <strong>interview</strong> with community contributor <strong>@hakilebara</strong> 🧠!</p>
<!-- READMORE -->
<hr />
<h2 id="decemberisovercollectyourgifthttpsairtablecomshrm9o5w89wsaa1tq"><a href="https://airtable.com/shrm9o5W89wsAa1Tq">DecEmber ❄ is over? Collect your gift! 🎁</a></h2>
<p><a href="https://www.emberjs.com/blog/2018/11/29/december-event.html">DecEmber</a> has wrapped up and it seems to have been a big hit! There were many contributions to <code>ember-learn</code> repos and it is all thanks to the awesome Ember community!</p>
<p>Did you participate in <strong>DecEmber</strong>? We'd like to send you a thank you gift! <a href="https://airtable.com/shrm9o5W89wsAa1Tq">Fill out the form</a> and enjoy!</p>
<hr />
<h2 id="decoratorsinfcphttpsgithubcomemberjsrfcspull408"><a href="https://github.com/emberjs/rfcs/pull/408">Decorators in FCP 🤓</a></h2>
<!-- alex ignore period -->
<p>The <a href="https://github.com/NullVoxPopuli/rfcs/blob/decorators/text/0000-decorators.md">decorators Request for Comments (RFC)</a> has been moved into <strong>Final Comment Period (FCP)</strong>. This means that if you have thoughts about decorators now is your chance to add your comment.</p>
<p>The motivation for the decorators RFC is that native decorators bring a <strong>more natural way of declaring computed properties</strong> to native classes than the current computed macros.</p>
<p>As always, feel free to read the <a href="https://github.com/NullVoxPopuli/rfcs/blob/decorators/text/0000-decorators.md">RFC</a> and share your thoughts as a comment.</p>
<hr />
<h2 id="stateofembervideohttpsyoutuberpxohsuvok"><a href="https://youtu.be/rPxOhSu-VOk">State of Ember Video 📺</a></h2>
<p><a href="https://github.com/knownasilya">@knownasilya</a> published a video that summarizes the <a href="https://youtu.be/rPxOhSu-VOk">State of Ember</a> today. In his video, he highlights key themes that represent where Ember is at today for people who are not following too closely to developments or those who are new to Ember.</p>
<p><a href="https://github.com/emberjs/rfcs/blob/9c7fe3f4e947b5f79050214334a98673494c25d7/text/0000-editions.md">Ember Editions</a> represents how Ember gets packaged to provide a coherent story. Editions provide a way to market new features to the community since Ember historically has used major releases to deprecate API.</p>
<p><a href="https://github.com/emberjs/rfcs/blob/26c4d83fb66568e1087a05818fb39a307ebf8da8/text/0000-roadmap-2018.md#ember-octane">Ember Octane</a> is a <strong>new edition</strong> that brings a good amount of features from new layout for projects, Glimmer components, Angle bracket component syntax, updates to the Guides to show the new programming model, a new website, a shift to move to decorators and more! Some of these have already landed and can be used today, while others are still in progress. Check out what’s coming in the <a href="https://github.com/emberjs/ember.js/issues/17234">Octane tracking issue</a>.</p>
<p><a href="https://github.com/gossi/ember-cli-create">Ember CLI Create</a> is a tool that - similar to <code>ember new</code> - allows to create Ember apps and with an option to create Octane apps, too! However since not everything about Octane has been settled, such as <a href="https://github.com/emberjs/ember.js/issues/16373">module unification</a>, you may need to refactor this code later on.</p>
<p>Check out the full video on <a href="https://youtu.be/rPxOhSu-VOk">YouTube</a>!</p>
<hr />
<h2 id="icontributetoemberwithfrdricsoumarhttpsdiscussemberjscomticontributetoemberwithfredericsoumare15995"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-frederic-soumare/15995">"I contribute to Ember" with Frédéric Soumaré 🧠</a></h2>
<div class="float-right padded portrait-frame"><img alt="Frédéric Soumaré - Portrait Picture" title="Frédéric Soumaré" src="/images/blog/emberjstimes/hakilebara.png" /></div>
<p>This week we'd like to highlight the work of community member <strong>Frédéric Soumaré</strong>, also known as <a href="https://github.com/hakilebara">@hakilebara</a>.
In an exclusive interview with the Ember Times he talks about his learnings as both an <strong>Ember meetup organizer</strong> and <strong>contributor</strong> to <strong>Ember learning projects</strong> and why showing up is key.</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-frederic-soumare/15995">the Ember Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-frederic-soumare/15995">Read more</a></p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/Windvis" target="gh-user">@Windvis</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/NLincoln" target="gh-user">@NLincoln</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/buschtoens" target="gh-user">@buschtoens</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/gitKrystan" target="gh-user">@gitKrystan</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>
and <a href="https://github.com/zimmi88" target="gh-user">@zimmi88</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Kenneth Larsen, Jessica Jordan, Alon Bukai, Ryan Mark, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-80</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-80</guid><pubDate>Fri, 11 Jan 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 81]]></title><description><![CDATA[<p>Salam Emberistas! 🐹</p>
<p>This week we have news from the latest <strong>3.7 release</strong> of <strong>Ember</strong> 🚀, an exclusive contributor interview with <strong>@serenaf</strong> 🎙,
and a new RFC on <strong>Restructuring</strong> the <strong>Guides</strong> Table of Contents 🔖 for you!</p>
<!-- READMORE -->
<hr />
<h2 id="ember37isouthttpswwwemberjscomblog20190107ember37html"><a href="https://www.emberjs.com/blog/2019/01/07/ember-3-7.html">Ember 3.7 is Out! 🎉</a></h2>
<p>In the past week <strong>version 3.7</strong> of Ember.js, Ember CLI and Ember Data has been released. The new release comes with lots of <strong>important bug fixes</strong> for Ember and new features for Ember CLI, including a new <strong>compatibility table</strong> for addon authors to be used in their projects' READMEs.</p>
<p>Read all about the new release and how you can <strong>upgrade</strong> your app <a href="https://www.emberjs.com/blog/2019/01/07/ember-3-7.html">in the official release blog post</a>.</p>
<hr />
<h2 id="icontributetoemberwithserenafritschhttpsdiscussemberjscomticontributetoemberwithserenafritsch16037"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-serena-fritsch/16037">"I contribute to Ember" with Serena Fritsch</a></h2>
<div class="float-right padded portrait-frame"><img alt="Serena Fritsch" title="Serena Fritsch - Contributor to Ember" src="/images/blog/emberjstimes/serenaf.jpeg" /></div>
<p>This week we'd like to highlight the work of community member <strong>Serena Fritsch</strong>, also known as <a href="https://github.com/serenaf">@serenaf</a>.
In an exclusive interview with the Ember Times she talks about her learnings contributing to the <strong>Ember Deprecations App</strong> and why she believes that every contribution counts.</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-serena-fritsch/16037">the Ember Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-serena-fritsch/16037">Read more</a></p>
<hr />
<h2 id="rfcrestructuringtheguidestochttpsgithubcomemberjsrfcspull431"><a href="https://github.com/emberjs/rfcs/pull/431">RFC: Restructuring the Guides TOC 🔖</a></h2>
<p>The <a href="https://guides.emberjs.com/release/">Ember.js Guides</a> are getting a makeover to improve the learning story of Ember and to modernize concepts that were once new, when the Guides were originally written. <a href="https://github.com/jenweber">@jenweber</a> put up an RFC (Request for Comments) on <a href="https://github.com/emberjs/rfcs/pull/431">Restructuring the Guides Table of Contents (TOC)</a> in order to achieve this goal.</p>
<p>This RFC aims not to write new content but to present existing content in a different way without breaking any existing URLs. It does this by revamping <strong>topic naming</strong> – or changing topic names to general web development concepts rather than Ember-specific jargon – and <strong>logic ordering and grouping</strong> – where it breaks up content between requiring prior knowledge of Ember concepts or not. These changes aim to promote an easier learning curve for new and existing users of the framework by leveraging the user’s existing knowledge.</p>
<p>Read and comment on the <a href="https://github.com/emberjs/rfcs/pull/431">full RFC on GitHub</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/bobisjan" target="gh-user">@bobisjan</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/Charizard" target="gh-user">@Charizard</a>, <a href="https://github.com/efx" target="gh-user">@efx</a> and <a href="https://github.com/runspired" target="gh-user">@runspired</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Ryan Mark, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-81</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-81</guid><pubDate>Fri, 18 Jan 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 82]]></title><description><![CDATA[<p>హలో Emberistas! 🐹</p>
<p>This week you can read all about a new RFC for <strong>accessible routing</strong> 🗺, angle brackets coming 🔜 to the guides, a new way to decorate with Ember Decorators 🖼, a <strong>contributor interview</strong> with @bekzod 💬, check out the upcoming Ember.js documentary 🎬🍿🎥, a new RFC for <strong>contextual helpers</strong> 🎒 and more!</p>
<!-- READMORE -->
<hr />
<h2 id="newrfcaccessibleroutinginemberhttpsgithubcomemberjsrfcspull433"><a href="https://github.com/emberjs/rfcs/pull/433">New RFC: Accessible Routing in Ember 🗺</a></h2>
<p>Currently, routing in Ember is not natively accessible for users with assistive technology. This means that whenever the user navigates to a new route within an Ember application, screen readers do not read out the new content or appropriately move focus. This new RFC by <a href="https://github.com/MelSumner">@MelSumner</a> proposes a solution to this so <strong>Ember routing can be natively accessible for users with assistive technology</strong>.</p>
<p>Feel free to read the <a href="https://github.com/MelSumner/rfcs/blob/MelSumner-a11y-routing/text/0000-a11y-routing.md">RFC</a> and leave your thoughts as a comment.</p>
<hr />
<h2 id="comingsoonanglebracketstotheguideshttpsgithubcomemberlearnguidessourceissues139"><a href="https://github.com/ember-learn/guides-source/issues/139">Coming Soon: Angle Brackets to the Guides 🎉</a></h2>
<p>A <a href="https://github.com/ember-learn/guides-source/issues/139">quest issue</a> to convert the guides to <strong>angle bracket invocation</strong> is gaining traction. This effort will bring <a href="https://github.com/emberjs/rfcs/blob/master/text/0311-angle-bracket-invocation.md">RFC 311</a> to the documentation in the next few weeks, which is nice since this is a feature that has been available in Ember for some time! Many thanks to the contributors involved in this effort. 👏</p>
<hr />
<h2 id="decoratetodaytheemberwayhttpemberdecoratorsgithubioemberdecorators"><a href="http://ember-decorators.github.io/ember-decorators/">Decorate Today! The Ember Way! 📍</a></h2>
<p><a href="https://github.com/emberjs/rfcs/blob/master/text/0408-decorators.md">Ember Decorators</a> are the future of using Ember along with native Javascript classes. The addon <a href="https://github.com/ember-decorators/ember-decorators">ember-decorators</a> allows you to use <strong>"The Javascript of the Future, Today!"</strong>
Once you install it you will have a fully RFC compliant implementation of Ember Decorators.
The <a href="https://github.com/emberjs/rfcs/blob/master/text/0408-decorators.md">Ember Decorators RFC</a> was merged into the RFC repo about two weeks ago. It will take some time until this functionality is in Ember Core.
If you would like to try this out now and give your feedback then install the addon and test it out!
Thanks to everyone for pushing this forward and making it a reality. 🏆</p>
<p><a href="http://ember-decorators.github.io/ember-decorators/">Decorate away!</a></p>
<hr />
<h2 id="icontributetoemberwithbekzodkhaitbaevhttpsdiscussemberjscomticontributetoemberwithbekzodkhaitbaev16085"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-bekzod-khaitbaev/16085">"I contribute to Ember" with Bekzod Khaitbaev 💬</a></h2>
<div class="float-right padded portrait-frame"><img alt="Bek" title="Bek - Contributor to Ember" src="/images/blog/emberjstimes/bekzod.png" /></div>
<p>This week we'd like to highlight the work of community member <strong>Bekzod Khaitbaev</strong>, also known as <a href="https://github.com/bekzod">@bekzod</a>. In an exclusive interview with the Ember Times he talk about his learnings as a <strong>contributor</strong> to the <strong>Ember.js framework</strong> and why contributions can have an impact on thousands of people.</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-bekzod-khaitbaev/16085">the Ember Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-bekzod-khaitbaev/16085">Read more</a></p>
<hr />
<h2 id="emberjsthedocumentaryhttpswwwyoutubecomwatchvv0ac3z1wicc"><a href="https://www.youtube.com/watch?v=V0AC3Z1WIcc">Ember.js: The Documentary 🎬🍿🎥</a></h2>
<p>Ever wondered how and why Ember came to be? Starring <a href="https://github.com/wycats">@wycats</a>, <a href="https://github.com/tomdale">@tomdale</a>, <a href="https://github.com/wifelette">@wifelette</a> and members of the Ember community – the film <strong>"Ember.js: The Documentary"</strong> will be premiering at Pakhuis de Zwijger in Amsterdam on February 8th! Get your tickets while they’re still <a href="https://www.eventbrite.ie/e/emberjs-the-documentary-premiere-qa-w-yehuda-katz-special-guests-tickets-53804460590">available on EventBrite</a>!</p>
<p>Until then, you can always watch the <a href="https://www.youtube.com/watch?v=V0AC3Z1WIcc">trailer on YouTube</a>!</p>
<hr />
<h2 id="contextualhelpershttpsgithubcomemberjsrfcspull432"><a href="https://github.com/emberjs/rfcs/pull/432">Contextual Helpers 🆕</a></h2>
<p>The <a href="https://guides.emberjs.com/release/components/wrapping-content-in-a-component/#toc_sharing-component-data-with-its-wrapped-content">Contextual Components pattern</a> empowered addon authors to create highly reusable UI components as part of popular addons such as <a href="https://offirgolan.github.io/ember-light-table/">Ember Light Table</a>, <a href="https://ember-power-calendar.com/">Ember Power Calendar</a>, <a href="https://miguelcobain.github.io/ember-paper/">Ember Paper</a> and many more.</p>
<p>In extension of <a href="https://emberjs.github.io/rfcs/0064-contextual-component-lookup.html">allowing components to be contextual</a>, a <strong>new Request for Comments (RFC)</strong>  proposes to <a href="https://github.com/emberjs/rfcs/blob/contextual-helpers/text/0432-contextual-helpers.md">extend the semantics of template helpers in a similar fashion</a>.</p>
<p>You can read all about the motivation and possible design solutions in the original proposal and <a href="https://github.com/emberjs/rfcs/pull/432">leave your thoughts in the comments below</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/cibernox" target="gh-user">@cibernox</a>, <a href="https://github.com/Parrryy" target="gh-user">@Parrryy</a>, <a href="https://github.com/cah-danmonroe" target="gh-user">@cah-danmonroe</a>, <a href="https://github.com/MichalBryxi" target="gh-user">@MichalBryxi</a>, <a href="https://github.com/jelhan" target="gh-user">@jelhan</a>, <a href="https://github.com/gitKrystan" target="gh-user">@gitKrystan</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/wycats" target="gh-user">@wycats</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Kenneth Larsen, Amy Lam, Jessica Jordan, Alon Bukai, Chris Ng, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-82</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-82</guid><pubDate>Fri, 25 Jan 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 83]]></title><description><![CDATA[<p>გამარჯობა Emberistas! 🐹</p>
<p>2019 is coming in strong with a staggering amount of RFCs in FCP ⌛, an update on native classes in Ember 🚀, Ember.js Core Team Face-to-Face Meeting 😄, as well as an upcoming This.JavaScript: State of Frameworks! 🎉</p>
<p>We also have an exclusive <strong>contributor interview</strong> with <strong>@jenweber</strong> for you! 🙌</p>
<!-- READMORE -->
<hr />
<!--alex ignore period-->
<h2 id="rfcsinfinalcommentperiodhttpsgithubcomemberjsrfcspullsqis3aopenis3aprlabel3a22finalcommentperiod22"><a href="https://github.com/emberjs/rfcs/pulls?q=is%3Aopen+is%3Apr+label%3A%22Final+Comment+Period%22">RFCs in Final Comment Period 🖊️⌛</a></h2>
<!--alex ignore period-->
<p>2019 is coming in strong with a staggering amount of RFCs in Final Comment Period (FCP). So come and check out these awesome work!</p>
<p><a href="https://github.com/emberjs/rfcs/pull/410">Tracked Properties RFC</a> by <a href="https://github.com/pzuraq">@pzuraq</a> which introduces a simpler and more ergonomic system for tracking state change in Ember applications.</p>
<p><a href="https://github.com/emberjs/rfcs/pull/432">Contextual Helpers & Modifiers RFC</a> by <a href="https://github.com/chancancode">@chancancode</a> or supporting first-class helpers/modifiers in our templates.</p>
<p>Two deprecation RFCs by <a href="https://github.com/chadhietala">@chadhietala</a> are now in FCP - <a href="https://github.com/emberjs/rfcs/pull/421">Deprecate Application Controller Router Properties RFC</a> and <a href="https://github.com/emberjs/rfcs/pull/418">Deprecate Route Render APIs RFC</a>.</p>
<p>Finally the <a href="https://github.com/emberjs/rfcs/pull/431">Restructuring the Guides Table of Contents RFC</a> by <a href="https://github.com/jenweber">@jenweber</a> where the <a href="https://guides.emberjs.com/release/">Guides</a> will be rearranged to provide a natural learning flow for today’s Ember.js developers is also in FCP.</p>
<hr />
<h2 id="nativeclassupdate2019editionhttpsemberjscomblog20190126emberjsnativeclassupdate2019editionhtml"><a href="https://emberjs.com/blog/2019/01/26/emberjs-native-class-update-2019-edition.html">Native Class Update - 2019 Edition 📝</a></h2>
<p><a href="https://github.com/pzuraq">@pzuraq</a> wrote a blog post on native classes in Ember, which officially landed in v3.6. The article focuses on current best practices and changes since the original <a href="https://medium.com/build-addepar/es-classes-in-ember-js-63e948e9d78e">how-to article</a> was posted. If you're curious about native classes in Ember, be sure to read Chris' <a href="https://emberjs.com/blog/2019/01/26/emberjs-native-class-update-2019-edition.html">detailed and informative writeup</a>!</p>
<hr />
<h2 id="emberjscoreteamfacetofacehttpsemberjscomblog20190125frameworkf2fhtml"><a href="https://emberjs.com/blog/2019/01/25/framework-f2f.html">Ember.js Core Team Face-to-Face 🐹</a></h2>
<p>In December the <strong>Ember.js Core Team met in-person</strong> and remotely to review the direction that the framework API is headed, work through some architectural design questions, and figure out next steps. This resulted in <a href="https://emberjs.com/blog/2019/01/25/framework-f2f.html">a blog post</a> summarizing all the cool things that were discussed. This means that you can have a look on the <strong>Octane discussion</strong> as well as a review of <strong>website improvement progress</strong>. If that sounds interesting to you, then you should check out <a href="https://emberjs.com/blog/2019/01/25/framework-f2f.html">the blog post</a>.</p>
<hr />
<h2 id="thisjavascriptstateofframeworkshttpswwwthisdotcoeventsthisjavascriptstateofframeworks"><a href="https://www.thisdot.co/events/this-javascript-state-of-frameworks">This.JavaScript: State of Frameworks 🌍</a></h2>
<p><a href="https://github.com/kennethlarsen">@kennethlarsen</a> is representing Ember at This.JavaScript's State of Frameworks event! Speakers from prominent open source frameworks will discuss upcoming releases, recent milestones, and community initiatives. Be sure to <a href="https://www.thisdot.co/events/this-javascript-state-of-frameworks">RSVP</a> to tune in online on Feb 12.</p>
<hr />
<h2 id="icontributetoemberwithjenweberhttpsdiscussemberjscomticontributetoemberwithjenweber16110"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-jen-weber/16110">"I contribute to Ember" with Jen Weber 💬</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Jen Weber" title="Jen Weber - Contributor to Ember" src="/images/blog/emberjstimes/jenweber.jpeg" />
</div>
<p>In the 4th edition of the contributor interview series, we'd like to highlight the work of community member <strong>Jen Weber</strong>, also known as <a href="https://github.com/jenweber">@jenweber</a>. In this exclusive interview with the Ember Times she talks about her work on the <a href="https://guides.emberjs.com/">Ember Guides</a>, what the next edition of Ember means for the framework’s learning story and which of her learnings from working on open-source have turned out to become powerful assets for her own career.</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-jen-weber/16110">the Ember Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-jen-weber/16110">Read more</a></p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/samcic" target="gh-user">@samcic</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/Panman8201" target="gh-user">@Panman8201</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/bmac" target="gh-user">@bmac</a>, <a href="https://github.com/mhankus" target="gh-user">@mhankus</a>, <a href="https://github.com/rimian" target="gh-user">@rimian</a>, <a href="https://github.com/BryanCrotaz" target="gh-user">@BryanCrotaz</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/nlfurniss" target="gh-user">@nlfurniss</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/miguelcobain" target="gh-user">@miguelcobain</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/noslouch" target="gh-user">@noslouch</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/dbendaou" target="gh-user">@dbendaou</a>, <a href="https://github.com/MonsieurDart" target="gh-user">@MonsieurDart</a> and <a href="https://github.com/wadie" target="gh-user">@wadie</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Kenneth Larsen, Chris Ng, Amy Lam, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-83</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-83</guid><pubDate>Fri, 01 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 84]]></title><description><![CDATA[<p>ሰላም Emberistas! 🐹</p>
<p>This week we have a new 🆕 EmberWeekly.com, ✨ the new documentation site for Ember Mirage, an introduction to the EmberConf 2019 closing speaker – Sarah Allen 🗣️, a new theme 🖤 for your Ember Twiddles and an exclusive interview with Ember contributor @rwwagner90!</p>
<!-- READMORE -->
<hr />
<h2 id="emberconf2019closingspeakersarahallenhttpstwittercomemberconfstatus1092880236864188416"><a href="https://twitter.com/EmberConf/status/1092880236864188416">EmberConf 2019 closing speaker: Sarah Allen 🗣️</a></h2>
<p>It was recently announced that <a href="https://twitter.com/ultrasaurus">Sarah Allen</a> – <a href="https://github.com/ultrasaurus">@ultrasaurus</a> – will be the <strong>closing</strong> <a href="https://emberconf.com/">EmberConf 2019</a> <strong>speaker</strong>!</p>
<!--alex ignore gal-guy-->
<p>Sarah founded Blazing Cloud, a mobile development firm, and Bridge Foundry, a diversity and inclusion nonprofit. She previously served as Presidential Innovation Fellow in the Obama Administration at the Smithsonian Institution, and was an early engineer on After Effects, Shockwave, and Flash video. She now leads Google Cloud Platform infrastructure teams working on server-side events and security policy.</p>
<p>So be sure to <a href="https://emberconf.com/register.html">register</a> for EmberConf if you haven’t yet!</p>
<hr />
<h2 id="emberweeklycomhttpswwwemberweeklycom"><a href="https://www.emberweekly.com/">🆕 EmberWeekly.com</a> 💥</h2>
<p>Our friends at <strong>Ember Weekly</strong> launched a new <a href="https://www.emberweekly.com/">EmberWeekly.com</a>. <a href="https://github.com/ebryn">@ebryn</a> <a href="https://twitter.com/ebryn/status/1093040993488855040">tweets</a> that the site includes six years of their newsletter's content, fully exposed to the web and now indexable. The site is powered by Ember and Fastboot and will help surface the wondering things happening in the Ember ecosystem! 💛</p>
<p>Looking for Ember resources on the web? A great link to share? Browse the <a href="https://www.emberweekly.com/?section=Reading">Reading</a> or <a href="https://www.emberweekly.com/?section=Watch%2FListen">Watch & Listen</a> sections. We think that the site looks pretty slick, too.</p>
<hr />
<h2 id="newandshinymiragedocshttpwwwemberclimiragecom"><a href="http://www.ember-cli-mirage.com/">✨ New and Shiny Mirage Docs</a></h2>
<p>As <a href="https://github.com/samselikoff">@samselikoff</a> posted on <a href="https://twitter.com/samselikoff/status/1088440182054051840">Twitter</a> ember-cli-mirage v0.4.13 is out now and it contains a very cool feature. The old <strong>documentation site</strong> has been retired and replaced with a <a href="http://www.ember-cli-mirage.com/">new and shiny site</a> built with <a href="https://github.com/ember-learn/ember-cli-addon-docs">ember-cli-addon-docs</a>.</p>
<p>As if that wasn't enough, ember-cli-mirage currently has <strong>0 reproducible bugs</strong>. Help out by trying the latest release and see if you can catch any bugs.</p>
<hr />
<h2 id="solarizeyourembertwiddlehttpsgithubcomsukimaembertwiddlesolarized"><a href="https://github.com/sukima/ember-twiddle-solarized">Solarize Your Ember Twiddle 🎨</a></h2>
<div class="blog-row">
  <img class="float-left transparent" alt="" title="Ember Twiddle Solarized Theme Demo" src="/images/blog/emberjstimes/ember-twiddle-solarized.png" />
</div>
<p>A <strong>new, dark theme</strong> for <a href="https://ember-twiddle.com/">Ember Twiddle</a> now allows you to create, edit and share Ember code snippets in a stylish way 🖤.</p>
<p>The project <a href="https://github.com/sukima/ember-twiddle-solarized">Ember Twiddle Solarized</a> is a UserCSS theme that can be installed in either Firefox, Chrome or Opera in a few steps.
<a href="https://github.com/sukima/ember-twiddle-solarized#installation-solarized#installation">Check out the installation instructions</a> and start twiddling today!</p>
<hr />
<h2 id="icontributetoemberwithrobertwagnerhttpsdiscussemberjscomticontributetoemberwithrobertwagner16143"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-robert-wagner/16143">"I contribute to Ember" with Robert Wagner 💬</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Robert Wagner" title="Robert Wagner - Contributor to Ember" src="/images/blog/emberjstimes/robertwagner.jpeg" />
</div>
<p>In our 5th edition of the contributor interview series community member <strong>Robert Wagner</strong>, also known as <a href="https://github.com/rwwagner90">@rwwagner90</a> talks about his work on the <a href="https://guides.emberjs.com/release/ember-inspector/">Ember Inspector</a>, his motivation to contribute and how to <strong>overcome</strong> the hurdle of sending one's <strong>first pull request</strong>.</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-robert-wagner/16143">the Ember Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-robert-wagner/16143">Read more</a></p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/apps/greenkeeper" target="gh-user">@greenkeeper[bot]</a>, <a href="https://github.com/wondersloth" target="gh-user">@wondersloth</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/SinS3i" target="gh-user">@SinS3i</a>, <a href="https://github.com/givanse" target="gh-user">@givanse</a>, <a href="https://github.com/bhullarg" target="gh-user">@bhullarg</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/btecu" target="gh-user">@btecu</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/prasannavijayan" target="gh-user">@prasannavijayan</a>, <a href="https://github.com/alexlafroscia" target="gh-user">@alexlafroscia</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/dayton-bobbitt" target="gh-user">@dayton-bobbitt</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/villander" target="gh-user">@villander</a>, <a href="https://github.com/makepanic" target="gh-user">@makepanic</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a> and <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Amy Lam, Kenneth Larsen, Alon Bukai and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-84</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-84</guid><pubDate>Fri, 08 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 85]]></title><description><![CDATA[<p>こんにちは Emberistas! 🐹</p>
<p>In this week's issue: watch the Ember.js Documentary 🍿, check out the Ember.js core team panel 📹, there's a big update to the guides 📐, a new RFC to deprecate computed().meta() 🚀, and we have an exclusive interview with Ember contributor Lisa Backer! 🎉</p>
<!-- READMORE -->
<hr />
<h2 id="emberjsthedocumentaryisnowreleasedhttpstwittercomhoneypotiostatus1094974913725849606"><a href="https://twitter.com/honeypotio/status/1094974913725849606">Ember.js: The Documentary is Now Released! 🍿</a></h2>
<!--alex ignore spa-->
<p>JavaScript was not always the dominant force in the web. Today a lot of SPA features we see around the web were pioneered by Ember. Explore the story of why and how Ember.js came to be in <a href="http://videos.honeypot.io/emberjs-documentary-2019/">Ember.js: The Documentary</a>!</p>
<p>Here are a couple of quick snippets from the film. Tom Dale said:</p>
<blockquote>
  <p>JavaScript frameworks don’t have to be disposable software. Web applications don’t have to be disposable software. You don’t need to tell your manager we need to stop writing any new features for the next 6 months because it’s been 2 years and we need to rewrite – Ember is a symbol of the fact that that is a false dichotomy.</p>
</blockquote>
<p>Yahuda Katz said:</p>
<blockquote>
  <p>I really hope the best of Ember is ahead because I think front end engineering needs it … needs an example of something that is not trying to tell people that when something goes wrong it’s their own fault. So like something that tells you if you’re a beginner like this is for you.</p>
</blockquote>
<p>Check out the <a href="https://www.youtube.com/watch?v=Cvz-9ccflKQ">full documentary</a> featuring <a href="https://github.com/wycats">@wycats</a>, <a href="https://github.com/tomdale">@tomdale</a>, <a href="https://github.com/wifelette">@wifelette</a>, <a href="https://github.com/GavinJoyce">@GavinJoyce</a>, <a href="https://github.com/balinterdi">@balinterdi</a>, <a href="https://github.com/MelSumner">@MelSumner</a>, <a href="https://github.com/jessica-jordan">@jessica-jordan</a> and other members of the community on <a href="https://www.youtube.com/watch?v=Cvz-9ccflKQ">YouTube</a>!</p>
<hr />
<h2 id="emberjscorepanelbostonmeetuphttpswwwyoutubecomwatchvjp4jrwz4zv8featureyoutubet105"><a href="https://www.youtube.com/watch?v=Jp4jrwz4zV8&feature=youtu.be&t=105">Ember.js Core Panel, Boston Meetup 📹</a></h2>
<p>At the January <a href="https://www.meetup.com/Boston-Ember-js/">Boston Ember.js Meetup</a> members of the Ember.js core team got together for a panel on the future of JavaScript.</p>
<p>Team members Tom Dale, Robert Jackson, Edward Faulkner, Dan Gebhardt and Jen Weber discussed their picks for the most exciting future developments in JavaScript and their impact on the web and the Ember.js ecosystem, followed by a super interesting Q&amp;A. Topics included web assembly and it's effect on mobile web application performance, web workers, decorators, learning stories and more! ✨</p>
<p>Check out the entire <a href="https://www.youtube.com/watch?v=Jp4jrwz4zV8&feature=youtu.be&t=105">archived live stream</a> featuring <a href="https://github.com/tomdale">@tomdale</a>, <a href="https://github.com/rwjblue">@rwjblue</a>, <a href="https://github.com/ef4">@ef4</a>, <a href="https://github.com/dgeb">@dgeb</a> and <a href="https://github.com/jenweber">@jenweber</a>.</p>
<hr />
<h2 id="guidesfromadifferentanglehttpsguidesemberjscomrelease"><a href="https://guides.emberjs.com/release/">Guides From a Different Angle 📐</a></h2>
<p>A new version of the <a href="https://guides.emberjs.com/release/">Ember guides</a> has been deployed, and it contains some exciting surprises. First of all, the <code>guides-source</code> and <code>guides-app</code> repositories have become <strong>one repository</strong>. This makes it so much more convenient to maintain and contribute. It also now uses the <a href="https://github.com/empress/guidemaker">Guidemaker</a> technology which means that CLI-guides and the Ember guides are using the same tech.</p>
<p>And now for the big surprise: <strong>The newly deployed guides now contains angle bracket invocation syntax</strong>. So, if you're looking to use angle bracket invocation syntax in your Ember application, the guides are the place to look for help.</p>
<hr />
<h2 id="farewellcomputedmetahttpsgithubcomemberjsrfcspull441"><a href="https://github.com/emberjs/rfcs/pull/441">Farewell, computed().meta() 👋</a></h2>
<p>Following the <strong>deprecation</strong> of other <strong>modifier functions</strong> of <strong>computed properties</strong> in the past (<a href="https://emberjs.github.io/rfcs/0375-deprecate-computed-property-modifier.html">1</a>, <a href="https://emberjs.github.io/rfcs/0370-deprecate-computed-volatile.html">2</a>),
a new Request for Comments (RFC) proposes the <a href="https://github.com/emberjs/rfcs/pull/441">deprecation of the <code>meta()</code> modifier</a>.</p>
<p>The once useful function for sharing and looking up meta information through a cp, can now be substituted by using <code>WeakMap</code>s - making the deprecation of <code>computed().meta()</code> possible as proposed in the RFC.</p>
<p>You can read more about the suggested transition path in the <a href="https://github.com/emberjs/rfcs/blob/51b57a865a3c58393c44d73f1c4931878c994eef/text/0000-deprecate-computed-meta.md">full proposal</a>. And as always, don't forget to <a href="https://github.com/emberjs/rfcs/pull/441">comment, too</a>!</p>
<hr />
<h2 id="icontributetoemberwithlisabackerhttpsdiscussemberjscomticontributetoemberwithlisabacker16168"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-lisa-backer/16168">"I contribute to Ember" with Lisa Backer ✍️</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Lisa Backer" title="Lisa Backer - Contributor to Ember" src="/images/blog/emberjstimes/lisabacker.jpeg" />
</div>
<p>In our 6th edition of the contributor interview series community member <strong>Lisa Backer</strong>, also known as <a href="https://github.com/eshtadc">@eshtadc</a> talks about her work on <code>ember-service-worker</code>, public speaking, the things that make open-source so valuable and why anyone in the community can be an expert who has important insights to share.</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-lisa-backer/16168">the Ember Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-lisa-backer/16168">Read more</a></p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/optikalefx" target="gh-user">@optikalefx</a>, <a href="https://github.com/prasannavijayan" target="gh-user">@prasannavijayan</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/patocallaghan" target="gh-user">@patocallaghan</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/jrjohnson" target="gh-user">@jrjohnson</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/MinThaMie" target="gh-user">@MinThaMie</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/bbarkley" target="gh-user">@bbarkley</a> and <a href="https://github.com/tomdale" target="gh-user">@tomdale</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Jared Galanis, Kenneth Larsen, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-85</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-85</guid><pubDate>Fri, 15 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 86]]></title><description><![CDATA[<p>สวัสดี Emberistas! 🐹</p>
<p>Fill out the <strong>2019 Ember Community Survey</strong>! 📝 We have RFCs galore: two follow-up RFCs to make <strong>Tracked Properties</strong> better  👣, the full deprecation of <strong>Partials</strong> 🥛, the renaming of <code>htmlSafe</code> and the <strong>deprecation of with</strong> 🚫, and a <strong>RFC Roundup Redux</strong> episode of Ember Weekend 🔈 for you. This week we're also highlighting a wholesome <strong>Ember community experience</strong> 🤝, and last, but not least, an exclusive interview with Ember contributor <strong>@cibernox</strong>! 💬</p>
<!-- READMORE -->
<hr />
<h2 id="2019embercommunitysurveyhttpsemberjscomblog20190219embercommunitysurveyhtml"><a href="https://emberjs.com/blog/2019/02/19/ember-community-survey.html">2019 Ember Community Survey 📝</a></h2>
<p>The <strong>official 2019 Ember Community Survey</strong> is here! We would like your help to learn about who is in the Ember community and how they work with the framework.</p>
<p>This is the fifth year we're learning about the community's makeup and interests, and we look forward to sharing the results at <a href="http://emberconf.com/">EmberConf 2019</a> on March 18th. Over 1300 participants took part in the survey in 2018 (<a href="https://www.emberjs.com/ember-community-survey-2018/">2018 survey results</a>) and we are aiming for even more participation this year!</p>
<p>Completing the survey should take about <strong>15 minutes</strong>. We've added a few new questions this year, while retaining opportunities to share feedback as free-form text. All submissions are completely anonymous, and demographic data about the community is not released in the same raw data files as the free-form text and other answers.</p>
<p>Submissions will be accepted <strong>until March 12th</strong>. More info about the survey can be found <a href="https://emberjs.com/blog/2019/02/19/ember-community-survey.html">here</a>. Why not fill it out now?!</p>
<p><a class="ember-button ember-button--centered" href="https://emberjs.com/ember-community-survey-2019/">Take the Survey</a></p>
<p>Please help us <strong>spread the word</strong> by sharing the <a href="https://emberjs.com/ember-community-survey-2019">survey landing page</a> on your social network feeds, at meetups and around your office and other communities.</p>
<p>We look forward to your participation! If you have any immediate questions, feel free to email the survey team via <a href="mailto:survey@emberjs.com">survey@emberjs.com</a>, or ping us in <a href="https://discordapp.com/channels/480462759797063690/480777444203429888">#dev-ember-learning</a> in <a href="https://discordapp.com/invite/zT3asNS">Discord</a> chat.</p>
<hr />
<h2 id="rfcsfordecoratorsupportandtrackedpropertyclassicclassdescriptorhttpsgithubcomemberjsrfcspullsutf8e29c93qis3apris3aopen440442"><a href="https://github.com/emberjs/rfcs/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+440+442">RFCs for Decorator Support and Tracked Property Classic Class Descriptor  👣</a></h2>
<p><a href="https://github.com/pzuraq">@pzuraq</a> opened up a pair of RFCs that supplemented the recently merged <a href="https://github.com/emberjs/rfcs/pull/410">Tracked Properties RFC</a>.</p>
<p>The <strong>Decorator Support RFC</strong> is a follow up to the <a href="https://github.com/emberjs/rfcs/blob/master/text/0408-decorators.md">Decorators RFC</a> since it was premised on decorators moving from stage 2 in the TC39 process to stage 3. However since decorators remained in stage 2, and have not been rejected, and that all parties were in agreement about the <em>invocation syntax</em> of decorators – decorators should present a minimal amount of risk to Ember and its users. The changes in the spec will mostly affect library and framework maintainers, but not end users in <em>most cases</em>. Ember will begin by supporting the latest version of the decorators transform provided by Babel.</p>
<p>The <strong>Tracked Property Classic Class Descriptor RFC</strong> adds the <code>descriptor</code> decorator for classic classes only which allows users to define native getters and setters (and other properties). This provides a clear 1-1 translation between native and classic syntax invocations as a way to add getters and setters to classic classes.</p>
<p>Read and comment on the <a href="https://github.com/emberjs/rfcs/pull/440">Decorator Support RFC</a> or the <a href="https://github.com/emberjs/rfcs/pull/442">Tracked Property Classic Class Descriptor RFC</a> on GitHub!</p>
<hr />
<h2 id="letsfullydeprecatepartialshttpsgithubcomemberjsrfcspull449"><a href="https://github.com/emberjs/rfcs/pull/449">Let's Fully Deprecate Partials! 🥛</a></h2>
<p><strong>Partials</strong> in Ember have been around for quite some time. Today however, they are considered bad practice and all of their functionality <strong>can be replaced</strong> with Components. There is an <a href="https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-partial.md">Ember Template Lint rule</a> against their use. There was a <a href="https://github.com/emberjs/rfcs/issues/390">Pre-RFC</a> created a while ago that recommended deprecating partials. Today we finally have a full RFC to <a href="https://github.com/emberjs/rfcs/pull/449">Deprecate Partials</a> written up by <a href="https://github.com/GavinJoyce">@GavinJoyce</a>. If you want to learn more about the deprecation or maybe the alternatives to partials <a href="https://github.com/gavinjoyce/rfcs/blob/gj/deprecate-partials/text/0000-template.md">check out the RFC</a>. Also be sure to chime in and voice your concerns or add a 👍🎉 to the <a href="https://github.com/emberjs/rfcs/pull/449">RFC itself</a>.</p>
<hr />
<h2 id="lessconfusedwithhtmlsafeandwithhttpsgithubcomemberjsrfcspull443"><a href="https://github.com/emberjs/rfcs/pull/443">Less Confused 🤷‍♀️🚫 with htmlSafe and with</a></h2>
<p>Two new <strong>Requests for Comments (RFC)</strong> propose deprecations to better avoid confusion in Ember apps:
<a href="https://github.com/emberjs/rfcs/pull/443">One of the proposals</a> aims to rename the <code>htmlSafe</code> template helper and util to <code>trustedHtml</code> in an effort to convey the mechanism of the util better.</p>
<p><a href="https://github.com/emberjs/rfcs/pull/445">The second RFC</a> proposes the <strong>deprecation</strong> of the <code>with</code> template helper acknowledging the rather recent <a href="https://guides.emberjs.com/release/templates/built-in-helpers/#toc_built-in-block-helpers"><code>let</code> helper</a>, that can now be used in templates instead of and with much clearer intent than <code>with</code>.</p>
<p>Be sure to check out the original proposals for <a href="https://github.com/emberjs/rfcs/pull/443">the renaming of <em>htmlSafe</em></a> and <a href="https://github.com/emberjs/rfcs/pull/445">the deprecation of the with helper</a> and leave your comments below!</p>
<hr />
<h2 id="emberweekendrfcroundupreduxepisodehttpstwittercomemberweekendstatus1095017680892035072"><a href="https://twitter.com/emberweekend/status/1095017680892035072">Ember Weekend RFC Roundup Redux Episode 🔈</a></h2>
<p>Don't miss <a href="https://github.com/rondale-sc">@rondale-sc</a> and <a href="https://github.com/code0100fun">@code0100fun</a> interviewing <a href="https://github.com/rwjblue">@rwjblue</a> on <strong>Episode 128</strong> of the <strong>Ember Weekend podcast</strong> <a href="http://emberweekend.com/episodes/rfc-roundup-reduce">RFC Roundup Redux</a>. They discussed the <a href="https://emberjs.github.io/rfcs/introduction.html">auto-published unified RFC's repo</a>, the <a href="https://emberjs.github.io/rfcs/0416-glimmer-components.html">Glimmer Components RFC</a> and its implications for hooks, the <a href="https://emberjs.github.io/rfcs/0415-render-element-modifiers.html">Render Element Modifiers RFC</a>, including the official addon it proposes, and more!</p>
<hr />
<h2 id="anembercommunityexperiencebygauravmunjalhttpstwittercomgaurav9576status1098298137507217408"><a href="https://twitter.com/gaurav9576/status/1098298137507217408">An Ember Community Experience by Gaurav Munjal 💛</a></h2>
<p>I had wanted to make some large breaking changes to <a href="https://github.com/btecu/ember-simple-tree">ember-simple-tree</a>,
in order to enable me to customize it to my liking. Given that it would break backward compatibility and existing applications, I figured my changes would never be accepted. So I forked it and released my version as <strong>ember-light-tree</strong>.</p>
<p>I was surprised when <strong>Bujorel Tecu</strong> AKA <a href="https://github.com/btecu">@btecu</a>, the author of ember-simple-tree,
contacted me and wanted to work together to include my changes. As a result, my changes are now in the latest version of
ember-simple-tree.</p>
<p>Even though we had to sacrifice technical backward compatibility, it was important to @btecu that we had <strong>a shared solution</strong>. One of the main strengths of Ember is how shared conventions enable developers to build on top of each other's work and <strong>improve the ecosystem for everyone</strong>. It's heartening to see this view echoed in the Ember addon community.</p>
<hr />
<h2 id="icontributetoemberwithmiguelcambahttpsdiscussemberjscomticontributetoemberwithmiguelcamba16193"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-miguel-camba/16193">"I contribute to Ember" with Miguel Camba ✍️</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Miguel Camba" title="Miguel Camba - Contributor to Ember" src="/images/blog/emberjstimes/miguelcamba.jpeg" />
</div>
<p>In our 7th edition of the contributor interview series, community member <strong>Miguel Camba</strong>, also known as <a href="https://github.com/cibernox">@cibernox</a> talks about his work on <strong>powerful</strong> addons, contributing by necessity and why the <strong>silly pull request</strong> is only <strong>a myth</strong>.</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-miguel-camba/16193">the Ember Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-miguel-camba/16193">Read more</a></p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/cibernox" target="gh-user">@cibernox</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/XaserAcheron" target="gh-user">@XaserAcheron</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/aklkv" target="gh-user">@aklkv</a>, <a href="https://github.com/bartocc" target="gh-user">@bartocc</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/EndangeredMassa" target="gh-user">@EndangeredMassa</a> and <a href="https://github.com/CodingItWrong" target="gh-user">@CodingItWrong</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Gaurav Munjal, Amy Lam, Alon Bukai, Jessica Jordan, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-86</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-86</guid><pubDate>Fri, 22 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 87]]></title><description><![CDATA[<p>Happy Friday, Emberistas! 🐹</p>
<p>This week: <strong>Take and share</strong> the <strong>2019 Ember Community Survey</strong> 🐹, Ember 3.8 released 🚀, SFC &amp; Template Import Primitives RFC 🔬, Contribution Guides RFC in FCP ✏️, dig through the Classic Class Owner Tunnel RFC 🕳, Help Wanted 🚧, and a brand-new <strong>Readers' Question</strong> 🤓 for you!</p>
<!-- READMORE -->
<hr />
<h2 id="letyourvoicebeheardinthe2019embercommunitysurveyhttpsemberjscomembercommunitysurvey2019"><a href="https://emberjs.com/ember-community-survey-2019/">Let Your Voice Be Heard in the 2019 Ember Community Survey 🗣</a></h2>
<p>With 2019 already under way the Ember Core team would like your help to learn about who is in the Ember community and how they work with the framework. <a href="https://emberjs.com/ember-community-survey-2019/">The 2019 Ember Community Survey</a> is anonymous and only open until <strong>March 12th</strong>!</p>
<p>Be sure to <a href="https://emberjs.com/ember-community-survey-2019/">take survey today</a> and <strong>spread the word</strong> among your colleagues and Ember friends!</p>
<p><a class="ember-button ember-button--centered" href="https://emberjs.com/ember-community-survey-2019/">Take the survey</a></p>
<hr />
<h2 id="ember38releasedhttpsemberjscomblog20190227ember38releasedhtml"><a href="https://emberjs.com/blog/2019/02/27/ember-3-8-released.html">Ember 3.8 Released 🚀</a></h2>
<p>New versions of Ember, Ember CLI and Ember Data have been released. Not only does this release contain features like the <strong>Element Modifier Manager and the array helper</strong> - it also marks 3.8 as a new LTS candidate. Both the features and the LTS information can be found in the <a href="https://emberjs.com/blog/2019/02/27/ember-3-8-released.html">release post</a>.</p>
<p>This release also contains 5 deprecations for Ember, so if you plan on upgrading to 3.8 please have a look at the <a href="https://emberjs.com/blog/2019/02/27/ember-3-8-released.html#toc_deprecations-5">new deprecations</a>.</p>
<hr />
<h2 id="rfcforsinglefilecomponentstemplateimportprimitiveshttpsgithubcomemberjsrfcspull454"><a href="https://github.com/emberjs/rfcs/pull/454">RFC for Single-File Components & Template Import Primitives</a> 🔬</h2>
<p><a href="https://github.com/tomdale">@tomdale</a> recently opened up an RFC to explore adding single-file components and module imports in component templates!</p>
<p>The <strong>SFC & Template Import Primitives RFC</strong> proposes adding experimental low-level primitives for embedding templates in JavaScript and associating templates with component classes, two highly-requested features. 🎉</p>
<p>Rather than proposing specific formats for single-file components and template imports, the RFC proposes new low-level API's that addons can use to implement experimental 🧪 file formats.</p>
<p>Be sure to checkout and comment on the detailed design of the <a href="https://github.com/emberjs/rfcs/pull/454">SFC & Template Import Primitives RFC</a> on Github!</p>
<hr />
<h2 id="contributionguidesinfcphttpsgithubcomemberjsrfcspull446"><a href="https://github.com/emberjs/rfcs/pull/446">Contribution Guides in FCP! 🖊️</a></h2>
<p><a href="https://github.com/jessica-jordan">@jessica-jordan</a> proposed adding an official <strong>Contribution Guide</strong> which aims to improve the discoverability of Ember-related projects that require help by the community and outlines the general contribution workflow for these projects.</p>
<p>With the intent of making the Contribution Guides as beginner-friendly as possible, it will include a <strong>summary</strong> of the motivation of open-source and its meaning for Ember as an OSS project, a real-world example of <strong>how to contribute code</strong>, a guide on <strong>how to file an issue</strong>, and an <strong>issue finder</strong> inspired by the <a href="https://whatcanidoformozilla.org/">What Can I Do for Mozilla landing page</a>.</p>
<!--alex ignore period-->
<p>The <a href="https://github.com/emberjs/rfcs/pull/446">Contribution Guides RFC</a> is in Final Comment Period (FCP) so check it out!</p>
<hr />
<h2 id="classicclassownertunnelrfchttpsgithubcomemberjsrfcspull451"><a href="https://github.com/emberjs/rfcs/pull/451">Classic Class Owner Tunnel RFC 🕳</a></h2>
<p><a href="https://github.com/pzuraq">@pzuraq</a> opened an RFC around making <code>getOwner</code> and explicit injections work in classic class constructors since the <a href="https://github.com/emberjs/rfcs/blob/master/text/0337-native-class-constructor-update.md">Native Class Constructor Update RFC</a> changed the way that classic classes were constructed.</p>
<p>The <strong>Classic Class Owner Tunnel RFC</strong> proposes to make <em>explicit</em> injections work for the class’s constructor method. However, <em>implicit</em> injections will still only be available during <code>init</code>, because they are passed in and assigned as <code>args</code>. The <em>implicit</em> injections will be caught using development-mode assertions which would direct users to add the injection explicitly (ideally), or to use <code>init</code>.</p>
<p>Read the full details on the <a href="https://github.com/emberjs/rfcs/pull/451">Classic Class Owner Tunnel RFC</a> on GitHub!</p>
<hr />
<h2 id="helpwantedhttpsgithubcomemberlearnguidessourceissuesqis3aopenis3aissuelabel3a22helpwanted22label3aoctane"><a href="https://github.com/ember-learn/guides-source/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3AOctane">Help Wanted 🚧</a></h2>
<p>A large part of the work for <strong>Octane</strong> ⛽️ is documentation! <strong>Would you like to help?</strong> Check out <a href="https://github.com/ember-learn/guides-source/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3AOctane">these issues</a>! Drop by the <a href="https://discordapp.com/channels/480462759797063690/480777444203429888">#dev-ember-learning</a> channel on <a href="https://discordapp.com/invite/zT3asNS">Discord</a> if you want to help out or have any questions. The goal is to make the upcoming edition information clear for both new learners and existing Ember developers, and along the way, do some general refactors of our guides content.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/CodingItWrong" target="gh-user">@CodingItWrong</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/enomws" target="gh-user">@enomws</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/ondrejsevcik" target="gh-user">@ondrejsevcik</a>, <a href="https://github.com/mike-north" target="gh-user">@mike-north</a>, <a href="https://github.com/tschoartschi" target="gh-user">@tschoartschi</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>, <a href="https://github.com/jeanduplessis" target="gh-user">@jeanduplessis</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/fpauser" target="gh-user">@fpauser</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/BradLeftley" target="gh-user">@BradLeftley</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/yusufsagdic" target="gh-user">@yusufsagdic</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a> and <a href="https://github.com/scalvert" target="gh-user">@scalvert</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="readersquestionswhatarethebenefitsofusingemberdataoverajaxhttpsdiscussemberjscomtreadersquestionswhatarethebenefitsofusingemberdataoverajax16254"><a href="https://discuss.emberjs.com/t/readers-questions-what-are-the-benefits-of-using-ember-data-over-ajax/16254">Readers' Questions: "What are the benefits of using Ember Data over Ajax?" 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>In <strong>this week's Readers' Question</strong> we're talking about a popular question asked by many Ember developers who are starting out: What are the benefits of using <strong>Ember Data</strong> over Ajax?
  Ember Learning team member <a href="https://github.com/jessica-jordan" target="jj">@jessica-jordan</a> highlights in her answer some of the plethora of advantages that a data management library like Ember Data offers for <strong>building easy-to-maintain</strong> applications that also <strong>scale well</strong>.</p>

  <p>
    <a class="es-button" href="https://discuss.emberjs.com/t/readers-questions-what-are-the-benefits-of-using-ember-data-over-ajax/16254">Read more</a>
  </p>
</div>
<div class="blog-row">
  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jessica Jordan, Kenneth Larsen, Chris Ng, Jared Galanis, Jen Weber, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-87</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-87</guid><pubDate>Fri, 01 Mar 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 88]]></title><description><![CDATA[<p>👋 Emberistas! 🐹</p>
<p>Be heard by filling out the Ember Community Survey! 🗣 Check out a video preview of Ember.js Octane tech 🎥, the latest release of ember-ajax 🎉, learn how to contribute to Ember Times 📰, a new full-stack livestream series 📹, and read about angle bracket component invocation syntax for built-in components 📐!</p>
<!-- READMORE -->
<hr />
<h2 id="onlyafewdayslefttocompletetheembercommunitysurveyhttpsemberjscomembercommunitysurvey2019"><a href="https://emberjs.com/ember-community-survey-2019/">Only a Few Days Left to Complete the Ember Community Survey 🚀</a></h2>
<p>This upcoming <strong>Tuesday, March 12th</strong> is the deadline to complete the <a href="https://emberjs.com/ember-community-survey-2019/">Ember community survey</a>. If you have already answered the survey, thank you! 🎉 Don’t forget to poke a lot of people around you to complete it too!</p>
<p>If you have not yet completed it, please do. Your answer will give a better view on the Ember community and how it is used all around the world!</p>
<hr />
<h2 id="emberjsoctanetechpreviewhttpswwwyoutubecomwatchvbv09blwlc64"><a href="https://www.youtube.com/watch?v=BV09blWlc64">Ember.js Octane Tech Preview  🎥</a></h2>
<p>Check out an awesome new video preview by <a href="https://github.com/GavinJoyce">@GavinJoyce</a> explaining some of the features and improvements available as part of <strong>Ember Octane</strong>!</p>
<p>The video briefly covers Module Unification and relevant changes to file structure in Ember Octane. Through examples <a href="https://github.com/GavinJoyce">@GavinJoyce</a> reviews the difference between classic Ember components and Glimmer components in both angle bracket invocation syntax and classic invocation syntax. Also covered are Octane's use of tracked properties vs computed properties, outer vs inner html semantics (div wrapping), tagName(s), classNames, component arguments, splattributes and more.</p>
<p><a href="https://github.com/GavinJoyce">@GavinJoyce</a> also calls attention to some nice resources available for learning more details about what's involved in Ember Octane. Watch the <a href="https://www.youtube.com/watch?v=BV09blWlc64">full video, here</a>.</p>
<hr />
<h2 id="releaseofemberajaxv500httpsgithubcomembercliemberajaxblobmasterchangelogmd50020190305"><a href="https://github.com/ember-cli/ember-ajax/blob/master/CHANGELOG.md#500-2019-03-05">Release of ember-ajax v5.0.0 🎉</a></h2>
<p><a href="https://github.com/turbo87/">@Turbo87</a> announced the <a href="https://twitter.com/TobiasBieniek/status/1103051224180498434">release of version 5.0.0</a> of <a href="https://github.com/ember-cli/ember-ajax">ember-ajax</a>. In this update, we have a <strong>breaking change</strong> for the Error classes since the base class of the custom Error classes was changed to extend native <code>Error</code> instead of <code>EmberError</code>.</p>
<p>Furthermore, ember-ajax was also updated to use <a href="https://github.com/babel/ember-cli-babel">ember-cli-babel</a> v7.x, which requires all apps that uses ember-ajax to use <a href="https://github.com/ember-cli/ember-ajax#compatibility">Ember CLI 2.13 or above</a>.</p>
<hr />
<h2 id="learntocontributetoemberjshttpswwwkennethlarsenorghowtocontributetotheembertimes"><a href="https://www.kennethlarsen.org/how-to-contribute-to-the-ember-times/">Learn to Contribute to Ember.js 🏫</a></h2>
<p><a href="https://github.com/kennethlarsen">@kennethlarsen</a> has released a new blog series that will <strong>take you through contributing to the Ember.js ecosystem</strong>. The series starts off with contributions that are non-advanced and does not require code and will finish with some more advanced code contributions.</p>
<p>In this first post <strong>you'll learn how to contribute to The Ember Times</strong>. It takes you through everything from picking a topic to requesting a review on your writing. Check out <a href="https://www.kennethlarsen.org/how-to-contribute-to-the-ember-times/">the blog post</a> to get started.</p>
<hr />
<h2 id="fullstackdevelopmentwithemberandrailslivestreamserieshttpswwwtwitchtvcodingitwrong"><a href="https://www.twitch.tv/codingitwrong">Full-Stack Development with Ember and Rails Livestream Series 📹</a></h2>
<p>Josh Justice AKA <a href="https://github.com/codingitwrong">@CodingItWrong</a> has a new livestream series on his <a href="https://www.twitch.tv/codingitwrong">Twitch channel</a> where he <strong>builds an application from scratch using Ember and Rails</strong>. Why Ember for this series? Productivity and developer happiness! 💯</p>
<p>These videos will appeal to you if…</p>
<ul>
<li>You're a backend developer who hasn't worked with extensive JavaScript before. You'll see how Ember allows you to build rich UIs, without needing to learn a lot to get started.</li>
<li>You have experience with another frontend framework. You can learn from Ember's approach and gain another perspective.</li>
<li>You've used Ember in the past. You'll be excited to see recent happenings that make Ember <em>easier</em> to use than before.</li>
</ul>
<p>Check out the <a href="https://www.youtube.com/watch?v=qCjUBVNng4w">teaser video</a> for the series, <a href="https://www.youtube.com/watch?v=8Sz2AuhWKe0&t=">Part 1: Deployment, CI, and Dependencies</a>, <a href="https://www.youtube.com/watch?v=gxA-dDw1Vqo">Part 2: Models with JSON:API</a>, and <a href="https://www.youtube.com/watch?v=bqnrUCCPego">Part 3: UI Libraries and UX</a>. More videos will be released on <a href="https://www.youtube.com/channel/UCa-4tbLDX_lmq2f40L0paZw">YouTube</a> over the next few Fridays. Better yet, tune into the livestream on <a href="https://www.twitch.tv/codingitwrong">Twitch</a> Fridays at 2pm ET to chat and follow along live!</p>
<hr />
<h2 id="anglebracketsforallcomponentshttpsgithubcomemberjsrfcspull459"><a href="https://github.com/emberjs/rfcs/pull/459">Angle Brackets for All Components 📐</a></h2>
<p>A <a href="https://github.com/emberjs/rfcs/pull/459">new Request for Comments (RFC)</a> is proposing to make <strong>Angle Bracket Component Invocation Syntax</strong> available for all components in an Ember application - including the <strong>built-in componnents</strong> <code>link-to</code>, <code>input</code> and <code>textarea</code>.</p>
<p>Currently, those cannot be invoked using the modern invocation syntax from Ember's upcoming edition <strong>Octane</strong>, but this proposal attempts to provide ways to do so and circumvent some of today's limiting APIs.</p>
<p>You can read more about the motivation and the detailed design of this change in <a href="https://github.com/emberjs/rfcs/blob/angle-built-ins/text/0459-angle-bracket-built-in-components.md">the original RFC</a>. Be sure to leave your thoughts!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/MinThaMie" target="gh-user">@MinThaMie</a>, <a href="https://github.com/rajasegar" target="gh-user">@rajasegar</a>, <a href="https://github.com/yusufsagdic" target="gh-user">@yusufsagdic</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/ming-codes" target="gh-user">@ming-codes</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/bazzel" target="gh-user">@bazzel</a>, <a href="https://github.com/muziejus" target="gh-user">@muziejus</a>, <a href="https://github.com/boris-petrov" target="gh-user">@boris-petrov</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Amy Lam, Chris Ng, Anne-Greeth van Herwijnen, Kenneth Larsen, Jared Galanis, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-88</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-88</guid><pubDate>Fri, 08 Mar 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 89]]></title><description><![CDATA[<p>Talofa Emberistas! 🐹 We hope to see you at EmberConf next week!</p>
<p>Polish up the Guides preview for Octane ⛽️, invoke nested components with angle bracket syntax 📐, an update on module unification 📝, check out the new Yieldable Named Blocks RFC 📇, an Ember Data Development Plan RFC 💾 and more!</p>
<!-- READMORE -->
<hr />
<h2 id="copyeditorsfortheoctaneguidesneededhttpsgithubcomemberlearnguidessourceissues588"><a href="https://github.com/ember-learn/guides-source/issues/588">Copy Editors For the Octane Guides Needed 📝</a></h2>
<p>Do you have <strong>a few minutes</strong> to read a page of the <a href="https://github.com/ember-learn/guides-source/issues/588">Work in Progress (WIP) of the new Octane Guides</a> and send a PR for any kind of <strong>small fix</strong>? It's all about <strong>spelling, typos and factual accuracy</strong> in this round of copy-editing for the Octane Guides, and your help - however big or small - is greatly appreciated! 🖤
Your work will contribute to a big initiative the Learning Core team and friends have been working on for a while and which will be highlighted at <a href="https://emberconf.com">EmberConf</a> next week!</p>
<p>You can read more about how to contribute and what to look out for in the <a href="https://github.com/ember-learn/guides-source/issues/588">description of the related Quest Issue</a> and thank you for your support - every little bit helps! ⭐️</p>
<hr />
<h2 id="invokingcomponentsfromallthedirectorieswithanglebracketshttpsgithubcomemberjsrfcspull457"><a href="https://github.com/emberjs/rfcs/pull/457">Invoking Components from All the Directories with Angle Brackets 📂</a></h2>
<p>Even though <a href="https://guides.emberjs.com/release/reference/syntax-conversion-guide/">angle bracket syntax</a> is the modern and already available way of invoking components in Ember, it is still not possible to invoke all your components in your Ember app this way (yet!).</p>
<p>In contrast to <strong>curly invocation syntax</strong>, or classic invocation syntax, <strong>angle bracket syntax</strong> does not allow you to invoke components from nested directories, e.g. <code>app/components/blog/post/comment.js</code>. A new <a href="https://github.com/emberjs/rfcs/pull/457">Request for Comments (RFC)</a> aims to change exactly that. It paves a way for Ember developers to use angle bracket invocation syntax on components from all app directories - nested or not.</p>
<!-- alex ignore period -->
<p>Be sure to read the full proposal and <a href="https://github.com/emberjs/rfcs/pull/457">leave your comments below</a> before the <strong>Final Comment Period (FCP)</strong> ends!</p>
<hr />
<h2 id="moduleunificationupdatehttpsblogemberjscom20190311updateonmoduleunificationandoctanehtml"><a href="https://blog.emberjs.com/2019/03/11/update-on-module-unification-and-octane.html">Module Unification Update 📝</a></h2>
<p>If you are interested in Module Unification (MU) and the plans surrounding that topic, the <a href="https://blog.emberjs.com/2019/03/11/update-on-module-unification-and-octane.html">blog post</a> that <a href="https://github.com/tomdale">@tomdale</a> wrote will tell you all about it. Tom tells the story starting with the <a href="https://emberjs.github.io/rfcs/0143-module-unification.html">Module Unification RFC</a> from 2016 and how the community worked really hard to make MU work.</p>
<p>Unfortunately, MU will not be shipped in Octane. The implementation of MU, in for example Glimmer, showed that there are challenges in making MU work intuitively and useable. With these challenges in mind and looking at the development of Angle bracket components, there is a <strong>new path</strong> wide open. The first steps towards MU in Ember start with the <a href="https://github.com/emberjs/rfcs/pull/454">SFC & Template Imports RFC</a> to make template imports possible.</p>
<p>So if you have a good idea to help make MU a success Ember, <strong>join the discussion</strong> and read the <a href="https://blog.emberjs.com/2019/03/11/update-on-module-unification-and-octane.html">Blog on Module Unification</a>.</p>
<hr />
<h2 id="yieldablenamedblocksrfchttpsgithubcomemberjsrfcspull460"><a href="https://github.com/emberjs/rfcs/pull/460">Yieldable Named Blocks RFC 📇</a></h2>
<p><a href="https://github.com/wycats">@wycats</a> opened an RFC around supporting <a href="https://github.com/emberjs/rfcs/pull/460">yieldable named blocks</a>. The proposed RFC amends the previously submitted <a href="https://emberjs.github.io/rfcs/0226-named-blocks.html">Named Blocks RFC</a> to finalize the syntax of named blocks and reduce the scope of the feature in light of the <a href="https://emberjs.github.io/rfcs/0311-angle-bracket-invocation.html">Angle Bracket Invocation</a> changes.</p>
<p>The RFC proposes an extension to the angle bracket invocation syntax, namely introducing a <strong>new syntax to handle named blocks</strong> as seen below using the <code>&lt;:&gt;</code> and <code>&lt;/:&gt;</code> syntax.</p>
<pre><code class="markup language-markup">AngleBracketWithBlock :
  "&lt;" ComponentTag ComponentArgs? BlockParams? "&gt;"
  BlockBody
  "&lt;/" ComponentTag "&gt;"

AngleBracketWithBlocks :
  "&lt;" ComponentTag ComponentArgs? BlockParams? "&gt;"
  NamedBlock+
  "&lt;/" ComponentTag "&gt;"

NamedBlock :
  | "&lt;:" Identifier "/&gt;"
  | "&lt;:" Identifier BlockParams? "&gt;" BlockBody "&lt;/:" Identifier "&gt;"
</code></pre>
<p>The RFC does not propose an extension to curly syntax, although a future extension to curly syntax is expected. <strong>Read more</strong> at the full <a href="https://github.com/emberjs/rfcs/pull/460">Yieldable Named Blocks RFC</a> on GitHub!</p>
<hr />
<h2 id="emberdatamediumtermdevelopmentplanrfchttpsgithubcomemberjsrfcspull452"><a href="https://github.com/emberjs/rfcs/pull/452">Ember Data Medium Term Development Plan RFC ⚡️💾</a></h2>
<p><a href="https://github.com/igorT">@igorT</a> recently opened an RFC setting a medium term plan for Ember Data's development with the goals of increasing approachability, speed, stability, flexibility and shedding some legacy layers.</p>
<p>The RFC describes a tactical plan to refactor Ember Data's internals to isolate <code>DS.Model</code> to facilitate swapping it out in the future, replace<code>InternalModel</code> functionality, and introduce <code>RecordIdentity</code> to uniquely identify records and harden system boundaries.</p>
<p>For more details and some <strong>interesting diagrams</strong> sketching out the architecture of what's involved, check out the <a href="https://github.com/emberjs/rfcs/pull/452">RFC on Ember Data's medium term development plan</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/ryanto" target="gh-user">@ryanto</a>, <a href="https://github.com/makepanic" target="gh-user">@makepanic</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/NullVoxPopuli" target="gh-user">@NullVoxPopuli</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/ygongdev" target="gh-user">@ygongdev</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/dfreeman" target="gh-user">@dfreeman</a>, <a href="https://github.com/kgautreaux" target="gh-user">@kgautreaux</a>, <a href="https://github.com/betocantu93" target="gh-user">@betocantu93</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/sukima" target="gh-user">@sukima</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/muziejus" target="gh-user">@muziejus</a> and <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>  for their contributions to Ember and related repositories! 💖</p>
<p>We would especially like to thank everyone who has contributed to the Octane Preview Guides! Their work will be showcased at EmberConf! Thank you <a href="https://github.com/betocantu93">@betocantu93</a>, <a href="https://github.com/jenweber">@jenweber</a>, <a href="https://github.com/mansona">@mansona</a>, <a href="https://github.com/kgautreaux">@kgautreaux</a>, <a href="https://github.com/rwjblue">@rwjblue</a>, <a href="https://github.com/muziejus">@muziejus</a>, <a href="https://github.com/makepanic">@makepanic</a>, <a href="https://github.com/sukima">@sukima</a>, <a href="https://github.com/efx">@efx</a>, <a href="https://github.com/mixonic">@mixonic</a>, <a href="https://github.com/kategengler">@kategengler</a>, <a href="https://github.com/MelSumner">@MelSumner</a>, <a href="https://github.com/locks">@locks</a>, <a href="https://github.com/pzuraq">@pzuraq</a>, <a href="https://github.com/bazzel">@bazzel</a>, <a href="https://github.com/jamescdavis">@jamescdavis</a>, <a href="https://github.com/rajasegar">@rajasegar</a>, <a href="https://github.com/CodingItWrong">@CodingItWrong</a>, <a href="https://github.com/acorncom">@acorncom</a>, <a href="https://github.com/toddjordan">@toddjordan</a>, <a href="https://github.com/ondrejsevcik">@ondrejsevcik</a>, <a href="https://github.com/enomws">@enomws</a>, <a href="https://github.com/kaeufl">@kaeufl</a>, <a href="https://github.com/bartocc">@bartocc</a>, <a href="https://github.com/DenisNazarenko">@DenisNazarenko</a>, <a href="https://github.com/EndangeredMassa">@EndangeredMassa</a>, <a href="https://github.com/knownasilya">@knownasilya</a>, <a href="https://github.com/jaredgalanis">@jaredgalanis</a>, <a href="https://github.com/dayton-bobbitt">@dayton-bobbitt</a>, <a href="https://github.com/dbendaou">@dbendaou</a>, <a href="https://github.com/MonsieurDart">@MonsieurDart</a>, <a href="https://github.com/chrisrng">@chrisrng</a>, <a href="https://github.com/cah-danmonroe">@cah-danmonroe</a>, <a href="https://github.com/jessica-jordan">@jessica-jordan</a>, <a href="https://github.com/Parrryy">@Parrryy</a>, <a href="https://github.com/KellyJohnBraun">@KellyJohnBraun</a>, <a href="https://github.com/kennethlarsen">@kennethlarsen</a>, <a href="https://github.com/sivakumar-kailasam">@sivakumar-kailasam</a>, <a href="https://github.com/pablobm">@pablobm</a>, <a href="https://github.com/maxwondercorn">@maxwondercorn</a>, and <a href="https://github.com/tomdale">@tomdale</a>. 🎉</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Anne-Greeth van Herwijnen, Jen Weber, Amy Lam, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-89</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-89</guid><pubDate>Fri, 15 Mar 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 90]]></title><description><![CDATA[<p>هيلو Emberistas! 🐹</p>
<p>This week has been super busy with The Ember Times team reporting from <strong>EmberConf 2019</strong> in Portland Oregon! We are sharing <strong>highlights</strong> from the conference with you 🐹, learn about <strong>Ember Octane</strong> ⛽️ in a series of blog posts 📖, read and comment on the new <strong>Bind Helper</strong> RFC 💖💪, and turn {{on}} the power with a new <strong>{{On}} Modifier</strong> RFC 🔌.</p>
<!-- READMORE -->
<hr />
<h2 id="greetingsfromemberconf2019httpsemberconfcom"><a href="https://emberconf.com">Greetings from EmberConf 2019</a></h2>
<p>This week <a href="https://emberconf.com">EmberConf - the biggest, annual Ember conference</a> - took place in Portland, Oregon, United States. Ember developers from all around the world came together to learn more about the newest features of the framework, best practices, case studies and most importantly meet online Ember friends.</p>
<p><img src="/images/blog/emberjstimes/embertimes-team-2019.jpg" class="centered" alt="The Ember Times Team 2019 and the Zoey mascot posing on stage behind the Ember logo and looking cool as ever 😎"/></p>
<p>Pictured are Jared Galanis, Melanie Sumner, Kenneth Larsen, L. Preston Sego III, Anne-Greeth Van Herwijnen as Zoey(!), Jessica Jordan, Jen Weber, Ryan Mark, Chris Ng, Amy Lam, and Ricardo "locks" Mendes. Not pictured: Robert Wagner, Alon Bukai, Edward Faulkner, Gaurav Munjal, Miguel Braga Gomes, and Sivakumar Kailasam. Many thanks to all of these folks for contributing to three or more issues in the past year! 💛</p>
<p>This year's <a href="https://youtu.be/O3RKLHvpUAI?t=369">keynote by Tom Dale and Yehuda Katz</a> featured lots of insight into the <strong>present and future of Ember</strong> and the official announcement for the <a href="https://octane-guides-preview.emberjs.com/release/getting-started/quick-start/"><strong>Edition Preview</strong> of <strong>Ember Octane</strong></a>. Wanna learn more about Ember Octane and the original RFC (Request for Comments)? Be sure to check out the <a href="https://emberjs.com/editions/octane/">Ember Octane Edition website</a> and read all about it!</p>
<p>Also The Ember Times will notify you, as soon as the full recordings of the conference sessions are online, so be sure to <strong>stay tuned</strong> and if you haven't done so, <a href="https://the-emberjs-times.ongoodbits.com/">subscribe today</a>!</p>
<hr />
<h2 id="comingsooninemberoctanehttpsblogemberjscom20190211comingsooninemberoctanepart1html"><a href="https://blog.emberjs.com/2019/02/11/coming-soon-in-ember-octane-part-1.html">Coming Soon in Ember Octane</a></h2>
<p>If you haven't seen them already, you won't want to miss the amazing 🎉 and in-depth <strong>blog posts</strong> 📖 that <a href="https://github.com/pzuraq">@pzuraq</a> has been putting out covering many of the new features of <strong>Ember Octane</strong>!</p>
<p>It's a five part series covering Native Classes and Decorators, Angle Brackets &amp; Named Arguments, Tracked Properties, Element Modifiers and Glimmer Components, all broken out into separate blog posts.</p>
<p>Find all the parts at the Ember.js Blog: <a href="https://blog.emberjs.com/2019/02/11/coming-soon-in-ember-octane-part-1.html">part 1</a>, <a href="https://blog.emberjs.com/2019/02/19/coming-soon-in-ember-octane-part-2.html">part 2</a>, <a href="https://blog.emberjs.com/2019/02/26/coming-soon-in-ember-octane-part-3.html">part 3</a>, <a href="https://blog.emberjs.com/2019/03/06/coming-soon-in-ember-octane-part-4.html">part 4</a> and <a href="https://blog.emberjs.com/2019/03/14/coming-soon-in-ember-octane-part-5.html">part 5</a>.</p>
<p>✨ Bonus ✨ also checkout a recent interview of <a href="https://github.com/pzuraq">@pzuraq</a> on the <a href="https://embermap.com/podcast/chris-garrett-on-ember-octane">EmberMap podcast</a>, where he discusses many of these topics with the EmberMap crew.</p>
<hr />
<h2 id="bindhelperrfchttpsgithubcomemberjsrfcspull470"><a href="https://github.com/emberjs/rfcs/pull/470">Bind Helper RFC 💖💪</a></h2>
<p>Fresh off EmberConf, <a href="https://github.com/rtablada">@rtablada</a> opened a new RFC that introduces a new helper <code>bind</code> to allow clear argument and context scope binding for functions passed in templates.</p>
<p>The idea is for the <code>bind</code> helper to take in a function and then the set of arguments that will be partially applied to the function, similar to the JavaScript bind method.</p>
<p>Check out the <a href="https://github.com/emberjs/rfcs/pull/470">full RFC</a> on GitHub!</p>
<hr />
<h2 id="poweronyouremberapphttpsgithubcomemberjsrfcspull471"><a href="https://github.com/emberjs/rfcs/pull/471">Power {{On}} your Ember App! 🔌</a></h2>
<p>A new RFC has been proposed by <a href="https://github.com/pzuraq">@pzuraq</a> that proposes adding a new <code>{{on}}</code> modifier to Ember. This modifier will allow adding event listeners to elements in your templates.</p>
<p>You might be thinking, "Hey Ember Times Writer, we already have those! We have the <code>{{action}}</code> element modifier and <code>on*=</code> property bindings." However those have a <a href="https://github.com/emberjs/rfcs/blob/27ee4012b0bbf63d4d304e6942b91ce37107bd91/text/0000-on-modifier.md#motivation">few downsides</a> that are fixed with the <code>{{on}}</code> modifier.</p>
<p>The <code>{{on}}</code> modifier will explicitly add event listeners using the <code>addEventListener</code> API. It is based on the addon <a href="https://github.com/buschtoens/ember-on-modifier">ember-on-modifier</a> by <a href="https://github.com/buschtoens">@buschtoens</a>.</p>
<p>An example: The following usages are equivalent:</p>
<pre><code class="handlebars language-handlebars">&lt;div {{on "click" this.handleClick passive=true}}&gt;&lt;/div&gt;
</code></pre>
<pre><code class="javascript language-javascript">element.addEventListener('click', this.handleClick, { passive: true });
</code></pre>
<p>So get your modify on today and <strong>make your voice heard</strong> on the <a href="https://github.com/emberjs/rfcs/pull/471">open RFC</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/shawnren" target="gh-user">@shawnren</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/habdelra" target="gh-user">@habdelra</a>, <a href="https://github.com/DingoEatingFuzz" target="gh-user">@DingoEatingFuzz</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/mschinis" target="gh-user">@mschinis</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/gabz75" target="gh-user">@gabz75</a>, <a href="https://github.com/robustdj" target="gh-user">@robustdj</a>, <a href="https://github.com/GavinJoyce" target="gh-user">@GavinJoyce</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/NullVoxPopuli" target="gh-user">@NullVoxPopuli</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/wycats" target="gh-user">@wycats</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/dherault" target="gh-user">@dherault</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/courajs" target="gh-user">@courajs</a>, <a href="https://github.com/ultrasaurus" target="gh-user">@ultrasaurus</a>, <a href="https://github.com/Charizard" target="gh-user">@Charizard</a>, <a href="https://github.com/richard-viney" target="gh-user">@richard-viney</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>, <a href="https://github.com/mike-north" target="gh-user">@mike-north</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a> and <a href="https://github.com/rbarbey" target="gh-user">@rbarbey</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Kenneth Larsen, Amy Lam, Alon Bukai, Jared Galanis, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-90</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-90</guid><pubDate>Fri, 22 Mar 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 91]]></title><description><![CDATA[<p>හෙලෝ Emberistas! 🐹</p>
<!--alex ignore hangman-hangwoman-->
<p>Read some RFCs around extending <code>EmberObject</code> 💡, learn how to build Hangman with <strong>Ember Octane</strong> 🎬, plus check out the Record Data Errors RFC 📇, an "e"mpressive EmberWeekend podcast with <strong>@mansona</strong> 🎙, and the Singleton Record Data RFC for Ember Data 💾! Last, but not least, catch our exclusive interview with Ember contributor <strong>@kategengler</strong>. 🚀</p>
<!-- READMORE -->
<hr />
<h2 id="rfcsaroundemberobjectbaseclasshttpsgithubcomemberjsrfcspulls"><a href="https://github.com/emberjs/rfcs/pulls">RFCs around EmberObject Base Class 💡</a></h2>
<p><a href="https://github.com/pzuraq">@pzuraq</a> opened 2 new RFCs around using the <code>EmberObject</code> <strong>base class</strong>.</p>
<p>The <a href="https://github.com/emberjs/rfcs/pull/468">@classic Decorator RFC</a> adds a <strong>set of warnings</strong> for users who adopt <strong>native class syntax</strong> with <code>EmberObject</code> base classes. By using the <code>@classic</code> decorator, the warnings around edge cases such as <code>init</code> vs <code>constructor</code> or use of <code>Mixins</code> are turned off. These warnings are used as a guide for components to slowly migrate away from extending from <code>EmberObject</code> to more standalone such as <code>GlimmerComponent</code>.</p>
<p>The <a href="https://github.com/emberjs/rfcs/pull/467">Injection Hook Normalization RFC</a> supersedes the submitted <a href="https://github.com/emberjs/rfcs/pull/451">Classic Class Owner Tunnel RFC</a>. This RFC looks to answer <strong>how</strong> we should <strong>handle dependency injection (DI)</strong> when we are not extending from the <code>EmberObject</code> base class. It proposes to assign values during construction by normalising the assignment of the <code>owner</code>, access to injected properties, and follow the same conventions as other popular DI frameworks.</p>
<p>Read more about <a href="https://github.com/emberjs/rfcs/pull/468">@classic Decorator RFC</a> and <a href="https://github.com/emberjs/rfcs/pull/467">Injection Hook Normalization RFC</a> on GitHub!</p>
<hr />
<!--alex ignore hangman-hangwoman-->
<h2 id="buildingahangmangamewithemberoctanehttpswwwtwitchtvvideos400723351"><a href="https://www.twitch.tv/videos/400723351">Building a Hangman Game with Ember Octane</a> 🎬</h2>
<!--alex ignore hangman-hangwoman-->
<p>Husband and wife team <a href="https://github.com/mike-north">@mike-north</a> and <a href="https://github.com/lisaychuang">@lisaychuang</a> did a <a href="https://www.twitch.tv/videos/400723351">live stream</a> on <strong>how to build</strong> a <strong>hangman game</strong>. They used the <a href="https://emberjs.com/editions/octane/">Ember Octane preview</a> and the Glimmer components that come with it.</p>
<p>This video is a nice introduction into the world of <strong>Ember Octane</strong> and <strong>Glimmer components</strong> and definitely shows the benefits of doing pair programming. 😊</p>
<hr />
<h2 id="recorddataerrorsrfchttpsgithubcomemberjsrfcspull465"><a href="https://github.com/emberjs/rfcs/pull/465">Record Data Errors RFC 📇</a></h2>
<!--alex ignore invalid-->
<p><a href="https://github.com/igorT">@igorT</a> created a RFC to expose the content of <strong>Invalid Errors</strong> on Record Data. This RFC suggests <strong>exposing</strong> the <strong>errors</strong> provided by the server if it returns a <code>422</code>. <code>InvalidError</code> payload follows the JSON API error object spec, and if the error payload contains pointers those get mapped to attributes on a record.</p>
<p>For more information about the getter for the errors and the <code>RecordDataStoreWrapper</code> and an opportunity to give feedback, see the <a href="https://github.com/emberjs/rfcs/pull/465">Record Data Errors RFC</a>.</p>
<hr />
<h2 id="episode129oftheemberweekendpodcasthttpsemberweekendcomepisodesempresstheemberpress"><a href="https://emberweekend.com/episodes/empress-the-ember-press">Episode 129 of the EmberWeekend Podcast 🎙</a></h2>
<!--alex ignore middleman-middlewoman-->
<p>Episode 129 of the <strong>EmberWeekend podcast</strong> featured <a href="https://github.com/mansona">@mansona</a> the creator of Authmaker. This episode included a range of topics including the <strong>migration</strong> of moving the <strong>Ember Guides</strong> from Middleman to be powered by Ember. Other areas include Middleman shortcomings and the rework of the Guides.</p>
<p><a href="https://github.com/mansona">@mansona</a> also talks about his journey using Broccoli Static JSON to <strong>convert markdown</strong> into <strong>JSON API</strong>. The ultimate goal was to use the Broccoli pipeline markdown to convert to JSON API and use static files!</p>
<p><a href="https://github.com/mansona">@mansona</a> also introduced <strong>Guidemaker</strong>:  A fully functional, static site implementation of a documentation site and EmberJS with fully out of the box SEO friendly output! With support to be hosted on S3 or any other site hosting solution. Check out the <a href="https://github.com/empress/guidemaker">GitHub</a> repo here.</p>
<p>Listen to the full <a href="https://emberweekend.com/episodes/empress-the-ember-press">podcast</a>.</p>
<hr />
<h2 id="singletonrecorddatarfchttpsgithubcomemberjsrfcspull461"><a href="https://github.com/emberjs/rfcs/pull/461">Singleton Record Data RFC 💾</a></h2>
<p>Want to learn more about how some of Ember Data's APIs are developing? Take a peek at the Singleton Record Data RFC recently opened by <a href="https://github.com/runspired">@runspired</a>.</p>
<p>This RFC focuses on ensuring that Record Data can be implemented as a singleton, eliminates some redundant APIs and simplifies method signatures. This plan for Record Data offers opportunities for <strong>performance optimizations</strong> ⚡️ and <strong>improved feature sets</strong>! ✨</p>
<p>For these proposed changes and a detailed design, including changes to many of the methods involved, check out the <a href="https://github.com/emberjs/rfcs/pull/461">Singleton Record Data RFC</a>.</p>
<hr />
<h2 id="icontributetoemberwithkatiegenglerhttpsdiscussemberjscomticontributetoemberwithkatiegengler16374"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-katie-gengler/16374">"I contribute to Ember" with Katie Gengler ✍️</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Katie Gengler" title="Katie Gengler - Contributor to Ember" src="/images/blog/emberjstimes/kategengler.jpeg" />
</div>
<p>In our 8th edition of the contributor interview series, community member <strong>Katie Gengler</strong>, also known as <a href="https://github.com/kategengler">@kategengler</a> talks about her work on <strong>Ember Observer</strong>, <strong>Ember Try</strong> and <strong>RFC tracking</strong> and why all kinds of contributions to Ember really matter.</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-katie-gengler/16374">the Ember Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-katie-gengler/16374">Read more</a></p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/zachgarwood" target="gh-user">@zachgarwood</a>, <a href="https://github.com/alexpark90" target="gh-user">@alexpark90</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/xjmdoo" target="gh-user">@xjmdoo</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/step2yeung" target="gh-user">@step2yeung</a>, <a href="https://github.com/mike-north" target="gh-user">@mike-north</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/tansongyang" target="gh-user">@tansongyang</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/mwpastore" target="gh-user">@mwpastore</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a> and <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Anne-Greeth van Herwijnen, Chris Ng, Jessica Jordan, Bradley Leftley, Kenneth Larsen, Jared Galanis, Katie Gengler, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-91</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-91</guid><pubDate>Fri, 29 Mar 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 92]]></title><description><![CDATA[<p>હેલો Emberistas! 🐹</p>
<p>The <strong>video</strong> recordings of <strong>EmberConf 2019</strong> are now available! But first, read about the benefits of <strong>volunteering at a tech conference</strong> 💪, an RFC on <strong>adding npm dependency lint</strong> ✨, a new <strong><code>{{fn}}</code> Helper</strong> RFC 🎉, <strong>data loading</strong> and <strong>animation patterns</strong> in your Ember app 🌟, and you don't wanna miss tips on <strong>mentoring</strong> Ember developers 👩‍🏫! Enjoy some ✨ fan art by <strong>@delusioninabox</strong> 👩‍🎨, and read the exclusive interview with Ember contributor <strong>@pzuraq</strong>! 💬</p>
<!-- READMORE -->
<hr />
<h2 id="3reasonstovolunteeratatechconferencehttpsmediumcomlisaychuang3reasonswhyyoushouldvolunteeratatechconference19a0c81d1d8"><a href="https://medium.com/@lisaychuang/3-reasons-why-you-should-volunteer-at-a-tech-conference-19a0c81d1d8">3 Reasons to Volunteer at a Tech Conference 💪🏼</a></h2>
<p><a href="https://twitter.com/lisaychuang">@lisaychuang</a> shares her experience from this year’s EmberConf, and encourages newcomers in any tech community to <strong>attend a tech conference</strong> (and possibly <strong>volunteer</strong>!).</p>
<p>As a volunteer, you can get:</p>
<ul>
<li>A warm welcome to the community</li>
<li>Behind the scene access</li>
<li>A chill home base during the conference</li>
</ul>
<p>Curious to learn more? Check out her post on Medium: <a href="https://medium.com/@lisaychuang/3-reasons-why-you-should-volunteer-at-a-tech-conference-19a0c81d1d8">3 reasons why you should volunteer at a tech conference</a>.</p>
<hr />
<h2 id="dependencylintrfchttpsgithubcomemberjsrfcspull464"><a href="https://github.com/emberjs/rfcs/pull/464">Dependency Lint RFC ✨</a></h2>
<p><a href="https://github.com/Alonski">@Alonski</a> proposed that the addon <code>ember-cli-dependency-lint</code> should be added to the <strong>default blueprint</strong>.</p>
<p>This lint helps us detect early if our addons rely on the same package but use different versions. In such cases, Ember CLI merges all versions into one. This can cause our app to behave unexpectedly and become hard to debug. 😨😰😱</p>
<p>You can learn about <code>ember-cli-dependency-lint</code> addon and how to resolve dependency conflicts at <a href="https://github.com/salsify/ember-cli-dependency-lint">https://github.com/salsify/ember-cli-dependency-lint</a>. Be sure to leave your comments on <a href="https://github.com/emberjs/rfcs/pull/464">the current proposal</a>.</p>
<hr />
<h2 id="fnhelperrfchttpsgithubcomemberjsrfcspull470"><a href="https://github.com/emberjs/rfcs/pull/470"><code>{{fn}}</code> Helper RFC 🎉</a></h2>
<p>Check out the <code>{{fn}}</code> Helper RFC opened by <a href="https://github.com/rtablada">@rtablada</a> that introduces clear argument passing for functions in templates.</p>
<p>The <code>{{fn}}</code> RFC should solve for some of the complexity and confusion around the current action helper. The new <code>{{fn}}</code> helper will take in a function and set of arguments that are partially applied to the function (with no need for build time private APIs), and context binding will be done using the <code>@action</code> decorator in classes.</p>
<p>For more on the detailed design of the proposal, including comparisons to the action helper/modifier and some alternatives <a href="https://github.com/emberjs/rfcs/pull/470">see the full RFC</a>.</p>
<hr />
<h2 id="animationandpredictabledataloadinginemberhttpscrunchingnumberslive20190402animationandpredictabledataloadinginember"><a href="https://crunchingnumbers.live/2019/04/02/animation-and-predictable-data-loading-in-ember/">Animation and Predictable Data Loading in Ember 🐹</a></h2>
<p><a href="https://github.com/ijlee2">@ijlee2</a>, a first time attendee at <a href="https://emberconf.com/">EmberConf</a>, shares a <a href="https://crunchingnumbers.live/2019/04/02/animation-and-predictable-data-loading-in-ember/">tutorial</a> on how to load complex data in a predictable manner and how to <strong>use animations</strong> to liven up your Ember applications.</p>
<p>The <strong>tutorial</strong> covers how you can make animations using <a href="https://github.com/ember-animation/ember-animated">Ember Animated</a> and <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API">Web Animations API</a> to help make your applications feel more dynamic and polished!</p>
<p>Another interesting area the tutorial explores is <strong>predictable data loading</strong>, overcoming bugs that you may encounter when having models and relationships and how you can use <a href="https://github.com/embermap/ember-data-storefront">Ember Data Storefront</a> to aid tackling some of this issues! Definitely worth checking out!</p>
<p>Read the <a href="https://crunchingnumbers.live/2019/04/02/animation-and-predictable-data-loading-in-ember/">full article</a> alongside some video previews or check out a preview of the <a href="https://ember-animated.herokuapp.com/">demo app</a> from the tutorial.</p>
<hr />
<h2 id="reflectingonbeingaformernoobhttpsmediumcomadamzdaniellereflectingonbeingaformernoobd5e192907ae"><a href="https://medium.com/@adamzdanielle/reflecting-on-being-a-former-noob-d5e192907ae">Reflecting on Being a Former Noob 👶</a></h2>
<p>While realizing she's no longer a beginner, <a href="https://github.com/danielleadams">@danielleadams</a> documents her thoughts on what <strong>more experienced developers</strong> can do to <strong>help</strong> those <strong>newer</strong> to the tech industry and working as developers. Check out her <a href="https://medium.com/@adamzdanielle/reflecting-on-being-a-former-noob-d5e192907ae">blog post</a> on the subject, stemming from her experience being a <strong>mentor</strong> at EmberConf!</p>
<hr />
<h2 id="emberconf2019videosouthttpswwwyoutubecomplaylistlistple7tqudrkcyywlwrhgmwsvzsqbswclhyl"><a href="https://www.youtube.com/playlist?list=PLE7tQUdRKcyYWLWrHgmWsvzsQBSWCLHYL">EmberConf 2019 Videos Out 🎦</a></h2>
<p>If you missed the chance to see talks from <a href="https://emberconf.com/">EmberConf 2019</a>, worry no more! Starting today, you can <strong>watch all of them</strong> on <a href="https://www.youtube.com/playlist?list=PLE7tQUdRKcyYWLWrHgmWsvzsQBSWCLHYL">YouTube</a>. Please upvote the videos and <strong>share them</strong> with your teams, communities, family, and friends! 💜</p>
<hr />
<h2 id="embermakescodingfeelsogoodcomichttpstwittercomdelusioninaboxstatus1111468497782091779"><a href="https://twitter.com/delusioninabox/status/1111468497782091779">Ember Makes Coding Feel So Good Comic 💥</a></h2>
<p><a href="https://github.com/delusioninabox">@delusioninabox</a> created a <strong>comic</strong> about being able to work with Ember again after a long time away. Like, <strong>retweet</strong>, or comment on the <a href="https://twitter.com/delusioninabox/status/1111468497782091779">post on Twitter</a>!</p>
<div class="centered">
  <blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Daily 2,195! <a href="https://twitter.com/emberjs?ref_src=twsrc%5Etfw">@emberjs</a> just makes coding feel so good...so right. ❤😍 <a href="https://t.co/AJJ8UMIqY5">pic.twitter.com/AJJ8UMIqY5</a></p>&mdash; Laura Kajpust 👩‍💻🎨 (@delusioninabox) <a href="https://twitter.com/delusioninabox/status/1111468497782091779?ref_src=twsrc%5Etfw">March 29, 2019</a></blockquote>
  <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div>
<hr />
<h2 id="icontributetoemberwithchrisgarretthttpsdiscussemberjscomticontributetoemberwithchrisgarrett16395"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-chris-garrett/16395">"I contribute to Ember" with Chris Garrett 💬</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Chris Garrett" title="Chris Garrett - Contributor to Ember" src="/images/blog/emberjstimes/pzuraq.jpg" />
</div>
<p>In the 9th edition of the contributor interview series, community member <strong>Chris Garrett</strong>, also known as <a href="https://github.com/pzuraq">@pzuraq</a>, talks about his story getting involved with <strong>native classes</strong> and <strong>decorators</strong> in Ember. Chris also explains why everyone in the community is eager to help <strong>make your contribution</strong> a real <strong>success</strong> as well ✨</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-chris-garrett/16395">the Ember Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-chris-garrett/16395">Read more</a></p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/yohanmishkin" target="gh-user">@yohanmishkin</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/cibernox" target="gh-user">@cibernox</a>, <a href="https://github.com/bartocc" target="gh-user">@bartocc</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/raulb" target="gh-user">@raulb</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/danwenzel" target="gh-user">@danwenzel</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/dayton-bobbitt" target="gh-user">@dayton-bobbitt</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/dfreeman" target="gh-user">@dfreeman</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/czosel" target="gh-user">@czosel</a>, <a href="https://github.com/RichardOtvos" target="gh-user">@RichardOtvos</a>, <a href="https://github.com/dmzza" target="gh-user">@dmzza</a>, <a href="https://github.com/ClaytonTurner" target="gh-user">@ClaytonTurner</a>, <a href="https://github.com/mdbiscan" target="gh-user">@mdbiscan</a>, <a href="https://github.com/zachgarwood" target="gh-user">@zachgarwood</a> and <a href="https://github.com/Charizard" target="gh-user">@Charizard</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Lisa Huang-North, Jessica Jordan, Isaac Lee, Danielle Adams, Amy Lam, Bradley Leftley, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-92</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-92</guid><pubDate>Fri, 05 Apr 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 93]]></title><description><![CDATA[<p>ഹായ് Emberistas! 🐹</p>
<!--alex ignore special-->
<p>Welcome to a <strong>Survey Special</strong> of The Ember Times! Besides a <strong>call for contribution</strong> to the Ember Engines Guides MVP that we're featuring this week, this issue will highlight the <strong>results</strong> of this year's <strong>Ember Community Survey</strong>. With over 1200 responses, thanks to you, the results of this survey give a nice insight into the Ember Community, where we currently are and also what we can improve upon. You are welcome to <a href="https://emberjs.com/ember-community-survey-2019/">read the results yourself</a>, but we as Ember Times writers will give you a nice overview and highlight <strong>three main reasons</strong> why the community still <strong>loves to use Ember</strong> today, as well as ways that we can reflect and improve. So enjoy the read. 📜</p>
<!-- READMORE -->
<hr />
<h2 id="reason1communityhttpsemberjscomcommunity"><a href="https://emberjs.com/community">Reason #1. Community 🏆</a></h2>
<p>One great reason to use Ember is the <a href="https://emberjs.com/community">community</a> that you are/will be a part of. Ember provides a wide platform for everyone to be an active learner and contributor. Where will you discover yourself next?</p>
<p>This year, we surveyed 10 different ways to <a href="https://emberjs.com/ember-community-survey-2019/#MS_Q103">learn</a> and <a href="https://emberjs.com/ember-community-survey-2019/#MS_Q112">contribute</a>!</p>
<p>Our 5 most favorite places to learn: (drumrolls, please)</p>
<ul>
<li><a href="https://guides.emberjs.com/release/">Documentations</a> (71%)</li>
<li><a href="https://blog.emberjs.com/">Ember.js blog</a> (54%)</li>
<li><a href="https://github.com/emberjs/rfcs">RFCs</a> (52%)</li>
<li>Code samples (51%)</li>
<li>Blog posts (47%)</li>
</ul>
<p>And our 5 most favorite ways to give back: 🥁🥁🥁</p>
<ul>
<li>Attend Meetups and conferences (35%)</li>
<li>Open issues (35%)</li>
<li>Maintain addons (27%)</li>
<li>Open PRs (24%)</li>
<li>Answer community questions (16%)</li>
</ul>
<p>It's great to see that we all like to meet in person and share knowledge with each other. Each year, you can meet Ember devs from around the world at <a href="https://emberconf.com/">EmberConf</a>, <a href="http://embercamp.com/">EmberCamp</a>, and <a href="https://emberfest.eu/">EmberFest</a>. You can also meet them on a regular basis through <a href="https://emberjs.com/community/meetups/">Meetups</a>.</p>
<p>What can you do if there isn't a Meetup in your area? We'd like to suggest that you start small. Get together with a few friends for coffee or food, and catch up over latest Ember news. You can also throw a viewing party and watch together (1) past talks and (2) live streams 🍿. If you'd like to know more about starting your own Meetup, you can join the <code>#meetup-organizers</code> channel on Discord where we'd be happy to help you.</p>
<p>Side note 1. Please contact <a href="https://discordapp.com/channels/480462759797063690/480499718330253342">#discord-server-admin</a> to join the <code>#meetup-organizers</code> channel.</p>
<p>Side note 2. <a href="https://discordapp.com/invite/zT3asNS">If you haven't joined the Ember Community on Discord, do so today</a>! 😉</p>
<hr />
<h2 id="reason2stableandmorereliablethaneverhttpsemberjscomembercommunitysurvey2019ms_q401"><a href="https://emberjs.com/ember-community-survey-2019/#MS_Q401">Reason #2. Stable and More Reliable Than Ever 💪</a></h2>
<p>According to the results of the latest community survey, modern Ember apps are everywhere! We can see that a great number of Ember apps has kept up with the latest releases. Most Ember apps beyond 3.x were locked in at <a href="https://emberjs.com/ember-community-survey-2019/#MS_Q401">version 3.7, 3.4 and 3.8</a>.</p>
<!-- alex ignore easy -->
<p>Seeing that a great number of Ember apps has managed to keep up with some of the latest releases is quite striking. It shows that Ember continues to deliver on its promise of <strong>Stability without Stagnation</strong>. As a framework that has thrived in the fast-paced front-end ecosystem for over seven years, Ember has always promoted itself as a stable and reliable solution for developers who want to make sure that the applications they're building are not only functional, but also still easy to maintain and upgrade tomorrow.</p>
<p>A major contributing factor for the project's stability is <a href="https://emberjs.com/releases/">the fine-tuned release process</a> which offers a straightforward upgrade path. The release process has been refined several times in the past. A 6-week release cycle started with Ember 1.0 (that was more than 5 years ago!) and provided the community with beta and canary builds, as well as <a href="https://blog.emberjs.com/2013/09/06/new-ember-release-process.html">feature flags for public API changes that aren't yet released</a> for every single release. A few years later, the <a href="https://blog.emberjs.com/2016/02/25/announcing-embers-first-lts.html">LTS releases</a> made it even easier for developers to keep up with important updates and bug fixes while still being able to upgrade their applications smoothly in their own time.</p>
<p>Additionally, community-maintained tools such as <a href="https://github.com/ember-cli/ember-cli-update">Ember CLI Update</a> and a plethora of codemods support developers with their upgrades. The addon <a href="https://github.com/ember-cli/ember-try">Ember Try</a> is another great way to continuously test projects against the latest Ember releases and to upgrade with confidence.</p>
<p>The <strong>success of the LTS release</strong> is also reflected in the results of the latest survey, in which the <a href="https://emberjs.com/ember-community-survey-2019/#MS_Q401">2.18 and the 3.4 LTS release</a> are among the most popular versions of Ember that today's apps depend on.</p>
<p>Ember's success in providing stability and reliability shines also through the age of applications that the survey participants have built. Almost a third of the applications were <a href="https://emberjs.com/ember-community-survey-2019/#MS_Q409">more than 4 years old</a>. This emphasises that the community is not only able to build amazing products, but that it is also <strong>empowered to maintain</strong> those <strong>apps over an extraordinary long time</strong> without a rebuild.</p>
<hr />
<h2 id="reason3businesscasehttpsemberjscomembercommunitysurvey2019howlikelytorecommendember"><a href="https://emberjs.com/ember-community-survey-2019/#how-likely-to-recommend-ember">Reason #3. Business Case 💼</a></h2>
<p>Ember developers can make a strong case for choosing Ember at work. With stability comes peace of mind for business users, who "can relax knowing that deprecations &amp; breaking changes will be flagged up months/years in advance."</p>
<p>By choosing Ember, you can <strong>save your development team time</strong>, particularly once you're familiar with Ember. In recommending Ember, one respondent said:</p>
<blockquote>
  <p>You can learn Ember once and apply your knowledge in any other Ember project. That is an achievement which can't even be remotely accomplished by (other frameworks). Ember is always a coherent experience as all addons can be authored and consumed via the same tools. Spending less brainpower on tooling, setting up a testing environment, or writing testable code is a very good thing.</p>
</blockquote>
<p>But it can be <strong>challenging</strong> to sway folks outside of the community to Ember. For example, another survey respondent shared:</p>
<!-- alex ignore just -->
<blockquote>
  <p>[Ember] just isn't used broadly enough in my part of the country to encourage people in that direction. The exception is for a large team that is starting from scratch - there I would recommend it still.</p>
</blockquote>
<p>This quote reminded us of our past Readers’ Question from <a href="https://github.com/kategengler">@kategengler</a>, where she discussed <a href="https://discuss.emberjs.com/t/readers-questions-how-do-i-pitch-ember-at-my-company/14289">"How do I pitch Ember at my company?"</a> We thought it would be worthwhile to share some of her tips again:</p>
<ul>
<li>Ember is used by large corporations such as LinkedIn, Intercom, Discourse, Sentry, and others.</li>
<li>Everything you need is included out-of-the-box (router, data layer, build tool), but there’s also the flexibility to replace pieces if needed.</li>
<li>There are many high-quality community-contributed/maintained addons. There are well-established solutions for common needs such as deployment, internationalization, accessibility, user interface elements, etc. See more at <a href="https://emberobserver.com/">emberobserver.com</a>.</li>
<li>Ember CLI helps you get a local development environment going.</li>
<li>LTS releases ensure you don’t have to constantly update Ember to get bug and security fixes.</li>
<li>Ember evolves without making sudden breaking changes. API changes are signaled well in advance of a major version through deprecations, with the major versions merely removing those deprecated APIs.</li>
<li>The Ember community is active and helpful, and can be found in the <a href="https://discordapp.com/invite/zT3asNS">Ember Community on Discord</a>.</li>
</ul>
<hr />
<h2 id="howcanweimprovelookingaheadhttpsemberjscomembercommunitysurvey2019howcanweimproveember"><a href="https://emberjs.com/ember-community-survey-2019/#how-can-we-improve-ember">How Can We Improve? 💡 Looking Ahead… 👀🚀</a></h2>
<p>The community survey highlights and reinforces so many of the aspects we all know and love about Ember.js, the community, the productivity, the stability! ♥️🎉✨ But, the survey also gives us as community members a chance to reflect on <strong>things we can do better</strong>. 🤔</p>
<p>Specifically the survey <strong>empowers</strong> community members, gives us a voice and a chance to comment about <a href="https://emberjs.com/ember-community-survey-2019/#how-can-we-improve-ember">how we feel Ember can improve</a>. Some shout-outs this year include continuing to broaden and diversify opinions, lighter builds and less Ember-specific syntax.</p>
<p>Also, some of the <a href="https://www.youtube.com/playlist?list=PLE7tQUdRKcyYWLWrHgmWsvzsQBSWCLHYL">excellent talks</a> we heard at EmberConf in 2019, like <a href="https://github.com/melsumner">@MelSumner</a>'s amazing talk <a href="https://noti.st/melsumner/Phhimm/dont-break-the-web">Don't Break The Web</a>, highlighted the importance of improving accessibility not only in Ember, but also across the web as a whole.  </p>
<p>The results of the survey's <a href="https://emberjs.com/ember-community-survey-2019/#stack-skills">skillset self-appraisal</a> underscore this point. While many survey participants identified themselves as possessing advanced skills in areas like Ember, JavaScript, HTML and CSS, almost 70% of participants self-identified at a beginner level skill regarding Accessible Rich Internet Applications (ARIA). So it turns out many of us can improve our skills in building <strong>accessible applications</strong>, let's seize the opportunity to improve and act on this data! ✨💪✨</p>
<p>A big, big <strong>thank you</strong> to all of those who participated in the 2019 Ember Community Survey! With your participation the survey provides all of us with a platform for discussion and ideas and is a truly important part of how we can all help move Ember.js forward in 2019 and beyond! 🚀🚀🚀</p>
<hr />
<h2 id="questemberenginesguidesmvphttpstwittercommvillanderstatus1113833794237341696"><a href="https://twitter.com/MVillander/status/1113833794237341696">Quest: Ember Engines Guides MVP 🚂</a></h2>
<p><a href="https://github.com/villander">@villander</a> started a <a href="https://github.com/ember-engines/ember-engines-website/issues/55">quest issue</a> to track all the work left to do to get an MVP of the <a href="https://github.com/ember-engines/ember-engines">Ember Engines</a> Guides out!</p>
<p>There are tasks open from <a href="https://github.com/ember-engines/ember-engines/issues/540">moving docs</a> from the README to <a href="https://ember-engines.netlify.app/">ember-engines.netlify.app</a> to <a href="https://github.com/ember-engines/ember-engines-website/issues/57">clarifying the philosophy</a> and intended uses for engines. Plenty for everyone with <strong>all levels of experience</strong> with Ember Engines to <a href="https://github.com/ember-engines/ember-engines-website/issues/55">contribute</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kiwiupover" target="gh-user">@kiwiupover</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/luxferresum" target="gh-user">@luxferresum</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/miguelcobain" target="gh-user">@miguelcobain</a>, <a href="https://github.com/ghislaineguerin" target="gh-user">@ghislaineguerin</a>, <a href="https://github.com/BradLeftley" target="gh-user">@BradLeftley</a>, <a href="https://github.com/uchihamalolan" target="gh-user">@uchihamalolan</a>, <a href="https://github.com/RichardOtvos" target="gh-user">@RichardOtvos</a> and <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jared Galanis, Jessica Jordan, Amy Lam, Anne-Greeth van Herwijnen and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-93</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-93</guid><pubDate>Fri, 12 Apr 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 94]]></title><description><![CDATA[<p>Bonghjornu Emberistas! 🐹</p>
<!-- alex ignore simple -->
<p>This week: calling nested components in Angle Brackets Invocation Syntax 🔍, 2 RFCs for improving Ember Data 💬, an exclusive interview with Ember contributor @danielleadams 🎙, user impersonation with Ember Simple Auth 👤, check out code splitting on routes 🖖, a brand-new blog post about <code>@action</code>, <code>{{on}}</code> &amp; <code>{{fn}}</code> 🚀, and last, but not least, EmberCamp videos are live! 🍿</p>
<!-- READMORE -->
<hr />
<h2 id="nestedcomponentsinanglebracketsafirstlookhttpsembermapcomvideoanglebracketcomponentsafirstlook"><a href="https://embermap.com/video/angle-bracket-components-a-first-look">Nested Components in Angle Brackets: A First Look 🔍</a></h2>
<p>Starting Ember 3.10 (currently in beta), we can call <strong>nested components in angle brackets</strong>! 🎉🎉🎉 Recall, we want to use angle brackets to <strong>add clarity to code</strong>.</p>
<p>EmberMap gave us <a href="https://embermap.com/video/angle-bracket-components-a-first-look">a first look</a> at the new syntax and how to incrementally migrate our templates. For example, the template,</p>
<pre><code class="handlebars language-handlebars">{{#ui-grid columns='md:2 lg:3' gutters='md:3' as |grid|}}
  {{#each sortedEpisodes as |episode|}}
    {{#grid.column}}
      {{podcast/components/podcast-card episode=episode}}
    {{/grid.column}}
  {{/each}}
{{/ui-grid}}
</code></pre>
<p>would become,</p>
<pre><code class="handlebars language-handlebars">&lt;Grid @columns='md:2 lg:3' @gutters='md:3' as |grid|&gt;
  {{#each sortedEpisodes as |episode|}}
    &lt;grid.Column&gt;
      &lt;Podcast::Components::PodcastCard @episode={{episode}} /&gt;
    &lt;/grid.Column&gt;
  {{/each}}
&lt;/Grid&gt;
</code></pre>
<p>The best news? You don't have to wait till your app is at 3.10. Thanks to <a href="https://github.com/rwjblue">@rwjblue</a>, you can use a <a href="https://github.com/rwjblue/ember-angle-bracket-invocation-polyfill">polyfill</a> to get the full feature set of angle brackets today! 😃</p>
<p><a href="https://embermap.com/video/angle-bracket-components-a-first-look">Learn more about angle bracket components from EmberMap.</a></p>
<hr />
<h2 id="recorddatarfcrecordstatehttpsgithubcomemberjsrfcspull463"><a href="https://github.com/emberjs/rfcs/pull/463">Record Data RFC: Record State 💬</a></h2>
<p>In <a href="https://github.com/emberjs/rfcs/pull/463">RFC #463</a>, <a href="https://github.com/igorT">@igorT</a> asks for <strong>your help with improving the Record Data interface</strong> in Ember Data.</p>
<p>What is Record Data? <a href="https://blog.emberjs.com/2018/10/15/ember-3-5-released.html">Introduced in Ember 3.5</a>, Record Data was designed to…</p>
<ul>
<li>Help addons <strong>extend Ember Data without relying on private APIs</strong></li>
<li>Help apps <strong>manage relationships, dirty attributes, rollbacks, and specialized models</strong> via these addons</li>
</ul>
<p>In the RFC, <a href="https://github.com/igorT">@igorT</a> proposes that we add methods that return the <code>created</code> and <code>deleted</code> states of a record. These methods would be consumed by the addons to make correct decisions.</p>
<p>If you'd like to learn more, please take a look at <a href="https://github.com/emberjs/rfcs/pull/463">RFC #463</a>. Please also leave your feedback! ✍️</p>
<hr />
<h2 id="emberdatarfcrequeststateservicehttpsgithubcomemberjsrfcspull466"><a href="https://github.com/emberjs/rfcs/pull/466">Ember Data RFC: Request State Service 💬</a></h2>
<p>On a related note, <a href="https://github.com/igorT">@igorT</a> proposes in <a href="https://github.com/emberjs/rfcs/pull/466">RFC #466</a> that we create a <strong>Request State service</strong>, which returns the <code>in-flight</code> and <code>completed</code> states of a request. The service would, not only simplify how we determine the state of a request, but also help us work with data from multiple sources.</p>
<p>You can read more about the proposal in <a href="https://github.com/emberjs/rfcs/pull/466">RFC #466</a>. As always, feedback is welcome! 🙂</p>
<hr />
<h2 id="icontributetoemberwithdanielleadamshttpsdiscussemberjscomticontributetoemberwithdanielleadams16473"><a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-danielle-adams/16473">"I contribute to Ember" with Danielle Adams 🎙</a></h2>
<div class="float-right padded portrait-frame">
  <img alt="Danielle Adams" title="Danielle Adams - Contributor to Ember" src="/images/blog/emberjstimes/danielleadams.jpg" />
</div>
<p>In our 10th edition of the contributor interview series, community member <strong>Danielle Adams</strong>, also known as <a href="https://github.com/danielleadams">@danielleadams</a>, talks about her work as a <strong>mentor</strong>, conference <strong>MC</strong> and <strong>public speaker</strong> and shares tips to be present and confident when presenting your ideas. ✨</p>
<p>You can read the full interview on <a href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-danielle-adams/16473">the Ember Forum</a>.</p>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/i-contribute-to-ember-with-danielle-adams/16473">Read more</a></p>
<hr />
<h2 id="userimpersonationinsaaswithemberjsandrubyonrailshttpscodeandtechnocompostsuserimpersonationembersimpleauthdoorkeeper"><a href="https://codeandtechno.com/posts/user-impersonation-ember-simple-auth-doorkeeper/">User Impersonation in SaaS with Ember.js and Ruby on Rails 👤</a></h2>
<p>When developing SaaS (software as a service) applications, it is important to be able to log in as one of your users and see exactly what they see. This can help with debugging issues and aid your support team in assisting users.</p>
<!-- alex ignore simple -->
<p><a href="https://github.com/matixmatix">@matixmatix</a> has created an <strong>awesome tutorial</strong> on how this can be done using Ember.js (with <a href="https://ember-simple-auth.com/">Ember Simple Auth</a>) and Ruby on Rails (with <a href="https://github.com/doorkeeper-gem/doorkeeper">Doorkeeper</a> gem for OAuth2).</p>
<!-- alex ignore simple -->
<p>Achieving this is a fairly simple process. Normally, a client exchanges their username and password for an access token. To impersonate that user, we would need to create the token without the user's password. We can ask <em>DoorKeeper</em> to issue a new token for the provided user directly. Lastly, we update our existing <em>OAuth2</em> authorizer so that we can pass the token (instead of a password) to log in as that user.</p>
<p>Read <a href="https://github.com/matixmatix">@matixmatix</a>'s full <a href="https://codeandtechno.com/posts/user-impersonation-ember-simple-auth-doorkeeper/">tutorial</a> to get started!</p>
<hr />
<h2 id="codesplittingonrouteshttpstwittercomacorncomstatus1111827571803471872"><a href="https://twitter.com/acorncom/status/1111827571803471872">Code Splitting on Routes 🖖</a></h2>
<p>In <a href="https://github.com/embroider-build/embroider">Embroider</a>, an experimental build system for EmberJS, <a href="https://github.com/ef4">@ef4</a> <a href="https://github.com/embroider-build/embroider/pull/109">added</a> the <code>splitAtRoutes</code> option along with the <code>@embroider/router</code> package to enable per <strong>route code splitting</strong>. Ember applications can start testing route code splitting by sticking to community conventions.</p>
<p>Try out <a href="https://github.com/embroider-build/embroider">Embroider</a> today!</p>
<hr />
<h2 id="actiononfnblogposthttpswwwpzuraqcomemberoctaneupdateaction"><a href="https://www.pzuraq.com/ember-octane-update-action/">@action, on & fn blog post 🚀</a></h2>
<p>If you haven't been following the discussion on <code>@action</code>, <code>{{on}}</code>, and <code>{{fn}}</code>, this is the <strong>blog post for you</strong>!</p>
<p><a href="https://github.com/pzuraq">@pzuraq</a> continues his wonderful series of blog posts with a new one that focuses on the evolution of <code>@action</code>, <code>{{on}}</code>, and <code>{{fn}}</code> in detail.</p>
<p>The post covers some of the rationales for changing the use of <code>{{action}}</code> and how the use of the <code>@action</code> decorator will differ, including consideration of what the <strong>responsibilities of actions</strong> are and treatment of how decorators can help improve binding context.</p>
<!-- alex ignore period -->
<p>You also won't want to miss coverage of the <code>{{on}}</code> modifier that replaces event handling responsibilities of <code>{{action}}</code> and the <code>{{fn}}</code> partial application helper, both of which have RFC's that have moved into <strong>Final Comment Period (FCP)</strong>.</p>
<p>For more details, check out the full blog post <a href="https://www.pzuraq.com/ember-octane-update-action/">here</a>.</p>
<hr />
<h2 id="embercampvideosarelivehttpswwwyoutubecomplaylistlistpl4eq2dppybbmvtghmdbjui1qd5girifw"><a href="https://www.youtube.com/playlist?list=PL4eq2DPpyBbm-vTgHMdBjUi1Qd5GiRIfW">EmberCamp Videos are Live! 🍿</a></h2>
<p>Looking for some more Ember content to watch? The first batch of EmberCamp 2018 videos are now available!</p>
<p>We especially enjoyed <a href="https://github.com/toranb">@toranb</a>'s talk <a href="https://www.youtube.com/watch?v=wX8PxE0BVjI&list=PL4eq2DPpyBbm-vTgHMdBjUi1Qd5GiRIfW&index=4">Fast Feedback, Forward Progress</a> where he talks about ways to <strong>work smarter, not harder</strong> as developers. He shares ways to choose productivity with a few stories in Ember.</p>
<ul>
<li>Test driven development: Choose a feedback loop designed for experimentation and learning</li>
<li>Hot reloading: Choose a feedback loop designed with layout in mind</li>
<li>User experience: Choose a feedback loop your customers will love</li>
</ul>
<p>Stay tuned for future announcements by following <a href="https://twitter.com/embercamp">@embercamp</a> on Twitter. And <strong>save the date</strong>, EmberCamp Chicago 2019 will be on August 23rd.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/nlfurniss" target="gh-user">@nlfurniss</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/raido" target="gh-user">@raido</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/pete-the-pete" target="gh-user">@pete-the-pete</a>, <a href="https://github.com/dcyriller" target="gh-user">@dcyriller</a>, <a href="https://github.com/CvX" target="gh-user">@CvX</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/ef4" target="gh-user">@ef4</a> and <a href="https://github.com/chiragpat" target="gh-user">@chiragpat</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Isaac Lee, Bradley Leftley, Amy Lam, Jessica Jordan, Chris Ng, Jared Galanis and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-94</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-94</guid><pubDate>Fri, 19 Apr 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 95]]></title><description><![CDATA[<p>What's up Emberistas! 🐹</p>
<p>This week you can read about the Component Templates Co-location RFC 🖇️, the story behind ember-model-select 📔, the launch of ember-intl-analyzer 🚀, and EmberFest 2019 announced 🇩🇰!</p>
<!-- READMORE -->
<hr />
<h2 id="componenttemplatescolocationrfchttpsgithubcomemberjsrfcspull481"><a href="https://github.com/emberjs/rfcs/pull/481">Component Templates Co-location RFC 🖇️</a></h2>
<p><a href="https://github.com/chancancode">@chancancode</a> opened an RFC around placing the component’s class and template in the same directory on the file system. The proposed change is to move the templates from being located at <code>app/templates/components</code> into the <code>app/components</code> directory, co-locating it with the component’s JavaScript file.</p>
<p>This change provides component class/template coupling, a single source of truth for components, resolves deviations from route template conventions, and the lack of a single import. If you'd like to learn more, please take a look at <a href="https://github.com/emberjs/rfcs/pull/481">RFC #481</a>. Read, comment, and spread the word about it! 🖊️</p>
<hr />
<h2 id="thestorybehindembermodelselecthttpsnickschotnlblogcreatingembermodelselect"><a href="https://nickschot.nl/blog/creating-ember-model-select">The Story Behind ember-model-select 📔</a></h2>
<p>Often, inspiration for a new idea comes from combining the best of existing ideas.</p>
<p>For his <a href="https://nickschot.nl/blog/creating-ember-model-select">first blog post</a>, <a href="https://github.com/nickschot">@nickschot</a> shared how he was inspired to create the addon <a href="https://nickschot.github.io/ember-model-select/">ember-model-select</a>. 🎉</p>
<p>We can use ember-model-select to create a <code>select</code> dropdown that lets users (1) <strong>search for a model in Ember Data</strong> and (2) <strong>see an unlimited amount of data</strong>. @nickschot combined three popular addons to solve this problem: <a href="https://ember-power-select.com/">ember-power-select</a>, <a href="http://ember-concurrency.com">ember-concurrency</a>, and <a href="https://github.com/ember-infinity/ember-infinity">ember-infinity</a>.</p>
<p>To learn more about @nickschot's motivation and solution behind ember-model-select, <a href="https://nickschot.nl/blog/creating-ember-model-select">please check out his blog post</a>. 🙏</p>
<hr />
<h2 id="emberintlanalyzerlaunchedhttpsgithubcomsimplabsemberintlanalyzer"><a href="https://github.com/simplabs/ember-intl-analyzer">ember-intl-analyzer Launched! 🚀</a></h2>
<p><a href="https://github.com/simplabs/ember-intl-analyzer">ember-intl-analyzer</a> is the newest addition to our <a href="https://github.com/ember-intl/ember-intl">i18n toolset</a>, thanks to collaboration between <a href="https://simplabs.com/">Simplabs</a> and <a href="https://qonto.eu/">Qonto</a>.</p>
<p>This CLI tool can <strong>find unused translations</strong> in your component files. Soon, it will be able to <strong>find broken and missing translations</strong> too!</p>
<p><a href="https://github.com/simplabs/ember-intl-analyzer">Try ember-intl-analyzer on your app today. 💛</a></p>
<hr />
<h2 id="emberfest2019announcedhttpsemberfesteu"><a href="https://emberfest.eu/">EmberFest 2019 Announced 🇩🇰</a></h2>
<p>EmberFest will be held in <strong>Copenhagen</strong> this year, October 17-18! EmberFest is the <strong>European Community Ember Conference</strong>. Looking for updates on the latest and greatest in Ember and Glimmer? This is the place to be!</p>
<p>Check out the videos from <a href="https://www.youtube.com/playlist?list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9">EmberFest 2018</a> or follow <a href="https://twitter.com/EmberFest/">@EmberFest</a> on Twitter. Tickets are on sale now, and you can take advantage of early-bird pricing (limited availability). Hope to see you there!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kiwiupover" target="gh-user">@kiwiupover</a>, <a href="https://github.com/MonsieurDart" target="gh-user">@MonsieurDart</a>, <a href="https://github.com/step2yeung" target="gh-user">@step2yeung</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/RichardOtvos" target="gh-user">@RichardOtvos</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/mbinet" target="gh-user">@mbinet</a>, <a href="https://github.com/btecu" target="gh-user">@btecu</a>, <a href="https://github.com/romgere" target="gh-user">@romgere</a>, <a href="https://github.com/JonForest" target="gh-user">@JonForest</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/alexhancock" target="gh-user">@alexhancock</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/KamiKillertO" target="gh-user">@KamiKillertO</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/kgautreaux" target="gh-user">@kgautreaux</a>, <a href="https://github.com/wycats" target="gh-user">@wycats</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/dbendaou" target="gh-user">@dbendaou</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/mikias10" target="gh-user">@mikias10</a>, <a href="https://github.com/zion" target="gh-user">@zion</a>, <a href="https://github.com/hakilebara" target="gh-user">@hakilebara</a>, <a href="https://github.com/dougbanville" target="gh-user">@dougbanville</a>, <a href="https://github.com/meanking" target="gh-user">@meanking</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Jessica Jordan, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-95</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-95</guid><pubDate>Fri, 26 Apr 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 96]]></title><description><![CDATA[<p>Spring has sprung, Emberistas! 🐹</p>
<p>This week: arrival of <strong>decorators in Ember 3.10 & Octane</strong> ✨, a new season of <strong>May I Ask a Question</strong> 🙋, <strong>contributions</strong> from the <strong>EmberJS Paris</strong> contributor workshop 🇫🇷, <strong>easier navigation through concurrency</strong> in your app tests 🕗, interview with <strong>Edward Faulkner on Embroider</strong> 🎙️, and building an <strong>e-commerce app with Octane</strong> 🔥! Read on…</p>
<!-- READMORE -->
<hr />
<h2 id="decoratorsarriveinember310octanehttpswwwpzuraqcomemberoctaneupdatelandingdecorators"><a href="https://www.pzuraq.com/ember-octane-update-landing-decorators/">Decorators Arrive in Ember 3.10 & Octane ✨</a></h2>
<p>It's official: <strong>Decorators</strong> will be shipped with Ember 3.10 and Octane! 🎉</p>
<p>In <a href="https://www.pzuraq.com/ember-octane-update-landing-decorators/">his latest coverage of Octane</a>, <a href="https://github.com/pzuraq">Chris Garrett</a> explains which decorators Ember supports, why others from <a href="https://github.com/ember-decorators/ember-decorators">ember-decorators</a> addon weren't included, and how <a href="https://github.com/pzuraq/ember-decorators-polyfill">we can use a polyfill to start using decorators now</a>.</p>
<p>Please look forward to the launches of Ember 3.10 and Octane. <a href="https://www.pzuraq.com/ember-octane-update-landing-decorators/">Learn more about decorators today!</a></p>
<p>P.S. Send your congratulations to Chris on his wedding and honeymoon! 💐</p>
<hr />
<h2 id="season2mayiaskaquestionbeginshttpsjenwebernetlifycomemberjsstackoverflowlivestreamsreturn"><a href="https://jenweber.netlify.com/ember.js-stack-overflow-livestreams-return/">Season 2, "May I Ask a Question" Begins! 🙋</a></h2>
<p><a href="https://github.com/jenweber">Jen Weber</a> and <a href="https://github.com/mansona">Chris Manson</a> kicked off the month of May with a new season of <a href="https://www.youtube.com/channel/UCyErLHzPqLAkL1F-SivFDcA">May I Ask a Question</a>.</p>
<p>Each week, the two will discuss and solve <a href="https://stackoverflow.com/questions/tagged/ember.js?sort=newest&pageSize=15">Ember-related questions on Stack Overflow</a>—show us how we can answer community questions in an <strong>effective and encouraging</strong> way. 💞</p>
<p>To find out when the next live episode will air, please follow <a href="https://twitter.com/jwwweber">@jwwweber</a> and <a href="https://twitter.com/real_ate">@real_ate</a> on Twitter. Please read <a href="https://jenweber.netlify.com/ember.js-stack-overflow-livestreams-return/">Jen Weber's blog post</a> to learn more about their initiative!</p>
<hr />
<h2 id="merciforyourcontributionsatemberjsparishttpstwittercomemberjsparisstatus1120760348485799939"><a href="https://twitter.com/EmberJSParis/status/1120760348485799939">Merci for Your Contributions at EmberJS Paris 🐹🇫🇷</a></h2>
<p>Last week's <strong>contributor workshop</strong>, organised by the folks over at the <a href="https://twitter.com/EmberJSParis">EmberJS Paris meetup</a>, was a <strong>real success</strong>: with new changes to Ember CLI, improvements to Ember addons and even a brand-new RFC written, the Ember community gave back to the project, with some of the work even being made by first-time contributors! 🙌</p>
<p>Already feeling inspired to participate in or initiate your own <strong>Ember contributor workshop</strong>? Be sure to check out <a href="https://github.com/ember-learn/emberjs-contributors-workshop">these helpful resources to get you started</a>. And don't forget to check back on <a href="https://discordapp.com/invite/emberjs">#dev-ember-learning Discord channel</a> and the <a href="https://help-wanted.emberjs.com/">Ember Help Wanted app</a> to find something neat to work on. Codage heureux! 💻❤️</p>
<hr />
<h2 id="anewmilestoneformanagingconcurrencyinyourtestsuitehttpssalsifygithubiomilestones"><a href="https://salsify.github.io/milestones/">A New Milestone 💎 for Managing Concurrency in Your Test Suite 🕗</a></h2>
<p>Managing <strong>concurrency in your app</strong> can be hard (at least, until you start using <a href="http://ember-concurrency.com">ember-concurrency</a> ✨). Managing <strong>concurrency in your tests</strong> can be even harder.</p>
<!-- alex ignore easy -->
<p>But there's a new hope, called <a href="https://twitter.com/__dfreeman/status/1120410100227878913">Milestones</a>. Celebrating its first public release, this library helps you build apps with concurrent behaviour that's easy to navigate in both your dev and test environment. Check it out <a href="https://salsify.github.io/milestones/">today and give it a try</a>!</p>
<hr />
<h2 id="edwardfaulkneronembroideremberclismodernbuildsystemhttpsembermapcompodcastedwardfaulkneronembroideremberclismodernbuildsystem"><a href="https://embermap.com/podcast/edward-faulkner-on-embroider-ember-cli-s-modern-build-system">Edward Faulkner on Embroider, Ember CLI's Modern Build System 🎙️</a></h2>
<p>At <a href="https://youtu.be/zYwdBcmz6VI?t=2855">EmberConf 2019</a>, we got a surprise announcement of <a href="https://github.com/embroider-build/embroider">Embroider</a>, the <strong>next-gen build pipeline for Ember applications</strong>. 🧡</p>
<p><a href="https://embermap.com/podcast/edward-faulkner-on-embroider-ember-cli-s-modern-build-system">EmberMap sat down with Edward Faulkner</a>, the creator of Embroider, to provide us more information.</p>
<p>Some key messages are:</p>
<ul>
<li>Embroider embraces ES modules and pull-based builds. It includes <strong>only the code that your app needs.</strong> 💯</li>
<li>You can <a href="https://github.com/embroider-build/embroider#how-to-try-it">try out Embroider today</a>! Once you are able to build your app with the default settings, you can <a href="https://github.com/embroider-build/embroider#options">look at various options</a> to <strong>boost performance</strong> and <strong>allow route splitting</strong>. 🖖</li>
<li>If you are an addon developer, please work towards <a href="https://github.com/embroider-build/embroider/blob/master/SPEC.md">getting to the V2 format</a>. This will allow Embroider to skip the expensive 1st build stage for your addon. ⏭️</li>
</ul>
<p>Be sure to look out for an RFC to make Embroider the next build system for Ember. In the meantime, please check out <a href="https://embermap.com/podcast/edward-faulkner-on-embroider-ember-cli-s-modern-build-system">EmberMap's interview with Edward Faulkner</a>!</p>
<hr />
<h2 id="buildingwithoctanebybetocanthttpswwwyoutubecomwatchvknkws18v9da"><a href="https://www.youtube.com/watch?v=KnkWs18V9dA">Building with Octane, by Beto Cantú 🔥</a></h2>
<!-- alex ignore just -->
<p>At the inaugural <a href="https://www.meetup.com/EmberSA">Ember San Antonio Meetup</a>, Beto Cantú (<a href="https://github.com/betocantu93">@betocantu93</a>) presented <a href="https://github.com/betocantu93/octane-ecommerce">an e-commerce app that he had built</a> with <a href="https://emberjs.com/editions/octane/">Octane</a> (in just hours!).</p>
<p>In addition to new features such as <code>@tracked</code> and <code>{{on}}</code> modifier, Beto covered the fundamentals of Ember—from designing routes to deploying our app. This made a great introduction to attendees who had never used Ember before. 🤗</p>
<p>Please watch Beto's talk to <a href="https://www.youtube.com/watch?v=KnkWs18V9dA">learn more about building apps with Octane</a>. Don't forget to upvote and share it with your friends!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rileyhilliard" target="gh-user">@rileyhilliard</a>, <a href="https://github.com/dnalagatla" target="gh-user">@dnalagatla</a>, <a href="https://github.com/CvX" target="gh-user">@CvX</a>, <a href="https://github.com/greyhwndz" target="gh-user">@greyhwndz</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/villander" target="gh-user">@villander</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/rtablada" target="gh-user">@rtablada</a>, <a href="https://github.com/romgere" target="gh-user">@romgere</a>, <a href="https://github.com/hjdivad" target="gh-user">@hjdivad</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/nikhilsane" target="gh-user">@nikhilsane</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/chiragpat" target="gh-user">@chiragpat</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/lifeart" target="gh-user">@lifeart</a>, <a href="https://github.com/rondale-sc" target="gh-user">@rondale-sc</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Jessica Jordan, Isaac Lee, Amy Lam, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-96</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-96</guid><pubDate>Fri, 03 May 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 97]]></title><description><![CDATA[<p>Kaltxì Emberistas! 🐹</p>
<p>This week: the <strong>EmberFest</strong> 2019 CFP is now open 📝, build a GitHub Gist clone in <strong>Octane</strong> ⛽️,
RFC proposing <strong>deprecation</strong> of <code>mouseenter</code> + <code>mouseleave</code> <strong>Ember Events</strong> 🐁, and last, but not least, an interview with <strong>Yehuda Katz</strong> 🎙️!</p>
<!-- READMORE -->
<hr />
<h2 id="emberfest2019cfpisnowopenhttpscfpemberfesteu"><a href="https://cfp.emberfest.eu">EmberFest 2019 CFP is now open! 📝</a></h2>
<p><a href="https://emberfest.eu/">EmberFest</a> – the European Community Ember Conference – will be held at <a href="https://mogensdahl.dk">Mogens Dahl</a> in Copenhagen this year from October 17-18, 2019. They have recently <a href="https://twitter.com/EmberFest/status/1125441719921717251">announced</a> that the CFP is <strong>now open</strong> with a deadline at August 1, 2019.</p>
<p>EmberFest is looking for a wide range of talks, from in-depth technical talks to broader talks covering other aspects of software development. While Ember-related is best, EmberFest is open to considering talks that cover more general software / tech related topics that would be of interest to Ember developers.</p>
<p><a href="https://cfp.emberfest.eu/events/emberfest-2019">Submit your talk today!</a></p>
<hr />
<h2 id="buildagithubgistcloneinoctanehttpswwwyoutubecomwatchv_jfnuppx1n8"><a href="https://www.youtube.com/watch?v=_JfNuppX1n8">Build a GitHub Gist Clone in Octane ⛽️</a></h2>
<p>In this free video tutorial, <a href="https://www.youtube.com/channel/UCshZ3rdoCLjDYuTR_RBubzw">Program with Erik</a> and <a href="https://courses.happyprogrammer.net/">Jeffrey Biles</a> pair program on building a simplified GitHub Gist clone in Octane. Jeffrey explains how Octane is a set of features bundled together to create a <strong>new programming experience</strong>. This video is geared toward beginners, folks coming from other frameworks, or people who are coming back to Ember after awhile! Share it with a friend?</p>
<p>In addition to using the Octane blueprint, the tutorial makes use of <a href="https://github.com/shipshapecode/ember-prism">ember-prism</a> and <a href="https://github.com/ember-animation/ember-animated">ember-animated</a>. Check out the recording and use the <a href="https://github.com/ErikCH/octane-example">GitHub repo</a> as a reference to code along at home.</p>
<hr />
<h2 id="embereventdispatchercleanupforseveralmouseeventshttpsgithubcomemberjsrfcspull486"><a href="https://github.com/emberjs/rfcs/pull/486">Ember Event Dispatcher Clean Up for Several Mouse Events 🐁💥</a></h2>
<p>Since the early beginnings of Ember, the <strong>Ember Event Dispatcher</strong> handled the delegation of browser events in an application.
But some events are harder to delegate to the Dispatcher than others. In particular, the <code>mouseenter</code>🕳 ⬅️🐁 and the <code>mouseleave</code> 🕳🐁➡️ events need to be handled differently because they do not bubble up - a characteristic that Ember's Event Dispatcher usually relies on for event delegation.</p>
<p>In a <a href="https://github.com/simonihmig/rfcs/blob/deprecate-mouseenter/text/0486-deprecate-mouseenter.md">new RFC</a>, the writer of <a href="https://emberjs.github.io/rfcs/0386-remove-jquery.html">RFC #386</a> is back with a proposal to reduce the overhead of event handling for these rarely used event types.
In his proposal, <a href="https://github.com/simonihmig">@simonihmig</a> suggests the deprecation of <code>mouseleave</code> and <code>mouseenter</code> events in Ember's Event Dispatcher in favor of using native event listeners.</p>
<p>Read more about the <strong>motivation</strong> and the <strong>transition path</strong> for the proposed change <a href="https://github.com/emberjs/rfcs/pull/486">in the original RFC</a> and be sure to leave your questions, thoughts or suggestions in the comments below! ✍️</p>
<hr />
<h2 id="yehudakatzoncopypasterepeathttpscopypasterepeatsimplecastfm4460c8fc"><a href="https://copypasterepeat.simplecast.fm/4460c8fc">Yehuda Katz on Copy, Paste, Repeat 🎙️</a></h2>
<p><a href="https://copypasterepeat.simplecast.fm/4460c8fc">Episode 15 of Copy, Paste, Repeat</a> introduces us to <a href="https://github.com/wycats">Yehuda Katz</a>, the co-creator of Ember.</p>
<p>Some of the highlights are:</p>
<ul>
<li>How Yehuda started his career as a developer</li>
<li>Lessons learned from early Ember</li>
<li>Where the web may be in 5 years</li>
</ul>
<p>To learn more, we encourage you to <a href="https://copypasterepeat.simplecast.fm/4460c8fc">listen to this podcast episode</a>!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank<a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/dgeb" target="gh-user">@dgeb</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/zinyando" target="gh-user">@zinyando</a>, <a href="https://github.com/pete-the-pete" target="gh-user">@pete-the-pete</a>, <a href="https://github.com/HeroicEric" target="gh-user">@HeroicEric</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/tchak" target="gh-user">@tchak</a> and <a href="https://github.com/RichardOtvos" target="gh-user">@RichardOtvos</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Amy Lam, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-97</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-97</guid><pubDate>Fri, 10 May 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 98]]></title><description><![CDATA[<p>Goeie dag Emberistas! 🐹</p>
<!--alex ignore king-queen-->
<p>This week:
<code>model</code> hook illuminated in Ember.js Guides 💡,
EmberCamp CFP open 🏕,
Ember podcasts to keep us happy 📻🍩🎧,
a proposal to use Empress to render the Ember RFCs 📃,
a new release of the ember-shepherd addon 🚢,
the new EmberWork.com ✌️,
FAQs about Ember.js in 2019 🙋‍♀️🙋‍♂️, and last, but not least,
trapping focus 💥 for better <strong>a11y</strong> in your Ember apps!</p>
<!-- READMORE -->
<hr />
<h2 id="modelhookilluminatedinemberjsguideshttpsguidesemberjscomreleaseroutingspecifyingaroutesmodel"><a href="https://guides.emberjs.com/release/routing/specifying-a-routes-model/"><code>model</code> Hook, Illuminated in Ember.js Guides 💡</a></h2>
<p>If you haven't yet, please revisit and share the latest Ember.js Guides on <a href="https://guides.emberjs.com/release/routing/specifying-a-routes-model/">Specifying a Route's Model</a>! You will find <strong>beginner-friendly, comprehensive explanation</strong> of what you can do in a route's <code>model</code> hook. 💖</p>
<p>In particular, our guide now shows:</p>
<ul>
<li>Why we want to use the <code>model</code> hook</li>
<li>How to use <code>model</code>, depending on your use case and knowledge of Ember</li>
<li>How to use <strong>dynamic segments</strong> in <code>model</code></li>
<li>How to debug <code>model</code></li>
</ul>
<p>These updates are stepping stones to <a href="https://github.com/jenweber">@jenweber</a>'s <a href="https://github.com/ember-learn/guides-source/issues/20">major initiative to help developers learn Ember Data</a>. Please thank Jen for her positive work, as well as <a href="https://github.com/acorncom">@acorncom</a>, <a href="https://github.com/lisaychuang">@lisaychuang</a>, <a href="https://github.com/mike-north">@mike-north</a>, and <a href="https://github.com/zachgarwood">@zachgarwood</a> for their help with reviews!</p>
<hr />
<h2 id="embercampcfpopenhttpembercampcom"><a href="http://embercamp.com/">EmberCamp CFP Open 🏕</a></h2>
<p>Join us on September 16th for the second annual <a href="http://embercamp.com/">EmberCamp Chicago</a>! We’ll be hosting <strong>150+ of the world’s top Ember developers</strong> for a full day of Ember talks. Have a talk idea? The EmberCamp Call For Proposals (CFP) is open now through <strong>June 15th</strong>. If you submit early, you'll be able to receive feedback before the CFP closes!</p>
<p>Proposal types:</p>
<ul>
<li>30 minute talks</li>
<li>10 minute talks</li>
<li>30-90 minute workshops</li>
<li>30-90 minute activities (new this year!)</li>
</ul>
<p>Whether you want to come enjoy the breathtaking views, make new Ember friends, or get the scoop on what's coming next—EmberCamp Chicago is the place to be!</p>
<hr />
<h2 id="jabberawayaboutjavascripthttpstwittercomsamselikoffstatus1128351412881063937"><a href="https://twitter.com/samselikoff/status/1128351412881063937">Jabber Away about Javascript 📻</a></h2>
<p>A new podcast episode of <a href="https://twitter.com/JSJabber">Javascript Jabber</a> has been released in which <a href="https://twitter.com/samselikoff">Sam Selikoff</a> is interviewed by <a href="https://twitter.com/solderjs">AJ ONeal</a> about <strong>Ember</strong>. 🐹 They go into detail regarding how Sam got started working with Ember and they also talked a little bit about the <strong>history of the Ember framework</strong>.</p>
<p>From the <a href="https://devchat.tv/js-jabber/jsj-364-ember-octane-with-sam-selikoff/">shownotes</a>:</p>
<blockquote>
  <p>Sam mentions some of the biggest advantages in using Ember, and what it should and should not be used for. He explains the architecture of Ember apps, addresses some of the performance concerns and then goes into Octane in detail.</p>
</blockquote>
<p>So make sure to <a href="https://devchat.tv/js-jabber/jsj-364-ember-octane-with-sam-selikoff/">give it a listen</a>! 🎧 You can tell us, and Sam, what you thought on the <a href="https://discordapp.com/channels/480462759797063690/486955806588403773/">#media channel</a> on <a href="https://discordapp.com/invite/zT3asNS">Discord</a>.</p>
<hr />
<h2 id="doordonutthereisnosizzlepiehttpstwittercomemberweekendstatus1116022639015940096"><a href="https://twitter.com/emberweekend/status/1116022639015940096">Do or Donut, There is No Sizzlepie 🍩</a></h2>
<p>The <a href="https://twitter.com/emberweekend">Ember Weekend Podcast</a> released an episode last month in which Chase, Robert, and Jonathan chat about various topics such as: an <strong>EmberConf recap</strong> (including <em>secret donut</em> info and <em>Sizzlepies</em>! 🥧), the <strong>Octane preview</strong> (including a <a href="https://www.youtube.com/watch?v=BV09blWlc64">video</a> by <a href="https://twitter.com/gavinjoyce">@gavinjoyce</a>), <a href="https://github.com/embroider-build/embroider">Embroider</a>, as well as an <a href="https://embermap.com/topics/intro-to-broccoli">EmberMap video "An Intro to Broccoli.js"</a>.</p>
<!--alex ignore dad-mom hostesses-hosts-->
<p><a href="https://emberweekend.com/episodes/do-or-donut">Check it out here</a>! 🎙 And pop into <a href="https://discordapp.com/channels/480462759797063690/486955806588403773/">#media</a> to share your thoughts with the community and the hosts!</p>
<hr />
<!--alex ignore king-queen-->
<h2 id="useempresstorendertheemberrfcshttpsgithubcomemberjsrfcspull489"><a href="https://github.com/emberjs/rfcs/pull/489">Use Empress to Render the Ember RFCs 📃</a></h2>
<!--alex ignore king-queen-->
<p><a href="https://github.com/mansona">@mansona</a> proposed an implementation change to how we currently "render" our RFCs in the <a href="https://emberjs.github.io/rfcs/">website</a>. The proposed change is to move from using <code>mdbook</code>, which provides better formatting for markdown files, to employing <a href="https://github.com/empress">Empress</a> techniques to render the RFC pages.</p>
<p>In the same proposal, the official URL of an RFC was proposed to move from <code>https://emberjs.github.io/rfcs/0425-website-redesign.html</code> to <code>https://rfcs.emberjs.com/0425-website-redesign/</code>. This would then be considered a stable URL and will require us to maintain redirects if we ever change them.</p>
<p>Read and comment more on <a href="https://github.com/emberjs/rfcs/pull/489">GitHub</a> about the proposed change!</p>
<hr />
<h2 id="anewversionoftheembershepherdaddonhttpstwittercomshipshapecodestatus1124490696843583490"><a href="https://twitter.com/shipshapecode/status/1124490696843583490">A New Version of the ember-shepherd Addon 🚀</a></h2>
<p><a href="https://github.com/rwwagner90">@rwwagner90</a>, <a href="https://github.com/st-h">@st-h</a>, and the crew at <a href="https://github.com/shipshapecode">Ship Shape</a> have released 🚢 version 5.0.0 of the <strong>ember-shepherd addon</strong>, an awesome site tour library. The updated version includes improved loading speeds⚡️ due to lazy loading with ember-auto-import.</p>
<p>In related news, Shepherd, the JavaScript library that underlies the ember addon that <strong>Ship Shape</strong> also maintains, <a href="https://twitter.com/shipshapecode/status/1122673639932014593">has been trending 📈 on Github</a>!</p>
<p>Check out the new release of ember-shepherd <a href="https://github.com/shipshapecode/ember-shepherd">here</a>.</p>
<hr />
<h2 id="emberworkcomhttpsemberworkcom"><a href="https://emberwork.com/">EmberWork.com ✌️</a></h2>
<p>We often hear folks say they want to work in Ember, but they can't find an Ember role! There's a new community resource for that—<a href="https://emberwork.com/">Ember Work</a>. Ember Work was built to make things <strong>a little easier</strong> on you. No more scouring LinkedIn or other sources. And no more jobs that are not <em>quite</em> Ember.</p>
<p>Have an open role on your team? Share it on <a href="https://emberwork.com/">Ember Work</a> for free. (While you're at it, post it on <a href="https://discordapp.com/channels/480462759797063690/480523148102467623">#ember-jobs</a> on Discord too!) Thanks <a href="https://github.com/herzzanu">@herzzanu</a> and <a href="https://github.com/Exelord">@Exelord</a> for building this resource for the community. 💼</p>
<hr />
<h2 id="faqsaboutemberjsin2019httpsmediumcomemberishfaqsaboutemberjsin201964efabbf84e6"><a href="https://medium.com/ember-ish/faqs-about-ember-js-in-2019-64efabbf84e6">FAQs about Ember.js in 2019 🙋‍♀️🙋‍♂️</a></h2>
<p>As developers who have worked with Ember for years, we can sometimes forget that we had once approached Ember with a bit of curiosity 😋, a bit of caution 😧, and a bit of confusion 🤕. As Ember approaches its 8th birthday, we want to continue to reach out to the wider JavaScript community, welcome new developers, and help out with their questions.</p>
<p>This week, <a href="https://github.com/jenweber">@jenweber</a> took her time to <a href="https://medium.com/ember-ish/faqs-about-ember-js-in-2019-64efabbf84e6">engage a wide audience on Medium</a> and answer commonly asked questions about Ember. <em>What companies use Ember? What is Octane? How can I get started with learning Ember?</em></p>
<p>We encourage you to <a href="https://medium.com/ember-ish/faqs-about-ember-js-in-2019-64efabbf84e6">read and share the blog post</a>! If you have time, we encourage you to pen and share your Ember article as well. 🙏</p>
<hr />
<!-- alex disable trap -->
<h2 id="intentionalelementfocuswithemberfocustraphttpstwittercomjosemarluedkestatus1127967059415953408"><a href="https://twitter.com/josemarluedke/status/1127967059415953408">Intentional Element Focus with Ember Focus Trap 💥</a></h2>
<p>On May 16th, <strong>Global Accessibility Awareness Day (GAAD)</strong> inspired developers all around the world to reflect on the way they use and build applications for the web. In her <a href="https://blog.emberjs.com/2019/05/13/global-accessibility-awareness-day.html">recent call-to-action for GAAD</a> 📣, <a href="https://github.com/MelSumner">@MelSumner</a> encouraged the Ember community to take the time to browse the web using keyboard or an assistive technology, and to spend time to improve accessibility in their own projects.</p>
<p>Addon author <a href="https://github.com/josemarluedke">@josemarluedke</a> followed this call-to-action and published <a href="https://github.com/josemarluedke/ember-focus-trap">Ember Focus Trap</a>! It's based on the JavaScript library <a href="https://github.com/davidtheclark/focus-trap">Focus Trap</a> that helps you to intentionally trap focus in certain DOM nodes. This helps you improve the keyboard accessibility of otherwise inaccessible elements such as modal dialogs.</p>
<p>With <strong>Ember Focus Trap</strong>, adding focus to interactive elements in your Ember app is only an <code>ember install</code> away. Check it <a href="https://josemarluedke.github.io/ember-focus-trap/">out today</a>!</p>
<!-- alex enable trap -->
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/tendermario" target="gh-user">@tendermario</a>, <a href="https://github.com/vasind" target="gh-user">@vasind</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/maurodibert" target="gh-user">@maurodibert</a>, <a href="https://github.com/2hu12" target="gh-user">@2hu12</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/NullVoxPopuli" target="gh-user">@NullVoxPopuli</a>, <a href="https://github.com/chiragpat" target="gh-user">@chiragpat</a>, <a href="https://github.com/pete-the-pete" target="gh-user">@pete-the-pete</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/scalvert" target="gh-user">@scalvert</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/maxfierke" target="gh-user">@maxfierke</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/jamescdavis" target="gh-user">@jamescdavis</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a> and <a href="https://github.com/ef4" target="gh-user">@ef4</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Isaac Lee, Amy Lam, Alon Bukai, Jared Galanis, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-98</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-98</guid><pubDate>Fri, 17 May 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 99]]></title><description><![CDATA[<p>你好 Emberistas! 🐹</p>
<p>Submit your input for Ember's 2019 Roadmap ✍️,
Ember 3.10 released 🔟,
new ways for you to mock requests in Fastboot tests 👢💨,
faster builds on Windows with Docker 🐳,
new addon ember-did-resize-modifier released 📐,
and last, but not least, Crash Log: a new Ember and more podcast 🎙!</p>
<!-- READMORE -->
<hr />
<h2 id="embers2019roadmapcallforblogpostshttpsblogemberjscom20190520ember2019roadmapcallforpostshtml"><a href="https://blog.emberjs.com/2019/05/20/ember-2019-roadmap-call-for-posts.html">Ember's 2019 Roadmap: Call for Blog Posts ✍️</a></h2>
<p>It’s that time of the year again! With the <a href="https://github.com/emberjs/rfcs/blob/master/text/0364-roadmap-2018.md">2018 Roadmap</a> underway, it’s time to think about what Ember will look like in 2019! The Roadmap process is part of Ember’s ongoing effort to have collaborative, clear, and published project-wide goals each year.</p>
<p>We want your input on what the priorities are for Ember in 2019. You can talk about Ember Data, Ember CLI, learning, tooling, the community, addons, and anything else Ember-related. To start you off, we have early 2019 blog posts from <a href="http://www.melsumner.com/blog/ember/the-road-goes-data-way/">@MelSumner</a>, <a href="https://yehudakatz.com/2019/05/20/ember-2019/">@wycats</a>, and <a href="https://nullvoxpopuli.com/2019-05-14-ember-2019-roadmap/">@NullVoxPopuli</a>! Make sure you get yours in before the <strong>June 17th deadline</strong> (it can be anything from a company blog post to a <a href="https://gist.github.com/">GitHub gist</a>)!</p>
<p>To contribute a post: <strong>Tweet a link</strong> to the post with the hashtag <a href="https://twitter.com/hashtag/emberjs2019">#EmberJS2019</a> or <strong>email a link</strong> to <a href="mailto:roadmap@emberjs.com">roadmap@emberjs.com</a>. These posts will be collected and categorized, and each one will be read by those working to draft the Roadmap RFC.</p>
<hr />
<h2 id="ember310releasedhttpsblogemberjscom20190521ember310releasedhtml"><a href="https://blog.emberjs.com/2019/05/21/ember-3-10-released.html">Ember 3.10 Released 🔟</a></h2>
<p>Ember 3.10 is here! This release has a whole bunch of new features: Angle Bracket Invocation for Nested Components, Angle Bracket Invocation for Built-In Components, RouteInfo Metadata, and Native Decorator Support. Addon authors will want to read about support for Node 6 being dropped before running their next release.</p>
<p>Note: Releases are <strong>considered done</strong> when the <a href="https://blog.emberjs.com/2019/05/21/ember-3-10-released.html">blog post</a> goes out. Upgrading your Ember app? Check out the official blog post for pointers. Sometimes, there are small bugs that get patched between when the version shows up on npm and the blog post. For example, Ember CLI version 3.10.1 fixes a small issue with Node versions in CI.</p>
<hr />
<h2 id="networkmockingforyourfastbootappwithemberclifastboottestinghttpstwittercomsamselikoffstatus1126510237723193345"><a href="https://twitter.com/samselikoff/status/1126510237723193345">Network Mocking for Your Fastboot App with Ember CLI Fastboot Testing 👢💨</a></h2>
<p>Building a <a href="https://ember-fastboot.com/">Fastboot</a> powered Ember application? Struggling with <strong>writing meaningful tests</strong> for it, that take into account outgoing network requests?</p>
<p>Imagine if you could <strong>mock network requests</strong> for your Fastboot test suite with ease, like you do with <a href="https://www.ember-cli-mirage.com/">Ember CLI Mirage</a> when testing the client-side of your app.</p>
<p>Your testing dreams can come true! <a href="https://embermap.github.io/ember-cli-fastboot-testing/">Ember CLI Fastboot Testing</a> provides you with useful test helpers and a mock server for intercepting requests from your Fastboot app while testing. Learn how to mock network requests with it by checking out this <a href="https://embermap.com/video/fastboot-network-mocking">amazing introduction</a> by <a href="https://embermap.com">our friends at EmberMap</a> and test away! ✨</p>
<hr />
<h2 id="fasteremberbuildswithdockeronwindowshttpsdevtodustinsoftwarebuildhacksfasteremberbuildswithdockeronwindows7e1"><a href="https://dev.to/dustinsoftware/build-hacks-faster-ember-builds-with-docker-on-windows-7e1">Faster Ember Builds with Docker on Windows 🐳</a></h2>
<p>Ember builds, which make use of temporary files, have traditionally been slow on Windows due to its file system. <a href="https://github.com/dustinsoftware">@dustinsoftware</a>, who wanted to empower Windows developers on his team, investigated using <a href="https://docs.docker.com/docker-for-windows/">Docker</a> to speed up and simplify their builds.</p>
<p>The results? About <strong>70% faster first build time</strong> and <strong>785% faster rebuild time</strong>! 🙌</p>
<p>Please check out <a href="https://dev.to/dustinsoftware/build-hacks-faster-ember-builds-with-docker-on-windows-7e1">Dustin's blog post</a> and <a href="https://github.com/dustinsoftware/ember-docker-starter">GitHub repo</a> to learn how you can set up Docker (with CI) for your Ember app!</p>
<hr />
<h2 id="resizinglikeaprohttpsgithubcomgmurpheyemberdidresizemodifier"><a href="https://github.com/gmurphey/ember-did-resize-modifier">Resizing Like a Pro 📐</a></h2>
<p>Have you ever found yourself trying to implement changes to your application based on element resizing? Well, then we have good news for you: <a href="https://github.com/gmurphey/ember-did-resize-modifier">ember-did-resize-modifier</a> is a great new addon that helps you by calling a callback whenever a given element is resized.</p>
<p>Check out the <a href="https://github.com/gmurphey/ember-did-resize-modifier#readme">README</a> for more information on what you can do with this addon.</p>
<hr />
<h2 id="newpodcastcrashloghttpscrashlogtransistorfm"><a href="https://crashlog.transistor.fm/">New Podcast: Crash Log 🎙</a></h2>
<p><a href="https://github.com/davewasmer">@davewasmer</a> and <a href="https://github.com/knownasilya">@kwownasilya</a> silently launched <strong>Crash Log</strong>, a weekly podcast with the Crash Engineering team covering the journey of building an Ember and Node web app. Tune in to hear about development, startup life, Ember.js, GraphQL, functional CSS frameworks, EmberConf, data fetching in realtime, and more! Check out the first three episodes at <a href="https://crashlog.transistor.fm/">TransistorFM</a>, <a href="https://podcasts.apple.com/us/podcast/crash-log/id1462819338">iTunes</a> or <a href="https://open.spotify.com/show/2gKJbmJCvCKJV0KfnUNI0b">Spotify</a>.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/villander" target="gh-user">@villander</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/makepanic" target="gh-user">@makepanic</a>, <a href="https://github.com/chriskrycho" target="gh-user">@chriskrycho</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/mixonic" target="gh-user">@mixonic</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/abhilashlr" target="gh-user">@abhilashlr</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/jrowlingson" target="gh-user">@jrowlingson</a>, <a href="https://github.com/ryanto" target="gh-user">@ryanto</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/rnegron" target="gh-user">@rnegron</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/NullVoxPopuli" target="gh-user">@NullVoxPopuli</a>, <a href="https://github.com/konstankinollc" target="gh-user">@konstankinollc</a>, <a href="https://github.com/tendermario" target="gh-user">@tendermario</a>, and <a href="https://github.com/maurodibert" target="gh-user">@maurodibert</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsblogemberjscomtagsnewsletterhtml"><a href="https://blog.emberjs.com/tags/newsletter.html">#embertimes 📰</a></h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Jessica Jordan, Isaac Lee, Kenneth Larsen, Amy Lam and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-ember-times-issue-99</link><guid isPermaLink="true">https://blog.emberjs.com/the-ember-times-issue-99</guid><pubDate>Fri, 24 May 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 43]]></title><description><![CDATA[<p>Ola Emberistas!</p>
<p>This week we <strong>try out another format</strong> for the <a href="https://the-emberjs-times.ongoodbits.com/">newsletter</a>
and bring it right to the Ember blog - making it accessible to even more Ember enthusiasts in the community.</p>
<p>And this week we not only have news about the <strong>2018 roadmap for Ember CLI</strong> for you,
but also highlights from the latest <strong>Ember 3.1 release</strong>.
Last but not least, a <strong>new Readers' Question</strong> about a neat new syntax feature is waiting for you.</p>
<p>Here's what's happened this week 🐹:</p>
<!-- READMORE -->
<hr />
<h2 id="theroadaheadforembercliin2018httpsdiscussemberjscomtembercli2018edition14543"><a href="https://discuss.emberjs.com/t/ember-cli-2018-edition/14543">The Road Ahead for Ember CLI in 2018</a></h2>
<p>This week the Ember CLI team has published their <strong>official roadmap</strong> for the
command-line tool to keep the Ember community posted on which shiny new things
might be landing in an Ember app near you soon.</p>
<p>The current project goals for 2018 include a dedicated transition story to
<a href="https://github.com/emberjs/rfcs/pull/143">Module Unification</a>, enabling
<a href="https://github.com/ember-cli/rfcs/pull/110">Treeshaking</a>, adding service worker support
to the blueprint of Ember apps by default and many other exciting topics.</p>
<p>You can <strong>read more</strong> about the roadmap on the <a href="https://discuss.emberjs.com/t/ember-cli-2018-edition/14543">Ember Forum</a>
and give your thoughts and suggestions in the discussion.</p>
<hr />
<h2 id="timetogetyouremberreleasethees5wayblog20180413ember31releasedhtml"><a href="/blog/2018/04/13/ember-3-1-released.html">Time to get your Ember release the ES5 way</a></h2>
<div class="blog-row">
  <img class="transparent padded float-left small" src="/images/brand/ember_Ember-Light.png" alt="Ember Brand Logo" />

  <p>
    With <strong>Ember 3.1</strong> you can now use <strong>ES5 getters</strong> to read the
    values from your computed properties since our target browsers support ES5 getters.
    The motivation is to improve developer ergonomics and interoperability with other tooling and libraries.
    For the property to recompute you still need to use <code>this.set()</code> or <code>Ember.set()</code>.</p>
  <p>
    Yet, this doesn’t mean that <code>this.get()</code> is now deprecated.
    There’s actually still a lot of cases where you should use <code>this.get()</code> instead of the ES5 getter.
    You can read all about it in the <a href="https://www.emberjs.com/blog/2018/04/13/ember-3-1-released.html#toc_es5-getters-for-computed-properties-1-of-3"><strong>release post</strong></a>.
  </p>
</div>
<p><a class="ember-button ember-button--centered" href="https://www.emberjs.com/blog/2018/04/13/ember-3-1-released.html#toc_es5-getters-for-computed-properties-1-of-3">Read more</a></p>
<h2 id="saymorehttpsgithubcomemberjsrfcspull327"><a href="https://github.com/emberjs/rfcs/pull/327">Say More</a></h2>
<p>A new RFC (Request for Comments) by <a href="https://github.com/jgwhite">@jgwhite</a> has landed, titled "Semantic Test Selectors."
The motivation behind this RFC first appeared in his talk <a href="https://www.youtube.com/watch?v=iAyRVPSOpy8">Say More</a> at EmberConf 2018.
The RFC describes, in 2 parts, how to write tests that "say more" about what the test is actually doing by writing less.  </p>
<p>Essentially the RFC proposes using labels, rather than selectors, to interact with elements in tests.  For example</p>
<pre><code class="javascript language-javascript">await fillIn('.login-form .field-email', 'alice@example.com');
await fillIn('.login-form .field-password', 'topsecret');
await click('.submit-btn');
</code></pre>
<p>becomes</p>
<pre><code class="javascript language-javascript">await fillIn('Email', 'alice@example.com');
await fillIn('Password', 'topsecret');
await click('Log in');
</code></pre>
<p>How do we get there?  One way is accessibility.
By delivering accessible, first-class Ember apps by default, you instantly have semantic access to elements because they are labeled in a meaningful way.
As <a href="https://github.com/jgwhite">@jgwhite</a>  eloquently puts it</p>
<blockquote>
  <p><cite>"If we want to access a UI element in a test, we do so as if we were using a screen reader."</cite></p>
</blockquote>
<p>Want to know more? The RFC is incredibly well written and it deserves a proper reading.  Head over to <a href="https://github.com/emberjs/rfcs/pull/327">RFC#327</a> to be part of an evolutionary way to test your Ember apps!</p>
<hr />
<h2 id="learningteamhappeningshttpsembertwiddlecom"><a href="https://ember-twiddle.com/">Learning Team happenings</a></h2>
<p><a href="https://ember-twiddle.com/">Ember Twiddle</a> now (finally!) uses Babel 6 instead of Babel 5 to transpile your code. Please encourage folks to test the canary so that any issues with Ember addons and existing twiddles might be found. Thanks for the update <a href="https://github.com/Gaurav0">@Gaurav0</a>!</p>
<p>The Learning Team merged a bunch of pull requests in emberjs/guides recently, many from first time contributors - thank you <a href="https://github.com/sdhull">@sdhull</a>. <a href="https://github.com/rmminusrfslash">@rmminusrfslash</a>, <a href="https://github.com/karan-pathak">@karan-pathak</a> and <a href="https://github.com/chrisrng">@chrisrng</a>. The Learning Team is working on closing out outstanding issues and PRs on emberjs/guides in an effort to launch the built with Ember <a href="https://github.com/ember-learn/guides-app">ember-learn/guides-app</a> in its place! 🔜</p>
<hr />
<h2 id="weloveemberjstimeshttpsembercommunityslackcommessagesc8p6upwnn"><a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">We love Ember.js Times 😍</a></h2>
<p>Do you? If so, contribute!  The Ember Times is always looking for people to help spread the word about all things Ember.
Drop by the Slack channel to <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/">say "hi!"</a> and learn how to get started.</p>
<hr />
<h2 id="embercliupdateupdatedhttpsgithubcomembercliembercliupdateoptions"><a href="https://github.com/ember-cli/ember-cli-update#options">Ember CLI Update Updated 🐹 ⬆️</a></h2>
<p><strong>Ember CLI Update</strong> which last week was brought in under the official ember-cli GitHub
organization has gotten an update. It now has two new commands that will help you keep your apps updated and using the latest and greatest in Emberland.
These new commands are <code>--dry-run</code> and <code>--list-codemods</code>.</p>
<p>The first, <code>--dry-run</code>, will give you a quick explanation of what running the update will do.
For example running</p>
<pre><code class="bash language-bash">ember-cli-update --dry-run
</code></pre>
<p>on an app running Ember v2.15.1 would output: <code>Would update from 2.15.1 to 3.1.2.</code></p>
<p>The second, <code>--list-codemods</code>, will give you a list of the available codemods along with more info about them.</p>
<p>Currently the codemods supported are:
<code>ember-modules-codemod</code>, <code>ember-qunit-codemod</code>, <code>ember-test-helpers-codemod</code>, and <code>es5-getter-ember-codemod</code>.
That last codemod helps your project use the native ES5 getters that were described up above.</p>
<p>A quick reminder that <em>ember-cli-update</em> has been accepted to be the <strong>official way</strong> to <strong>update Ember apps</strong>
so if you aren't currently using it, now is a great time to start!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv310contributingrepositories"><a href="https://guides.emberjs.com/v3.1.0/contributing/repositories/">Contributor's Corner</a></h2>
<div  class="blog-row">
 <p>
  A shout out to all the amazing contributors who worked on Ember core projects this week:
  <a href="https://github.com/Dhaulagiri" target="gh-user">@Dhaulagiri</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/GavinJoyce" target="gh-user">@GavinJoyce</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/ctrlaltjustine" target="gh-user">@ctrlaltjustine</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/jheth" target="gh-user">@jheth</a>, <a href="https://github.com/ryanto" target="gh-user">@ryanto</a>, <a href="https://github.com/EndangeredMassa" target="gh-user">@EndangeredMassa</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/efx" target="gh-user">@efx</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/Bestra" target="gh-user">@Bestra</a>, <a href="https://github.com/sdhull" target="gh-user">@sdhull</a>, <a href="https://github.com/karan-pathak" target="gh-user">@karan-pathak</a>, <a href="https://github.com/itzsaga" target="gh-user">@itzsaga</a>, <a href="https://github.com/jonnii" target="gh-user">@jonnii</a>, <a href="https://github.com/ajcolter" target="gh-user">@ajcolter</a>, <a href="https://github.com/strout" target="gh-user">@strout</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/lennyburdette" target="gh-user">@lennyburdette</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/arthirm" target="gh-user">@arthirm</a>, <a href="https://github.com/eliasmelgaco" target="gh-user">@eliasmelgaco</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/williamhaley" target="gh-user">@williamhaley</a>, <a href="https://github.com/rmminusrfslash" target="gh-user">@rmminusrfslash</a>, <a href="https://github.com/san650" target="gh-user">@san650</a> and <a href="https://github.com/mansona" target="gh-user">@mansona</a>.
  A warm thank you for all your efforts! ❤️
 </p>
</div>
<hr />
<h2 id="slackhttpsembercommunityslackinherokuappcom"><a href="https://ember-community-slackin.herokuapp.com/">Slack ⭐️</a></h2>
<p>The Ember Times would like to give a shoutout to <a href="https://github.com/runspired">@runspired</a> (Chris Thoburn), for being incredibly helpful and responsive in a majority of the Slack channels this last week
by supporting community members migrate through the many versions of Ember data from 2.12 all the way to 3.2.0-beta.2.</p>
<p>Chris is a major contributor to the Ember ecosystem and to ember-data specifically.
and shares his in-depth knowledge of ember-data internals to make it easier for everyone to understand why things work in a particular way and to also shed some light on how ember-data will work in the future. Thanks <a href="https://github.com/runspired">@runspired</a>!</p>
<hr />
<h2 id="readersquestionswhenandhowwillwebeabletousedecoratorsinemberappshttpsdiscussemberjscomtreadersquestionwhenwillwebeabletousedecoratorsinemberapps14583"><a href="https://discuss.emberjs.com/t/readers-question-when-will-we-be-able-to-use-decorators-in-ember-apps/14583">Readers' Questions: When and how will we be able to use decorators in Ember apps?</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>In this week's <strong>brand new</strong> Readers’ Question it's all about the new and cool and shiny that will
  be coming to your Ember apps soon: When will we be able to make use of the <strong>decorator syntax</strong> when writing Ember apps?
  </p>
  <p>In his detailed write-up <a href="https://github.com/pzuraq">@pzuraq</a> will answer everything you need to know about the current state of the decorators
  proposal itself and when you will be able to decorate your own application. Read the <strong>full answer</strong>
  on the <a href="https://discuss.emberjs.com/t/readers-question-when-will-we-be-able-to-use-decorators-in-ember-apps/14583">offical Ember forum</a>.</p>
</div>
<p><a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/readers-question-when-will-we-be-able-to-use-decorators-in-ember-apps/14583">Read more</a></p>
<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Kenneth Larsen, Chris Garrett, Sivakumar Kailasam, Alon Bukai, Amy Lam, Ryan Mark, Ricardo Mendes, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-emberjs-times-issue-43</link><guid isPermaLink="true">https://blog.emberjs.com/the-emberjs-times-issue-43</guid><pubDate>Fri, 20 Apr 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 44]]></title><description><![CDATA[<p>ಹಲೋ Emberistas!</p>
<p>You can find our newsletter in both <a href="https://the-emberjs-times.ongoodbits.com/">the e-mail</a>
and the <a href="https://emberjs.com/blog/2018/04/27/the-emberjs-times-issue-44.html">blog format</a>.
Share it with all your Ember friends!</p>
<p>In this edition, we will share updates for <strong>Ember CLI</strong>, what's upcoming
for Ember <strong>documentation</strong> very, very soon, and the latest <strong>Ember patch</strong> release that
neither you nor your apps should miss.</p>
<p>Here's a recap of what happened in Emberland these days ✨</p>
<!-- READMORE -->
<hr />
<h2 id="ember311releasedhttpsgithubcomemberjsemberjsreleasestagv311"><a href="https://github.com/emberjs/ember.js/releases/tag/v3.1.1">Ember 3.1.1 Released 🐹✨</a></h2>
<p>This week, a <strong>patch</strong> for Ember was released. It includes <strong>several bug fixes</strong>, but here are a few selected ones:</p>
<p><a href="https://github.com/emberjs/ember.js/issues/16379">A bug</a> was introduced in Ember 3.1 that caused <code>ariaRole</code> to not be appended if this was initially set as being <code>false</code>. The expected behaviour here is that if you initially set the <code>ariaRole</code> to false it should not be appended, but you might want to dynamically change this later on. This is now fixed with Ember 3.1.1.</p>
<p>After upgrading to 3.1 <a href="https://github.com/emberjs/ember.js/issues/16503">some people</a> started seeing errors like <code>Cannot read property 'syscall' of null</code>. This was caused by <code>ComponentDefinitions</code> leaking heap space. This has been fixed in Ember 3.1.1.</p>
<p>Ember 3.1.1 contains several more fixes. You can go though them all in <a href="https://github.com/emberjs/ember.js/releases/tag/v3.1.1">the release change log.</a></p>
<blockquote>
  <p>Look! I'm a beautiful butterfly! - Heimlich, A Bug's Life</p>
</blockquote>
<p><a class="ember-button ember-button--centered" href="https://github.com/emberjs/ember.js/releases/tag/v3.1.1">Read more</a></p>
<hr />
<h2 id="allgoodfrom10to4inemberclihttpsgithubcomembercliemberclipull7791"><a href="https://github.com/ember-cli/ember-cli/pull/7791">All good from 10 to 4 in Ember CLI 🐹💻</a></h2>
<p><img class="float-left small transparent padded" alt="Command Line Tomster" title="Ember CLI" src="/images/blog/emberjstimes/embercli-tomster.png" /></p>
<p>This week, contributors to Ember CLI worked on improving the test suite by
<a href="https://github.com/ember-cli/ember-cli/pull/7791">extending the list of Node versions</a> tested against.
This means that you will be able to use your favorite command line tool
on the latest version smoothly and without any worries.</p>
<p>Lots of efforts are underway to bring <strong>Treeshaking capabilities</strong> to your
Ember app very soon. Treeshaking is the removal of unused code in order
to decrease app bundle size. Several contributions this week (<a href="https://github.com/ember-cli/ember-cli/pull/7788">1</a>,
<a href="https://github.com/ember-cli/ember-cli/pull/7786">2</a>,
<a href="https://github.com/ember-cli/ember-cli/pull/7784">3</a>) aimed at improving the internal
packaging manager of Ember CLI. Wanna know more about the new exciting things
that are on the horizon for Ember CLI in 2018? Do not miss the annual <a href="https://discuss.emberjs.com/t/ember-cli-2018-edition/14543">roadmap for 2018</a> - it's worth the read!</p>
<p>Finally, <code>ember-cli-update</code> is <strong>the way to update</strong> your Ember apps, but our documentation
hasn't caught up! You can help by <a href="https://github.com/ember-cli/ember-cli-update/issues/288">contributing</a>
to one of several official documentation resources, like the ember-cli website.
Also, more help is wanted in reminding <code>ember-cli-update</code> users when <a href="https://github.com/ember-cli/ember-cli-update/issues/326">a new version is out</a>.</p>
<p>We're looking forward to your upgrades! ✨</p>
<hr />
<h2 id="learningteamcornerhttpsemberjscomblog20180422emberlearningupdatehtml"><a href="https://emberjs.com/blog/2018/04/22/ember-learning-update.html">Learning Team Corner 🤓</a></h2>
<p>The Learning Team met IRL at EmberConf and shared the results of that meeting on <a href="https://emberjs.com/blog/2018/04/22/ember-learning-update.html">the Ember blog</a>. Initiatives for the new year were grouped into two directions - User Support and Marketing.</p>
<p>Some big things are happening over the next few weeks for <strong>The Guides</strong>! A <strong>new app</strong> will be launching soon! <a href="https://github.com/mansona">Chris
Manson</a> has been working on this project since November, together with a few other
contributors.</p>
<p>Many have been dreaming of it for years.
The main difference is that The Guides have been coverted to an Ember app (instead of a Ruby app),
making it easier for new people to contribute and for the team to maintain.
And, because of <a href="https://github.com/ef4/prember">prember</a>, it's <strong>SEO-friendly</strong>! Deprecation of the old guides app is happening <a href="https://github.com/emberjs/guides#notice-this-repository-is-deprecated">here</a>. Very soon, <strong>Pull Requests</strong> and Issues will be
<strong>frozen</strong>, and contributions to The Guides will continue in one of two new repositories. The WIP
<a href="https://github.com/ember-learn/guides-app">guides-app</a> is the Ember app that will control layout and functionality,
while <a href="https://github.com/ember-learn/guides-source">guides-source</a> contains the written content in the form
of versioned markdown files. In the future, most pull requests will be made to the guides-source to keep our content
up to date and continually improving.</p>
<p>The Learning Team and Friends appreciate your patience during the final launch steps.
As we tie up loose ends and move to production, we'll give updates via the
<a href="https://ember-community-slackin.herokuapp.com/">Ember Community Slack</a>
#-team-learning and #-announcements channels.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv310contributingrepositories"><a href="https://guides.emberjs.com/v3.1.0/contributing/repositories/">Contributor's Corner</a></h2>
<p>This week we'd like to thank these awesome contributors who worked on Ember core projects:
<a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/ef4" target="gh-user">@ef4</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/toranb" target="gh-user">@toranb</a>, <a href="https://github.com/st-h" target="gh-user">@st-h</a>, <a href="https://github.com/IzzatN" target="gh-user">@IzzatN</a>, <a href="https://github.com/GavinJoyce" target="gh-user">@GavinJoyce</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/skaterdav85" target="gh-user">@skaterdav85</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/tylerturdenpants" target="gh-user">@tylerturdenpants</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/lolmaus" target="gh-user">@lolmaus</a>, <a href="https://github.com/htwroclau" target="gh-user">@htwroclau</a>, <a href="https://github.com/ursm" target="gh-user">@ursm</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/pbishop16" target="gh-user">@pbishop16</a>, <a href="https://github.com/cibernox" target="gh-user">@cibernox</a>, <a href="https://github.com/snewcomer" target="gh-user">@snewcomer</a>, <a href="https://github.com/karan-pathak" target="gh-user">@karan-pathak</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/selvaa89" target="gh-user">@selvaa89</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/Techn1x" target="gh-user">@Techn1x</a>, <a href="https://github.com/thoov" target="gh-user">@thoov</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/amiller-gh" target="gh-user">@amiller-gh</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/knownasilya" target="gh-user">@knownasilya</a> and <a href="https://github.com/ryanto" target="gh-user">@ryanto</a>. Thank you for your efforts! 💖</p>
<hr />
<h2 id="morequestionsmoreanswersforreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">More Questions & more Answers for Readers' Questions</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />
  <p>With learning team efforts being in overdrive this week,
  we want to take the chance to point you to some of previous, great answers to previous, great questions by Ember.js Times readers:</p>
  <ul>
    <li><a href="https://discuss.emberjs.com/t/readers-questions-how-far-are-we-from-being-able-to-just-use-any-npm-package-via-the-import-statement/14462" target="readersq">
    Readers’ Questions #5: “How far are we from being able to just use any npm package via the import statement?”</a></li>
    <li><a href="https://discuss.emberjs.com/t/readers-questions-is-it-bad-to-load-data-in-components/14521" target="readersq">
    Readers’ Questions #6: “Is it bad to load data in components?”</a></li>
    <li><a href="https://discuss.emberjs.com/t/readers-questions-when-will-we-be-able-to-use-decorators-in-ember-apps/14583" target="readersq">
    Readers’ Questions #7: “When will we be able to use decorators in Ember apps?”</a></li>
  </ul>
</div>
<p>Apart from that we’d like to ask you for <strong>many more questions</strong> to be answered in future editions of The Ember Times!</p>
<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Kenneth Larsen, Sivakumar Kailasam, Amy Lam, Jen Weber and Jessica Jordan</p>]]></description><link>https://blog.emberjs.com/the-emberjs-times-issue-44</link><guid isPermaLink="true">https://blog.emberjs.com/the-emberjs-times-issue-44</guid><pubDate>Fri, 27 Apr 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 45]]></title><description><![CDATA[<p>こんにちは Emberistas!</p>
<p>Lots of Ember programmers and writers have been busy this week! We have several new data-driven RFCs (📝 Requests for Comments), community efforts, and an outstanding update to Ember Inspector to present to you.</p>
<p>As well as a sincere reminder to eat your veggies! 🥒🥕</p>
<!-- READMORE -->
<hr />
<h2 id="ihopemybuildneverletsmedownagaininemberhttpsgithubcomemberjsrfcspull328"><a href="https://github.com/emberjs/rfcs/pull/328">I hope my build never lets me down again in Ember 🐹</a></h2>
<p>Have you ever made a change in the source code of your Ember app and subsequently awaited
the reload of your app's browser tab, to no avail?
Seconds, minutes, a coffee later—you might have checked your terminal window—then at last, you find that syntax error in your template
that led to a failing build, preventing the reload.</p>
<p>This week's RFC proposes the automatic inclusion of <strong><i>ember-cli-build-notifications</i></strong>
into new Ember apps. It's an addon providing system notifications for failing Ember app builds by default.</p>
<p>The RFC proposal also discusses several alternative techniques to improve developer ergonomics regarding
app builds. If you're curious, check out the <a href="https://github.com/emberjs/rfcs/pull/328">full RFC here</a>
and leave your thoughts on it!</p>
<hr />
<h2 id="listentoyourbroccolianditwilltellyouhowtoeatithttpwwwoligriffithscombroccolijs"><a href="http://www.oligriffiths.com/broccolijs/">Listen to your Broccoli and it will tell you how to eat it</a></h2>
<p>You might already know that Broccoli takes care of your asset pipeline. But do you know <strong>how</strong> it works? <a href="https://twitter.com/oligriffiths">Oli Griffiths</a> has made an <a href="http://www.oligriffiths.com/broccolijs/">amazing tutorial</a> on <em>the asset pipeline for ambitious applications</em>. It takes you through the basic setup and guides you through the journey of sass preprocessing, debugging and fingerprints.</p>
<hr />
<h2 id="emberinspectordarkmodehttpsgithubcomemberjsemberinspector"><a href="https://github.com/emberjs/ember-inspector">Ember Inspector dark mode</a></h2>
<p><img src="/images/blog/emberjstimes/ember-inspector-dark.png" alt="Ember Inspector Dark Mode Screenshot" /></p>
<p>The Ember Inspector project is on a roll! v3.1.0 has the new component tree and dark mode. Change your theme from light to dark in Chrome/Firefox dev tools. 🖤</p>
<hr />
<h2 id="springcleaningforemberdatapoweredbyrfcshttpsgithubcomemberjsrfcspull329"><a href="https://github.com/emberjs/rfcs/pull/329">Spring cleaning for Ember Data powered by RFCs 📟🐹</a></h2>
<p>A particular RFC has entered the final comment period with incredible speed!
It proposes the <strong>deprecation</strong> of Ember Data's <code>Array.filter</code> method and explains
how this change will not only improve the maintainability of the
Ember Data project, but also improve the <strong>performance</strong> of Ember apps.</p>
<p>You can <a href="https://github.com/emberjs/rfcs/pull/326">read the full RFC here</a> and
leave your comments for it.</p>
<p>If you're making use of <code>this.get('store').filter</code> in your app or addon,
check out the documentation of the <i>ember-data-filter</i> addon and
follow the dedicated <a href="https://github.com/ember-data/ember-data-filter#recommended-refactor-guide">guide on how to refactor</a>.</p>
<p>In other Ember Data news, another proposal focuses on removing usage of the <code>Ember.Evented</code> mixin
in Ember Data specifically.
This would also lead to the future removal of several lifecycle hooks and methods
on <code>Model</code>s and other Ember Data classes. You can learn more about
the design of this proposed deprecation in <a href="https://github.com/emberjs/rfcs/pull/329">the original RFC</a>.</p>
<p>This week, contributors focused on getting some <a href="https://github.com/emberjs/data/pull/5459">cleanup
work</a> underway to leave the
soon-to-be deprecated <code>store.filter</code> behind for good.
Finally, a <a href="https://github.com/emberjs/data/pull/5461">bug fix</a> for breaking up async relationships has landed. ✨</p>
<hr />
<h2 id="emberjs2018blogpostswantedhttpsemberjscomblog20180502ember2018roadmapcallforpostshtml"><a href="https://emberjs.com/blog/2018/05/02/ember-2018-roadmap-call-for-posts.html">#EmberJS2018: blog posts wanted</a></h2>
<p>The Ember team would like you (yes, you!) to write a blog post to propose goals and direction for Ember in the remainder of 2018. The content of these posts will help the core team to draft their first Roadmap RFC.</p>
<p>Write your <strong>blog post</strong> by <strong>May 30th</strong>. Tweet a link to the post with the hashtag <strong>#EmberJS2018</strong>. Topic ideas could include: ideas for community programs, framework features, documentation improvements, ecosystem needs, or tooling enhancements.</p>
<p>Check out Katie Gengler's awesome <a href="https://emberjs.com/blog/2018/05/02/ember-2018-roadmap-call-for-posts.html">call for blog posts here</a> and get writing!</p>
<hr />
<h2 id="thestackoverflowproblemhttpsmediumcomfrontendhackingwhatsupwithemberjsandstackoverflow1961ac29ebde"><a href="https://medium.com/front-end-hacking/whats-up-with-ember-js-and-stack-overflow-1961ac29ebde">The Stack Overflow problem</a></h2>
<p>Jen Weber and Chris Manson are taking a deep dive into Ember's presence on Stack Overflow this month. They're even recording their efforts once a week at <strong>9am EST on Fridays</strong>! You can tune into their <a href="https://www.youtube.com/channel/UCyErLHzPqLAkL1F-SivFDcA">YouTube channel</a> or <a href="https://www.twitch.tv/videos/252443184">Twitch stream</a>.</p>
<p>Collectively, question by question, we can try to create a better Ember presence on Stack Overflow. Check out some tips and tricks on how to get involved in the Stack Overflow effort in the <a href="https://medium.com/front-end-hacking/whats-up-with-ember-js-and-stack-overflow-1961ac29ebde">What’s up with Ember.js and Stack Overflow?</a> post. It's gonna be…May. 🥁</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv310contributingrepositories"><a href="https://guides.emberjs.com/v3.1.0/contributing/repositories/">Contributor's corner</a></h2>
<p>This week a warm thank you goes to <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/mikeu" target="gh-user">@mikeu</a>, <a href="https://github.com/shearichard" target="gh-user">@shearichard</a>, <a href="https://github.com/frank06" target="gh-user">@frank06</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/SeanHealy33" target="gh-user">@SeanHealy33</a>, <a href="https://github.com/fivetanley" target="gh-user">@fivetanley</a>, <a href="https://github.com/bmac" target="gh-user">@bmac</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/chriskrycho" target="gh-user">@chriskrycho</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/rwwagner90" target="gh-user">@rwwagner90</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/lifeart" target="gh-user">@lifeart</a>, <a href="https://github.com/lupestro" target="gh-user">@lupestro</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/greenkeeper[bot]" target="gh-user">@greenkeeper[bot]</a>, <a href="https://github.com/dcombslinkedin" target="gh-user">@dcombslinkedin</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/dgeb" target="gh-user">@dgeb</a>, <a href="https://github.com/anehx" target="gh-user">@anehx</a> and <a href="https://github.com/dfreeman" target="gh-user">@dfreeman</a> for contributing to Ember core projects this week. 💖
</p>
<hr />
<h2 id="gotaquestionwerelookingforwardtoithttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? We’re looking forward to it!</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember
  ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="bit.ly/ask-ember-core" target="ask-ember-core">https://bit.ly/ask-ember-core</a> and a member of the Ember team will answer in a future edition of The Ember Times. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Kenneth Larsen, Sivakumar Kailasam, Amy Lam, Jen Weber, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-emberjs-times-issue-45</link><guid isPermaLink="true">https://blog.emberjs.com/the-emberjs-times-issue-45</guid><pubDate>Fri, 04 May 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 46]]></title><description><![CDATA[<p>හෙලෝ Emberistas!</p>
<p>Again you can enjoy reading The Ember Times in both the <a href="https://the-emberjs-times.ongoodbits.com/2018/05/11/issue-46">e-mail</a> and the <a href="https://emberjs.com/blog/2018/05/11/the-emberjs-times-issue-46.html">blog format</a> to share it even better with your Ember friends.</p>
<p>This week we'll highlight a new RFC deprecating features from ancient Ember times and a sweet reminder for blogging about your best wishes for Ember and - last, but not least - we have a brand-new Readers' Question❓✨ for you!</p>
<!-- READMORE -->
<hr />
<h2 id="moaremberjs2018blogpostswantedhttpsemberjscomblog20180502ember2018roadmapcallforpostshtml"><a href="https://emberjs.com/blog/2018/05/02/ember-2018-roadmap-call-for-posts.html">Moar #EmberJS2018 blog posts wanted!</a></h2>
<div class="blog-row">
  <img class="float-left small transparent padded" alt="Original Tomster Mascot Image" title="Tomster loves your blog posts about Ember.js" src="/images/tomsters/original.png" />

  <p>We've already seen a lot of thoughtful blog posts from the Ember team's <a href="https://emberjs.com/blog/2018/05/02/ember-2018-roadmap-call-for-posts.html" target="cta-blogs">call for community blog posts</a>. But we're hoping for more! Have something to say?</p>

<p>Write a blog post by <strong>May 30th</strong> to propose goals and direction for Ember in the remainder of 2018. The content of these posts will help the core team to draft their first Roadmap RFC.</p>
</div>
<p>Looking for inspiration? Check out the <a href="https://twitter.com/search?q=%23EmberJS2018">#EmberJS2018 hashtag</a> on Twitter or <a href="https://github.com/zinyando/emberjs2018-posts">@zinyado's repo collecting posts</a> on GitHub.</p>
<hr />
<h2 id="globalresolutionandmoreforemberhttpsgithubcomemberjsrfcspull331"><a href="https://github.com/emberjs/rfcs/pull/331">Global resolution and more for Ember 🐹</a></h2>
<p><a href="https://github.com/Gaurav0">@Gaurav0</a> has submitted an RFC to finally <strong>deprecate the Globals resolver</strong> and the related API. The Globals resolver is primarily a holdover from the early days of Ember when people used Ember without Ember CLI.</p>
<p>The API allowed the creation of an <code>App</code> global like this:</p>
<pre><code class="javascript language-javascript">// app.js
var App = Ember.Application.create();
</code></pre>
<p>and the further setup of your Ember app based off this global:</p>
<pre><code class="javascript language-javascript">// app.js
App.Router.map(function() {
  this.route('about');
});

App.AboutRoute = Ember.Route.extend({
  model: function() {
    return ['red', 'yellow', 'blue'];
  }
});
</code></pre>
<p>Using Ember CLI as the build tool for Ember apps has been recommended for years and is widely adopted in the community. Yet, if you're an active user of the Globals resolver API you should definitely give the <a href="https://github.com/emberjs/rfcs/pull/331">original proposal for deprecating it</a> a read and leave your thoughts on its use cases in the comments.</p>
<p>Furthermore, contributors to Ember this week worked on preventing memory leaks in tests (<a href="https://github.com/emberjs/ember.js/pull/16620">1</a>, <a href="https://github.com/emberjs/ember-qunit/pull/328">2</a>), nifty bug fixes (<a href="https://github.com/emberjs/ember.js/pull/16615">3</a>, <a href="https://github.com/emberjs/ember.js/pull/16613">4</a>) and more internal and devops-driven improvements (<a href="https://github.com/emberjs/ember.js/pull/16617">5</a>, <a href="https://github.com/emberjs/ember.js/pull/16616">6</a>, <a href="https://github.com/emberjs/ember.js/pull/16582">7</a>).</p>
<hr />
<h2 id="getinvolvedwiththenewemberguideshttpsemberguidesstonecircleiorelease"><a href="https://emberguides.stonecircle.io/release/">Get involved with the new Ember guides</a></h2>
<p>The Learning Team has been working on a new and improved version of the Guides app. It's now made with Ember.js and is more shiny than ever. The Guides app is almost ready for a proper release, but before we do so, we would love for you to <a href="https://emberguides.stonecircle.io/release/">try it out</a>. If you find any issues then please <a href="https://github.com/ember-learn/guides-app/issues">report them</a>.</p>
<p>Or if you feel in a particulary good mood, look through existing issues in the <a href="https://github.com/ember-learn/guides-app/issues">Guides app</a> or the <a href="https://github.com/ember-learn/guides-source/issues">Guides source</a> and start contributing to the new guides.</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv310contributingrepositories"><a href="https://guides.emberjs.com/v3.1.0/contributing/repositories/">Contributors' Corner</a></h2>
<p>Many thanks to <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/ryanto" target="gh-user">@ryanto</a>, <a href="https://github.com/nummi" target="gh-user">@nummi</a>, <a href="https://github.com/chancancode" target="gh-user">@chancancode</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/dfreeman" target="gh-user">@dfreeman</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a> and <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a> for contributing to Ember core projects this week. 💖</p>
<hr />
<h2 id="readersquestionswhydoesemberstillusersvphttpsdiscussemberjscomtreadersquestionswhydoesemberstillusersvp14736"><a href="https://discuss.emberjs.com/t/readers-questions-why-does-ember-still-use-rsvp/14736">Readers’ Questions: “Why does Ember still use RSVP?”</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>This week's Readers’ Question revolves around Promises: Why does Ember ship with <code>RSVP.Promise</code> by default and why would it not rely on a regular Promise polyfill instead?</p>

<p>In his detailed write-up, Ember Core team member <a href="https://github.com/ef4" target="gh-user">@ef4</a> will answer everything you need to know about the origin of <code>RSVP</code> in Ember, what it has been and still is used for and if Ember will be going all in regarding native Promises in the future.
You can read <a href="https://discuss.emberjs.com/t/readers-questions-why-does-ember-still-use-rsvp/14736" target="embertimesq">the full answer</a> on the offical Ember forum.</p>
</div>
<div class="blog-row">
<a class="ember-button ember-button--centered" href="https://discuss.emberjs.com/t/readers-questions-why-does-ember-still-use-rsvp/14736" target="embertimesq">Read more</a>
</div>
<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Gaurav Munjal, Edward Faulkner, Sivakumar Kailasam, Kenneth Larsen, Amy Lam, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-emberjs-times-issue-46</link><guid isPermaLink="true">https://blog.emberjs.com/the-emberjs-times-issue-46</guid><pubDate>Fri, 11 May 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 47]]></title><description><![CDATA[<p>안녕하세요 Emberistas!</p>
<p>Again you can enjoy reading The Ember Times in both the <a href="https://the-emberjs-times.ongoodbits.com/2018/05/18/issue-47">e-mail</a> and the <a href="https://emberjs.com/blog/2018/05/18/the-emberjs-times-issue-47.html">blog format</a> to share it even better with your Ember friends.</p>
<p>This week we have <strong>several RFCs</strong> from the Ember Data 📟 project for you, as well as an <strong>#EmberJS2018 countdown</strong>, a new way to cast some <strong>template transform magic</strong> 🎩 and a recap of what has happened in Readers' Questions for you:</p>
<!-- READMORE -->
<hr />
<h2 id="metaandlinkallthethingsinemberdatahttpsgithubcomemberjsrfcspull332"><a href="https://github.com/emberjs/rfcs/pull/332">Meta and Link all the Things in Ember Data 🐹</a></h2>
<p>This backwards compatible Request for Comments (RFC) allows <code>ember-data</code> users to associate optional <code>meta</code> and <code>links</code> on <strong>records</strong> alongside the top-level document <code>meta</code> (mandatory) and <code>links</code> (optional).  Sadly, <code>ember-data</code> currently stores this information only on relationships and not individual records.  </p>
<p>The RFC design is pretty straightforward and proposes that all <code>meta</code> and <code>links</code>:</p>
<ul>
<li>will be honored in any resource that is part of a <a href="http://jsonapi.org/">JSON API compliant</a> document</li>
<li>when defined on resource identifiers (e.g. links inside a relationhip that link to other resources) will be ignored</li>
<li>when defined on relationship objects will continue to function as they do today</li>
<li>will be exposed as getters on instances of <code>DS.Model</code> and will default to null if nothing has been provided</li>
</ul>
<p>Similarly, <code>meta</code> and <code>links</code> will be exposed on instances of <code>DS.Snapshot</code>. Although <code>meta</code> and <code>links</code> are getters on <code>DS.Model</code>s, they will be exposed on <code>DS.Snapshot</code> as methods:</p>
<pre><code class="javascript language-javascript">class Snapshot {
  links() {}
  meta() {}
}
</code></pre>
<p>Interestingly, some apps have inadvertently achieved what this RFC purposes by moving <code>meta</code> and <code>links</code> into <code>attributes</code> during serialization and then exposing each of them via <code>DS.attr</code>.
Therefore, this RFC gives <code>ember-data</code> an even more <strong>complete "out of the box experience"</strong> and will likely be a very welcomed addition to the library.  </p>
<p>Think differently? Tell <a href="https://github.com/runspired">@runspired</a> what you think on the <a href="https://github.com/emberjs/rfcs/pull/332">original proposal</a>.</p>
<hr />
<h2 id="only12moredaysofemberjs2018httpsemberjscomblog20180502ember2018roadmapcallforpostshtml"><a href="https://emberjs.com/blog/2018/05/02/ember-2018-roadmap-call-for-posts.html">Only 12 more days of #EmberJS2018 ✍️💨</a></h2>
<p>12 months in a year. 12 eggs in a dozen. 12 days to submit your blog posts for the <a href="https://emberjs.com/blog/2018/05/02/ember-2018-roadmap-call-for-posts.html">#EmberJS2018 Roadmap RFC</a>! 📝</p>
<p>Need to beat writer's block? Listen to Ember Core team member <a href="https://github.com/chadhietala">Chad Hietala</a> on The Changelog podcast, discussing <a href="https://changelog.com/podcast/293">Ember four years later</a>. And you can peruse blog posts from the community on <a href="https://github.com/zinyando/emberjs2018-posts">@zinyado's repo</a> or the <a href="https://twitter.com/search?q=%23EmberJS2018">#EmberJS2018 hashtag</a> on Twitter. Get your two cents in <strong>by May 30th</strong>.</p>
<hr />
<h2 id="moreemberdatarfcforremovingembereventedhttpsgithubcomemberjsrfcspull329"><a href="https://github.com/emberjs/rfcs/pull/329">More Ember Data: RFC for removing <code>Ember.Evented</code></a></h2>
<p>There's an RFC on removing usage of the <code>Ember.Evented</code> mixin in Ember Data specifically. This would also lead to the future <strong>removal</strong> of several <strong>lifecycle hooks</strong> and methods on <code>Model</code>s and other Ember Data classes.</p>
<p>The use of <code>Ember.Evented</code> is mostly a legacy from pre 1.0 of Ember Data and is not needed anymore.
You can <strong>follow the discussion</strong> and read all about the implications of this change on the <a href="https://github.com/emberjs/rfcs/pull/329">RFC pull request</a>.</p>
<hr />
<h2 id="recastingcallfortemplateshttpsgithubcomembertemplatelintembertemplaterecast"><a href="https://github.com/ember-template-lint/ember-template-recast">Recasting Call 🎬 for Templates</a></h2>
<div class="blog-row">
  <img class="float-left small transparent padded" alt="Handlebars Logo Fading" title="Handlebars" src="/images/about/handlebars_fade.png" />

<p>Are you an Ember addon author who wants to be able to <strong>transform the template</strong> of host apps? Or are you an Ember developer who tinkers with templates or template-related codemods? Then, the new Ember addon <a href="https://github.com/ember-template-lint/ember-template-recast" target="recast">ember-template-recast</a> is just for you.</p>

<p>Ember Template Recast will allow you to transform templates easily in a <strong>non-destructive manner</strong> - this means, that you can modify specific parts of your templates while preserving everything else - incl. whitespace formatting and linebreaks - from your original template.</p>
</div>
<p>The <code>templateRecast</code> API offers you methods for creating abstract syntax trees (AST) from your templates and vice versa and a way to <a href="https://github.com/ember-template-lint/ember-template-recast#traverse">traverse</a> your templates and modify them along the way.</p>
<p>See it in action:</p>
<pre><code class="javascript language-javascript">const { transform } = require('ember-template-recast');

const template = `
{{my-component
  title="I less than 3 ember-template-recast"
}}
`;

let { code } = transform(template, env =&gt; {
  let { builders: b } = env.syntax;

  return {
    MustacheStatement() {
      return b.mustache(b.path('wat-wat'));
    },
  };
});

// ...et voilà, enjoy a modified template string 💁🏻
console.log(code); // =&gt; {{wat-wat}}
</code></pre>
<p>The project is still cutting-edge experimental 👨🏾‍🔬, <del> but </del> and therefore pretty exciting! Try it out for yourself <a href="https://github.com/ember-template-lint/ember-template-recast" target="recast">here</a> and transform your templates today.✨</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv310contributingrepositories"><a href="https://guides.emberjs.com/v3.1.0/contributing/repositories/">Contributors' Corner</a></h2>
<p>A big thank you goes to the people who contributed to Ember core projects this week: <a href="https://github.com/csantero" target="gh-user">@csantero</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/miguelcobain" target="gh-user">@miguelcobain</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/jimenglish81" target="gh-user">@jimenglish81</a>, <a href="https://github.com/josemarluedke" target="gh-user">@josemarluedke</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/dcombslinkedin" target="gh-user">@dcombslinkedin</a>, <a href="https://github.com/kategengler" target="gh-user">@kategengler</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/efx" target="gh-user">@efx</a> and <a href="https://github.com/mansona" target="gh-user">@mansona</a>. 💕</p>
<hr />
<h2 id="morequestionsmoreanswersforreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">More Questions & more Answers for Readers' Questions</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>With learning team efforts concentrating on 🚢 something pretty exciting very soon,
  we want to take the chance to recap some of the previous, great answers to previous, great questions by Ember.js Times readers:</p>

  <ul>
    <li><a href="https://discuss.emberjs.com/t/readers-questions-is-it-bad-to-load-data-in-components/14521" target="readersq">
    Readers’ Questions #6: “Is it bad to load data in components?”</a></li>
    <li><a href="https://discuss.emberjs.com/t/readers-questions-when-will-we-be-able-to-use-decorators-in-ember-apps/14583" target="readersq">
    Readers’ Questions #7: “When will we be able to use decorators in Ember apps?”</a></li>
    <li><a href="https://discuss.emberjs.com/t/readers-questions-why-does-ember-still-use-rsvp/14736" target="readersq">
    Readers’ Questions #8: “Why does Ember still use RSVP?”</a></li>
  </ul>

</div>
<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Tobias Bieniek, Robert Jackson, Kenneth Larsen, Sivakumar Kailasam, Amy Lam, Ryan Mark, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-emberjs-times-issue-47</link><guid isPermaLink="true">https://blog.emberjs.com/the-emberjs-times-issue-47</guid><pubDate>Fri, 18 May 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 48]]></title><description><![CDATA[<p>你好 Emberistas!</p>
<p>Read either on the <a href="https://www.emberjs.com/blog/2018/05/25/the-emberjs-times-issue-48.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/2018/05/25/issue-48">e-mail newsletter</a> what has been going on in Emberland this week: We have some news for Ember CLI <strong>bundled up</strong> for you, as well as <strong>documentation highlights</strong> from the folks from <code>ember-cli-addon-docs</code>, a final reminder to hand in your Ember <strong>Roadmap blog post</strong> and a pretty big announcement from the Learning Team for you! 🙆🏾</p>
<!-- READMORE -->
<hr />
<h2 id="whatisyourwishforemberin2018httpsemberjscomblog20180502ember2018roadmapcallforpostshtml"><a href="https://emberjs.com/blog/2018/05/02/ember-2018-roadmap-call-for-posts.html">What is your wish for Ember in 2018?🌟</a></h2>
<p>There’s a week left of the Ember’s 2018 call for blog posts. There’s already been a lot of great blog posts from the community, but we’re hoping for more!</p>
<p>Write a blog post by <strong>May 30th</strong> to propose goals and direction for Ember in the remainder of 2018. The content of these posts will help the core team to draft their first Roadmap RFC.</p>
<p>Looking for inspiration? Check out the <a href="https://twitter.com/search?q=%23EmberJS2018">#EmberJS2018 hashtag</a> on Twitter or <a href="https://github.com/zinyando/emberjs2018-posts">@zinyado’s repo collection posts</a> on GitHub.</p>
<hr />
<h2 id="apackageoutfordeliverytoemberclihttpsgithubcomembercliemberclipull7826"><a href="https://github.com/ember-cli/ember-cli/pull/7826">A Package out for delivery to Ember CLI 📦♥︎🐹</a></h2>
<p>Recently, lots of work has landed 🛬 in Ember CLI to bring the long-awaited <strong>Packager feature</strong> to life (<a href="https://github.com/ember-cli/ember-cli/pull/7826">1</a>, <a href="https://github.com/ember-cli/ember-cli/pull/7818">2</a>, <a href="https://github.com/ember-cli/ember-cli/pull/7816">3</a>, <a href="https://github.com/ember-cli/ember-cli/pull/7796">4</a>, <a href="https://github.com/ember-cli/ember-cli/pull/7788">5</a>). The Packager will increase the <strong>flexibility</strong> of Ember's <strong>build pipeline</strong>, paving the way for other neat features like code splitting and tree shaking and finally allowing developers to further reduce the filesize of their applications by dramatic amounts.</p>
<p>Want a recap of what's in for the Packager feature? Be sure to check out both the  the <a href="https://github.com/chadhietala/rfcs/blob/packager/active/0002-packager.md">original RFC (Request for Comments) proposal</a>, as well as <a href="https://github.com/ember-cli/rfcs/blob/master/active/0051-packaging.md">this year's update</a> that details the motivation behind it.
And want to know <strong>when</strong> it will finally land for an Ember app near you? We'll let you know ASAP 🔜 in one of the upcoming editions of The Ember Times!</p>
<hr />
<h2 id="newemberguideslaunchedhttpsguidesemberjscom"><a href="https://guides.emberjs.com/">New Ember Guides launched 🚀</a></h2>
<p>The new <a href="https://guides.emberjs.com">guides.emberjs.com</a> is live, hooray!</p>
<!--alex ignore  middleman-middlewoman-->
<p>The Guides are a cornerstone of the Ember experience, and one of our community's strengths is that anyone can get involved. So, it's important to make it easier for everyone to create content or functionality. For this reason, a team of contributors have been working for months to convert the Guides from a Ruby/Middleman app into an Ember app. Now, to help with content, contributors only need to work with markdown files, and to see how things would look on the website, they run an Ember app!</p>
<p><a href="https://github.com/ember-learn/guides-app">ember-learn/guides-app</a> contains the static site generator that pulls written content from <a href="https://github.com/ember-learn/guides-source">guides-source</a> markdown files. The guides-app produces static HTML using <a href="https://github.com/ef4/prember">Prember</a> and <a href="https://www.ember-fastboot.com/">FastBoot</a>. The app is currently served through Heroku who supports Ember in a big way by sponsoring hosting and advice. (Did you know that it takes a ton of back end infrastructure to run a front-end framework project? Other parts of our website rely on support from Fastly, like the API docs. We're thankful to have so many friends of open source 👨‍👩‍👧‍👦!)</p>
<p>Moving forward, the only part of our site that's not Ember is the website repo, which includes the home page, the blog, and some other odds and ends. Everything else has already been moved into Ember apps! If you want to help out, drop by the <a href="https://embercommunity.slack.com/messages/C04KG57CF/">#team-learning</a> channel.</p>
<hr />
<h2 id="shinynewembercliaddondocshttpsgithubcomemberlearnembercliaddondocs"><a href="https://github.com/ember-learn/ember-cli-addon-docs">Shiny new ember-cli-addon-docs ✨</a></h2>
<p>The <code>ember-cli-addon-docs</code> are getting easier to use day-by-day, so there's no excuse to leave your software libraries undocumented anymore…</p>
<p>A real-world example of its usage is the <code>ember-decorators</code> documentation: <a href='http://ember-decorators.github.io/ember-decorators/latest/docs' target='_blank'>ember-decorators</a>, which was recently revamped by leveraging the add-on. Have a go at it and inspire yourself 👩‍🎨 to your own documentation!</p>
<p>Also, on the most recent releases, the following neatest features were made available:</p>
<ul>
<li><p>New <strong>version selector</strong>: good news for when you feel nostalgic about old documentation. Now you can add to your navigation a version selector control that will enable you to jump back and forth to different documentation versions with ease, check it out <a href='https://github.com/ember-learn/ember-cli-addon-docs/pull/156' target='_blank'>here</a>.</p></li>
<li><p><em>"Magic mirror, on the wall – who is the most beautiful documentation of all?"</em>: <code>ember-cli-addon-docs</code> has an even <strong>prettier UI</strong> now thanks to <code>ember-cli-tailwind</code>. If you are unfamiliar with Tailwind, do yourself a favour and deep dive into its power <a href='https://tailwindcss.com/' target='_blank'>here</a>.</p></li>
</ul>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv310contributingrepositories"><a href="https://guides.emberjs.com/v3.1.0/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/qpowell" target="gh-user">@qpowell</a>, <a href="https://github.com/krisselden" target="gh-user">@krisselden</a>, <a href="https://github.com/csantero" target="gh-user">@csantero</a>, <a href="https://github.com/kevinansfield" target="gh-user">@kevinansfield</a>, <a href="https://github.com/toddjordan" target="gh-user">@toddjordan</a>, <a href="https://github.com/dexturr" target="gh-user">@dexturr</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a>, <a href="https://github.com/Mi6u3l" target="gh-user">@Mi6u3l</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/Willibaur" target="gh-user">@Willibaur</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/axyxnz" target="gh-user">@axyxnz</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/cibernox" target="gh-user">@cibernox</a>, <a href="https://github.com/twokul" target="gh-user">@twokul</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/rondale-sc" target="gh-user">@rondale-sc</a>, <a href="https://github.com/locks" target="gh-user">@locks</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/Dan-Ste" target="gh-user">@Dan-Ste</a>, <a href="https://github.com/nickbender" target="gh-user">@nickbender</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/robbiewain" target="gh-user">@robbiewain</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/Bestra" target="gh-user">@Bestra</a>, <a href="https://github.com/mschinis" target="gh-user">@mschinis</a> and <a href="https://github.com/localpcguy" target="gh-user">@localpcguy</a> for contributing to one or several of Ember's core projects❤️!
</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a question? Ask Readers' Questions!🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Miguel Gomes, Kenneth Larsen, Sivakumar Kailasam, Amy Lam, Jessica Jordan, Jen Weber and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-emberjs-times-issue-48</link><guid isPermaLink="true">https://blog.emberjs.com/the-emberjs-times-issue-48</guid><pubDate>Fri, 25 May 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 49]]></title><description><![CDATA[<section class="breaking-news blog-row">
  <h3><a href="https://twitter.com/eaf4/status/1002258968910159873" target="npm">Breaking News: Just import from NPM! 🚨</a></h3>
  <p>Just before the editorial deadline, we received reports from the internet
   that there is now a way to easily <code>npm install</code> a <strong>package</strong> and <strong>import</strong> it into your Ember app.
   The addon <a href="https://github.com/ef4/ember-auto-import" target="emberauto">ember-auto-import</a>
   will allow <strong>zero-configuration imports</strong> out of the box today
   and should be a suitable until the <a href="https://www.emberjs.com/blog/2018/05/25/the-emberjs-times-issue-48.html#toc_a-href-https-github-com-ember-cli-ember-cli-pull-7826-a-package-out-for-delivery-to-ember-cli-a" target="package">packager feature</a> lands in Ember CLI.
   Reports also claim that addon author and Ember Core team member <a href="https://github.com/ef4" target="ed">@ef4</a> stated that <a href="https://twitter.com/eaf4/status/1002258968910159873" target="inspire">his work was heavily inspired</a> by a particular blog post series using the hashtag <a href="https://github.com/zinyando/emberjs2018-posts" target="ember18">#EmberJS2018</a>.</p>
</section>
<p>ਸਤ ਸ੍ਰੀ ਅਕਾਲ Emberistas!</p>
<!--alex ignore special-->
<p>This week we have a 🌟 <strong>Special Edition</strong> 🌟😲 for you: we'll take a look into the internals of the new
Ember Guides website, which has had a <a href="https://www.emberjs.com/blog/2018/05/25/the-emberjs-times-issue-48.html#toc_a-href-https-guides-emberjs-com-new-ember-guides-launched-a">complete makeover and relaunched this month</a> to finally run on an amazing Ember app. This will finally make contributions through the Ember community immensely easier. ✨</p>
<!--alex ignore special-->
<p>In this special edition of The Ember Times, <a href="https://github.com/mansona">@real_ate</a> who championed the <strong>migration of the Guides</strong> will let us have a peek into <a href="https://github.com/ember-learn/guides-app">the new app's</a> internals and into its <strong>Broccoli</strong> powered <strong>build pipeline</strong>. So get ready to hit your recommended daily intake of veggies 🥒🥕 and read either on the <a href="https://www.emberjs.com/blog/2018/06/01/the-emberjs-times-issue-49.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/2018/06/01/issue-49">e-mail newsletter</a> about what has been going on in Emberland this week…</p>
<!-- READMORE -->
<hr />
<p>This is the second part of a six part series on how we rebuilt the new Ember Guides from the ground up
over the course of six months, converting it into an Ember app in the process. If you want to see
the first part in this series check it out <a href="https://blog.stonecircle.io/the-right-way-to-build-the-ember-guides/">here</a>. You
can keep track of future posts in this series by following <a href="https://feedly.com/i/subscription/feed%2Fhttps%3A%2F%2Fblog.stonecircle.io%2Frss.xml">the RSS feed</a>.</p>
<h2 id="initialexperiments">Initial experiments</h2>
<!--alex ignore ball-->
<p>In the very early stages of the conversations about upgrading the Ember Guides to be a fully-fledged
Ember app, Ryan Tablada (AKA <a href="https://github.com/rtablada">@rtablada</a>) pointed me towards an
experiment that he had started to get the ball rolling. It was called
<a href="https://github.com/rtablada/broccoli-blog-api">broccoli-blog-api</a> and was designed to:</p>
<blockquote>
  <p>Translate a directory (or set of directories) of Markdown documents into a static JSON:API.</p>
</blockquote>
<p>Having worked extensively with Broccoli many years ago (before Ember CLI was the official build
system for Ember), I thought to myself "What's the worst that could happen?" and jumped straight into
the code. The thing about Broccoli is that it's almost the opposite of "riding a bike" and you very
quickly forget everything about it if you haven't been using it for a while… 😣</p>
<h2 id="whyweusedbroccolijsonapi">Why we used Broccoli &amp; JSON:API</h2>
<p>Anyone who has been following Ember for any reasonable amount of time knows that Ember Data works
great with JSON:API. If your backend already speaks JSON:API and follows the spec, you are
essentially ready to go! If you have ever needed to integrate a hand-rolled, bespoke API's endpoints
with Ember Data, you know that it is essentially a process of translating things into JSON:API
in JavaScript before it goes into Ember Data. If you're using JSON:API upfront, things are a lot
easier to deal with, and you get to make use of the simplicity of Ember Data.</p>
<!-- alex ignore just -->
<p>Broccoli is an <strong>asset pipeline</strong> that deals very effectively with the file system. It is Just Javascript™️ in theory. One of the issues that makes Broccoli more
challenging to work with is the lack of documentation, or at least that <em>used</em> to be the case. Over
the last few months, <a href="https://github.com/oligriffiths">Oli Griffiths</a> has been very active in the
Broccoli community and has recently published a <a href="https://github.com/oligriffiths/broccolijs-tutorial">Broccoli
tutorial</a>. There is also a lot of work going on
behind the scenes to make Broccoli more straightforward to work with and a much more powerful tool.
For example, Oli is currently <a href="https://github.com/ember-cli/ember-cli/pull/7798">working on an
experiment</a> to bring Broccoli 1.x support to
Ember CLI, which will (hopefully) make life much better for Windows developers. <a href="https://github.com/jenweber">Jen Weber</a> is also working on updating the <a href="https://ember-cli.com/user-guide/">Ember CLI documentation</a>. Soon, it should be a bit easier to get started modifying your build pipeline in Ember CLI via Broccoli! 🎉</p>
<p>Having made these original decisions, we ultimately decided to build something called <a href="https://github.com/stonecircle/broccoli-static-site-json">broccoli-static-site-json</a>, which as you can see has very similar goals to <code>broccoli-blog-api</code>:</p>
<!-- alex ignore simple -->
<blockquote>
  <p>Simple Broccoli plugin that parses collections of Markdown files and exposes them as JSON:API documents in the output tree, under the specified paths. It also supports the use of front-matter to define metadata for each Markdown file.</p>
</blockquote>
<p>Since the early days of <code>broccoli-static-site-json</code>, things have gotten a tiny bit more complicated…more flexibility usually means more complexity! But to understand the basics of how effective Broccoli has been for this use case, we can go back and look at the files of the very first commit on 7 Nov 2017. We are going to go into more detail below, but if you want to follow along you can find the main index file <a href="https://github.com/stonecircle/broccoli-static-site-json/blob/95cfe954e48da203eacba5fa154333cbc0b3a81d/index.js">here</a>.</p>
<h2 id="themainplugin">The main plugin</h2>
<p>The early experiment of the <code>broccoli-static-site-json</code> had an <code>index.js</code> file (the only active file at the time) with a total of 119 lines of code, the main active lines making up the <code>build()</code> of the Broccoli plugin only adding up to 50 lines of code, which is definitely small enough for us to deep dive into in this post. 💪</p>
<p>I'm going to give a brief overview of the structure of a Broccoli plugin and then go into detail of each line of the main <code>build()</code> function.</p>
<h3 id="structureofabroccoliplugin">Structure of a Broccoli plugin</h3>
<p>Here is a basic example of a plugin:</p>
<pre><code class="javascript language-javascript">const Plugin = require('broccoli-plugin');

class BroccoliStaticSiteJson extends Plugin {
  constructor(folder, options) {
    // tell broccoli which "nodes" we're watching
    super([folder], options);
    this.options = {
      folder,
      contentFolder: 'content',
      ...options,
    };
    // don't know what this does
    Plugin.call(this, [folder], {
      annotation: options.annotation,
    });
  }

  build() {}
}

module.exports = BroccoliStaticSiteJson;
</code></pre>
<p>This isn't exactly the <em>most</em> basic example of a plugin as it has some of the business logic and API of <code>broccoli-static-site-json</code> exposed. It is not apparent from the example above, but it is telling us that if we wanted to use this plugin we would do something like this:</p>
<pre><code class="javascript language-javascript">const jsonTree = new StaticSiteJson('input', {
  contentFolder: 'output-jsons',
})
</code></pre>
<p>This is setting the local <code>folder</code> and the <code>contentFolder</code> in the options hash for the <code>StaticSiteJson</code> class and will eventually be useful to tell the plugin to look for Markdown files in the <code>input</code> folder and put the output JSON:API files in <code>output-jsons</code>. The <code>contentFolder</code> is optional and will default to <code>content</code>.</p>
<p>When this is used in Ember CLI or any other Broccoli pipeline, the <code>build()</code> function is called. This is where most of the work happens.</p>
<h3 id="thebuildfunction">The build() function</h3>
<p>Let's show the whole <code>build()</code> function and then break it down piece by piece. Note: I've removed some things that aren't necessary for the explanation of this process like a few optional defensive programming steps, to make this easier to follow.</p>
<pre><code class="javascript language-javascript">build() {
  // build content folder if it doesn't exist
  if (!existsSync(join(this.outputPath, this.options.contentFolder))) {
    mkdirSync(join(this.outputPath, this.options.contentFolder));
  }

  // build pages file
  if (existsSync(join(this.options.folder, 'pages.yml'))) {
    let pages = yaml.safeLoad(readFileSync(join(this.options.folder, 'pages.yml'), 'utf8'));

    writeFileSync(join(this.outputPath, this.options.contentFolder, 'pages.json'), JSON.stringify(TableOfContentsSerializer.serialize(pages)));
  }

  // build the tree of MD files
  const paths = walkSync(this.inputPaths);

  const mdFiles = paths.filter(path =&gt; extname(path) === '.md');

  const fileData = mdFiles.map(path =&gt; ({
    path,
    content: readFileSync(join(this.options.folder, path)),
  })).map(file =&gt; ({
    path: file.path,
    ...yamlFront.loadFront(file.content),
  }));

  fileData.forEach((file) =&gt; {
    const directory = dirname(join(this.outputPath, this.options.contentFolder, file.path));
    if (!existsSync(directory)) {
      mkdirSync(dirname(join(this.outputPath, this.options.contentFolder, file.path)));
    }

    const serialized = ContentSerializer.serialize(file);

    writeFileSync(join(this.outputPath, this.options.contentFolder, `${file.path}.json`), JSON.stringify(serialized));
  });
}
</code></pre>
<p>This may seem a bit scary, but don't worry we will break it down, and hopefully it will all become clear!</p>
<h4 id="creatingtheoutputfolder">Creating the output folder</h4>
<p>The first piece is a bit of housecleaning. We want to make sure the output folder exists before we continue and if it doesn't we need to create it:</p>
<pre><code class="javascript language-javascript">// build content folder if it doesn't exist
if (!existsSync(join(this.outputPath, this.options.contentFolder))) {
  mkdirSync(join(this.outputPath, this.options.contentFolder));
}
</code></pre>
<p>One thing that you will notice right off the bat is that we are using functions like <code>exitsSync()</code>, <code>mkdirSync()</code> and <code>join()</code> which are all native NodeJS functions. You can see where they are coming from if you look at the top of the <code>index.js</code> file to see the require statements:</p>
<pre><code class="javascript language-javascript">const { extname, join, dirname } = require('path');
const {
  readFileSync,
  writeFileSync,
  mkdirSync,
  existsSync,
} = require('fs');
</code></pre>
<p>You can read more about these functions on the official NodeJS documentation for <a href="https://nodejs.org/api/fs.html"><code>fs</code></a> and <a href="https://nodejs.org/api/path.html"><code>path</code></a>.</p>
<h4 id="creatingthetableofcontentsfromthepagesfile">Creating the Table of Contents from the pages file</h4>
<p>Before I started building <code>broccoli-static-site-json</code>, <a href="https://github.com/locks">Ricardo Mendes AKA @locks</a> and <a href="https://github.com/jaredgalanis">Jared Galanis</a> had begun the process of building the Markdown sources directories that would allow us to manage different versions of the Ember Guides more effectively. One of the key aspects of this structure was that it included a <a href="https://github.com/ember-learn/guides-source/blob/master/guides/v2.15.0/pages.yml"><code>pages.yml</code></a> file that specified the Table of Contents (ToC) for any particular version of the Guides. What we needed to do as part of this process was to parse this YAML file and output a JSON:API based file in the output directory. Here is the code for that:</p>
<pre><code class="javascript language-javascript">// build pages file
if (existsSync(join(this.options.folder, 'pages.yml'))) {
  let pages = yaml.safeLoad(readFileSync(join(this.options.folder, 'pages.yml'), 'utf8'));

  writeFileSync(join(this.outputPath, this.options.contentFolder, 'pages.json'), JSON.stringify(TableOfContentsSerializer.serialize(pages)));
}
</code></pre>
<p>This snippet first checks to see if the input folder contains a <code>pages.yml</code> file and if it does it loads it using <a href="https://www.npmjs.com/package/js-yaml">js-yaml</a>. After it loads the data, it writes a <em>serialized</em> version of the file to the output folder, and the serialization is done using <a href="https://github.com/SeyZ/jsonapi-serializer">jsonapi-serializer</a> with the following serializer definition:</p>
<pre><code class="javascript language-javascript">const TableOfContentsSerializer = new Serializer('page', {
  id: 'url',
  attributes: [
    'title',
    'pages',
  ],
  keyForAttribute: 'cammelcase',
});
</code></pre>
<h4 id="buildingthetreeofmarkdownfiles">Building the tree of Markdown files</h4>
<p>Next up is the main event, converting a nested structure of Markdown files into a nested structure of JSON:API documents. This one will be simpler to follow if we take it in bite-sized chunks. Let's start with getting the Markdown files:</p>
<pre><code class="javascript language-javascript">const paths = walkSync(this.inputPaths);

const mdFiles = paths.filter(path =&gt; extname(path) === '.md');
</code></pre>
<p>This code uses <a href="https://github.com/joliss/node-walk-sync"><code>walkSync</code></a> to list all of the files under the inputPaths (what we passed in as the <code>folder</code> in the constructor), and then we filter that list of paths to find all files that end with <code>.md</code>, so that we can find Markdown files.</p>
<p>Next it's time to load each of those files into an array:</p>
<pre><code class="javascript language-javascript">const fileData = mdFiles.map(path =&gt; ({
  path,
  content: readFileSync(join(this.options.folder, path)),
})).map(file =&gt; ({
  path: file.path,
  ...yamlFront.loadFront(file.content),
}));
</code></pre>
<p>We used <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map"><code>Array.map()</code></a> twice to convert a list of file <em>names</em> into a data structure that contains everything that we need. The first map converts the file names into an array of objects that looks something like this:</p>
<pre><code class="javascript language-javascript">[{
  path: '/getting-started/index.md',
  content: `---
            title: Getting Started
            ---
            Getting started with Ember is easy. Ember projects are created ...`
}, {
  path: '/getting-started/quick-start.md',
  content: `---
            title: Quick Start
            ---
            This guide will teach you how to build a simple ...`
}]
</code></pre>
<p>As you can see each object remembers the path to the file that was created and has the <strong>full content</strong> of the file loaded. In the second <code>map()</code> function we the use <a href="https://www.npmjs.com/package/yaml-front-matter"><code>yaml-front-matter</code></a> to load the optional extra YAML metadata into the object. You can read more about what front-matter is and what it can be used for <a href="https://jekyllrb.com/docs/frontmatter/">here</a>.</p>
<p>After the second <code>map()</code> function the <code>fileData</code> array looks like this:</p>
<pre><code class="javascript language-javascript">[{
  path: '/getting-started/index.md',
  title: 'Getting Started',
  __content: 'Getting started with Ember is easy. Ember projects are created ...'
}, {
  path: '/getting-started/quick-start.md',
  title: 'Quick Start',
  __content: 'This guide will teach you how to build a simple ...'
}]
</code></pre>
<p>This leaves us finally ready to serialize into JSON:API. Next we need to loop over the <code>fileData</code> array and write our JSON files out to disk:</p>
<pre><code class="javascript language-javascript">fileData.forEach((file) =&gt; {
  const directory = dirname(join(this.outputPath, this.options.contentFolder, file.path));
  if (!existsSync(directory)) {
    mkdirSync(dirname(join(this.outputPath, this.options.contentFolder, file.path)));
  }

  const serialized = ContentSerializer.serialize(file);

  writeFileSync(join(this.outputPath, this.options.contentFolder, `${file.path}.json`), JSON.stringify(serialized));
});
</code></pre>
<p>The first thing we do in this function is to make sure that the folder we want to write the file into actually exists. We need to check this on all files because we used <code>walkSync</code> earlier in this process and it is possible to have a very deeply nested folder structure.</p>
<p>Next we serialize the <code>file</code> object using another <code>jsonapi-serializer</code> and write the serialized document to disk. Here is the serializer definition for the <code>ContentSerializer</code>, which is only very slightly more complicated than the one for the pages in the ToC:</p>
<pre><code class="javascript language-javascript">const ContentSerializer = new Serializer('content', {
  id: 'path',
  attributes: [
    '__content',
    'title',
  ],
  keyForAttribute(attr) {
    switch (attr) {
      case '__content':
        return 'content';
      default:
        return attr;
    }
  },
});
</code></pre>
<p>In this case we use <code>keyForAttribute()</code> to rename <code>__content</code> to be <code>content</code>.</p>
<h2 id="conclusion">Conclusion</h2>
<p>I hope you enjoyed this deep dive into the guts of <code>broccoli-static-site-json</code>. If you are interested in other places that make use of this system, you can check out <a href="https://github.com/stonecircle/ember-casper-template">Ember Casper Template</a>, which also happens to be what is powering <a href="https://blog.stonecircle.io/">the Stone Circle blog</a>. 🎉</p>
<p>As always, you can reach out to me on <a href="https://twitter.com/real_ate">Twitter</a>, or you can find me on the Ember Community Slack as <code>@real_ate</code>.</p>
<hr />
<h2 id="andlastbutnotleasthttpsgithubcomemberlearnguidesappgraphscontributors"><a href="https://github.com/ember-learn/guides-app/graphs/contributors">And last, but not least…</a></h2>
<p> We'd like to thank everyone who made the new Guides app possible! Big kudos to <a href="https://github.com/mansona" target="contributor">mansona</a>, <a href="https://github.com/sivakumar-kailasam" target="contributor">sivakumar-kailasam</a>, <a href="https://github.com/jenweber" target="contributor">jenweber</a>, <a href="https://github.com/rwwagner90" target="contributor">rwwagner90</a>, <a href="https://github.com/chrismou" target="contributor">chrismou</a>, <a href="https://github.com/localpcguy" target="contributor">localpcguy</a>, <a href="https://github.com/acorncom" target="contributor">acorncom</a>, and <a href="https://github.com/dopin" target="contributor">dopin</a> - we appreciate all the effort you put into renewing one of our most favorite documentation sites! 💖
</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Manson, Sivakumar Kailasam, Amy Lam, Ryan Mark, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-emberjs-times-issue-49</link><guid isPermaLink="true">https://blog.emberjs.com/the-emberjs-times-issue-49</guid><pubDate>Fri, 01 Jun 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 50]]></title><description><![CDATA[<p>Sawubona Emberistas! 🐹</p>
<p>Read either on the <a href="https://www.emberjs.com/blog/2018/06/08/the-emberjs-times-issue-50.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/2018/06/08/issue-50">e-mail newsletter</a> what has been going on in Emberland this week:
We have a couple of <strong>fresh 🥒 Ember RFCs</strong> (Request for Comments) in for you this week, a status update from the long-awaited
<strong>Package</strong> 📦 feature in Ember CLI 💻, a call-to-action for creative <strong>writers</strong> ✍️ and
last, but not least, a <strong>brand-new Readers' Question</strong> for you 📚:</p>
<!-- READMORE -->
<hr />
<h2 id="letssendsendactionawayhttpsgithubcomemberjsrfcspull335"><a href="https://github.com/emberjs/rfcs/pull/335">Lets Send SendAction Away!</a></h2>
<p>The time has come. <code>component#sendAction</code> has served the Ember community well for years but in a new <a href="https://github.com/emberjs/rfcs/pull/335">RFC by @cibernox</a> he proposes to deprecate this feature. In the old days, before v1.13, <code>component#sendAction</code> was the only way to <strong>bubble up actions</strong> from components. Since v1.13 we have <em>closure actions</em> which are more intuitive and flexible and they are the current recommended Ember Way™ for doing actions in components.</p>
<p><em>Closure actions</em> have been the recommended way to do actions in components for almost 3 years. Also <code>component#sendAction</code> is not even mentioned in the guides anymore so there is really little reason to keep it around. So look out for a new deprecation near you, coming soon!</p>
<p>If you want to learn more about why <em>closure actions</em> are preferred over <code>component#sendAction</code> then you can check out <a href="http://miguelcamba.com/blog/2016/01/24/ember-closure-actions-in-depth">this blog post from 2016</a>.</p>
<p>Read more about this proposal and join the RFC discussion:</p>
<p><a class="ember-button ember-button--centered" href="https://github.com/emberjs/rfcs/pull/335">Read more</a></p>
<hr />
<h2 id="rfcdeprecatingemberutilshttpsgithubcomemberjsrfcspull334"><a href="https://github.com/emberjs/rfcs/pull/334">RFC Deprecating Ember Utils 🛠</a></h2>
<p>A new RFC has been posted on deprecating <code>Ember.{isEmpty, isBlank, isNone, isPresent}</code>. The motivation of this is to <strong>clean up</strong> utils that do not provide much value over writing plain old Javascript. There's already a discussion going on whether this is a good decision or not. You can follow the discussion and read the RFC at the <a href="https://github.com/emberjs/rfcs/pull/334">RFC repository</a>.</p>
<hr />
<h2 id="globalresolverrfcinfinalprocesshttpsgithubcomemberjsrfcspull331"><a href="https://github.com/emberjs/rfcs/pull/331">Global Resolver RFC in Final Process 👨‍⚖️‍</a></h2>
<p>The RFC to <strong>deprecate global resolver</strong> is has now entered the final stage. The motivation of this RFC is the fact that we have transitioned to using Ember CLI. The globals resolver is primarily used for Ember without Ember CLI.</p>
<p>Read all about the RFC and bring your thoughts for the final process in the <a href="https://github.com/emberjs/rfcs/pull/331">RFC repository</a>.</p>
<hr />
<h2 id="emberclipackagernewsfromthefieldhttpsgithubcomemberclirfcsblobmasteractive0051packagingmd"><a href="https://github.com/ember-cli/rfcs/blob/master/active/0051-packaging.md">Ember CLI Packager: News from the Field 🌾</a></h2>
<p>We already wrote about the <a href="https://www.emberjs.com/blog/2018/05/25/the-emberjs-times-issue-48.html#toc_a-href-https-github-com-ember-cli-ember-cli-pull-7826-a-package-out-for-delivery-to-ember-cli-a">Packager in Ember CLI recently</a>. But here's another <strong>status update</strong> for this
feature which will make the <strong>build pipeline</strong> of your Ember apps <strong>easier to modify</strong> very soon:
These weeks lots of new improvements and fixes landed (<a href="https://github.com/ember-cli/ember-cli/pull/7864">1</a>, <a href="https://github.com/ember-cli/ember-cli/pull/7855">2</a>, <a href="https://github.com/ember-cli/ember-cli/pull/7848">3</a>, <a href="https://github.com/ember-cli/ember-cli/pull/7860">4</a>).
According to internal sources, there have already been <strong>successful test runs</strong> using the experimental version of this <a href="https://rollupjs.org/guide/en">Rollup</a> powered packager 😲 for bundling and tree-shaking
different open-source Ember 🐹 projects.
We'll keep you posted with more news from the field soon!</p>
<hr />
<h2 id="gotsomethingtosharehttpsairtablecomshrdbeo2y80opg0kc"><a href="https://airtable.com/shrDbeo2Y80OPG0kC">Got Something to Share?</a></h2>
<p>We all love reading the Ember blog. It’s an awesome way to find out what’s happening in the community and to keep up to date on all things Ember. Sometimes though, you may think to yourself, “I’ve got something to say!”. Awesome! Whether your passion is authoring addons or tinkering with broccoli, <strong>contributing to the blog</strong> is an excellent opportunity to connect with the community. Well, getting started could not be any easier! If you want to write a guest blog post for the website, make your way over to <a href="https://airtable.com/shrDbeo2Y80OPG0kC">Ember.js Guest Blog Post Invitation</a>, and fill out the form!</p>
<hr />
<h2 id="theshortestemberbookhttpsgithubcomemberlearntheshortestemberbook"><a href="https://github.com/ember-learn/the-shortest-ember-book">The Shortest Ember Book 📖🐹</a></h2>
<div class="blog-row">
  <img class="float-left medium transparent padded pad-l0" alt="Shortest Ember Book" title="Shortest Ember Book" src="/images/about/shortest-ember-book.jpg" />

  <p><strong>The Shortest Ember Book</strong> is <a href="https://github.com/ember-learn/the-shortest-ember-book" target="emberbook">here</a>! The goal is to quickly and concisely communicate <strong>what Ember is</strong>, how it works, and steps to get started. Anyone is welcome to print the book! Meetup organizers, speakers, and conference table hosts are especially encouraged to print and distribute copies. Shoutout to <a href="http://www.bradenlawrence.com/portfolio" target="braden">Braden Lawrence</a> for the designs and <a href="https://github.com/jenweber" target="jen">Jen Weber</a> for leading the project.</p>
</div>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv310contributingrepositories"><a href="https://guides.emberjs.com/v3.1.0/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/IzzatN" target="gh-user">@IzzatN</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/savvymas" target="gh-user">@savvymas</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/jeffdaley" target="gh-user">@jeffdaley</a>, <a href="https://github.com/vFederer" target="gh-user">@vFederer</a>, <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/thoov" target="gh-user">@thoov</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/izelnakri" target="gh-user">@izelnakri</a>, <a href="https://github.com/dfreeman" target="gh-user">@dfreeman</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/jfdnc" target="gh-user">@jfdnc</a>, <a href="https://github.com/chaoobject001" target="gh-user">@chaoobject001</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/CodingItWrong" target="gh-user">@CodingItWrong</a>, <a href="https://github.com/pizza" target="gh-user">@pizza</a>, <a href="https://github.com/sbatson5" target="gh-user">@sbatson5</a> and <a href="https://github.com/sivakumar-kailasam" target="gh-user">@sivakumar-kailasam</a> - thank you for all your efforts! ❤️
</span>
</p>
<hr />
<h2 id="readersquestionsidliketocontributetoemberhowcanigetstartedhttpsdiscussemberjscomtreadersquestionsidliketocontributetoemberhowcanigetstarted14915"><a href="https://discuss.emberjs.com/t/readers-questions-id-like-to-contribute-to-ember-how-can-i-get-started/14915">Readers' Questions: "I'd like to contribute to Ember. How can I get started?" 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>In <strong>this week's Readers' Question</strong> we're talking about contribution - and <strong>first-time contributions</strong> to Ember in particular.
  Ember Learning team member <a href="https://github.com/jessica-jordan" target="jj">@jessica-jordan</a> highlights in her answer which repositories are a great starting point for a first contribution to the Ember ecosystem, how you can find an interesting issue to work on and where you can reach out to other community members to make your contribution a <strong>real success</strong> 💪.</p>
</div>
<div class="blog-row">
  <a class="es-button" href="https://discuss.emberjs.com/t/readers-questions-id-like-to-contribute-to-ember-how-can-i-get-started/14915">Read more</a>
</div>
<div class="blog-row">
  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> at <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Kenneth Larsen, Sivakumar Kailasam, Alon Bukai, Ryan Mark, Amy Lam, Jen Weber, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-emberjs-times-issue-50</link><guid isPermaLink="true">https://blog.emberjs.com/the-emberjs-times-issue-50</guid><pubDate>Fri, 08 Jun 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 51]]></title><description><![CDATA[<p>העלא Emberistas! 🐹</p>
<p>Read either on the <a href="https://www.emberjs.com/blog/2018/06/15/the-emberjs-times-issue-51.html">Ember blog</a> or in our <a href="https://the-emberjs-times.ongoodbits.com/2018/06/15/issue-51">e-mail newsletter</a> what has been going on in Emberland this week.
We have a reminder for a RFC (Request for Comments) which has entered its <strong>Final Comment Period (FCP)</strong>,
as well as a look into the <strong>Future of Ember</strong> and an <strong>engine</strong>-powered <strong>Roadmap</strong> highlight for you.</p>
<p>This is what's happened in Emberland this week 🐹:</p>
<!-- READMORE -->
<hr />
<h2 id="backtothefuturehttpsgithubcomrwjblueembernamedargumentspolyfill"><a href="https://github.com/rwjblue/ember-named-arguments-polyfill">Back To the Future 🤖✨</a></h2>
<p>A polyfill that is now available is <a href="https://github.com/rwjblue/ember-named-arguments-polyfill">ember-named-arguments-polyfill</a> which polyfills the named arguments feature to work for Ember 2.10+.</p>
<p>This is helpful for add-on authors who want to leverage the named arguments feature for a cleaner template. So, components receiving an argument named <code>foo</code> can now do:
<code>{{@foo}}</code>. This allows you to distinguish arguments from local variables, computed properties and such.</p>
<p>Named arguments already landed in <a href="https://www.emberjs.com/blog/2018/04/13/ember-3-1-released.html#toc_named-arguments-1-of-4">Ember 3.1</a> so this polyfill is for anyyone who didn't upgrade but still wants to use the feature.</p>
<hr />
<h2 id="thefutureofemberisnowhttpsblogusejournalcomemberjs2018mysafariintothefuturee4f31a4902ea"><a href="https://blog.usejournal.com/emberjs2018-my-safari-into-the-future-e4f31a4902ea">The Future of Ember is now</a></h2>
<p>Quite recently <strong>a plethora of RFCs (Request for Comments)</strong> proposed ground-breaking, <strong>new
features</strong> for Ember. These included the proposals for <a href="https://github.com/emberjs/rfcs/blob/master/text/0281-es5-getters.md">ES5 Getters</a> and <a href="https://github.com/emberjs/rfcs/blob/master/text/0276-named-args.md">named arguments for Components</a> which already found their way into the <strong>previous 3.1 release</strong> in a <a href="https://www.emberjs.com/blog/2018/04/13/ember-3-1-released.html#toc_changes-in-ember-js-3-1">stable fashion</a>.
But what about all the other cool things that we mentioned in previous editions of the Ember Times?
When are all of these proposal finally gonna land?</p>
<p>Features which haven't found their way into a stable release and have not been recommended by the <a href="https://github.com/ember-learn/guides-app">official Guides</a> yet,
might in fact have landed already. Like a hidden gem, they sit there for a while, only noticed by a few,
but still ready to be tested and improved until they make it into a stable release.
And so it seems some of the most exciting API changes in Ember this year have still <strong>gone unnoticed</strong>:
But <a href="#toc_a-href-https-github-com-rwjblue-ember-named-arguments-polyfill-back-to-the-future-a">AngleBracketComponents</a>,
ES6 Classes, the new folder structure à la Module Unification and even Glimmer Components can be used in Ember apps today -
with a little help from feature flags, canary releases and the Ember addon ecosystem.</p>
<p>But <strong>how</strong> do you make the future of Ember happen in your apps today? If you're wondering about that, check out <a href="https://blog.usejournal.com/emberjs2018-my-safari-into-the-future-e4f31a4902ea">this excellent How-To</a> by <a href="https://github.com/chrism/">@chrism</a>,
a <strong>step-by-step guide</strong> for those who want to <strong>try out the future of Ember</strong> in their applications.
Because you don't have to wait for the future of Ember until another day; the future of Ember is <strong>now</strong>.</p>
<p><a class="ember-button ember-button--centered" href="https://blog.usejournal.com/emberjs2018-my-safari-into-the-future-e4f31a4902ea" target="futureofember">See It in Action</a></p>
<hr />
<h2 id="isyourcomponentnotpointyenoughhttpsgithubcomrwjblueemberanglebracketinvocationpolyfill"><a href="https://github.com/rwjblue/ember-angle-bracket-invocation-polyfill">Is Your Component Not Pointy Enough? 👈</a></h2>
<p><a href="https://github.com/rwjblue/ember-angle-bracket-invocation-polyfill">ember-angle-bracket-invocation-polyfill</a> provides a polyfill for <strong>angle bracket invocation syntax</strong> as described in <a href="https://github.com/emberjs/rfcs/pull/311">RFC #311</a>.
It includes features such as invoking components via angle brackets using <em>TitleCase</em>, self-closing syntax, paths and much more.</p>
<p>If you’re interested in using this, the best documentation is <a href="https://emberjs.github.io/rfcs/0311-angle-bracket-invocation.html">the RFC itself</a>.</p>
<hr />
<h2 id="starttheengineandgofor10httpsdiscussemberjscomtengines10roadmap14914"><a href="https://discuss.emberjs.com/t/engines-1-0-roadmap/14914">Start the Engine and Go for 1.0 🏍</a></h2>
<p>This week <a href="https://discuss.emberjs.com/t/engines-1-0-roadmap/14914">the long-awaited Roadmap</a> leading to the <strong>first major release of Ember Engines</strong> has been published. It includes <strong>a to-do list</strong> of features and improvements that are required to land before a <em>v1.0</em> becomes reality,
including support for loading route-less engines lazily and a refactor of the build pipeline to be powered by the <a href="https://github.com/ember-cli/rfcs/blob/master/active/0051-packaging.md">upcoming Packager feature in Ember CLI</a>.</p>
<p>If you're a user of Ember Engines yourself, be sure to not only join the <a href="https://discuss.emberjs.com/t/engines-1-0-roadmap/14914">discussion on the Ember Forum</a>,
but also <strong>provide</strong> the necessary <strong>feedback</strong> on <a href="https://airtable.com/shrZ4fnIa6ayNinHH">how you are using Ember Engines</a>
to make the 1.0 Roadmap a real success. ✨</p>
<hr />
<h2 id="newreleaseofembertwiddlehttpsembertwiddlecom"><a href="https://ember-twiddle.com">New release of Ember Twiddle</a></h2>
<p><strong>Ember Twiddle v0.14.0</strong> was released on Monday, June 4. It includes support for Ember 2.18, Babel 6, and new module imports.
The entire <a href="https://github.com/ember-cli/ember-twiddle/releases/tag/v0.14.0">changelog</a> shows all the work that has gone into this.
The next version is also being worked on, supporting Ember 3.0 - Ember 3.2.
You can <strong>test out the new version</strong> at <a href="https://canary.ember-twiddle.com">canary.ember-twiddle.com</a> today.
Ember Twiddle is a <strong>playground website</strong> for developing small Ember applications backed by Github gists.</p>
<hr />
<h2 id="itsvisiblytimetodeprecateisvisiblehttpsgithubcomemberjsrfcspull324"><a href="https://github.com/emberjs/rfcs/pull/324">It's visibly time to deprecate isVisible 👀</a></h2>
<p>A new RFC has been posted on deprecating <code>Component#isVisible</code>. The motivation is related to the confusion associated to setting the isVisible property on a component. Also, modern Ember applications are already avoiding using isVisible in favor of simpler conditionals in the template. Given that <code>Component#isVisible</code> is a public API, deprecating now would schedule for removal in the next major version release (4.0).</p>
<p>No sweat, other options are still available to hide elements, such as:</p>
<ul>
<li><code>&lt;div hidden={{boolean}}&gt;&lt;/div&gt;</code></li>
<li>Wrapping the component in a template conditional <code>{{#if}}</code> statement.</li>
<li>Using the Component's <code>classNames</code> and <code>classNameBindings</code></li>
</ul>
<p>A heads-up that this RFC has entered the FCP (Final Comment Period), so this week might be your last chance to comment on it!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomv320contributingrepositories"><a href="https://guides.emberjs.com/v3.2.0/contributing/repositories/">Contributors' Corner</a></h2>
<p>This week we'd like to thank <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/xg-wang" target="gh-user">@xg-wang</a>, <a href="https://github.com/alexmasita" target="gh-user">@alexmasita</a>, <a href="https://github.com/Serabe" target="gh-user">@Serabe</a>, <a href="https://github.com/sandydoo" target="gh-user">@sandydoo</a>, <a href="https://github.com/mdbiscan" target="gh-user">@mdbiscan</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/Mi6u3l" target="gh-user">@Mi6u3l</a>, <a href="https://github.com/andreavaghi" target="gh-user">@andreavaghi</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/Gaurav0" target="gh-user">@Gaurav0</a>, <a href="https://github.com/nataliemok" target="gh-user">@nataliemok</a>, <a href="https://github.com/jessica-jordan" target="gh-user">@jessica-jordan</a>, <a href="https://github.com/pablobm" target="gh-user">@pablobm</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/kevinansfield" target="gh-user">@kevinansfield</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a>, <a href="https://github.com/mmun" target="gh-user">@mmun</a>, <a href="https://github.com/lbdm44" target="gh-user">@lbdm44</a>, <a href="https://github.com/stefanpenner" target="gh-user">@stefanpenner</a>, <a href="https://github.com/chrism" target="gh-user">@chrism</a>, <a href="https://github.com/givanse" target="gh-user">@givanse</a>, <a href="https://github.com/thoov" target="gh-user">@thoov</a>, <a href="https://github.com/cyk" target="gh-user">@cyk</a>, <a href="https://github.com/NullVoxPopuli" target="gh-user">@NullVoxPopuli</a>, <a href="https://github.com/dnachev" target="gh-user">@dnachev</a>, <a href="https://github.com/gokatz" target="gh-user">@gokatz</a>, <a href="https://github.com/knownasilya" target="gh-user">@knownasilya</a>, <a href="https://github.com/acorncom" target="gh-user">@acorncom</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/antidis" target="gh-user">@antidis</a>, <a href="https://github.com/dctalbot" target="gh-user">@dctalbot</a>, <a href="https://github.com/joehany" target="gh-user">@joehany</a>, <a href="https://github.com/rodrigoyoshida" target="gh-user">@rodrigoyoshida</a>, <a href="https://github.com/MattSwanson" target="gh-user">@MattSwanson</a> and <a href="https://github.com/progand" target="gh-user">@progand</a> for their contributions to Ember and related repositories! 💕
</p>
<hr />
<h2 id="moreqaforreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">More Q&A for Readers' Questions 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>With core team efforts focusing in on important bug fixes for Ember itself, we want to take the chance to recap some of the <strong>previous, great answers</strong> to previous, <strong>great questions</strong> by Ember.js Times readers:</p>

  <ul>
    <li><a href="https://discuss.emberjs.com/t/readers-questions-is-it-bad-to-load-data-in-components/14521" target="rquestion">Readers’ Questions #6: “Is it bad to load data in components?”</a></li>
    <li><a href="https://discuss.emberjs.com/t/readers-questions-when-will-we-be-able-to-use-decorators-in-ember-apps/14583" target="rquestion">Readers’ Questions #7: “When will we be able to use decorators in Ember apps?”</a></li>
    <li><a href="https://discuss.emberjs.com/t/readers-questions-why-does-ember-still-use-rsvp/14736" target="rquestion">Readers’ Questions #8: “Why does Ember still use RSVP?”</a></li>
    <li><a href="https://discuss.emberjs.com/t/readers-questions-id-like-to-contribute-to-ember-how-can-i-get-started/14915" target="rquestion">Readers’ Questions #9: “I’d like to contribute to Ember. How can I get started?”</a></li>
  </ul>
</div>
<div class="blog-row">
  <p><strong>Submit your own</strong> short and sweet <strong>question</strong> at <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>
</div>
<h2 id="theembertimesiswhatwemakeithttpstheemberjstimesongoodbitscom"><a href="https://the-emberjs-times.ongoodbits.com/">The Ember Times is What We Make It 🙌</a></h2>
<p>The <strong>The Ember Times</strong> is a <strong>weekly news editorial</strong> featuring all the new things that are going on in Emberland.
<a href="https://the-emberjs-times.ongoodbits.com/">Subscribe to our e-mail newsletter</a> to get the next edition <strong>right to your inbox</strong>.
If you ❤️ what you're reading and you feel like a <strong>writer</strong> at heart,
drop by <a href="https://embercommunity.slack.com/messages/C8P6UPWNN/convo/C4TD5JJ7R-1497022015.688894/">#topic-embertimes</a> on the Ember Community Slack Chat to join the discussion or even <strong>become the co-author</strong> of a future edition!</p>
<hr />
<p>That's another wrap!  ✨</p>
<p>Be kind,</p>
<p>Gaurav Munjal, Melanie Sumner, Miguel Braga Gomes, Sivakumar Kailasam, Kenneth Larsen, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-emberjs-times-issue-51</link><guid isPermaLink="true">https://blog.emberjs.com/the-emberjs-times-issue-51</guid><pubDate>Fri, 15 Jun 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 74]]></title><description><![CDATA[<p>This week we are thankful for our Emberistas! 🐹</p>
<p>Check out the new Ember Data public packages 📦, this week's work by dedicated contributors 💪 to the Ember Guides, an improvement to the guides tutorial 🗺️, and the Ember in VSCode tutorial 💻!</p>
<!-- READMORE -->
<hr />
<h2 id="rfcforemberdatapackageshttpsgithubcomemberjsrfcspull395"><a href="https://github.com/emberjs/rfcs/pull/395">RFC for @ember-data packages 📦</a></h2>
<p><a href="www.github.com/runspired">@runspired</a> dropped a big RFC on <a href="https://github.com/emberjs/data">Ember Data</a> packages. The RFC proposes <strong>public</strong> import path changes for <code>ember-data</code> and moving <code>ember-data</code> into the <code>@ember-data</code> namespace.</p>
<!--alex ignore nuts-->
<p>The motivations for these changes revolve around improving the <a href="https://www.typescriptlang.org/">TypeScript</a> experience, reduce bike shedding, simplify the mental model, engage more contributors, improve CI time, and more! By breaking down the single large package into smaller consumable chunks, end users can pick and choose which parts they need and do not need as well as make the ecosystem easier to navigate.</p>
<p>There are <a href="https://github.com/runspired/rfcs/blob/ember-data-packages-rfc/text/0000-ember-data-packages.md#detailed-design">detailed designs</a> on where each package will move towards so read more about it in the <a href="https://github.com/runspired/rfcs/blob/ember-data-packages-rfc/text/0000-ember-data-packages.md">RFC on GitHub</a>!</p>
<hr />
<h2 id="withlearnersinmindimprovingtheemberguideshttpsdiscordappcomchannels480462759797063690480777444203429888"><a href="https://discordapp.com/channels/480462759797063690/480777444203429888">With Learners in Mind: Improving the Ember Guides 🐹</a></h2>
<p>This week a set of contributions to the <a href="https://github.com/ember-learn/guides-source/">Ember Guides</a> will make concepts like Ember Components, Ember Data among others much <strong>easier to understand</strong> for learners of the framework. The contributors <a href="https://github.com/zachgarwood">@zachgarwood</a>, <a href="https://github.com/ppcano">@ppcano</a>, <a href="https://github.com/LalithaRajanala">@LalithaRajanala</a> and <a href="https://github.com/sduquej">@sduquej</a> made sure that new concepts are introduced sufficiently and that instructions in the <a href="https://guides.emberjs.com/release/tutorial/ember-cli/">Ember Tutorial</a> are as clear as possible (<a href="https://github.com/ember-learn/guides-source/pull/284">1</a>, <a href="https://github.com/ember-learn/guides-source/pull/283">2</a>, <a href="https://github.com/ember-learn/guides-source/pull/282">3</a>, <a href="https://github.com/ember-learn/guides-source/pull/280">4</a>, <a href="https://github.com/ember-learn/guides-source/pull/240">5</a>, <a href="https://github.com/ember-learn/guides-source/pull/222">6</a>). <strong>Thank you</strong> so much for <strong>your contributions</strong> to the Guides! ❤️</p>
<p>If you want to help improve the Guides as well, please be sure to check out the <a href="https://help-wanted.emberjs.com/learning?query=guides">list of issues that need help</a> or drop by the <a href="https://discordapp.com/channels/480462759797063690/480777444203429888">#dev-ember-learning channel on Discord</a> to get started!</p>
<hr />
<h2 id="newandimprovedtutorialhttpsguidesemberjscomreleasetutorialembercli"><a href="https://guides.emberjs.com/release/tutorial/ember-cli/">New and Improved Tutorial 🗺️</a></h2>
<p>One of the great ways to learn Ember is by building the <code>super-rentals</code> app by following the <a href="https://guides.emberjs.com/release/tutorial/ember-cli/">tutorial in the guides</a>. One of the things you’ll learn in that tutorial is how to integrate Google Maps into an Ember application. Sadly, some changes to Google Maps meant that now you would have to provide credit card information to embed it in your app.</p>
<p>Thankfully, <strong>the amazing <a href="https://github.com/toddjordan">@toddjordan</a></strong> has provided a great fix for this. He has switched the Google Maps part out of <code>super-rentals</code> and replaced it with the free alternative Leaflet Mapbox.</p>
<p>Thanks a lot for all of the hard work on this, <a href="https://github.com/toddjordan">@toddjordan</a>! ❤️</p>
<hr />
<h2 id="usevscodehelpwantedhttpsgithubcommicrosoftvscodedocsissues1509issuecomment440084989"><a href="https://github.com/Microsoft/vscode-docs/issues/1509#issuecomment-440084989">Use VSCode? Help Wanted 🚧</a></h2>
<p>VSCode recently published <a href="https://code.visualstudio.com/docs/nodejs/emberjs-tutorial">Using Ember in Visual Studio Code</a> on their docs site! Ember <strong>enthusiasts</strong> are encouraged to <a href="https://github.com/Microsoft/vscode-docs/issues/1509#issuecomment-440084989">submit PRs</a> to improve the tutorial, particularly to the <a href="https://github.com/Microsoft/vscode-docs/blob/master/docs/nodejs/emberjs-tutorial.md#common-questions">client-side debugging story</a>.</p>
<p>Looking for help to get started? Drop by <a href="https://discordapp.com/channels/480462759797063690/480777444203429888">#dev-ember-learning</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Chat</a> and ask away!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/bobisjan" target="gh-user">@bobisjan</a>, <a href="https://github.com/SergeAstapov" target="gh-user">@SergeAstapov</a>, <a href="https://github.com/hjdivad" target="gh-user">@hjdivad</a>, <a href="https://github.com/chadhietala" target="gh-user">@chadhietala</a>, <a href="https://github.com/simonihmig" target="gh-user">@simonihmig</a>, <a href="https://github.com/bekzod" target="gh-user">@bekzod</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/chrisrng" target="gh-user">@chrisrng</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/thorsteinsson" target="gh-user">@thorsteinsson</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/NullVoxPopuli" target="gh-user">@NullVoxPopuli</a>, <a href="https://github.com/sduquej" target="gh-user">@sduquej</a>, <a href="https://github.com/zachgarwood" target="gh-user">@zachgarwood</a>, <a href="https://github.com/jaredgalanis" target="gh-user">@jaredgalanis</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/spruce" target="gh-user">@spruce</a> and <a href="https://github.com/LalithaRajanala" target="gh-user">@LalithaRajanala</a> for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Chris Ng, Amy Lam, Jessica Jordan, Kenneth Larsen, and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-emberjs-times-issue-74</link><guid isPermaLink="true">https://blog.emberjs.com/the-emberjs-times-issue-74</guid><pubDate>Fri, 23 Nov 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Ember Times - Issue No. 75]]></title><description><![CDATA[<p>Hallo Emberistas! 🐹</p>
<p>This week we have: the Learning Team's first annual Dec<strong>Ember</strong> ❄️, a sneak peek at the <strong>new Ember CLI guides</strong> 📖, final comments on <strong>RFC RFCeption</strong> 🤔, upvotes for the <strong>Ember subreddit</strong> ⬆️, a reminder to watch the first season of <strong>EmberFest 2018</strong> 🍿📽, a how-to for <strong>building</strong> your own painting <strong>game</strong> 🎨, and a guide to start writing <strong>components you'll love</strong> 💖!</p>
<!-- READMORE -->
<hr />
<h2 id="firstannualdecembereventhttpsemberjscomblog20181129decembereventhtml"><a href="https://emberjs.com/blog/2018/11/29/december-event.html">First Annual DecEmber Event! ❄️</a></h2>
<p>This year, the Ember Learning Core Team is sponsoring our first annual DecEmber, a hackathon event specifically targeted at Learning Team efforts! For an extra bit of awesome, it’s running at the same time as <a href="https://24pullrequests.com/">24 Pull Requests</a>, so contributions to DecEmber will count for both!</p>
<p>Maybe December is a busy month for you, because of the holidays and family obligations—and that’s totally okay—we hope you have a great time! But for some, December is a time of the year with a lot of downtime. Maybe that’s you! Are you wondering what to do with all your vacation time in December? We’ve got ya covered!</p>
<h3 id="participationrules">Participation Rules</h3>
<p>To qualify for any of our random assortment of thank you goodies (that we’ve delightfully dubbed <em>Embercouragement</em>), you must complete at least five participation activities for repositories in the <a href="https://github.com/ember-learn">ember-learn org</a> between December 1-28, 2018.</p>
<h3 id="participationactivities">Participation Activities</h3>
<ul>
<li>Submitting PRs for issues<ul>
<li>In the <a href="https://github.com/ember-learn">Ember Learn org</a></li>
<li>That have the <code>DecEmber</code> label</li></ul></li>
<li>Writing Issues for repositories in the ember-learn org. We will mark them with the <code>DecEmber</code> label if they qualify.</li>
<li>Creating Illustrations: Maybe you have an artistic side, and illustrating code concepts is fun for you! If that’s the case, there are always illustrations that would enhance the guides, and those are very welcome for this event!</li>
<li>If you have another idea that you think would help support the Learning Core Team, let us know!</li>
</ul>
<h3 id="qualitystandards">Quality Standards</h3>
<p>We don’t think we need to say these things, but just in case…</p>
<ul>
<li>The PR counts once it is merged; the issue counts once we have added the label.</li>
<li>The PR must not be disruptive (i.e., taking someone else’s branch/commits and creating a PR).</li>
<li>If you participate by writing an issue, the issue should be of respectable quality and not something that is clearly an intent to +1 your participation count.</li>
</ul>
<h3 id="support">Support</h3>
<p>During the month of December, members of the Learning Core Team will be spending extra time in the December <a href="https://discordapp.com/channels/480462759797063690/517914929261576212">text</a> and <a href="https://discordapp.com/channels/480462759797063690/517914929261576212">voice chat</a> channels on our <a href="https://discordapp.com/invite/zT3asNS">Discord server</a>! It's a great place to ask questions or chat about the event.</p>
<hr />
<h2 id="newguidesforemberclihttpscliemberjscomrelease"><a href="https://cli.emberjs.com/release/">New Guides for Ember CLI 📓</a></h2>
<p>There's a <strong>new and improved version of the Ember CLI guides out</strong>. <a href="https://github.com/jenweber">@jenweber</a> has been championing moving the Ember CLI guides into the Ember domain with enhanced content.</p>
<p>There will be a more formal launch of the new Ember CLI guides on the <a href="https://emberjs.com/blog/">Ember blog</a> but since you're <strong>an Ember Times subscriber</strong>, <a href="https://cli.emberjs.com/release/">you get a sneak peek</a>.</p>
<p>If you find any typos or bugs, then please feel free to report it to the <a href="https://github.com/ember-learn/cli-guides">new repository</a>.</p>
<hr />
<h2 id="therfcrfceptionhttpsgithubcomemberjsrfcspull300"><a href="https://github.com/emberjs/rfcs/pull/300">The RFC RFCeption 🤔</a></h2>
<!--alex ignore period-->
<p>The RFC (Request For Comments) about the <a href="https://github.com/emberjs/rfcs/pull/300">RFC Process</a> itself is in its <strong>final comment period</strong>!</p>
<p>The current RFC process is great but has a few quirks. For example, there are different processes for <a href="https://github.com/emberjs/rfcs">emberjs/rfcs</a> and <a href="https://github.com/ember-cli/rfcs">ember-cli/rfcs</a>. If you haven't taken a look yet; this RFC proposes joining together all RFC processes, requiring a <a href="https://emberjs.com/team/">core team</a> champion for RFCs that are accepted and more. Check it out and join the <a href="https://github.com/emberjs/rfcs/pull/300">discussion</a>!</p>
<hr />
<h2 id="haveyoureadtheembersubreddithttpswwwredditcomremberjs"><a href="https://www.reddit.com/r/emberjs/">Have You Read the Ember Subreddit? ⬆️</a></h2>
<p>In case you didn't know Ember.js has its own <a href="https://www.reddit.com/r/emberjs/">Reddit subreddit</a>! It is another media channel where people can participate and share <strong>Ember-related</strong> things! It recently got a facelift and a new Ember brand theme.</p>
<p>The community has decided that we want to revive this subreddit and get it active. We want to get something about Ember on the front page but we need your help!</p>
<p>If you are wondering where to start check out <a href="https://www.reddit.com/r/emberjs/comments/9yycbi/what_are_you_working_on_nov_2018/">What Are You Working On (Nov 2018)</a> and tell us what Ember things you have been doing in the month of November.</p>
<p>If you have any questions about the subreddit itself or want to help out hit up the new mods <a href="https://github.com/NullVoxPopuli">@NullVoxPopuli</a> or <a href="https://github.com/Alonski">@Alon</a> on <a href="https://discord.gg/zT3asNS">Discord</a>.</p>
<p>So <strong>subscribe</strong> to the <a href="https://www.reddit.com/r/emberjs/">subreddit</a> today, post some content and upvote 🆙 what you love!</p>
<hr />
<h2 id="didntmakeittoemberfestwatchthishttpswwwyoutubecomwatchvorzmdobmz_qlistpln4spdlosvksb9034ldndp1jonbgssax9"><a href="https://www.youtube.com/watch?v=oRzmDobMZ_Q&list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9">Didn't Make It to EmberFest 🐹🎉? Watch This!</a></h2>
<p>Didn't make it to <strong>Emberfest</strong>, a Europe-based conference around Ember, this year? Then be sure to take a look into the <a href="https://www.youtube.com/watch?v=oRzmDobMZ_Q&list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9">list of talk recordings here</a>! 👀</p>
<p>From the <a href="https://www.youtube.com/watch?v=oRzmDobMZ_Q&list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9&index=1">the intriguing opening keynote</a> by <a href="https://github.com/tomdale">@tomdale</a>, to <a href="https://github.com/danielleadams">@danielleadams'</a> stellar guide to <a href="https://www.youtube.com/watch?v=-UZyjqBm59U&index=16&list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9">mastering forms in Ember</a>, and <a href="https://www.youtube.com/watch?v=xP-kog04lng&list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9&index=21">the thought-provoking closing keynote</a> by <a href="https://github.com/MelSumner">@MelSumner</a>, there are many highlights to find in the more than 5-hour long playlist. 🎬 <a href="https://www.youtube.com/watch?v=oRzmDobMZ_Q&list=PLN4SpDLOSVkSB9034lDNdP1JoNBGssax9">Check it out!</a></p>
<hr />
<h2 id="videotutorialonhowtobuildapaintinggamehttpstwittercomgavinjoycestatus1068208916117577728"><a href="https://twitter.com/gavinjoyce/status/1068208916117577728">Video Tutorial on How to Build a Painting Game 🎨</a></h2>
<!--alex ignore kids-->
<p><a href="https://github.com/GavinJoyce">@GavinJoyce</a> published a tutorial on how to build a kids painting game in 20 minutes <a href="https://www.youtube.com/watch?v=N4KrBuO0RRE">on YouTube</a>.</p>
<p>In his tutorial, he uses 3 Ember CLI addons: <a href="https://github.com/embermap/ember-cli-tailwind">ember-cli-tailwind</a>, <a href="https://github.com/DockYard/ember-composable-helpers">ember-composable-helpers</a>, and <a href="https://github.com/machty/ember-concurrency">ember-concurrency</a> as well as <a href="https://www.emberjs.com/blog/2018/10/15/ember-3-5-released.html">Ember 3.5</a>.</p>
<!--alex ignore kids-->
<p>You can check out the full source code for the demo <a href="https://github.com/GavinJoyce/ember-kids-painting-game">on GitHub</a> or run the <a href="http://kids-painting-game.surge.sh/">app online</a>.</p>
<hr />
<h2 id="startwritingcomponentsyoulllovehttpsembermapcomembercomponentpatterns"><a href="https://embermap.com/ember-component-patterns">Start Writing Components You'll Love 💖</a></h2>
<p>EmberMap just launched a <a href="https://embermap.com/ember-component-patterns">free e-mail course</a> where you'll learn how to build <strong>better Ember components</strong> in six lessons that walk through the fundamentals of UI development. We're excited to learn about declarative rendering, state hoisting, data-loading components and more! Check out <a href="https://discordapp.com/channels/480462759797063690/486955806588403773">#media</a> on Discord to chat about the course and other external Ember resources!</p>
<hr />
<h2 id="contributorscornerhttpsguidesemberjscomreleasecontributingrepositories"><a href="https://guides.emberjs.com/release/contributing/repositories/">Contributors' Corner 👏</a></h2>
<p>This week we'd like to thank <a href="https://github.com/kratiahuja" target="gh-user">@kratiahuja</a>, <a href="https://github.com/rwjblue" target="gh-user">@rwjblue</a>, <a href="https://github.com/bobisjan" target="gh-user">@bobisjan</a>, <a href="https://github.com/cah-danmonroe" target="gh-user">@cah-danmonroe</a>, <a href="https://github.com/BradenLawrence" target="gh-user">@BradenLawrence</a>, <a href="https://github.com/runspired" target="gh-user">@runspired</a>, <a href="https://github.com/jenweber" target="gh-user">@jenweber</a>, <a href="https://github.com/buschtoens" target="gh-user">@buschtoens</a>, <a href="https://github.com/samselikoff" target="gh-user">@samselikoff</a>, <a href="https://github.com/zachgarwood" target="gh-user">@zachgarwood</a>, <a href="https://github.com/pzuraq" target="gh-user">@pzuraq</a>, <a href="https://github.com/jelhan" target="gh-user">@jelhan</a>, <a href="https://github.com/ppcano" target="gh-user">@ppcano</a>, <a href="https://github.com/MelSumner" target="gh-user">@MelSumner</a>, <a href="https://github.com/amyrlam" target="gh-user">@amyrlam</a>, <a href="https://github.com/kennethlarsen" target="gh-user">@kennethlarsen</a>, <a href="https://github.com/Alonski" target="gh-user">@Alonski</a>, <a href="https://github.com/mansona" target="gh-user">@mansona</a>, <a href="https://github.com/hjdivad" target="gh-user">@hjdivad</a>, <a href="https://github.com/igorT" target="gh-user">@igorT</a>, <a href="https://github.com/thorsteinsson" target="gh-user">@thorsteinsson</a>, <a href="https://github.com/mydea" target="gh-user">@mydea</a>, <a href="https://github.com/tomdale" target="gh-user">@tomdale</a>, <a href="https://github.com/chiragpat" target="gh-user">@chiragpat</a>, <a href="https://github.com/kellyselden" target="gh-user">@kellyselden</a> and <a href="https://github.com/Turbo87" target="gh-user">@Turbo87</a>  for their contributions to Ember and related repositories! 💖</p>
<hr />
<h2 id="gotaquestionaskreadersquestionshttpsdocsgooglecomformsde1faipqlscqu7lw_9cikrtaixkitgkao4xx_pv1pdcfmjgir6py1v9ogviewform"><a href="https://docs.google.com/forms/d/e/1FAIpQLScqu7Lw_9cIkRtAiXKitgkAo4xX_pV1pdCfMJgIr6Py1V-9Og/viewform">Got a Question? Ask Readers' Questions! 🤓</a></h2>
<div class="blog-row">
  <img class="float-right small transparent padded" alt="Office Hours Tomster Mascot" title="Readers' Questions" src="/images/tomsters/officehours.png" />

  <p>Wondering about something related to Ember, Ember Data, Glimmer, or addons in the Ember ecosystem, but don't know where to ask? Readers’ Questions are just for you!</p>

<p><strong>Submit your own</strong> short and sweet <strong>question</strong> under <a href="https://bit.ly/ask-ember-core" target="rq">bit.ly/ask-ember-core</a>. And don’t worry, there are no silly questions, we appreciate them all - promise! 🤞</p>

</div>
<hr />
<h2 id="embertimeshttpsemberjscomblogtagsnewsletterhtml"><a href="https://emberjs.com/blog/tags/newsletter.html">#embertimes</a> 📰</h2>
<p>Want to write for the Ember Times? Have a suggestion for next week's issue? Join us at <a href="https://discordapp.com/channels/480462759797063690/485450546887786506">#support-ember-times</a> on the <a href="https://discordapp.com/invite/zT3asNS">Ember Community Discord</a> or ping us <a href="https://twitter.com/embertimes">@embertimes</a> on Twitter.</p>
<p>Keep on top of what's been going on in Emberland this week by subscribing to our <a href="https://the-emberjs-times.ongoodbits.com/">e-mail newsletter</a>! You can also find our posts on the <a href="https://emberjs.com/blog/tags/newsletter.html">Ember blog</a>.</p>
<!--alex enable just clearly-->
<hr />
<p>That's another wrap! ✨</p>
<p>Be kind,</p>
<p>Melanie Sumner, Chris Ng, Amy Lam, Alon Bukai, Kenneth Larsen, Jessica Jordan and the Learning Team</p>]]></description><link>https://blog.emberjs.com/the-emberjs-times-issue-75</link><guid isPermaLink="true">https://blog.emberjs.com/the-emberjs-times-issue-75</guid><pubDate>Fri, 30 Nov 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Road to Ember 3.0]]></title><description><![CDATA[<p>Today the Ember.js Core Team is happy to announce our plans for the release of Ember 3.0. Ember 3.0 will arrive 2.5 years and 18 minor revisions after the release of Ember 2.0. The final release of the 2.x series will be Ember 2.18 on January 1st, 2018.</p>
<p><strong>Ember 3.0 removes public API deprecated in Ember 2.x releases.</strong> 3.0 does not introduce new public APIs or breaking changes.</p>
<p>Traditionally, major releases of software are centered around marketing pitches and new functionality. In contrast, major releases of Ember are “garbage collection” releases. Ember APIs that were deprecated during 2.x but were still supported are purged from the codebase in 3.0. The APIs remaining in 3.0 reflect what we think of as the idiomatic way to build an Ember app.</p>
<p>Ember 2.0 was the project’s first attempt at a major release where the transition path for apps and addons was a priority. The community took several important lessons from the 2.0 release cycle, and these have shaped our plans for 3.0. Please take a moment to review our plans below.</p>
<h2 id="theember30releaseschedule">The Ember 3.0 release schedule</h2>
<p>We’re announcing this release several months ahead of its final date so application authors and addons will have time to prepare for the transition. The specific schedule of releases leading to 3.0 will be as follows:</p>
<p><img src="/images/blog/2017-10/ember-3-timeline.jpg" alt="Ember 3.0 release schedule" /></p>
<ul>
<li>2.16.0 stable released: October 9th 2017</li>
<li>2.17.0 stable released, 2.16 promoted LTS: November 20th 2017</li>
<li>2.18.0 stable released, 3.0-beta released: January 1st 2018</li>
<li>3.0.0 stable released, 2.18 promoted to LTS: February 12th 2018</li>
<li>3.4.0 stable released: July 30th 2018</li>
<li>3.5.0 stable release, 3.4 promoted to LTS: September 10th 2018</li>
</ul>
<p>The above dates are projections based on our 6-week release cycle. This schedule has two notable departures from our standard release policies:</p>
<ul>
<li>Ember 2.18 will be made an additional LTS to maximize the opportunity for apps to transition to 3.x.</li>
<li>Ember 3.4, and not 3.0, will be the first 3.x release promoted to an LTS.</li>
</ul>
<p>Ember 2.18-LTS, the final release of Ember 2.x, will receive support for critical bugfixes until September 2018 and security fixes until February 2019. This is in alignment with our standard long-term support practices.</p>
<h2 id="transitioningto30">Transitioning to 3.0</h2>
<p>We’ve refined the release plan for Ember 3.0 based on the lessons of 2.0. The most important of those lessons is that there should be no last-minute deprecations during transition releases, and no intimate (unintentionally in common use) or private API churn around the transition.</p>
<p>To turn that lesson into practice, we’ve carefully tracked the addition of 3.0-targeted deprecations for each part of the framework:</p>
<ul>
<li>The last 3.0-targeted deprecation to Ember was in July 2017, Ember 2.14</li>
<li>The last 3.0-targeted deprecation to Ember Data was in April 2017, Ember 2.13</li>
<li>The last 3.0-targeted deprecation to Ember CLI was in April 2017, Ember 2.13</li>
</ul>
<p><strong>No additional 3.0-targeted deprecations will be introduced.</strong> This will prevent a last-minute rush to plan API changes for 3.0, and ensure that application authors behind on deprecation fixes don’t fall further behind than they already are. The single exception here is that we will add a deprecation message in development builds for IE9, IE10, and PhantomJS.</p>
<p>To further expand the migration window for 2.x applications to adopt 3.x, <strong>we will be releasing an addon that provides support for Ember.js 2.x APIs into the 3.x series.</strong> We’re committing to support that addon until Ember 3.4 (the first LTS candidate of the Ember 3.x cycle). If you want to contribute to this effort, you can find this package under the name <code>ember-2-legacy</code>.</p>
<h2 id="apiremovalsin30">API Removals in 3.0</h2>
<p>All APIs to be removed in Ember 3.0 are already deprecated today. By removing support for these features we achieve two goals for our major release. First, we make it simpler for Ember to strip code that supports these features if you don’t use them. Second, we make it possible for Ember to remove the code supporting these features entirely, opening the door to refactoring that improves the clarity and simplicity of our implementations.</p>
<p>The APIs removed in each of Ember.js, Ember Data, and Ember CLI are:</p>
<hr>
<h3 id="apisremovedinemberjs30">APIs Removed in Ember.js 3.0</h3>
<p>Below we’ve listed some of the most significant API removals in Ember.js 3.0. For an exhaustive list of removals, see the <a href="/deprecations/v2.x/">Ember.js 2.x deprecation guide</a>.</p>
<h4 id="legacyregistryandcontaineraccess">Legacy registry and container access.</h4>
<p>A large undertaking of the 2.x cycle was to improve Ember’s boot process, enabling features like <a href="https://ember-fastboot.com/">Ember Fastboot</a> and improving the performance of Ember’s dependency injection system.</p>
<p>In Ember 2.0 there was still no public API for registering dependencies or interacting with the DI container. Instead, you would often see code that referenced the <code>registry</code> or <code>container</code> properties on application objects or other objects instantiated by the framework. In Ember 3.0 these legacy systems will be removed in favor of APIs on the application object, application instance object, and the “owner” API.</p>
<p>For more details, please see the deprecation guide:</p>
<ul>
<li><a href="/deprecations/v2.x/#toc_initializer-arity">Initializer arity</a></li>
<li><a href="/deprecations/v2.x/#toc_ember-application-registry-ember-applicationinstance-registry"><code>Ember.Application#registry</code> / <code>Ember.ApplicationInstance#registry</code></a></li>
<li><a href="/deprecations/v2.x/#toc_ember-applicationinstance-container"><code>Ember.ApplicationInstance#container</code></a></li>
<li><a href="/deprecations/v2.x/#toc_injected-container-access">Injected <code>container</code> access</a></li>
<li><a href="/deprecations/v2.x/#toc_migrating-from-_lookupfactory-to-factoryfor">Migrating from <code>_lookupFactory</code> to <code>factoryFor</code></a></li>
</ul>
<h4 id="legacydeprecateapi">Legacy deprecate API</h4>
<p>Ember’s deprecation APIs improved in 2.0. The goal was to provided more information to tools like <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> and the <a href="https://github.com/emberjs/ember-inspector">Ember inspector</a>. All calls to a deprecation API must now include an <code>id</code> and <code>until</code> parameter. This permits them to be filtered by tooling. In the 3.x series we plan to use this improved data to implement “svelte” builds of Ember, where deprecated but unused code paths in the framework are removed during an application build.</p>
<p>For more details, see the deprecation guide:</p>
<ul>
<li><a href="/deprecations/v2.x/#toc_function-as-test-in-ember-deprecate-ember-warn-ember-assert">Function as test in <code>Ember.deprecate</code>, <code>Ember.warn</code>, <code>Ember.assert</code></a></li>
<li><a href="/deprecations/v2.x/#toc_ember-debug-function-options">Ember debug function options</a></li>
</ul>
<h4 id="legacydatabindingapi">Legacy data binding API</h4>
<p>For a long time, Ember has provided two systems for applications to perform data-binding in JavaScript. The first uses computed properties and it is still idiomatic today. For example, you’ll often see <code>Ember.computed.alias</code> in application code. This system remains without any deprecation.</p>
<p>The second system uses the <code>Ember.Binding</code> namespace or any property with the postfix of <code>Binding</code> on an object. For example:</p>
<pre><code class="javascript language-javascript">export default Ember.Component.extend({
  wowBinding: 'MyApp.wowObject',
  thingContainer: {},
  amazingBinding: Ember.Binding.oneWay('thingContainer.firstAmazingThing'),
  wasThisReallyTheAPIBinding: 'thingContainer.yesThisWasTheAPI'
});
</code></pre>
<p>This second system will be removed in Ember 3.0. For more details, see the deprecation guide:</p>
<ul>
<li><a href="/deprecations/v2.x/#toc_ember-binding"><code>Ember.Binding</code></a></li>
</ul>
<h4 id="legacyrenderhelper">Legacy {{render}} helper</h4>
<p>Ember’s <code>{{render}}</code> helper presaged the idea of component-driven rendering architecture as we now know it. Despite this, it was also an API coupled to Ember’s <code>Controller</code> system, was subject to edge cases where the context of a template was difficult to discern, and additionally was entangled with Ember’s routing system. Through the 2.x cycle we’ve worked to ensure each use-case for <code>{{render}}</code> has a viable solution in Ember’s component-driven system.</p>
<p>Fully deprecated since Ember 2.11, in 3.0 the <code>{{render}}</code> helper will be removed. Please see the deprecation guide for more details:</p>
<ul>
<li><a href="/deprecations/v2.x/#toc_render-helper-with-block"><code>{{#render}}</code> helper with a block</a></li>
<li><a href="/deprecations/v2.x/#toc_model-param-in-code-render-code-helper">Model param in <code>{{render}}</code> helper</a></li>
<li><a href="/deprecations/v2.x/#toc_code-render-code-helper"><code>{{render}}</code> helper</a></li>
<li><a href="/deprecations/v2.x/#toc_rendering-into-a-render-helper-that-resolves-to-an-outlet">Rendering into a <code>{{render}}</code> helper that resolves to an <code>{{outlet}}</code></a></li>
</ul>
<h4 id="legacyemberkutility">Legacy Ember.K utility</h4>
<p>Ember has historically provided a short-to-type noop function for use as a stub on parent classes or in other situations where a noop might be useful. With the advent of ECMAScript 2015 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions">method definitions</a> and <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions">arrow functions</a>, this kind of utility has become more confusing than convenient.</p>
<p>In Ember 3.0 the <code>Ember.K</code> function will be removed. For more details, please see the deprecation guide:</p>
<ul>
<li><a href="/deprecations/v2.x/#toc_code-ember-k-code"><code>Ember.K</code></a></li>
</ul>
<h4 id="consumingemberthroughbower">Consuming Ember through Bower</h4>
<p>Ember.js 3.0 and later releases will no longer be published to bower. If you still use bower today, we strongly suggest you begin the migration of your dependencies to npm.</p>
<hr>
<h3 id="apisremovedinemberdata30">APIs Removed in Ember Data 3.0</h3>
<p>Below we’ve listed the most notable Ember Data API removals in 3.0. For an exhaustive list see the <a href="/deprecations/ember-data/v2.x/">Ember</a> <a href="/deprecations/ember-data/v2.x/"></a><a href="/deprecations/ember-data/v2.x/">Data 2.x deprecation guide</a>.</p>
<h4 id="usingemberdataviaglobals">Using Ember-Data via globals</h4>
<p>Ember Data deprecated access to <code>window.DS</code> early in 2.x. Instead, accessing the <code>DS</code> namespace object via ES modules is preferred. In general this makes Ember Data more like other addons in the Ember ecosystem.</p>
<p>To access Ember Data in applications we suggest importing the <code>DS</code> namespace. For example:</p>
<pre><code class="javascript language-javascript">import DS from 'ember-data';
</code></pre>
<p>Additionally, Ember Data 3.0 and later releases will no longer be published to bower. If you still use bower today, we strongly suggest you begin the migration of your dependencies to npm.</p>
<p>Please see the deprecation guide for some additional information:</p>
<ul>
<li><a href="/deprecations/ember-data/v2.x/#toc_global-version-of-ds">Global version of</a> <a href="/deprecations/ember-data/v2.x/#toc_global-version-of-ds"><code>DS</code></a></li>
</ul>
<h4 id="dateparse">Date.parse</h4>
<p>In some legacy browsers, <code>Date.parse</code> does not support the ISO8601 standard date format. Ember Data provided a polyfill to make <code>Date.parse</code> consistent across environments.</p>
<p>During the 2.x cycle, none of these legacy browsers were supported. Despite this, Ember Data continued to replace <code>Date.parse</code> with its own polyfill. Partway through the 2.x cycle, Ember Data introduced the ability to opt-out of this polyfill and that change was made default for new Ember applications.</p>
<p>In Ember Data 3.0 the opt-out functionality will become a noop and the native <code>Date.parse</code> functionality will always be used. Additionally, the deprecated API <code>Ember.Date.parse</code> will be removed.</p>
<p>For more details see the deprecation guides:</p>
<ul>
<li><a href="/deprecations/ember-data/v2.x/#toc_ember-date-parse"><code>Ember.Date.parse</code></a></li>
<li><a href="/deprecations/ember-data/v2.x/#toc_date-prototype-extension">Date prototype extension</a></li>
</ul>
<h4 id="relocatedapis">Relocated APIs</h4>
<p>Several APIs have effectively been relocated in Ember Data during the 2.x series. In some cases these changes reflected the promotion of a private API to a public one, in other cases a subtle adjustment to the development model.</p>
<ul>
<li><code>store.hasRecordForId</code> was introduced to replace <code>store.recordIsLoaded</code> (<a href="/deprecations/ember-data/v2.x/#toc_recordisloaded">deprecation guide</a>).</li>
<li><code>store.adapterFor</code> was introduced to replace <code>store.lookupAdapter</code> (<a href="/deprecations/ember-data/v2.x/#toc_lookupadapter">deprecation guide</a>).</li>
<li><code>store.serializerFor</code> was introduced to replace <code>store.lookupSerializer</code> (<a href="/deprecations/ember-data/v2.x/#toc_lookupserializer">deprecation guide</a>).</li>
<li><code>model.serialize</code> was introduced to replace <code>store.serialize</code> (<a href="/deprecations/ember-data/v2.x/#toc_store-serialize">deprecation guide</a>).</li>
</ul>
<h4 id="unusedinitializers">Unused initializers</h4>
<p>Ember Data provided several initializers which have been consolidated into a single <code>ember-data</code> initializer. In 3.0, support for the legacy initializers (and for ordering other initializers based on their names) will be removed.</p>
<p>Please see the deprecation guide for more details:</p>
<ul>
<li><a href="/deprecations/ember-data/v2.x/#toc_unused-initializers">Unused Initializers</a></li>
</ul>
<hr>
<h3 id="apisremovedinembercli30">APIs Removed in Ember CLI 3.0</h3>
<p>Here we’ve listed the most notable Ember CLI API removals in 3.0. For an exhaustive list see the <a href="/deprecations/ember-cli/v2.x/">Ember-CLI 2.x deprecation guide</a>.</p>
<h4 id="baseurlconfiguration">Base URL configuration</h4>
<p>Ember CLI applications used to look for a <code>baseURL</code> property in an application’s <code>config/environment.js</code>. This value would be used to populated a <code>&lt;base&gt;</code> tag in the application’s <code>index.html</code>. This option provided a way to run an Ember app from a URL subdirectory without rewriting asset URLs.</p>
<p>Unfortunately the <code>&lt;base&gt;</code> tag strategy was fatally flawed. Amongst other issues discussed in the <a href="/blog/2016/04/28/baseURL.html"><code>baseURL</code></a> <a href="/blog/2016/04/28/baseURL.html">deprecation blog post,</a> SVG fragments on a page with a <code>&lt;base&gt;</code> tag have poor support in several browsers. This problem, and others, lead to the <code>baseURL</code> option being deprecated in favor of more robust support and documentation of the <code>rootURL</code> option.</p>
<p>In Ember CLI 3.0, support for base URL configuration will be removed. For more details on how to migrate away from <code>baseURL</code>, see these resources:</p>
<ul>
<li>Blog post: <a href="/blog/2016/04/28/baseURL.html">Upcoming deprecation of baseURL in Ember CLI 2.7</a></li>
<li>Deprecation guide: <a href="/deprecations/ember-cli/v2.x/#toc_base-url">Base URL</a></li>
</ul>
<h4 id="legacybrocfilejs">Legacy Brocfile.js</h4>
<p>Ember CLI builds were originally configured in the file <code>Brocfile.js</code>. Early in the 2.x series use of this file was deprecated in favor of <code>ember-cli-build.js</code>. This new file allowed Ember CLI to pass default configuration to application builds and decoupled Ember CLI from Broccoli’s own configuration system.</p>
<p>In Ember 3.0, support for <code>Brocfile.js</code> will be removed. Please see the deprecation guide for more details:</p>
<ul>
<li><a href="/deprecations/ember-cli/v2.x/#toc_migrate-from-brocfile-js-to-ember-cli-build-js">Migrate from <code>Brocfile.js</code> to <code>ember-cli-build.js</code></a></li>
</ul>
<hr>
<h2 id="browsersupportin30">Browser Support in 3.0</h2>
<p>Ember 3.0 will drop support for Internet Explorer 9, IE 10, and PhantomJS. If you still require support for these browsers, Ember 2.18-LTS will maintain support for significant bug fixes until September 2018 and security fixes until February 2019. We encourage you to use this window of time to plan a transition for your users if you intend to upgrade to Ember 3.x.</p>
<p>Microsoft ended support for IE 9 (including security fixes) <a href="http://www.allyncs.com/docs/lifecyclesupport.html">in April of 2017</a>. IE 10 has global usage <em>below</em> that of IE9, partially because all operating systems running IE10 can support an upgrade to IE11 or another browser. Amongst Ember developers in the <a href="/ember-community-survey-2017/#browser-requirements">2017 Ember Community Survey</a> only 2.9% expect to work on application supporting IE9 this spring. Providing a great web experience is difficult on these browsers, and supporting them makes it difficult for us to leverage modern JavaScript and web APIs.</p>
<p>Although there is still limited activity on its GitHub repo, PhantomJS is effectively unmaintained <a href="https://groups.google.com/forum/#!topic/phantomjs/9aI5d-LDuNE">as of April 2017</a>. In its place, Ember and other projects have started to use <a href="https://developers.google.com/web/updates/2017/04/headless-chrome">headless Chrome</a> for continuous integration and other use cases. If you have not already, we encourage you to migrate your own continuous integration systems to headless Chrome.</p>
<p>This decision to drop support for IE9, IE10, and PhantomJS is pending completion of a final comment period on <a href="https://github.com/emberjs/rfcs/pull/252">RFC 252: Browser Support Changes</a>. For more details, please see that RFC.</p>
<h2 id="onwardto3x">Onward to 3.x</h2>
<p>Ember 3.x presents us an opportunity to do more than removing code. We’re excited to take the conventions Ember developers are building with and continue to streamline the framework around them.</p>
<p>Around the release of Ember 2.0 there were several features we ambitiously hoped to land during the 2.x cycle. We're not planning to rush these features in at the last minute.</p>
<ul>
<li><strong>Routable components</strong> were pitched as a way to remove controllers from Ember applications. Controllers are problematic for two reasons: They are singletons instances, which is often unexpected by developers, and they are a unique concept applied to a specific scenario in application architecture, making them difficult for new developers to learn. Despite these issues, removing controllers remains a challenging design problem that hinges on component API design (should we use today’s components or block on Glimmer components?) as well as query params and routing. We’ve removed most or all of the worst footguns around controllers during the 2.x cycle, and encourage you to use them without hesitation until we complete a migration path to something better.</li>
<li><strong>Svelte builds</strong> are a system we’ve discussed for some time. The general pattern is to ship less code to the browser, especially when that code is related to framework features that an application does not use. Migrating Ember itself to be distributed as an Ember CLI addon was the most complex step in the process of bringing svelte to applications. We’re happy to have that hurdle down and Robert Jackson is looking at our next steps.</li>
</ul>
<p>Please visit our new <a href="/statusboard">Ember Status board</a> to keep up with what we’re working on. Ember's 3.0 release is focused on removing legacy features, but that doesn't mean we're not working hard in other areas of the framework to deliver on improvement. <strong>In fact, work on improvements to Ember has been effectively decoupled from the 3.x release, and we expect to see new features landing throughout the transition period.</strong></p>
<p>As a demonstration, here are some examples of new functionality we've
recently added to Ember without adding 3.0-targeted deprecations:</p>
<ul>
<li><strong>The JavaScript modules API for Ember.js</strong>: In Ember.js 2.16 applications can import parts of Ember without going through a single namespace object. This creates opportunities to improve our documentation, editor tooling, and performance. Additionally in Ember 2.16, newly generated applications will use the new module import statements by default. See the <a href="/blog/2017/09/01/ember-2-15-released.html#toc_ember-js-modules-api">Ember 2.16-beta release post</a> for more details.</li>
<li><strong>Routing service phase I</strong>: In Ember.js 2.15 we landed a new service that permits components to interact with the routing system. This service improves the general architecture of Ember apps and creates the opportunity for new kinds of analytics tracking. The first phase of development for the routing service landed in Ember 2.15, with the second phase to follow. See the <a href="/blog/2017/09/01/ember-2-15-released.html#toc_public-router-service-phase-1">Ember 2.15 release post</a> for more details.</li>
<li><strong>Newer versions of the Glimmer-VM rendering engine</strong>: In Ember.js 2.15 the framework upgraded its internal dependency on the Glimmer-VM rendering engine. Included were features like Glimmer's "stack VM", improved assertion stripping, and an improved implementation of the <code>(component</code> helper. The Glimmer-VM team is committed to keeping Ember up to date with recent releases. This incremental approach to delivers improvements and optimizations with low risk of a major regression.</li>
</ul>
<p>We look forward to sharing Ember 3.0-beta on January 1st. Thank you!</p>]]></description><link>https://blog.emberjs.com/the-road-to-ember-3-0</link><guid isPermaLink="true">https://blog.emberjs.com/the-road-to-ember-3-0</guid><pubDate>Tue, 03 Oct 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Road to Ember 4.0]]></title><description><![CDATA[<p>Contributors to the Ember project have been hard at work since <a href="https://blog.emberjs.com/octane-is-here/">Ember Octane</a> was released in December 2019.</p>
<p>Over the duration of a challenging (and sometimes devastating) year and a half, we've shipped a powerful new feature (<a href="https://api.emberjs.com/ember/3.26/modules/@glimmer%2Fcomponent#passing-multiple-blocks">Named Blocks</a>) and supported an ecosystem shifting to Octane conventions. We've more closely aligned Ember with wider frontend conventions through improved publishing &amp; build tooling (<a href="https://github.com/embroider-build/embroider">Embroider</a>) and better support for TypeScript (both through <a href="https://github.com/typed-ember/ember-cli-typescript">ember-cli-typescript</a> and reducing reliance on type-unsafe framework features).</p>
<p>Check out <a href="https://youtu.be/1Z6cLV2licU?t=103">Godfrey's EmberConf 2021 keynote</a> for
a more complete walk-through of recent changes in Ember.</p>
<h2 id="announcingember40">Announcing Ember 4.0</h2>
<p>In his <a href="https://www.youtube.com/watch?v=pJPUQQQ9QDg">EmberConf 2021 keynote</a>, Yehuda shared a name for Ember's next edition: <strong>Polaris</strong>. In order to unblock Polaris providing the best, most productive experience the Ember project can build, we're going to remove already-deprecated APIs in a 4.0 release.</p>
<p>Ember 3.27, which has already been released, was the final version of Ember to include new deprecations targeting Ember 4.0.</p>
<p>Ember 3.28, which has been released as a beta, will be released as stable around August 9th. It will not introduce additional deprecations targeting Ember 4.0. Six weeks after its stable release, around September 20th, Ember 3.28 will become a <a href="https://emberjs.com/releases/lts/">Long-Term Support</a> release.</p>
<p><strong><em>Update from October 27th 2021:</strong> Getting Ember's codebase and the addon community
prepared for 4.0 has taken us a bit longer than planned. Currently 4.0 is
available in beta releases, and we're aiming at mid-November for a
stable release.</em></p>
<p><strong>Ember 4.0 will be released around September 20th.</strong> Ember 4.0 itself is not an LTS candidate.</p>
<p>Ember 4.4 will be the first LTS candidate of the 4.x series. It will be released as stable around February 2022 and as an LTS around March 2022.</p>
<h2 id="whatsina40">Whats in a 4.0?</h2>
<p>Since the release of Ember 2.0, major versions of Ember have been about removal of deprecated API, and not about the introduction of new features or development styles. <strong>Ember 4.0 follows that tradition, and will contain no new features.</strong></p>
<p>Additionally, Ember 4.0 does not remove the <code>EmberComponent</code> API or the core parts of the <code>EmberObject</code> system. These APIs are widely used, even after the release of Octane, by existing application and addon code.</p>
<p>Ember 4.0 will remove <a href="https://deprecations.emberjs.com/v3.x">all APIs deprecated in Ember 3.x</a> and targeting Ember 4.0. These include:</p>
<ul>
<li><code>Ember.Logger</code> is removed in favor of native <code>console</code> APIs. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-console-deprecate-logger">Guide here</a>.</li>
<li><code>Copyable</code> mixin is removed in favor of the <a href="https://github.com/emberjs/ember-copy">ember-copy addon</a>. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-runtime-deprecate-copy-copyable">Guide here</a>.</li>
<li><code>sendAction</code> is removed in favor of calling closure actions like any other callback. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-component-send-action">Guide here</a>.</li>
<li><code>willTransition</code> and <code>didTransition</code> are removed in favor of router service events. <a href="https://deprecations.emberjs.com/v3.x/#toc_deprecate-router-events">Guide here</a>.</li>
<li>Computed Property <code>volatile()</code> calls are removed in favor of native getters. <a href="https://deprecations.emberjs.com/v3.x/#toc_computed-property-volatile">Guide here</a>.</li>
<li><code>this.$()</code> and other jQuery APIs are deprecated in favor of native browser equivalents. <a href="https://deprecations.emberjs.com/v3.x/#toc_jquery-apis">Guide here</a>. An optional feature which restored this and other jQuery-specific features is also removed. <a href="https://deprecations.emberjs.com/v3.x/#toc_optional-feature-jquery-integration">Guide here</a>.</li>
<li><code>{{partial}}</code> is removed in favor of template-only components. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-partial">Guide here</a>.</li>
<li>Using the built-in global resolver (<code>App.FooController</code> anyone?) is deprecated in favor of using <a href="https://github.com/ember-cli/ember-resolver">ember-resolver</a>, already the default for Ember CLI generated apps. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-deprecate-globals-resolver">Guide here</a>.</li>
<li>Ambiguous references to a component's properties are removed. You must now write <code>{{this.someProp}}</code>. <a href="https://deprecations.emberjs.com/v3.x/#toc_this-property-fallback">Guide here</a>.</li>
<li><code>renderTemplate</code> is removed in favor of <code>{{in-element}}</code> or other rendering target redirection like <a href="https://github.com/yapplabs/ember-wormhole">ember-wormhole</a>. <a href="https://deprecations.emberjs.com/v3.x/#toc_route-render-template">Guide here</a>.</li>
<li>Support for the <code>Ember</code> global on <code>window</code> is removed in favor of importing the <code>Ember</code> object or using the module-based API. <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-global">Guide here</a>.</li>
<li>Support for specific features of the <code>&lt;LinkTo&gt;</code>, <code>&lt;Input&gt;</code>, and <code>&lt;Textarea&gt;</code> components are removed. See guides on <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-glimmer-link-to-positional-arguments">positional arguments</a>, <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-built-in-components-legacy-arguments">legacy arguments</a>, <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-built-in-components-legacy-attribute-arguments">legacy HTML attributes</a>, and <a href="https://deprecations.emberjs.com/v3.x/#toc_ember-built-in-components-import">importing legacy built-in components</a>.</li>
<li>Finally, <strong>Ember classic is deprecated in favor of Ember Octane</strong>. Although
many APIs from Ember classic (like <code>EmberComponent</code>) continue to be available,
the optional features and application configuration which define Ember Octane
must be enabled in 4.0. See <a href="https://deprecations.emberjs.com/v3.x#toc_editions-classic">the deprecation guide
entry</a> and
<a href="https://guides.emberjs.com/v3.27.0/upgrading/current-edition/">upgrading to Ember
Octane</a> guide for
more details.</li>
</ul>
<p>The above APIs, listed as an example of what will be removed but not defining the complete list, show that API removals in 4.x largely consist of APIs that date back to Ember 1.x, and are rarely used now (or should be rarely used).</p>
<p>An additional important change is the completion of Ember 3.x's browser support policy. Ember 4.0 will support two classes of browsers: Evergreen (those on a weeks-long, auto-upgrade release cycle) and non-evergreen. This classification system allows us to create a rolling minimum version for evergreen browsers, while using a more traditional, pinned minimum version for non-evergreen browsers.</p>
<p><strong>Specifically, the Ember 4.x release policy includes support for Google Chrome, Mozilla Firefox, Microsoft Edge, and Apple Safari on desktop and mobile. It does not include support for any version of Internet Explorer.</strong></p>
<p>Read more about this change in <a href="https://deprecations.emberjs.com/v3.x/#toc_3-0-browser-support-policy">the deprecation guide</a> and at <a href="https://emberjs.com/browser-support/">Ember's browser support policy page</a>.</p>
<p>Existing Ember users should note that Ember 3.27 has already removed IE11 from the default target list for production and testing builds.</p>
<h2 id="planningyourupgradeto40">Planning your upgrade to 4.0</h2>
<p>For each API removed in Ember 4.0, you can find an entry in the <a href="https://deprecations.emberjs.com/v3.x/">Ember 3.x deprecation guide</a>. As many of the removed APIs have not been included in best practices or common documentation for the entire 3.x cycle, applications started on 3.x are expected to have a fairly smooth upgrade path.</p>
<p>Consider using the <a href="https://github.com/mixonic/ember-cli-deprecation-workflow">ember-cli-deprecation-workflow</a> addon as part of your upgrade process. The addon allows you to create a configuration file to silence most deprecations. This means you can focus on one or a few warnings at a time. Additionally, you can configure the addon to throw an error when a deprecation that was previously addressed is re-introduced. If you work with a large codebase and many contributors, this helps you prevent backsliding in your upgrade process.</p>
<p>In contrast to prior major releases, we have no plans to offer an
<code>ember-3-legacy</code> package that makes Ember 3.x APIs available for a limited time
in Ember 4.0. This is based on fairly low use of these packages in the past.</p>
<p><strong>Don't panic.</strong> We expect many Ember users to enthusiastically adopt our 4.0 release. If you prefer a conservative upgrade path, we suggest using Ember's Long-Term Support releases. Ember 3.28, the last version of the 3.x cycle, will become an LTS in September 2021. The first 4.x release to be promoted to LTS will be Ember 4.4 around March 2022. This timeline provides a long window for your business to address any remaining 4.0-targeted deprecations (while using 3.28-LTS) before 4.4-LTS is promoted.</p>
<h2 id="contributingtoember40">Contributing to Ember 4.0</h2>
<p>In the <a href="https://github.com/emberjs/ember.js">Ember.js</a>, <a href="https://github.com/emberjs/data">Ember Data</a>, and <a href="https://github.com/ember-cli/ember-cli">Ember CLI</a> repos, the final beta cycle of 3.x has already started. The <code>master</code> branch is ready for code changes targeting 4.0. You are welcome to contribute to these repos by removing already deprecated functionality and IE11 compatibility code.</p>
<p>The core framework effort to prepare for 4.0 is tracked at
<a href="https://github.com/emberjs/ember.js/issues/19545">emberjs/ember.js#19545</a>, and
a list of deprecated APIs we need help to remove is tracked at
<a href="https://github.com/emberjs/ember.js/issues/19617">emberjs/ember.js#19617</a>.</p>
<p>Join us on <a href="https://discord.com/invite/emberjs">Discord</a> in the <code>#dev-ember-js</code>, <code>#dev-ember-data</code>, <code>#dev-ember-cli</code>, or <code>#dev-ember-learning</code> channels to find out how you can contribute.</p>
<p>In less than six weeks, we expect the first betas for 4.0 to be released. Please help test the betas on your applications and addons so that we can catch any regressions.</p>
<p>We're looking forward to working with the community on Ember 4.0 and on the opportunities beyond it. As always we appreciate your support, your trust, and our common partnership.</p>]]></description><link>https://blog.emberjs.com/the-road-to-ember-4-0</link><guid isPermaLink="true">https://blog.emberjs.com/the-road-to-ember-4-0</guid><pubDate>Wed, 14 Jul 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Road to Ember Data 1.0]]></title><description><![CDATA[<p><strong>TL;DR</strong> Ember Data 1.0 is coming soon. We have a few last features to land before we
can confidently make guarantees around not breaking the API. Specifically:</p>
<ol>
<li><p>A guarantee that if one side of a two-way relationship changes, the other
side will remain in sync, even if it hasn't loaded yet.</p></li>
<li><p>All relationships will become async, but DataBoundPromises will make them
work well in observers, computed properties and in templates.</p></li>
</ol>
<p>Recall how it took us a few attempts to get the router right, but now we've
got the best one in JavaScript. Getting Ember Data right has taken longer than
we thought, but it's here and it's almost ready for a 1.0.</p>
<hr />
<p>Ever since the 1.0 release, developers building apps on top of Ember.js have
appreciated the stability and forward-momentum that our commitment to <a href="http://semver.org/">Semantic
Versioning</a> allows.</p>
<p>We frequently get asked, "Ember.js is great, but what about Ember Data?" Today,
we'd like to give you an update on where Ember Data is and where it's headed
soon.</p>
<p>First, the good news: there is only one major breaking change planned before
releasing Ember Data 1.0, and we are doing our best to minimize the impact that
that change will have on existing apps.</p>
<p>Other than that, we anticipate that the current feature set and API will serve
as a stable base for the foreseeable future. In other words, we don't
anticipate needing any more user-facing breaking changes in order to
accommodate future changes to the architecture.</p>
<p>So why haven't we released a 1.0 yet? There are two more features that we're
working on: an improved relationship architecture, and more consistent API when
dealing with relationships.</p>
<h2 id="asinglesourceoftruth">A Single Source of Truth</h2>
<p>Modeling relationships between records is the most difficult feature
we've added to Ember Data. Finding a common solution is complicated because of
how much JSON servers differ from one another. Things get even more interesting
when you introduce streaming changes over WebSockets.</p>
<p>The naïve approach is to declare that the problem is too domain-specific and
that each developer should hand-roll relationships via a simplistic abstraction
(like sugar around computed properties).</p>
<p>However, we have observed that everyone who tries to implement their own
domain-specific relationships quickly ends up with their own ad hoc
mini-framework. As we did with Ember, we wanted to look at the problems shared
across all of these applications, and tease out the core abstractions.</p>
<!-- alex ignore just -->
<p>We wanted to build something that was powerful, to help save time for advanced
developers, while also being accessible to developers just getting started with
client-side web applications.</p>
<p>To take an example, sometimes a has-many relationship is stored in the
parent record's JSON representation:</p>
<pre><code class="javascript language-javascript">{
  "id": 1,
  "name": "Lord Grantham",
  "children": [2, 3, 4]
}
</code></pre>
<p>Other times, the same relationship may be saved as a foreign key on the children:</p>
<pre><code class="javascript language-javascript">{
  "id": 2,
  "name": "Lady Mary",
  "parent_id": 1
}
</code></pre>
<p>Often, the same application will represent the same relationship in both forms,
depending on whether the records are being loaded or saved.</p>
<p>I'll spare you the details, but the permutations get even more complex when you
introduce things like streaming changes from the server over a socket.</p>
<p>The point of highlighting the essential complexity here is to demonstrate that
we couldn't hardcode support for each one; each representation will likely
co-exist and interoperate with multiple other representations.</p>
<p>One-way relationships aren't too bad--you can get pretty far with hand-rolled
solutions before inevitably hitting a wall. The real problem comes up when you
have two-way relationships: an article has many comments, but each comment also
belongs to the article.</p>
<p>Because both sides of the relationship aren't always loaded together, and
because each side may represent the relationship differently (a foreign key on
the comment and an array on the article), maintaining this link has
historically been very difficult for us.</p>
<p>It's especially complicated when you want to support updated data coming in
from the server. Imagine that refreshing the article provides a new set of
comments, but you also know that the user is in the middle of creating her own
comment. How do you make sure that the <code>comments</code> array takes both of those
facts into consideration?</p>
<p>At a high-level, the solution is this: instead of internally storing the
relationships as state on each record that needs to be synchronized, we
maintain a single entity in memory that represents the logical relationship
<strong>between</strong> the records. That entity exists regardless of which side of the
relationship the application has loaded.</p>
<p>For example, if you change the belongs-to relationship on a comment, you are
changing the has-many side even if the application has not yet loaded the
article. When the application finally does load the article, the local
belongs-to change is ready to apply.</p>
<p>The long and short of it is that the two sides of a two-way relationship will
remain in sync in Ember Data 1.0, regardless of the order the records were
loaded, the way they were loaded, or how the relationships were represented in
the payloads.</p>
<p>We are doing this work on the
<a href="https://github.com/emberjs/data/tree/single-source-of-truth">single-source-of-truth</a>
branch (thank you <a href="https://github.com/igort">Igor Terzic</a> for getting this over
the finish line!) and hope to merge it soon.</p>
<h2 id="asyncrelationships">Async Relationships</h2>
<p>Currently in Ember Data, you must specify ahead of time whether relationships
are synchronous or asynchronous. Determining whether or not a relationship is
asynchronous requires knowing how the server will represent the data when
sending it to your application. That isn't fatal, but it does tightly couple
the semantics of your application to the server.</p>
<p>The fatal problem comes when you start refactoring your server API. For
example, in a has-many relationship, perhaps instead of inlining an array of
record IDs you instead send a URL where the client can retrieve the collection.</p>
<p>All of a sudden, your application starts breaking in very Zalgo-esque ways (of
note: if you have not read Isaac's <a href="http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony">excellent essay on async
APIs</a>,
please do).</p>
<!-- alex ignore easy -->
<p>We strongly consider how easy or difficult refactorings are when designing
APIs, and in this case, we made a mistake. Making small changes to your server
API should not require widespread changes to the application that consumes it.</p>
<p>For what it's worth, not all refactorings are created equal. In this case, we
observed that real apps almost always shuffle around their payloads as they
grow, hitting this problem. (In other cases, if we see that real-world
applications rarely change in a particular way, we might prioritize convenience
over refactor-proofing.)</p>
<p>The solution is to treat <strong>all</strong> relationships as async, and use promises to
represent their values. By relying on Promises/A+'s guarantees around
asynchronicity, we can avoid releasing Zalgo into your application. In the
future, if the way you represent a relationship changes, or the order in which
the relationship becomes available changes, your application will continue to
function with no changes required.</p>
<p>To use a Promise in JavaScript, call <code>.then</code> on it and do
something with the returned value in the callback. But what if you want to use
an Ember Data relationship in a template or in a computed property? How would
that work?</p>
<p>Ember Data 1.0 introduces a subclass of Promise called <code>DataBoundPromise</code>. This
object allows you to observe properties on the Promise, as you would on a
normal object. When the promise resolves, those properties will be updated to
match the underlying object. If you <code>get</code> a property from a <code>DataBoundPromise</code>
when it is unresolved, it will return <code>undefined</code>.</p>
<pre><code class="javascript language-javascript">var article = comment.get('article');

// If the promise has not yet resolved
article.get('title'); //=&gt; undefined

// If the promise has resolved
article.get('title'); //=&gt; "Ember Data Roadmap"
</code></pre>
<p>The basic idea is that when you're working within the context of Ember data bindings (templates, computed properties, observers), you can use a relationship as if it were a synchronous value, and let the data binding system handle the promise. This means that in many cases, this change won't affect your existing code, and will indeed improve your ability to work with asynchronous relationships in templates and computed properties (a major pain point today).</p>
<p>You should <strong>not</strong> rely on this behavior when you want to use the value in imperative JavaScript (outside of computed properties); in that case, always use the promise's <code>then()</code> method to ensure the value is available, lest you unleash Zalgo into your own apps. Only <code>.get</code> properties from a <code>DataBoundPromise</code> if you're relying on Ember's data binding functionality to update the template or computed property when the promise finally does resolve.</p>
<p><strong>TL;DR</strong> Only use <code>get</code> on <code>DataBoundPromises</code> inside of observers or computed properties. Otherwise, always treat them as regular promises and use <code>.then</code>.</p>
<h2 id="otherimprovements">Other Improvements</h2>
<p>There are a number of outstanding bugs we'd like to get fixed before we feel comfortable declaring 1.0. Some of them involve tightening up behavior that is currently undefined, and others are bugs we want to make sure applications don't come to rely on.</p>
<p>Most notably, the current <code>RESTAdapter</code> calls the wrong <code>normalize</code> hook for embedded or sideloaded data in <code>pushPayload</code>. <a href="https://github.com/emberjs/data/issues/1804">Fixing this</a> is a high priority and blocks the 1.0 release.</p>
<p>We are also committed to making sure that the documentation is up to the high quality standards people expect from Ember before we declare 1.0.</p>
<h2 id="whatsnext">What's Next</h2>
<p>We are committed to following <a href="http://semver.org/">Semantic Versioning</a>, and want to make sure we have a solid base we can build on for the next few years.</p>
<p>We think the decision to iterate on Ember.js before locking down the API has given us a foundation that we can continue to iterate on for years, without breaking backwards compatibility. We want the same for Ember Data.</p>
<p>Once the issues we've outlined above are complete, we'll be releasing a 1.0 of Ember Data that will not see breaking changes for some time. We intend to keep the release of Ember.js and Ember Data in sync, so that the first version in the Ember Data 1.x series will be whatever the current version of Ember is at that time.</p>
<p>For example, if Ember.js 1.7 is the current stable version at the time of Ember Data's first stable release, it will be Ember Data 1.7.</p>
<p>As with Ember.js, we intend Ember Data to follow the same <a href="/blog/2013/09/06/new-ember-release-process.html">Chrome-inspired six-week release process</a>. That release process has paid dividends in terms of predictability and momentum, and the feedback has been overwhelmingly positive. Importantly, having separate stable, beta and canary releases also allows us to <a href="http://emberjs.com/builds/#/beta">communicate which features are stable</a> and ready for production, and which are still being worked on.</p>
<h2 id="aframeworkfordata">A Framework for Data</h2>
<p>As we outlined in <a href="http://www.youtube.com/watch?v=jScLjUlLTLI">our keynote last week at Fluent</a>, we believe that frameworks exist to make doing the right thing feel better than doing the wrong thing. By codifying best practices in code, frameworks allow their communities to build further abstractions, creating a virtuous cycle that grows more and more powerful over time.</p>
<p><strong>We think of Ember Data as a framework for managing your models and relationships.</strong></p>
<p>Relationships are difficult to get right, but by giving in to temptation and having everyone roll their own solutions, the community cannot build further abstractions on top of the concept of relationships.</p>
<!-- alex ignore primitive -->
<p>Earlier on, when we started with Ember Data, we tried to codify good practices, but didn't provide a flexible enough primitive underneath as an escape valve. Because people are interacting with servers they don't always control, we realized that having a good escape valve was more important in Ember Data than usual.</p>
<p>In order to make sure that the community would still be able to build on top of the Ember Data abstraction, we tried our best to isolate the code that is different between applications to the Adapter. This means that if someone writes a plugin for Ember Data, they can assume that models and relationships will look the same in all apps that use it, even though application backends can vary considerably.</p>
<!-- alex ignore just -->
<p>In earlier versions of Ember Data, we were too religious about this separation, forcing every application to bear significant costs in the adapter layer. When we rebooted Ember Data six months ago, we took a hard look at striking a better balance between these competing concerns. Based on the feedback we've gotten since then, we believe that Ember Data is now a great fit for applications that have very unique backends, as well as applications that want direction on how to build a backend that "just works" with Ember Data.</p>
<p>We are committed to getting things right before declaring 1.0. The router in Ember.js went through several similar iterations, which were painful at the time, but we believe the results speak for themselves. Adapting to real-world usage is an important part of our design process, and we will always prioritize thinking through problems carefully over rushing to ship.</p>
<p>Given that, we hope that you will trust us when we say that Ember Data is on the cusp of the level of quality that we demand from the 1.0 versions of our open source projects. If you start building now, you'll be very happy with the forward momentum that having a community with shared understanding will bring.</p>]]></description><link>https://blog.emberjs.com/the-road-to-ember-data-1-0</link><guid isPermaLink="true">https://blog.emberjs.com/the-road-to-ember-data-1-0</guid><pubDate>Tue, 18 Mar 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[This Week in Ember.js]]></title><description><![CDATA[<p>There's been a lot of exciting changes going in the Ember.js community, here's a recap of some of the biggest updates.</p>
<!-- READMORE -->
<h3 id="dataformatagnosticism">Data Format Agnosticism</h3>
<p>While we believe the vast majority of Ember.js apps will be using JSON for
communication, there's no reason to restrict it so.</p>
<p>To this end we've made two changes to Ember Data's <code>DS.Store</code>:</p>
<ol>
<li>A new <code>extractId</code> method has been added to the adapter for extracting the
 ID from a data hash, by default this asks for <code>data.id</code>.</li>
<li>Any method with the term <code>JSON</code> has been renamed to use <code>Data</code> instead,
 for instance <code>DS.Serializer</code>'s <code>toJSON</code> method has been renamed to <code>toData</code>.</li>
</ol>
<p>If you are using the built-in <code>DS.RESTAdapter</code>, these changes do not affect you.</p>
<p>Check out <a href="https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md">BREAKING_CHANGES</a>
for more information.</p>
<h3 id="adapterdirtinesshooks">Adapter Dirtiness Hooks</h3>
<p>In line with the efforts to decouple Ember.js from REST specifics, we've made
some more changes to how the adapter dirties records in relationships.</p>
<p>Previously the store would dirty all the objects involved when a relationship was modified
and let the adapter decide what to do with the records on <code>commit</code>.</p>
<p>As of revision 9, Ember now provides a series of adapter dirtiness hooks:</p>
<ul>
<li><code>dirtyRecordsForAttributeChange</code></li>
<li><code>dirtyRecordsForBelongsToChange</code></li>
<li><code>dirtyRecordsForHasManyChange</code></li>
</ul>
<p>By firing these hooks at the time of dirtying, the adapter can mark the
appropriate objects as dirty and move on.</p>
<p>If you are using the built-in <code>DS.RESTAdapter</code>, these changes do not affect you.</p>
<p>Check out <a href="https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md">BREAKING_CHANGES</a>
for more information.</p>
<h3 id="newrouterapi">New Router API</h3>
<p>Managing state in intermediate- to large-scale applications is a major
challenge for web developers. In fact, that's part of the reason so many
people love Ember.js—tools like the router built-in to the framework
make dealing with complex state manageable.</p>
<p>Still, we've heard the feedback loud and clear that the current router
API is too hard to understand, complicated to maintain, and aesthetically
unpleasing.</p>
<p>Because we think the router is the centerpiece of Ember, we've been working hard to get this right.</p>
<p>Implementation has been started on a new router API. You can check out the progress on
the <a href="https://github.com/emberjs/ember.js/tree/new-router">new-router</a> branch.</p>
<p>Check out a quick rundown of the changes in <a href="https://gist.github.com/3981133">this gist</a>.</p>
<p>We believe that this is the final step to make Ember an accessible
framework for new developers.</p>
<h3 id="viewdefaultcontext">View default context</h3>
<p>Although it has been deprecated for a while, we've <a href="https://github.com/emberjs/ember.js/commit/ed38ab3777733597ac5abd33ce26c3edeb2d7d13">finally removed</a>
the defaulting of a view's context to itself if none was provided. This should
not be an issue for most applications out there, but may break example snippets
around the place.</p>
<h3 id="meetups">Meetups</h3>
<!-- alex disable hang -->
<p>Zendesk is hosting the <a href="http://www.meetup.com/Ember-SF/events/89198892/">SF Ember.js Meetup</a> on Tuesday 4 December, if you're in the area please head along and hang out with other Emberenõs.</p>
<p>Likewise, Tom Dale and Yehuda Katz will be making an
appearance at the <a href="http://www.meetup.com/Ember-js-Seattle-Meetup/events/68465172/">Seattle Ember.js DecEMBER Meetup</a>
on Thursday 6 December.</p>
<p>That's all for this week,<br />
Bradley Priest<br />
<a href="https://twitter.com/bradleypriest">@bradleypriest</a></p>]]></description><link>https://blog.emberjs.com/this-week-in-ember-js-2</link><guid isPermaLink="true">https://blog.emberjs.com/this-week-in-ember-js-2</guid><pubDate>Sun, 02 Dec 2012 00:00:00 GMT</pubDate></item><item><title><![CDATA[This Week in Ember.js]]></title><description><![CDATA[<p>Only a few more days left, I hope everyone's had a great 2012,
while you get ready for the New Year, here's what's been happening in Ember.</p>
<!-- READMORE -->
<h3 id="newrouterapi">New Router API</h3>
<p>The <a href="https://github.com/emberjs/ember.js/commit/44b23dcf245b0fffdeb29f9f8a5d1bbdc9eb7690">new router API has been merged</a>!
We've spent a lot of time incorporating feedback about our first
iteration of the router, and we think you're going to really love what
we've come up with. It helps you get started quickly, and
eliminates the old API that forced you to write unwieldy nested objects.</p>
<p>There is a <a href="https://gist.github.com/3981133">short walkthrough</a> that
describes the thinking behind the new API. Full documentation should be
landing this week.</p>
<h3 id="embeddedrecords">Embedded Records</h3>
<p>After a massive refactor of the Ember Data library, it now fully
supports embedded records, amongst other goodies.</p>
<p>As always, check out <a href="https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md">BREAKING_CHANGES</a>
for information about updating your apps.</p>
<h3 id="dsjsonserializer">DS.JSONSerializer</h3>
<p>In the last post we talked about the changes in the serialization API's renaming methods
to remove the JSON specificity whilst adding hooks to manage relationship dirtiness.</p>
<p>We've now fully extracted all the JSON semantics from <code>DS.Serializer</code> into it's own class.
The <code>DS.JSONSerializer</code> is a subclass of <code>DS.Serializer</code> which implements
the JSON-specific semantics. The <code>RESTAdapter</code> now uses the <code>JSONSerializer</code> by
default so if you are using that there is no need to change anything in your application.</p>
<p>After some feedback we've also renamed <code>toData/fromData</code> to <code>serialize/deserialize</code>
for a more friendly API.</p>
<p>As always, check out <a href="https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md">BREAKING_CHANGES</a>
for more information.</p>
<h3 id="boundhandlebarshelpers">Bound handlebars helpers</h3>
<!-- alex ignore just -->
<p>Ember.Handlebars just got a little bit smarter. <code>Ember.Handlebars.registerBoundHelper</code>
provides a way to create your own bound custom helpers.</p>
<h4 id="example">Example:</h4>
<pre><code class="javascript language-javascript">Ember.Handlebars.registerBoundHelper('capitalize', function(value) {
  return value.toUpperCase();
});
</code></pre>
<p>which can be used in your templates as follows:</p>
<pre><code class="handlebars language-handlebars">{{capitalize name}}
</code></pre>
<h3 id="emberobjectcreatebehaviorchange">Ember.Object.create behavior change</h3>
<p>The new behavior will call computed property setters instead of overwriting them.
We suggest using <code>Ember.Object.extend()</code> to create classes and use <code>create</code> to initialize
properties on your instance. The old behavior is available via <code>createWithMixins</code>.
This change should increase object creation performance by 2x.</p>
<h3 id="otherchangesofnote">Other changes of note</h3>
<p><code>reject</code> and <code>rejectProperty</code> methods have been added to <code>Ember.Enumerable</code>.</p>
<p><code>Ember.none</code> and <code>Ember.empty</code> have been renamed to <code>Ember.isEmpty</code> and <code>Ember.isNone</code>
to keep with the Ember Boolean naming convention.</p>
<h3 id="embercamp">EmberCamp</h3>
<p>The very first Ember Camp in SF is happening on the 15th February 2013.
<a href="https://tito.io/tilde/ember-camp-2013">Sign up here</a>, be quick, tickets are limited.</p>
<p>Looking to learn Ember? There's also an <a href="http://www.embertraining.com/">Introduction to Ember</a>
event in the week leading up to Ember Camp.</p>
<p>Enjoy your holiday,
Bradley Priest
<a href="https://twitter.com/bradleypriest">@bradleypriest</a></p>]]></description><link>https://blog.emberjs.com/this-week-in-ember-js-3</link><guid isPermaLink="true">https://blog.emberjs.com/this-week-in-ember-js-3</guid><pubDate>Sat, 22 Dec 2012 00:00:00 GMT</pubDate></item><item><title><![CDATA[This Week in Ember]]></title><description><![CDATA[<p>It's been a big month for Ember.js, and we're excited about the progress
that we've made. With so much going on, it can be hard to
keep up-to-date with the project, so here's what you need to know.</p>
<!-- READMORE -->
<h2 id="embercamp">Ember Camp</h2>
<p>While we have an incredible network of local meetup groups, <a href="http://www.embercamp.com">Ember
Camp</a> is the first national event for the Ember
community.</p>
<p>We've been working hard on making sure that this event is both fun and
educational, and we'll be announcing the lineup of speakers soon.
Unfortuately, tickets have sold out, so if you didn't get yours this
time, make sure you grab a ticket next year!</p>
<p>While Ember Camp is happening, keep an eye on this website and on <a href="https://twitter.com/emberjs">our
Twitter account</a>. There will be several announcements you won't want
to miss!</p>
<h2 id="peepcode">PeepCode</h2>
<p>We were fortunate enough to get to spend a day with Geoffrey Grosenbach,
reviewing his in-progress PeepCode screencast about Ember.js. He spent a
lot of time getting to know Ember in-depth, and we think the final
product will be invaluable for new developers getting started with the
framework.</p>
<p><center></p>
<blockquote class="twitter-tweet"><p>Finished an Ember.js demo app, filming screencast tomorrow, will publish next week. Fun stuff! <a href="https://t.co/Sq4q85Ql" title="https://peepcode.com/system/uploads/2013/peepcode-emberjs-demo.png">peepcode.com/system/uploads…</a></p>&mdash; PeepCode (@peepcode) <a href="https://twitter.com/peepcode/status/291350861207187456" data-datetime="2013-01-16T01:07:13+00:00">January 16, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p></center></p>
<h2 id="theroadto10">The Road to 1.0</h2>
<p>If you've been tracking <code>master</code> over the last month, you know that we
have made many large improvements to Ember.js in quick succession. Some
of these involved API changes that were not backwards compatible.</p>
<p>We appreciate your patience as we round the corner to a 1.0 release. We
take feedback about "developer ergonomics" extremely seriously, and
we're not willing to rush out a release if we're not satisfied that the
API is as good as we can make it.</p>
<p>Thanks for all your excellent feedback on earlier iterations of the
router API. Learning about how you found the API confusing or hard to
use drove our work on the final version that is shipping in <code>pre4</code>.</p>
<h3 id="therouter">The Router</h3>
<p>The first iteration of the Ember.js router (which some have colloquially
begun referring to as "v1") allowed us to begin fleshing out some
conventions around application structure. Previously, application
structure was mostly done on an ad hoc basis, but common conventions
emerged in the community, which we rolled into "Router v1."</p>
<p>However, despite the fact that developers appreciated conventions around
app structure, their reaction to the first version of the API could
generously be described as <em>horrified</em>. Indeed, the router for large
applications began to look like the twisted amalgams of views in old
SproutCore applications. We knew we had to head back to the drawing
board with the lessons we had learned.</p>
<p>The reaction to "v2" of our router proposal, in contrast, has been
overwhelmingly positive. While we've had to make several tweaks over the
past month to make sure the API is as intuitive as possible, the overall
concepts behind the API have remained stable.</p>
<p>We believe that we've finally worked out the edge cases, and do not
have any plans to make any further backwards-incompatible changes to the
router API before the final 1.0 release.</p>
<p>To learn what this router API is all about, head over to the <a href="http://www.emberjs.com/guides/routing/">Routing
guide</a>.</p>
<h3 id="apifreeze">API Freeze</h3>
<p>In the run-up to Ember 1.0, we have chosen to aggressively make API
changes in response to your feedback in an effort to make the 1.0 API as
good as possible.</p>
<p>The reward for putting up with that level of churn is that we plan to
keep things very stable after 1.0. As we get close to that milestone, we
are starting to freeze portions of the API.</p>
<p>As of today, we will no longer make changes to the API that affect
high-level tutorials, screencasts or our introductory-level
documentation, unless such a change is necessary to address a critical
bug.</p>
<p>When we release the first RC, we will no longer make changes that affect
any part of the documented API–again–unless such a change is necessary
to address a critical bug.</p>
<p>In keeping with <a href="http://semver.org/">SemVer</a>, once we release the final 1.0, we will
not make breaking, backwards-incompatible changes to publicly documented
APIs until Ember 2.0. We may deprecate APIs, and print deprecation
warnings in the debug build, but things will continue to work.</p>
<p>In order to facilitate these API freezes, we are planning on taking
several steps:</p>
<ol>
<li>We will convert high-profile screencasts and much of our public
documentation into integration tests. "Your commit broke the PeepCode
screencast" is something that Travis will tell contributors.</li>
<li>We will freeze the Ember 1.0 tests and run them against all builds of
Ember in the 1.x series. This will notify us if we make a
potentially backwards-incompatible change, and we can examine if it
is the result of an API change or brittle tests. If we have to
modify an old test, we will announce it here.</li>
</ol>
<h2 id="documentation">Documentation</h2>
<p>Perhaps the most widespread feedback we received from developers was:
<em>"Ember.js looks really cool, but your documentation is not."</em> We heard
you loud and clear.</p>
<p>We recently launched the <a href="http://www.emberjs.com/guides/">completely redesigned Guides</a>, and due to
their more focused nature, have been able to rapidly iterate on them.
Since deploying the new site, the bounce rate has dropped dramatically
and engagement with any particular page has nearly doubled.</p>
<p>We have lots more great documentation coming your way as we approach the
1.0 release, and we think the design work that <a href="http://www.heropixel.com">Matt Grantham</a> did on
the new guides will make them much easier for new developers to approach.</p>
<p>We are also working on improving the API reference documentation. In
particular, <a href="https://twitter.com/stefanpenner">Stefan Penner</a> has been putting in a heroic effort to
bring them up to a similarly polished look-and-feel as the guides.</p>
<h2 id="thanks">Thanks</h2>
<p>We've been working on Ember.js for a little over a year now, and it's no
understatement to say that it has attracted some of the best and
brightest web engineers on the planet. It has been extremely gratifying
to see our ideas take form, and we can't wait to see what 2013 holds for
web applications.</p>
<p>Big thanks to all of <a href="https://github.com/emberjs/ember.js/graphs/contributors">our contributors</a>, who have poured hours of
their nights and weekends into helping us make one of the best tools for
writing ambitious web applications. We quite literally could not have
done it without you.</p>
<p>Wishing you all the best in the new year,<br />
Yehuda Katz &amp; Tom Dale</p>]]></description><link>https://blog.emberjs.com/this-week-in-ember-js-4</link><guid isPermaLink="true">https://blog.emberjs.com/this-week-in-ember-js-4</guid><pubDate>Fri, 18 Jan 2013 00:00:00 GMT</pubDate></item><item><title><![CDATA[This Week in Ember.js]]></title><description><![CDATA[<p>There's a lot of work happening on Ember.js and sometimes it's hard to keep track of what's going on. Here's what me and Yehuda got done this week.</p>
<!-- READMORE -->
<h3 id="meetup">Meetup</h3>
<p>The SF Ember.js Meetup on Tuesday (which we actually held in Mountain
View this month) was a success! It was sponsored by our friends at
Addepar, who are also <a href="https://addepar.com/ember/">funding me and Yehuda to work on Ember Data for
the next few months</a>. So, big thanks to them!</p>
<p>Tony Sherbondy gave an overview of the Addepar app and described how
Ember.js has helped them. The biggest "a-ha" moment for me was when he
described how they completely changed out the table view that powers big
chunks of the UI, and didn't have to make any changes in the rest of the
app. It's exactly this type of encapsulation that makes Ember a win, and
I'm glad to see it happening in real life.</p>
<!-- alex ignore chairman-chairwoman -->
<p>I gave a talk on Ember Data, and discussed some of the new APIs we'll be
working on over the next few months. Yehuda gave a talk about the router
proposal. The pork belly buns from the Chairman Bao
food truck were epic. I got a little drunk.</p>
<h3 id="pertypeadapters">Per-Type Adapters</h3>
<p>You can now register different adapters on the store per-type. You can
read more about this feature in <a href="https://gist.github.com/4004913">this Gist</a>.</p>
<p>This feature is done and on <code>master</code>!</p>
<h3 id="explicitinverses">Explicit Inverses</h3>
<p>Ember Data has always been smart enough to know that when you set a <code>belongsTo</code> relationship, the child record should be added to the parent's corresponding <code>hasMany</code> relationship.</p>
<p>Unfortunately, it was pretty braindead about <em>which</em> <code>hasMany</code> relationship it would update. Before, it would pick the first relationship it found with the same type as the child.</p>
<p>Because it's reasonable for people to have multiple <code>belongsTo</code>/<code>hasMany</code>s for the same type, we added support for specifying an inverse:</p>
<pre><code class="javascript language-javascript">App.Comment = DS.Model.extend({
  onePost: DS.belongsTo("App.Post"),
  twoPost: DS.belongsTo("App.Post"),
  redPost: DS.belongsTo("App.Post"),
  bluePost: DS.belongsTo("App.Post")
});


App.Post = DS.Model.extend({
  comments: DS.hasMany('App.Comment', {
    inverse: 'redPost'
  })
});
</code></pre>
<p>You can also specify an inverse on a <code>belongsTo</code>, which works how you'd expect.</p>
<h3 id="mappablerefactor">Mappable Refactor</h3>
<p>We noticed that a lot of configuration APIs we were introducing in the
adapter layer wanted to treat the adapter or serializer object like a
map, but there were some slightly different semantics than the standard
<code>Ember.Map</code> implementation.</p>
<p>This refactor greatly cleans up the implementation and increases the
amount of code shared between classes.</p>
<p>It's a little hard to explain, but hopefully the inline documentation
plus the actual usage in the framework should make it clear what I mean.</p>
<p>Unfortunately I totally spaced and forgot to push this, and it's on a
computer I don't have access to at the moment. Look for this in a few
weeks!</p>
<h3 id="coreconceptsguide">Core Concepts Guide</h3>
<p>Many people getting started with Ember.js tell me that each of the
individual pieces make sense, but they're not sure how all of those
pieces fit together.</p>
<p>We're making a big push towards improving our documentation as we head
towards the 1.0 release, and this is one of the first things I want to
address.</p>
<p>To that end, I wrote a "Core Concepts" guide that I hope you will find
helpful. It's not up yet (I'm still working on a branch of the website)
but you can <a href="https://github.com/emberjs/website/blob/doc-refactor/source/guides/getting-started/core-concepts.md">view the Markdown on GitHub</a>.</p>
<!-- alex ignore easy -->
<p>We want to make Ember.js as easy for new developers to pick up as
possible, so your feedback about our documentation, as always, is
extremely important. Please review and let me know what you think!</p>
<hr />
<p>Finally, I'd like to give a shoutout to Trek Glowacki for doing an
awesome job <a href="http://javascriptjabber.com/034-jsj-ember-js/">repping the Ember.js community on the JS Jabber podcast</a>. If you haven't listened yet, it's worth your time.</p>
<p>Me, Yehuda and the rest of the Tilde team will be in Hawaii next week
for our company offsite. We should have wi-fi and be generally
available, but we have plenty of luaus, boat cruises, and zip line
adventures planned, so if we're less available than usual, that's the
reason.</p>
<p>That's it for this week,<br />
Tom Dale<br />
<a href="https://twitter.com/tomdale">@tomdale</a></p>]]></description><link>https://blog.emberjs.com/this-week-in-ember-js</link><guid isPermaLink="true">https://blog.emberjs.com/this-week-in-ember-js</guid><pubDate>Fri, 02 Nov 2012 00:00:00 GMT</pubDate></item><item><title><![CDATA[Typed Ember is now the Ember TypeScript Core Team!]]></title><description><![CDATA[<p>Last Friday, the Ember project merged <a href="https://emberjs.github.io/rfcs/0724-road-to-typescript.html">RFC #0724: Official TypeScript Support</a>, committing to make TypeScript an officially-supported language for Ember.js. To make that a reality, we also need to have a team dedicated to maintaining Ember’s types and its TypeScript compiler integrations.</p>
<p>Happily, we already have a group of people who do that! For the last five years, Ember has had community-driven TypeScript support, led by the past and present members of the Typed Ember team.</p>
<p>The Typed Ember team joins the Framework, Learning, CLI, and Data Core teams as a new Core sub-team: the <strong>Ember TypeScript Core Team</strong>. Its initial members are the current Typed Ember team: <a href="https://github.com/jamescdavis">James Davis (@jamescdavis)</a>, <a href="https://github.com/dfreeman">Dan Freeman (@dfreeman)</a>, and <a href="https://github.com/chriskrycho">Chris Krycho (@chriskrycho)</a>.</p>
<p>The team will continue to do all the things they have been doing:</p>
<ul>
<li>maintaining TypeScript build integration with <code>ember-cli-typescript</code> and <code>ember-cli-babel</code></li>
<li>investing in type-checked templates via Glint</li>
<li>sustaining the community types on DefinitelyTyped (until they are sunset!)</li>
<li>providing input on TypeScript implications for RFCs</li>
<li>advising the community about best patterns with TypeScript and Ember</li>
</ul>
<p>They will also lead and support the effort to enable Ember to publish types natively, advise and collaborate with the Learning team on the work to document TypeScript as a supported language for Ember, and collaborate on key design questions with the Framework team.</p>
<p>From one angle, you could see this as nothing much changing, and you’d be right: the same people who have led this effort for years will keep doing what they have been. From another, though, this is a huge deal: we have never added a new officially-supported language before, and adding new Core teams is rare! This marks a significant shift for Ember. We haven’t made a formal change to our governance in three and a half years, and we have only made a handful of these changes over the whole history of the project. <em>Getting TypeScript right really matters to us, and we’re investing accordingly.</em></p>
<p>We’d also like to take this opportunity to say thanks to the many contributors who have helped get us here, and <em>especially</em> to emeritus team members Derek Wickern and Mike North, who did an enormous amount of work to make Ember’s TypeScript story viable and sustainable.</p>
<!-- alex ignore just-->
<p>We’re incredibly excited about the future of TypeScript in Ember—and we’re just getting started.</p>]]></description><link>https://blog.emberjs.com/typed-ember-is-now-the-ember-type-script-core-team</link><guid isPermaLink="true">https://blog.emberjs.com/typed-ember-is-now-the-ember-type-script-core-team</guid><pubDate>Thu, 10 Mar 2022 12:30:00 GMT</pubDate></item><item><title><![CDATA[Update - The Ember Website]]></title><description><![CDATA[<p>With the initial launch of the website redesign complete, we're now working on the various sub-domains that all come together to make up the Ember Website experience. We want to share these plans with the community, so that those who want to help know where to pitch in.</p>
<p>Community members that want to help should familiarize themselves with the ember-styleguide addon - this is the UI addon that we're using to help us consistently apply the branded look and feel to all of the sub-domains within the website. We've created a handy <a href="https://ember-styleguide.netlify.app/">documentation site</a>, so those who want to help out should read through that before getting started.</p>
<p>Next up, we plan to work on the blog! To help out with that, visit the <a href="https://github.com/orgs/ember-learn/projects/15">Emberify and Redesign the Ember Blog</a> project board on GitHub. Let us know that you want to help in the <code>#st-website</code> channel on the <a href="https://discord.gg/emberjs">Ember Discord chat</a> server.</p>
<p>The <a href="https://github.com/orgs/ember-learn/projects/39">project board</a> shows, roughly, the order in which we plan to do the rest of the work:</p>
<ul>
<li>Blog</li>
<li>Guides</li>
<li>API Docs</li>
<li>Deprecation App</li>
<li>Help Wanted</li>
<li>Ember CLI Guides</li>
</ul>
<p>Along the way, it's likely that new component work will be needed in the ember-styleguide addon, especially with regard to additional component design and documentation.</p>
<p>After that, we'll move on to implementing some fine-tuning and extra polish to any of the sites that have been finished, since at that point we anticipate that a few gaps may have appeared that need to be addressed.</p>
<p>Now, while this is the plan for the website strike team, this project still follows our general community guidelines for contributing- if someone has particular energy for a subset of this work, then they should contribute to that as they are able. No one will be asked to shift their focus or work on something different- PR review may take a little longer in those instances.</p>
<p>We hope this quick update has helped clarify the plan and helped you identify places where you can contribute! The website strike team meets every Thursday at <a href="https://meetingzone.app/utc/thursday/1430">14:30 UTC</a>, so if you want to come join in, you're more than welcome to do so! And you can always ask us any questions in the <code>#st-website</code> channel on Discord.</p>]]></description><link>https://blog.emberjs.com/update-ember-website</link><guid isPermaLink="true">https://blog.emberjs.com/update-ember-website</guid><pubDate>Sun, 26 Apr 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Update on Module Unification]]></title><description><![CDATA[<!-- alex disable fight laid burn -->
<p>Ember's conventions for project layout and file naming are central to the
developer experience. It's crucial that we get both the technical and
ergonomic details right. I wanted to provide an update about Module
Unification and our plans for the file structure in Ember Octane.</p>
<p><strong>In short, we do not plan to ship Module Unification in Octane</strong>. Instead,
Octane will ship with today's file system layout, with one change: support
for nested components in <code>&lt;AngleBracket /&gt;</code> invocation syntax</p>
<p>Because Octane apps will continue with today's file system layout, we want to
address the largest barrier to <code>&lt;AngleBracket /&gt;</code> adoption today: components
nested inside other directories.</p>
<p>For example, if you have a component located at
<code>app/components/icons/download-icon.js</code> (i.e., nested inside an <code>icons</code>
directory), you can invoke it with curly invocation syntax like this:</p>
<pre><code class="handlebars language-handlebars">{{icons/download-icon}}
</code></pre>
<p>However, it's not possible to invoke the same nested component with angle
bracket syntax without resorting to clunky workarounds.</p>
<p>As proposed in the <a href="https://github.com/emberjs/rfcs/pull/457">Nested Invocations in Angle Bracket Syntax
RFC</a>, we plan to address this by adding support for
nested components via the <code>::</code> separator.</p>
<p>With this proposal, the component described above could be invoked with angle
bracket syntax like this:</p>
<pre><code class="handlebars language-handlebars">&lt;Icons::DownloadIcon /&gt;
</code></pre>
<p>Because this is a small change, it can be implemented quickly without
requiring us to delay the Ember Octane release.</p>
<h2 id="statusofmoduleunification">Status of Module Unification</h2>
<p>Given that the Module Unification RFC was merged in late 2016, and we talked
about shipping Module Unification in the <a href="https://emberjs.github.io/rfcs/0364-roadmap-2018.html">2018 Roadmap RFC</a>,
it's fair to ask what happened and why we're making this decision now.</p>
<p>Heads up: this post gets long and detailed, so if you only care about the
plan going forward, you can safely skip the rest.</p>
<p>In the spirit of transparency and overcommunication, though, I wanted to
share a little bit of the history and evolution of MU from my perspective.</p>
<p>Let's call the file system layout that Ember apps use today the "classic"
layout. While this structure has served us well, it also has several
shortcomings.</p>
<p>In the classic layout, files are grouped by type, not by name. Sometimes,
this means that closely related files (like a component and its template) are
separated from each other, and navigating between them can be frustrating.</p>
<p>Ideally, related files would be close to each other in the file system. For
example, you may want an Ember Data model and its associated serializer to be
co-located in the same directory.</p>
<p>Early on, Ember CLI implemented an experimental "pods" layout that grouped
files by name rather than by kind. For example, a <code>User</code> model and its
serializer would be grouped together in <code>app/user/</code>, as <code>model.js</code> and
<code>serializer.js</code> respectively.</p>
<p>Feedback from the community was that pods felt more productive than the
classic layout. However, pods had several problems that needed to be
addressed before it could be enabled by default.</p>
<p>The effort to address the design flaws of pods led to the <a href="https://emberjs.github.io/rfcs/0143-module-unification.html">Module Unification
RFC</a>, a ground-up rethink of how the file system should work in Ember
apps. Importantly, this design grappled with overhauling Ember's resolver and
dependency injection systems as well, which was just as important as
shuffling around where particular files went on disk.</p>
<p>The MU RFC was merged at the end of 2016, but new Ember apps are still
generated with the classic layout. So, why can't we flip the switch on
enabling Module Unification-style layout by default today?</p>
<p>Remember that MU described not just a new file system but a significant
overhaul of Ember's resolver. Implementing MU was a <strong>huge</strong> initiative that,
while often hidden, touched nearly every part of the framework. Despite this
large scope, and thanks to the incredible amount of time and energy our
community devoted to the work, MU implementation has made great progress, and
nearly everything needed to make Module Unification work has landed in Ember.</p>
<p><strong>Nearly</strong> everything. When we merged the Roadmap RFC last year, there was one
last major piece of MU that still needed to be designed: component
namespacing, or how to refer to components that come from other addons in
templates.</p>
<p>While we had a plan, a shift in the JavaScript ecosystem sent us back to the
drawing board. And the harder we worked on solving this last piece, the more
we realized that fundamental aspects of the overall design needed to be
rethought.</p>
<h3 id="namespacesandscopedpackages">Namespaces and Scoped Packages</h3>
<p>Besides files being spread out, another problem with the classic layout is
that everything goes into one big global pool of names.</p>
<p>So, for example, Ember Data defines a service called <code>store</code> that you can
inject into components and services. If you install another addon that also
has a service called <code>store</code>, there's no easy way to use both.</p>
<p>Similarly, if your app has a component called <code>small-button</code> and you install
an addon that also has a component called <code>small-button</code>, you have no way to
tell Ember which one you mean when you type <code>{{small-button}}</code> in a template.</p>
<p>One of the key benefits of the MU design is that names are no longer global,
but namespaced to the package where they come from. So, for example, if an
npm package called <code>ember-ui-library</code> contains a component called
<code>small-button</code>, the MU RFC proposed referring to it in your template like
this:</p>
<pre><code class="handlebars language-handlebars">{{#ember-ui-library::small-button}}
  ...
{{/ember-ui-library::small-button}}
</code></pre>
<p>Around the same time we were designing MU, however, <a href="https://blog.npmjs.org/post/116936804365/solving-npms-hard-problem-naming-packages">npm announced support
for scoped package names</a>. Prior to this change, npm package
names were limited to alphanumeric characters and dashes. Now, though,
packages could start with an <code>@</code> and contain a <code>/</code>, like
<code>@glimmer/component</code>.</p>
<p>Component invocations with scoped packages blew past the verbosity limit. We
simply could not bring ourselves to accept a syntax that commonly produced
code like this:</p>
<pre><code class="handlebars language-handlebars">{{#@my-company/ember-ui-library::small-button}}
  ...
{{/@my-company/ember-ui-library::small-button}}
</code></pre>
<p>We also had concerns that this was confusing to scan visually, considering
that <code>@</code> already means a component argument and <code>/</code> already means a closing
tag.</p>
<p>While Ember had been using it for years, around this time JavaScript module
syntax (<code>import Post from './post'</code>) started gaining significant traction in
the wider ecosystem, along with tools like webpack that could use these
modules to perform code splitting.</p>
<p>After scoped npm packages scuttled our original plan for namespaced
components, we went back to the drawing board, and something similar to
JavaScript's <code>import</code> seemed like a promising solution. However, we
immediately hit some challenges while exploring this idea.</p>
<p>The concept of a "component" in Ember isn't a singular thing, but the union
of a template and a component class. With the component and template in
separate files, it isn't clear which one you're supposed to import. Because
of this, we wanted something where you would import a component by name
(<code>my-component</code>), not a specific file like in JavaScript.</p>
<p>But despite the differences, the overall concept of importing modules was
similar. We wanted to find a syntax that would give users who already knew
JavaScript an intuition about the similarities, while not making it look so
similar that people would be misled into thinking it was literally the same
thing.</p>
<p>We tried to find a balance between these two constraints with a syntax that
looked like this:</p>
<pre><code class="handlebars language-handlebars">{{use component-name from 'package-name'}}
</code></pre>
<p>We hoped that it looked similar enough to JavaScript's <code>import</code> syntax to
give you a clue about what it was doing, but by adopting the <code>use</code> keyword
instead of <code>import</code>, signal that this was not exactly the same as JavaScript
modules.</p>
<p>Matthew Beale poured significant time into capturing all of these conflicting
constraints in the <a href="https://github.com/emberjs/rfcs/pull/367">Module Unification Packages RFC</a>, but, even after
months of discussion, we couldn't come to consensus and the RFC was never
merged.</p>
<p>Despite everyone agreeing this was an urgent problem, we couldn't convince
ourselves that having different module systems for JavaScript and templates
was a viable solution. Unfortunately, there wasn't an obvious alternative
plan, and not having an answer meant MU was indefinitely blocked until we
could figure out this last piece of the puzzle.</p>
<p>We felt stuck.</p>
<h3 id="realworldfeedback">Real-World Feedback</h3>
<p>In the meantime, enough of Module Unification was shipping behind feature
flags (and in Glimmer.js) that we were able to get feedback from early
adopters. While overall people really liked the new file system and really
appreciated not dealing with frustrating name collisions, something felt
<em>off</em>.</p>
<p>One common theme in the feedback was that MU felt too rigid and frequently
got in the way of simple tasks. To understand why, it's important to
understand that MU is about more than a file system. MU is really a system
for <em>controlling scope</em>.</p>
<p>For example, a feature of MU is the ability to have private components that
don't leak into the rest of the app. If we have a component called
<code>list-paginator</code> and it has a child component called <code>paginator-control</code>, MU
allows us to organize them like this:</p>
<pre><code class="markup language-markup">src
├── ui
│   ├── components
│   │   └── list-paginator
│   │       ├── paginator-control
│   │       │   ├── component.js
│   │       │   └── template.hbs
│   │       ├── component.js
│   │       └── template.js
</code></pre>
<p>In this example, the <code>list-paginator</code> template can invoke
<code>{{paginator-control}}</code> to render its child component. However, if you try to
invoke <code>{{paginator-control}}</code> from any template outside the <code>list-paginator</code>
directory, you'll get an error. In other words, <code>paginator-control</code> is
<em>local</em> to <code>list-paginator</code>.</p>
<p>MU, then, is about scope, and controlling who has access to what. Where a
module lives in the MU file system determines what it can see to and who
else can see it.</p>
<p>This is a clever idea that eliminates a lot of boilerplate. If you have to
organize your files anyway, and if you want to group related things together
anyway, it makes sense to try to create a single system that solves
organization and scoping at the same time.</p>
<p>In practice, though, we ran into a few challenges:</p>
<ol>
<li>This idea is not common in the JavaScript ecosystem, so the file system
controlling scope isn't intuitive for new learners. They also have to
memorize these naming rules, which are implicit and get quite complex.</li>
<li>Similarly, ecosystem tools don't understand MU. We have to build custom
integrations to get things like "Go to Definition" to work in IDEs or code
splitting to work in webpack, that other libraries get for free.</li>
<li>JavaScript files in Ember use module syntax, which doesn't go through the
MU system, adding to the confusion. Having one system in a component's
JavaScript and another in its template is not ideal.</li>
<li>When file names and locations are so meaningful, it can be frustrating
if you want to create a file that isn't part of the MU world. Tasks that
are normally trivial, such as extracting utility functions into a separate
file or grouping related files together in a directory, can easily turn
into a battle where your build starts erroring because you're not playing
by the MU rules.</li>
</ol>
<h3 id="apersonalanecdote">A Personal Anecdote</h3>
<p>Personally, this last one was what really caused me to step back and
re-evaluate our plan for MU. It happened during a project at work where we
were using both Glimmer.js (with Module Unification) and Preact.</p>
<p>As the number of components grew, a co-worker created a directory called
<code>icons</code> in the Preact app to hold all of the components for rendering
different SVG icons. I'm sure it didn't take more than a few minutes to
create the directory, drag the appropriate component files in, and update the
paths everywhere those components were imported. (In fact, VS Code probably
updated the import paths automatically.)</p>
<p>When we tried to do the same thing in the Glimmer app, it was a much
different experience that turned into an hours-long slog. And despite all the
great things it <em>does</em> do, MU doesn't really have a way to do this kind of
lightweight grouping.</p>
<p>We could have found a workaround. We could have extracted the SVG icon
components into a separate package, or created a higher-order component that
wrapped all of the child icon components. But it seemed ridiculous to burn so
much time looking for a "workaround" to perform a task that felt like it
should have been (and was, in Preact) trivial.</p>
<p>I knew, intellectually, the benefits of MU. I knew how carefully it was
designed to enforce structure and consistency as your application grew and
had different engineers of different experience levels working on it. (Indeed,
by the end of the project, I found the Glimmer app much easier to navigate,
while the Preact app had several inconsistently-followed conventions.)</p>
<p>But I never forgot how viscerally bad it felt to have my co-workers fight so
hard to do something that felt like it should be so easy.</p>
<p>So this was the status quo last year. We were all incredibly frustrated that
we couldn't make progress on the scoped package problem, but I was even more
overwhelmed trying to figure out what, if anything, to do about the negative
experiences my co-workers had had when using MU.</p>
<p>Discovering problems in a design you've been working on for so long is
painful, especially in cases like this where the majority of the work was
already complete, and we thought we were so close to the finish line.</p>
<p>Programming language and API design is really hard. Sometimes I read old RFCs
and marvel at how obvious the solution seems now, in contrast to the weeks,
months, or years I know it took to tease it out from the millions of possible
alternatives.</p>
<p>When you're trying to balance so many competing constraints, sometimes a
small change is all it takes to get you out of a design conundrum you've
struggled with for months. In this case, that change was angle bracket
component invocation.</p>
<p>One thing making JavaScript imports difficult to use with templates was the
constraint that components had to have a dash in their name. Unfortunately,
dashes aren't valid in JavaScript identifiers, so something like <code>import
some-component from './some-component'</code> produces a syntax error.</p>
<p>Angle bracket components, on the other hand, start with a capital letter to
disambiguate themselves from normal HTML tags: <code>&lt;MyComponent /&gt;</code> instead of
<code>{{my-component}}</code>. Most importantly, there's no dash.</p>
<p>As the Ember community started using angle bracket syntax, early feedback was
very positive. All of a sudden, JavaScript import syntax was back on the
table.</p>
<h3 id="thepathforwardtemplateimports">The Path Forward: Template Imports</h3>
<p>Speaking for the Ember.js core team, we are trying to get better at updating
the community when plans have changed but the new plan isn't fully locked in
yet. So, consider this one of those situations.</p>
<p>We know that the exact plan for Module Unification (MU), as described in the
original RFC, will need to change. How it changes is not yet certain,
but we believe that some of the problems we wanted to solve with MU are
better solved with template imports.</p>
<p>With template imports, we intend to make templates play nicely with
JavaScript, so you can use the <code>import</code> feature you already know and love. By
having components and helpers be modules you can import, we can eliminate the
most complex parts of Module Unification so it's easier to learn and use.</p>
<p>We recently posted the <a href="https://github.com/emberjs/rfcs/pull/454">SFC & Template Imports RFC</a>,
which describes some of the low-level APIs needed in Ember to make template
imports possible.</p>
<p>Learning from past mistakes, this RFC focuses on the primitives so we can
quickly experiment, get feedback, and iterate on template import proposals in
addons, before stabilizing them in the core framework.</p>
<p>While the Ember.js core team has reached consensus that template imports are
the intended path forward, please note that the current RFC only covers
low-level primitives, not the API that would be used by Ember developers to
author templates.</p>
<p>Here is one example of a <strong>very hypothetical</strong> template imports syntax:</p>
<pre><code class="handlebars language-handlebars">---
import UserProfile from './user-profile';
import UserIcon from './icons/user';
---
&lt;h1&gt;{{this.blog.title}}&lt;/h1&gt;
&lt;UserIcon /&gt;
&lt;UserProfile @userId={{this.blog.authorId}} /&gt;
</code></pre>
<p>The syntax is up in the air and will almost certainly be different from this
example. Regardless, it shows the benefit of template imports clearly: we've
imported two components—<code>UserProfile</code> and <code>UserIcon</code>—just like how we would
refer to any other JavaScript module. This makes it very easy for
everyone—from developer who are new to Ember, to IDEs, and other tooling in
the JavaScript ecosystem—to understand what came from where.</p>
<p>You can even imagine an (again, <strong>very hypothetical</strong>) single-file component
format that places the template right within the component's class. Here, a
unified imports solution feels especially natural:</p>
<pre><code class="javascript language-javascript">// src/ui/components/blog-post.gbs

import Component from '@glimmer/component';
import UserIcon from './icons/user';

export class BlogPost extends Component {
  blog = { title: 'Coming soon in Octane', authorId: '1234' };

  &lt;template&gt;
    &lt;h1&gt;{{this.blog.title}}&lt;/h1&gt;
    &lt;UserIcon /&gt;
    &lt;UserProfile @userId={{this.blog.authorId}} /&gt;
  &lt;/template&gt;
}
</code></pre>
<p>Again, the exact syntax is up in the air and will almost certainly be
different from this example. The benefit of exposing the low-level primitives
first is that we can try out multiple competing designs relatively easily
before comitting. And if you don't like what we eventually decide on, you can
build an alternative that is just as stable as the default implementation.</p>
<p>But note that template imports are not a replacement for MU. They don't help
with things like better isolation of an addon's services, or a more intuitive
file system layout. Instead, we hope that template imports will better solve
one aspect of MU, so the overall design can be simplified and its benefits
can shine through more clearly.</p>
<p>Template imports also give us a good opportunity to try to address the
ergonomic problems people reported when trying MU.</p>
<p>Without template imports, we had to rely on MU to resolve component names,
meaning the files in the <code>src/ui/components</code> directory had to follow strict
rules. But <strong>with</strong> template imports, users can just tell us which module on
disk they want. We can skip resolving components through MU altogether, and
let Ember users organize their component files however they want.</p>
<p>As frustrating as it was at the time, the inability to make progress on MU
may have been a blessing in disguise. It gave us time to implement angle
bracket syntax for components, which allowed template imports to seem
feasible again—which means we now have a solution that seems to address both
the scoped package problem and the ergonomics problem. Even better, template
imports make things like treeshaking and code-splitting in
<a href="https://github.com/embroider-build/embroider">Embroider</a> much easier.</p>
<p>I believe the dead-end we found ourselves in was a sign from the universe
that something better was just around the corner. Time will tell, but my
hunch is that template imports solve these important problems much more
elegantly than what we had before. This process also pushed us to explore
single-file components, which I think will be a surprisingly big productivity
improvement for Ember developers.</p>
<p>While we're excited about template imports, we want to keep our promise to
finish what we started. We are prioritizing Ember Octane and making sure that
our first edition is a polished, cohesive experience. Only once Octane is out
the door will we turn our attention to new initiatives like template imports.</p>
<p>Hopefully, this post helps provide some context about the state of MU. Of
course, what I've written here is my personal, imperfect recollection of
events, simplified for clarity. The reality of technical design is messy and
feels a lot more like going around in circles than the tidy sequence I've
presented here.</p>
<p>I will also mention that, as a project, I think we've dramatically improved
how we design, implement, validate, and iterate on features since we
originally started the Module Unification RFC. The MU RFC is the last of the
proposals from the "mega-RFC" era, where we had a tendency to do a ton of
upfront design and implementation before we had any feedback from real users.</p>
<p>Nowadays, I think we're a lot better about making sure RFCs are relatively
small and focused on doing one thing. We also tend to prioritize exposing
hooks or other primitives that let us test out new ideas in addons. This
allows us to improve designs based on early feedback, without the strict
stability requirements that come with landing something in the framework
proper.</p>
<p>This has worked well for things like <code>ember-decorators</code> and Glimmer
components, where real world feedback and the ability to make breaking
changes based on that feedback was critical. I'm hopeful that a similar
strategy for template imports will be just as successful.</p>
<p>My sincere thanks to everyone who has worked so hard on MU and related
efforts. I'm proud to be part of a community that refuses to charge ahead
with something we know isn't right. Ember's longevity is, at least in part,
explained by our willingness to make these kinds of hard decisions.</p>
<p>I'm so excited about Ember, our roadmap, and the newfound energy in our
community. In 2019, a thriving Ember is more important for the web than ever.
Thank you for being a part of our community, and I hope to see you at
<a href="https://emberconf.com">EmberConf</a> in a few weeks. It's gonna be a good one.</p>]]></description><link>https://blog.emberjs.com/update-on-module-unification-and-octane</link><guid isPermaLink="true">https://blog.emberjs.com/update-on-module-unification-and-octane</guid><pubDate>Mon, 11 Mar 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Updates To The EmberData Lockstep Versioning Strategy]]></title><description><![CDATA[<h2 id="updatestotheemberdatalockstepversioningstrategy">Updates To The EmberData Lockstep Versioning Strategy</h2>
<p>Today the EmberData team is excited to announce changes to how we manage lockstep
versioning with the broader Ember.js project.</p>
<p>The primary goal of these changes is to improve version-to-version stability for our consumers. We see this being beneficial in several ways.</p>
<p>First, by releasing fewer versions that contain no effective changes other than the version bump, we believe consumers will be able to navigate version-by-version and LTS-by-LTS upgrades with greater stability and clarity.</p>
<p>Second, if the only changes are bug fixes then these fixes are applied to the latest minor
instead of becoming strung out across multiple minors.</p>
<p>Third, this should enable the project to move more carefully at times when more substantive changes
are being made.</p>
<p>We hope that this new policy will improve the ability for us to invest in upgrade paths for
consumers using older versions by focusing on providing the most robust release targets we can.</p>
<h2 id="policychanges">Policy Changes</h2>
<ul>
<li><p>When Ember.js releases an LTS, the most recent release of EmberData will also be released as an LTS.</p></li>
<li><p>When Ember.js releases a new major, EmberData will also release a new major.</p></li>
<li><p>New minor releases of EmberData will coincide with Ember.js' six-week release cadence when EmberData releases a new minor.</p></li>
<li><p>These changes do not affect how and when ember-source and ember-cli release.</p></li>
<li><p>These changes do not change EmberData's LTS support policy or its ember-source LTS support policy.</p>
<ul>
<li>The latest EmberData release will always support the last two ember-source LTS releases.</li></ul></li>
</ul>
<h2 id="mitigatingeffects">Mitigating Effects</h2>
<ul>
<li><p>The API Docs will continue to function as expected. It's worth noting that when viewing docs for EmberData the version dropdown will only include versions available for EmberData. Additionally, links in the EmberData API docs to the Ember API docs will take you to the matching version number of Ember - not necessarily the most recently released version of Ember.</p></li>
<li><p>EmberData's README has added a <a href="https://github.com/emberjs/data#compatibility">compatibility table</a>.</p></li>
<li><p>New releases (including patch and LTS releases) of EmberData beginning today will always list the range of compatible ember-source versions in the release notes at the time of release.</p></li>
<li><p>EmberData will begin setting an explicit peerDependency on ember-source set to all tested compatible versions matching the range specified in the release notes.</p>
<ul>
<li>Note: this peerDependency will at times be much broader than EmberData's official LTS support policy of "last 2 ember-source LTS releases".</li></ul></li>
<li><p>Ember CLI will ship the latest version of EmberData at the time of releases in the new app blueprint.</p></li>
<li><p>The releases overview on the website will continue to offer instructions for installing the latest version of Ember.js, which will include the latest version of EmberData (see previous bullet point). The LTS page will be updated to track both the Ember.js and EmberData LTS.</p></li>
</ul>
<h2 id="examples">Examples</h2>
<ul>
<li>ember-source releases a new minor (5.4), EmberData chooses to not release and remains at 5.3.</li>
<li>ember-source releases a new LTS (5.4), EmberData's latest release is 5.3 and thus releases 5.3 as LTS.</li>
<li>ember-source releases a new minor (5.5), EmberData chooses to release and thus bumps from 5.3 to 5.4.</li>
<li>ember-source releases a new major (6.0), EmberData will release 6.0.</li>
</ul>
<h2 id="timeline">Timeline</h2>
<p>EmberData is beginning this new policy effective with the current release, and has opted to not
release in this cycle. Thus the latest ember-source is 5.4 and latest ember-data is 5.3.</p>]]></description><link>https://blog.emberjs.com/updates-to-ember-data-versioning-strategy</link><guid isPermaLink="true">https://blog.emberjs.com/updates-to-ember-data-versioning-strategy</guid><pubDate>Wed, 01 Nov 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[What's Coming in Ember in 2014]]></title><description><![CDATA[<p>Every few months, the Ember core team likes to get together to discuss
issues face-to-face and set our priorities for the following quarter.</p>
<p>This time, we all converged on Portland, Oregon for the weekend to
figure out where to focus our energy in 2014.</p>
<h2 id="buildtoolsmodules">Build Tools &amp; Modules</h2>
<p>We spent the majority of our time discussing a unified plan that
combines ES6 modules with fast, robust, full-featured build tools for
Ember developers.</p>
<p>One thing I love about the Ember community is that it values quality
over raw implementation speed. For us, it's more important <a href="http://merrickchristensen.com/articles/scenario-vs-problem-solving.html">to solve
problems than to solve
scenarios</a>,
because scenario solving leads to fragmented solutions that don't scale
or compose as your app grows.</p>
<p>So far, we've held off on endorsing any particular build tool because,
while we've investigated all of them thoroughly, the currently-available
options all have fatal flaws that make them unpleasant to use as your
app gets larger.</p>
<p>Many people have also been asking us about modules. When we started
Ember, there were no popular module formats. Since then, both CommonJS
modules on the server and AMD modules in the browser have exploded in
popularity. While both are great options, their ecosystems are
disconnected and the two communities frequently engage in emacs/vi-style
holy wars.</p>
<p>Fortunately, TC39, the committee in charge of maintaining JavaScript,
recognized the need for a unified module system. ES6 modules offer the
best of both AMD and CommonJS modules while being integrated directly
into the language.</p>
<p>Just as the Ember community was one of the first to fully embrace
JavaScript promises, we have spent the last few months working on making
ES6 modules a reality and bringing them to production.</p>
<p>Two notable projects have come out of this work:</p>
<ul>
<li><a href="http://www.thomasboyt.com/2013/06/21/es6-module-transpiler">ES6 Module Transpiler</a>,
which can transpile JavaScript written in the ES6 module syntax down
into browser globals, AMD or CommonJS.</li>
<li><a href="http://embersherpa.com/articles/introduction-to-ember-app-kit/">Ember App Kit</a>, a foundation
for building Ember apps that uses ES6 modules (via the transpiler)
instead of globals.</li>
</ul>
<p>It's important to note that we have been planning for module support for
some time. In fact, one of the last features that was blocking our
initial 1.0 release was to have the entire framework go through an object
called the <em>resolver</em>.</p>
<p>The resolver is the part of our dependency injection system that is
responsible for determining naming conventions. For example, imagine a
user visits your Ember application at <code>/posts</code>. By default, Ember will
look for a template called <code>posts</code>, ask the <code>App.PostsRoute</code> for a
model, and hook it all up to the <code>App.PostsController</code>. But these
globals are not hardcoded into the framework—instead, there's a default
resolver that encapsulates all of these naming conventions.</p>
<p>To write an Ember app that uses modules, swap out
the default resolver for one that requires named modules instead of
looking for globals.</p>
<p>In order to make it really nice, however, we believe we need
command-line tools to smooth the process of creating, developing, and
deploying apps.</p>
<p>Our focus for the first quarter of 2014 will be to develop first-class
build tools that leverage existing tools where they fit our needs, and
write new ones where the current options fall down. We'll make modules a
first-class citizen, and soon every developer who starts using Ember
will also be using ES6 modules. We're excited about a world where
browser and server JavaScript packages live together in harmony.</p>
<p>To give you an idea of what we're thinking, here are some example CLI
commands and their effects. Note that this is all under heavy
development and is subject to change.</p>
<h3 id="initializinganapp">Initializing an App</h3>
<pre><code class="bash language-bash">ember new my-app
</code></pre>
<p>This initializes a new Ember.js project and generates stub directories,
an app, a router, etc.</p>
<h3 id="startingthedevelopmentserver">Starting the Development Server</h3>
<pre><code class="bash language-bash">ember server
</code></pre>
<h3 id="runningtests">Running Tests</h3>
<pre><code class="bash language-bash">ember test
</code></pre>
<p>Runs the QUnit tests using Karma (PhantomJS plus available
browsers), although we are planning migrate to testem as we've found its
output easier to work with.</p>
<p>You can also host the QUnit test harness for manual testing by
running:</p>
<pre><code class="bash language-bash">ember test:server
</code></pre>
<h2 id="addingpackages">Adding Packages</h2>
<p>The Ember CLI supports bower natively. Just use the commands
you're used to:</p>
<pre><code class="bash language-bash">bower install moment
</code></pre>
<p>The lingua franca module format in Ember is ES6 modules. We will do the
work to ensure that bower modules are usable by Ember apps
automatically, by shimming AMD, CommonJS and browser global packages:</p>
<ol>
<li>Provide a <code>shim.json</code> and <code>shim</code> directory for AMD shims</li>
<li>Name anonymous module based on filesystem location (including
versions)</li>
<li>Concatenate modules into app.js (with source map)</li>
<li>Inherit source maps from bower (if provided)</li>
</ol>
<p>Even if a library was shipped as AMD, you would be able to use it as
though it was an ES6 module:</p>
<pre><code class="javascript language-javascript">import md from "markdown";
</code></pre>
<p>Every time a file changes, the final concatenated file loaded by the
browser (app.js, app.css, etc.) is locked and any HTTP requests for it
block until the new version is compiled.</p>
<h2 id="enhancedinspectorfeatures">Enhanced Inspector Features</h2>
<p>If you're developing your app using the Ember CLI tools, the Chrome and
Firefox inspectors get even better. The development server will open a
socket that the inspector can connect to that will provide additional
environmental information to the browser extension.</p>
<p>There are lots of exciting things you can do once your browser and
development tools are talking to each other, but some of the ideas we've
tossed around are:</p>
<ul>
<li>Seeing a list of installed bower packages</li>
<li>Seeing the results of test runs</li>
<li>Linting and auditing your codebase</li>
<li>Configuring package.json using visual editor</li>
</ul>
<h2 id="filesystemlayout">Filesystem Layout</h2>
<p>Here is a rough example of the kind of layout you might see when
initializing a new Ember app via the CLI:</p>
<pre><code class="markup language-markup">app/
  controllers/
  models/
  fonts/
  …
config/
  shim.json
vendor/
  underscore.js    // bower installed
  markdown.js
lib/
  ember-histogram/ // incubator for packages
    skylight/
    bower.json
modules/           // non-MVC stuff
  underscore.js
</code></pre>
<h3 id="poddirectorystructure">"Pod" Directory Structure</h3>
<p>Right now, many Ember projects have adopted a Rails-style directory
layout where everything is grouped by type:</p>
<pre><code class="markup language-markup">app/
  controllers/
    post.js
    posts.js
    index.js
  models/
    post.js
    user.js
  templates/
    post.handlebars
    posts.handlebars
    index.handlebars
</code></pre>
<p>We discussed moving this to a layout where related features are
grouped together in "pods" of functionality:</p>
<pre><code class="test language-test">app/
  config/
    application.js
  serializers/
  models/
    post.js
    user.js
  mixins/
pods/
  post/
    controller.js
    template.handlebars
  posts/
    controller.js
    template.handlebars
  index/
    controller.js
    template.handlebars
components/
  google-map/
    component.handlebars
    component.js
    component.css
</code></pre>
<p>This proposed directory structure is still up for lots of discussion.
We've been looking at many different real world apps to see if this
makes managing the source code for Ember apps any easier.</p>
<h2 id="slimmingdownemberjsprojectsvelte">Slimming Down Ember.js (Project Svelte)</h2>
<p>We believe there are several areas in the Ember codebase that have the
potential to be slimmed down substantially. We'd like to pick a target
filesize and have a sprint to get the total built framework size under
that target.</p>
<p>We haven't picked a target size yet, but we tossed around the 50k figure.
We'll have more information about this once we've made a list of good
candidates for slimming action.</p>
<h2 id="distributingcomponents">Distributing Components</h2>
<p>There are a number of open issues around distributing reusable,
third-party components and libraries of components. Typically we defer
to the <a href="http://www.w3.org/TR/components-intro/">Web Components spec</a>, but
there are areas where the spec does not currently provide any guidance.
As we deal with them, we are keen to provide feedback to the Web Components
spec authors with how we have chosen to solve the problems.</p>
<p>Other limitations are due to certain features not being available in
older browsers, and we are working on polyfilling and working around
those issues so that you can enjoy the power of Web Components today in
browsers all the way back to IE8.</p>
<h3 id="namespacing">Namespacing</h3>
<p>Right now, Ember components share a global namespace. If I have a
component called <code>area-graph</code> and you have a component called
<code>area-graph</code> and I want to use your component in my app, we will have a
collision.</p>
<p>Soon, components in packages will be addressable by a fully-qualified path.</p>
<p>Here's a notional area graph component:</p>
<pre><code class="handlebars language-handlebars">{{area-graph@d3 xValue=responseTimes}}
</code></pre>
<p>If you find yourself typing the fully-qualified path often, you will be
able to alias the helper in the lexical scope of the Handlebars template:</p>
<pre><code class="handlebars language-handlebars">{{import "area-graph" from "d3"}}
</code></pre>
<p>We may also add a syntax for making all helpers in a package available:</p>
<pre><code class="handlebars language-handlebars">{{import "d3"}}
</code></pre>
<h3 id="templateversioningcompilation">Template Versioning/Compilation</h3>
<p>Handlebars compiles templates down into an intermediate AST. This AST
can change between Handlebars versions. Additionally, Handlebars syntax
may be extended, or change in version 2.0.</p>
<p>Given that components are distributed on bower, should they be shipped
with their templates pre-compiled, or should we leave it up to ember-cli
to compile them on-demand?</p>
<p>Currently, we are leaning towards shipping templates in their raw source
form, but we need to do some more investigation.</p>
<h3 id="scopedcss">Scoped CSS</h3>
<p><code>&lt;style scoped&gt;</code> is not available today in many browsers. Distributed
components will get a uuid associated with them, and all of their CSS
rules will be wrapped in a selector that limits them to elements with
that uuid as a class name.</p>
<h2 id="itemcontroller">Item Controller</h2>
<p>Instead of doing <code>{{#each itemController="postItem"}}</code>, you can just
define <code>App.PostsItemController</code> (or the <code>app/controllers/posts-item</code>
module) and it will be wired up automatically.</p>
<h2 id="htmlbars">HTMLBars</h2>
<p>HTMLBars is on track and will hopefully be available behind a feature
flag sometime in the new year. Yehuda spent some time going over the
implementation with Kris Selden and Alex Matchneer. They are going to be
taking over the effort of integrating the HTMLBars compiler into Ember
proper.</p>
<p>If you're not familiar with HTMLBars, it is a compiler that knows about
both HTML5 and Handlebars syntax. This is important for two reasons.</p>
<p>First, it will allow us to deprecate the <code>{{bind-attr}}</code> Handlebars
helper. Instead of this:</p>
<pre><code class="handlebars language-handlebars">&lt;img {{bind-attr src=imageUrl}}&gt;
</code></pre>
<p>You will be able to say:</p>
<pre><code class="handlebars language-handlebars">&lt;img src="{{imageUrl}}"&gt;
</code></pre>
<p>Second, it will also allow us to eliminate the ugly metamorph.js script
tags that we currently use to track bound values in the DOM.</p>
<p>Here's what the DOM looks like before HTMLBars:</p>
<p><img
src="/images/blog/2013-12-17-whats-coming-in-ember-in-2014/with-metamorph.png"></p>
<p>And after:</p>
<p><img src="/images/blog/2013-12-17-whats-coming-in-ember-in-2014/without-metamorph.png"></p>
<h2 id="eliminatejquerydependency">Eliminate jQuery Dependency</h2>
<p>Once we move over to HTMLBars, the interaction between Ember.js and the
DOM gets smaller. We can probably treat jQuery as an optional dependency
and only use it if it is available via globals or as an AMD module. We
just want to make sure that we remove components/views using jQuery if its
available so that jQuery UI widgets that have stored data in the DOM via
jQuery.data() get cleaned up appropriately.</p>
<h2 id="animation">Animation</h2>
<p>We're still working on having animation support be built in to the
framework, but we don't have any specific API proposals to share at this
time. As always, we prioritize getting the API correct the first time
rather than having to re-do it in a later release.</p>
<h2 id="ie8support">IE8 Support</h2>
<p>Despite the imminent End of Life status of Windows XP, we will continue
supporting Internet Explorer 8. We know many Ember.js users still need
to target enterprise and education customers, who will be on IE8 for
some time.</p>
<h2 id="emberconf">EmberConf</h2>
<p>EmberConf 2014: It's happening. We'll have more details available very
soon, but I will say that you should keep March as free as you can.</p>
<h2 id="emberdart">EmberDart</h2>
<p>Just kidding.</p>
<h2 id="howyoucanhelp">How You Can Help</h2>
<p>As we've said before, Ember is a completely community-driven project.
I'd like to thank all of the core team members who pay out-of-pocket for
travel and accommodation so they can be at these meetings.</p>
<p>It has been extremely rewarding to watch the Ember community grow, and
also to see it assume a position of leadership in the JavaScript
community.</p>
<p>We need your help to keep pushing the boundaries of what's possible in
the browser. If you'd like to get started helping out, please join us in
<code>#emberjs-dev</code> on Freenode, where our helpful community can point you in
the right direction. (If you just need help with developing your Ember
app, please keep those questions in <code>#emberjs</code>.)</p>
<p>If there's anything we've forgotten to mention here, please feel free to
let us know what you'd like to see in the comments below!</p>
<h2 id="emberdata">Ember Data</h2>
<p>We've got lots of exciting stuff coming in Ember Data. Expect an update
on our roadmap there in a separate blog post soon.</p>
<p><img src="/images/blog/2013-12-17-whats-coming-in-ember-in-2014/1.jpg">
<img src="/images/blog/2013-12-17-whats-coming-in-ember-in-2014/2.jpg">
<img src="/images/blog/2013-12-17-whats-coming-in-ember-in-2014/3.jpg">
<img src="/images/blog/2013-12-17-whats-coming-in-ember-in-2014/4.jpg">
<img src="/images/blog/2013-12-17-whats-coming-in-ember-in-2014/5.jpg"></p>]]></description><link>https://blog.emberjs.com/whats-coming-in-ember-in-2014</link><guid isPermaLink="true">https://blog.emberjs.com/whats-coming-in-ember-in-2014</guid><pubDate>Tue, 17 Dec 2013 00:00:00 GMT</pubDate></item></channel></rss>