Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

ember-composable-helpers

DockYard262kMIT5.0.0

Composable helpers for Ember

ember-addon, helpers, compose, group-by, map-by, filter-by, sort-by, take, drop, compute

readme

ember-composable-helpers

Download count all time CircleCI npm version Ember Observer Score

ember-composable-helpers is built and maintained by DockYard, contact us for expert Ember.js consulting.

Composable helpers for Ember that enables more declarative templating. These helpers can be composed together to form powerful ideas:

{{#each (map-by "fullName" users) as |fullName|}}
  <input type="text" value={{fullName}} onchange={{action (mut newName)}}>
  <button {{action (pipe updateFullName saveUser) newName}}>
    Update and save {{fullName}} to {{newName}}
  </button>
{{/each}}

To install:

Ember 3.13+:

ember install ember-composable-helpers

Ember 3.12 and below:

ember install ember-composable-helpers@^2.4.0

Watch a free video overview presented by EmberMap:

Table of Contents

Configuration

If you don't need all the helpers, you can specify which to include or remove from your build using only or except within your ember-cli-build.js:

module.exports = function(defaults) {
  var app = new EmberApp(defaults, {
    'ember-composable-helpers': {
      only: ['inc', 'dec', 'pipe'],
      except: ['filter-by']
    }
  });

Both only and except can be safely used together (the addon computes the diff), although it's best if you only use one for your own sanity.

except: ['pipe'] // imports all helpers except `pipe`
only: ['pipe'] // imports only `pipe`

Argument ordering

This addon is built with composability in mind, and in order to faciliate that, the ordering of arguments is somewhat different then you might be used to.

For all non-unary helpers, the subject of the helper function will always be the last argument. This way the arguments are better readable if you compose together multiple helpers:

{{take 5 (sort-by "lastName" "firstName" (filter-by "active" array))}}

For action helpers, this will mean better currying semantics:

<button {{action (pipe (action "closePopover") (toggle "isExpanded")) this}}>
  {{if isExpanded "I am expanded" "I am not"}}
</button>

Upgrade Guide

For help upgrading between major versions, check out the upgrading documentation.

Available helpers

Action helpers

pipe

Pipes the return values of actions in a sequence of actions. This is useful to compose a pipeline of actions, so each action can do only one thing.

<button {{action (pipe (action 'addToCart') (action 'purchase') (action 'redirectToThankYouPage')) item}}>
  1-Click Buy
</button>

The pipe helper is Promise-aware, meaning that if any action in the pipeline returns a Promise, its return value will be piped into the next action. If the Promise rejects, the rest of the pipeline will be aborted.

The pipe helper can also be used directly as a closure action (using pipe-action) when being passed into a Component, which provides an elegant syntax for composing actions:

{{foo-bar
    addAndSquare=(pipe-action (action "add") (action "square"))
    multiplyAndSquare=(pipe-action (action "multiply") (action "square"))
}}
{{! foo-bar/template.hbs }}
<button {{action addAndSquare 2 4}}>Add and Square</button>
<button {{action multiplyAndSquare 2 4}}>Multiply and Square</button>

⬆️️ back to top

call

Calls the given function with arguments

{{#each (call (fn this.callMeWith @daysInMonth) as |week|}}
  {{#each week as |day|}}
    {{day}}
  {{/each}}
{{/each}}

⬆️ back to top

compute

Calls an action as a template helper.

The square of 4 is {{compute (action "square") 4}}

⬆️ back to top

toggle

Toggles a boolean value.

<button {{action (toggle "isExpanded" this)}}>
  {{if isExpanded "I am expanded" "I am not"}}
</button>

toggle can also be used directly as a closure action using toggle-action:

{{foo-bar
    toggleIsExpanded=(toggle-action "isExpanded" this)
    toggleIsSelected=(toggle-action "isSelected" this)
}}
{{! foo-bar/template.hbs }}
<button {{action toggleIsExpanded}}>Open / Close</button>
<button {{action toggleIsSelected}}>Select / Deselect</button>

toggle also accepts optional values to rotate through:

<button {{action (toggle "currentName" this "foo" "bar" "baz")}}>
  {{currentName}}
</button>

⬆️ back to top

noop

Returns an empty function.

<div {{on "mouseenter" (if @isLoading (noop) @sendTrackingEvent))}}>Some content</div>

⬆️ back to top

optional

Allows for the passed in action to not exist.

<button {{action (optional handleClick)}}>Click Me</button>

⬆️ back to top

queue

Like pipe, this helper runs actions in a sequence (from left-to-right). The difference is that this helper passes the original arguments to each action, not the result of the previous action in the sequence.

If one of the actions in the sequence returns a promise, then it will wait for that promise to resolve before calling the next action in the sequence. If a promise is rejected it will stop the sequence and no further actions will be called.

<button {{action (queue (action "backupData") (action "unsafeOperation") (action "restoreBackup"))}} />

⬆️ back to top


Array helpers

map

Maps a callback on an array.

{{#each (map (action "getName") users) as |fullName|}}
  {{fullName}}
{{/each}}

⬆️ back to top

map-by

Maps an array on a property.

{{#each (map-by "fullName" users) as |fullName|}}
  {{fullName}}
{{/each}}

sort-by

Sort an array by given properties.

{{#each (sort-by "lastName" "firstName" users) as |user|}}
  {{user.lastName}}, {{user.firstName}}
{{/each}}

You can append :desc to properties to sort in reverse order.

{{#each (sort-by "age:desc" users) as |user|}}
    {{user.firstName}} {{user.lastName}} ({{user.age}})
{{/each}}

You can also pass a method as the first argument:

{{#each (sort-by (action "mySortAction") users) as |user|}}
  {{user.firstName}} {{user.lastName}} ({{user.age}})
{{/each}}

⬆️ back to top

filter

Filters an array by a callback.

{{#each (filter (action "isActive") users) as |user|}}
  {{user.name}} is active!
{{/each}}

filter-by

Filters an array by a property.

{{#each (filter-by "isActive" true users) as |user|}}
  {{user.name}} is active!
{{/each}}

If you omit the second argument it will test if the property is truthy.

{{#each (filter-by "address" users) as |user|}}
  {{user.name}} has an address specified!
{{/each}}

You can also pass an action as second argument:

{{#each (filter-by "age" (action "olderThan" 18) users) as |user|}}
  {{user.name}} is older than eighteen!
{{/each}}

⬆️ back to top

reject-by

The inverse of filter by.

{{#each (reject-by "isActive" true users) as |user|}}
  {{user.name}} is not active!
{{/each}}

If you omit the third argument it will test if the property is falsey.

{{#each (reject-by "address" users) as |user|}}
  {{user.name}} does not have an address specified!
{{/each}}

You can also pass an action as third argument:

{{#each (reject-by "age" (action "youngerThan" 18) users) as |user|}}
  {{user.name}} is older than eighteen!
{{/each}}

⬆️ back to top

find-by

Returns the first entry matching the given value.

{{#with (find-by 'name' lookupName people) as |person|}}
  {{#if person}}
    {{#link-to 'person' person}}
      Click here to see {{person.name}}'s details
    {{/link-to}}
  {{/if}}
{{/with}}

⬆️ back to top

intersect

Creates an array of unique values that are included in all given arrays.

<h1>Matching skills</h1>
{{#each (intersect desiredSkills currentSkills) as |skill|}}
  {{skill.name}}
{{/each}}

⬆️ back to top

invoke

Invokes a method on an object, or on each object of an array.

<div id="popup">
  {{#each people as |person|}}
    <button {{action (invoke "rollbackAttributes" person)}}>
      Undo
    </button>
  {{/each}}
  <a {{action (invoke "save" people)}}>Save</a>
</div>

⬆️ back to top

union

Joins arrays to create an array of unique values. When applied to a single array, has the same behavior as uniq.

{{#each (union cartA cartB cartC) as |cartItem|}}
  {{cartItem.price}} x {{cartItem.quantity}} for {{cartItem.name}}
{{/each}}

⬆️ back to top

take

Returns the first n entries of a given array.

<h3>Top 3:</h3>
{{#each (take 3 contestants) as |contestant|}}
  {{contestant.rank}}. {{contestant.name}}
{{/each}}

⬆️ back to top

drop

Returns an array with the first n entries omitted.

<h3>Other contestants:</h3>
{{#each (drop 3 contestants) as |contestant|}}
  {{contestant.rank}}. {{contestant.name}}
{{/each}}

⬆️ back to top

reduce

Reduce an array to a value.

{{reduce (action "sum") 0 (array 1 2 3)}}

The last argument is initial value. If you omit it, undefined will be used.

repeat

Repeats n times. This can be useful for making an n-length arbitrary list for iterating upon (you can think of this form as a times helper, a la Ruby's 5.times { ... }):

{{#each (repeat 3) as |empty|}}
  I will be rendered 3 times
{{/each}}

You can also give it a value to repeat:

{{#each (repeat 3 "Adam") as |name|}}
  {{name}}
{{/each}}

⬆️ back to top

reverse

Reverses the order of the array.

{{#each (reverse friends) as |friend|}}
  If {{friend}} was first, they are now last.
{{/each}}

⬆️ back to top

range

Generates a range of numbers between a min and max value.

{{#each (range 10 20) as |number|}}
  {{! `number` will go from 10 to 19}}
{{/each}}

It can also be set to inclusive:

{{#each (range 10 20 true) as |number|}}
  {{! `number` will go from 10 to 20}}
{{/each}}

And works with a negative range:

{{#each (range 20 10) as |number|}}
  {{! `number` will go from 20 to 11}}
{{/each}}

⬆️ back to top

join

Joins the given array with an optional separator into a string.

{{join ', ' categories}}

⬆️ back to top

compact

Removes blank items from an array.

{{#each (compact arrayWithBlanks) as |notBlank|}}
  {{notBlank}} is most definitely not blank!
{{/each}}

⬆️ back to top

contains

:warning: contains is deprecated. Use includes instead.

Checks if a given value or sub-array is contained within an array.

{{contains selectedItem items}}
{{contains 1234 items}}
{{contains "First" (w "First Second Third") }}
{{contains (w "First Second") (w "First Second Third")}}

⬆️ back to top

includes

Checks if a given value or sub-array is included within an array.

{{includes selectedItem items}}
{{includes 1234 items}}
{{includes "First" (w "First Second Third") }}
{{includes (w "First Second") (w "First Second Third")}}

⬆️ back to top

append

Appends the given arrays and/or values into a single flat array.

{{#each (append catNames dogName) as |petName|}}
  {{petName}}
{{/each}}

⬆️ back to top

chunk

Returns the given array split into sub-arrays the length of the given value.

{{#each (chunk 7 daysInMonth) as |week|}}
  {{#each week as |day|}}
    {{day}}
  {{/each}}
{{/each}}

⬆️ back to top

without

Returns the given array without the given item(s).

{{#each (without selectedItem items) as |remainingItem|}}
  {{remainingItem.name}}
{{/each}}

⬆️ back to top

shuffle

Shuffles an array with a randomizer function, or with Math.random as a default. Your randomizer function should return a number between 0 and 1.

{{#each (shuffle array) as |value|}}
  {{value}}
{{/each}}
{{#each (shuffle (action "myRandomizer") array) as |value|}}
  {{value}}
{{/each}}

⬆️ back to top

flatten

Flattens an array to a single dimension.

{{#each (flatten anArrayOfNamesWithMultipleDimensions) as |name|}}
  Name: {{name}}
{{/each}}

⬆️ back to top

object-at

Returns the object at the given index of an array.

{{object-at index array}}

⬆️ back to top

slice

Slices an array

{{#each (slice 1 3 array) as |value|}}
  {{value}}
{{/each}}

⬆️ back to top

next

Returns the next element in the array given the current element. Note: Accepts an optional boolean parameter, useDeepEqual, to flag whether a deep equal comparison should be performed.

<button onclick={{action (mut selectedItem) (next selectedItem useDeepEqual items)}}>Next</button>

⬆️ back to top

has-next

Checks if the array has an element after the given element. Note: Accepts an optional boolean parameter, useDeepEqual, to flag whether a deep equal comparison should be performed.

{{#if (has-next page useDeepEqual pages)}}
  <button>Next</button>
{{/if}}

⬆️ back to top

previous

Returns the previous element in the array given the current element. Note: Accepts an optional boolean parameter, useDeepEqual, to flag whether a deep equal comparison should be performed.

<button onclick={{action (mut selectedItem) (previous selectedItem useDeepEqual items)}}>Previous</button>

⬆️ back to top

has-previous

Checks if the array has an element before the given element. Note: Accepts an optional boolean parameter, useDeepEqual, to flag whether a deep equal comparison should be performed

{{#if (has-previous page useDeepEqual pages)}}
  <button>Previous</button>
{{/if}}

⬆️ back to top


Object helpers

entries

Returns an array of a given object's own enumerable string-keyed property [key, value] pairs

  {{#each (entries object) as |entry|}}
    {{get entry 0}}:{{get entry 1}}
  {{/each}}

You can pair it with other array helpers too. For example

  {{#each (sort-by myOwnSortByFunction (entries myObject)) as |entry|}}
    {{get entry 0}}
  {{/each}}`);

⬆️ back to top

from-entries

Converts a two-dimensional array of [key, value] pairs into an Object

  {{#each-in (from-entries entries) as |key value|}}
    {{key}}:{{value}}
  {{/each}}

You can pair it with other array helpers too. For example, to copy only properties with non-falsey values:

  {{#each-in (from-entries (filter-by "1" (entries myObject))) as |k v|}}
    {{k}}: {{v}}
  {{/each-in}}`);

⬆️ back to top

group-by

Returns an object where the keys are the unique values of the given property, and the values are an array with all items of the array that have the same value of that property.

{{#each-in (group-by "category" artists) as |category artists|}}
  <h3>{{category}}</h3>
  <ul>
    {{#each artists as |artist|}}
      <li>{{artist.name}}</li>
    {{/each}}
  </ul>
{{/each-in}}

⬆️ back to top

keys

Returns an array of keys of given object.

{{#with (keys fields) as |labels|}}
  <h3>This article contain {{labels.length}} fields</h3>
  <ul>
    {{#each labels as |label|}}
      <li>{{label}}</li>
    {{/each}}
  </ul>
{{/with}}

⬆️ back to top

pick

Receives an object and picks a specified path off of it to pass on. Intended for use with {{on}} modifiers placed on form elements.

  <input
    ...
    {{on 'input' (pipe (pick 'target.value') this.onInput)}}
  />

It also supports an optional second argument to make common usage more ergonomic.

  <input
    ...
    {{on 'input' (pick 'target.value' this.onInput)}}
  />

*⬆️ back to top

values

Returns an array of values from the given object.

{{#with (values fields) as |data|}}
  <h3>This article contain {{data.length}} fields</h3>
  <ul>
    {{#each data as |datum|}}
      <li>{{datum}}</li>
    {{/each}}
  </ul>
{{/with}}

*⬆️ back to top


Math helpers

inc

Increments by 1 or step.

{{inc numberOfPeople}}
{{inc 2 numberOfPeople}}

⬆️ back to top

dec

Decrements by 1 or step.

{{dec numberOfPeople}}
{{dec 2 numberOfPeople}}

⬆️ back to top


String helpers

String helpers were extracted to the ember-cli-string-helpers addon.

See also:

DockYard, Inc © 2016

@dockyard

Licensed under the MIT license

Contributors

We're grateful to these wonderful contributors who've contributed to ember-composable-helpers:

changelog

Changelog

All notable changes to this project will be documented in this file. Dates are displayed in UTC.

Generated by auto-changelog.

v4.5.0

7 June 2021

  • Embroider #406
  • Fix Beta/Canary Tests #404
  • CI Configuration Improvements #405
  • Bump elliptic from 6.5.2 to 6.5.4 #399
  • Document "includes" helper #397

v4.4.1

4 December 2020

  • fixes sort-by case with multiple properties and nulls #390
  • Support embroider #383

v4.4.0

28 November 2020

  • better array handlers (for nan, null, undefined, sets) #389
  • Add Github Actions b7f9fa8
  • Rm 3.4 and 3.8 f218950
  • Rm 3.12 37020b0

v4.3.2

18 November 2020

  • [sort-by] Cannot call get with 'configOrder' on an undefined object. #388

v4.3.1

9 November 2020

  • Don't sort array when key is empty #386
  • use confirmedArrays when performing intersect #384
  • README improvements 5754b41

v4.3.0

1 September 2020

  • Add call helper #380
  • Rename {{contains}} helper to {{includes}} #379

v4.2.2

5 July 2020

  • Fix sort-by with null values #377

v4.2.1

12 June 2020

  • Further improve sorting algorithm to put undefined values at end of list #376

v4.2.0

10 June 2020

  • Fixes sort-by's handling of multiple keys #375
  • CHANGELOG 4.2.0 b52cd41

v4.1.3

8 June 2020

  • Ignore undefined values when sorting #373

v4.1.2

6 June 2020

  • Refactor sort by to Alphabetical instead of ASCII(betical) #370
  • Bump websocket-extensions from 0.1.3 to 0.1.4 #371
  • add a changelog #368
  • Improve README language 4e195ce

v4.1.1

4 June 2020

  • Fix sort-by to handle an EmberArray #367

v4.1.0

3 June 2020

  • Pick Helper #366
  • Refactor sort-by with native implementation of sort #362
  • Bump 3.17 #361

v4.0.0

19 April 2020

  • [MAJOR]: bump 3.16 and drop node to min 10 #360

v3.2.0

19 April 2020

  • Object helpers #359
  • [Feature] Object keys & entries helpers #352
  • replace deprecated method sinon sandbox #353
  • Bump acorn from 5.7.3 to 5.7.4 #350

v3.1.1

12 February 2020

  • bugfix map-by with ember-data models #348

v3.1.0

17 January 2020

  • allow 2 args {{slice}} #346

v3.0.3

3 January 2020

  • Restore helper functions exports #343
  • Add contributor-faces #342
  • Fix install instructions on Ember 3.12 and below #340

v3.0.2

9 November 2019

  • tlindsay/security fixes #338
  • Bump handlebars from 4.1.0 to 4.5.1 #331
  • Bump lodash.defaultsdeep from 4.6.0 to 4.6.1 #332
  • Bump eslint-utils from 1.3.1 to 1.4.3 #333
  • Bump mixin-deep from 1.3.1 to 1.3.2 #334
  • Bump js-yaml from 3.12.1 to 3.13.1 #335
  • Handle null arrays for all helpers #336

v3.0.1

30 October 2019

  • Handle null array in map-by #329

3.0.0

25 October 2019

v3.0.0

25 October 2019

  • Refactor helpers for Octane #321
  • upgrade to Ember 3.13 ea3554a

v2.4.0

22 October 2019

  • Add noop helper #325
  • allow {{take}} to be used with null arrays #324
  • Node 8 #322
  • Change filter-by to avoid dependant keys #313

v2.3.1

24 April 2019

  • Add reverse helper to index.js #317

v2.3.0

24 April 2019

  • fix unused helper stripping #316
  • Add yarn #312

v2.2.0

23 February 2019

  • Upgrade to CircleCI 2.0 #290
  • Fix tests #309
  • Updating without helper to work with ember data arrays. Fixes #268. #277
  • Remove reexports of nonexistent files #307
  • Adding ember-cli-shims to bower is not longer needed nor advised. #306
  • Update to 3.5 family #305
  • Remove reexports of nonexistent names #302
  • Revert "Delete package-lock.json + Ignore lockfiles (#294)" #295
  • Delete package-lock.json + Ignore lockfiles #294
  • Fixed range helper inclusive, when args are the same value #292
  • Updating without helper to work with ember data arrays. Fixes #268. (#277) #268

v2.1.0

9 January 2018

  • Read options from parent or app #279
  • Use "New Module Imports" #278
  • Version 3.1.0 3b22487
  • Update README.md 50e91eb

v2.0.3

5 July 2017

  • Fix filter helpers regexp #275
  • Released v2.0.3 29ff550

v2.0.2

16 June 2017

  • Only install ember-cli-shims if it doesn't exist #270
  • Update ember-cli to 2.13 #273
  • Use yarn #266
  • Update readme on config #265
  • Fix package.json 980269b
  • Released v2.0.2 e447b21

v2.0.1

12 April 2017

  • Check if whitelist|blacklist exists in filterHelpers #260
  • Add an upgrade guide from 1.x to 2.x #258
  • Fix group by test a5e941d
  • Fix jscs style regression 53a1715
  • Released v2.0.1 f66a46b

v2.0.0

28 January 2017

  • Remove String helpers #237
  • Released v2.0.0 436c68c
  • Add string helpers to list of other helper addons ea579b3

v1.2.0

28 January 2017

  • Updating next and previous helpers to handle ember-data relationships. #241
  • Remove deprecated Ember.K #246
  • Updating next and previous helpers to handle ember-data relationships. (#241) #229
  • Upgrade to ember-cli/ember @2.11.0 51518bf
  • Add failing tests for filter-by and reject-by when value is omitted 2c182dd
  • All group-by with strings that contain punctuation 7dbcc57

v1.1.3

9 January 2017

  • Update is-promise.js #248
  • Add ember-math-helpers link #230
  • Use Ember.isEqual #236
  • Update ember-cli to 2.9.1 #232
  • Released v1.1.3 290ee86

v1.1.2

17 September 2016

  • Make compatible with Ember 2.9.0-beta.2+. #227
  • Update ember-cli to 2.8.0 #226
  • Document the {{queue}} helper #222
  • Released v1.1.2 3255f87

v1.1.1

25 August 2016

  • Upgrade each-in-polyfill #221
  • Fixes titleize properly handling null #220
  • Fix style issues #219
  • Fix example #216
  • Upgrade Ember CLI to 2.7.0 + Suave'd #207
  • Released v1.1.1 2a87ae1

v1.1.0

23 August 2016

  • Add queue helper #214
  • Add issue & PR templates, code of conduct and contributing docs #212
  • Add html-safe helper #211
  • Add download count badge #210
  • Remove TravisCI #209
  • Make sure node-tests run in CI #208
  • Fixed dasherize typo in docs #206
  • Use a newer version of Chrome on Circle CI #204
  • Setup Circle CI #202
  • Update Ember Try scenarios #201
  • Test Ember Alpha #200
  • standardize array checks to Ember arrays (#197) #198
  • Released v1.1.0 d5ee127
  • Fix typo 8c931ed

v1.0.0

22 July 2016

  • Move config from config/environment to ember-cli-build #196
  • Add next and previous helpers #140
  • Titleize Helper #194
  • [BUGFIX] {{filter-by}} must work without prototype extensions #195
  • Fix without with Ember Arrays #193
  • Fixes {{sort-by}} with a function #191
  • Slice helper #190
  • Set up Ember Try to work with version compat and Ember Exam #189
  • Add a change test to without #188
  • Fix small typo in README.md #187
  • Add next and previous helpers (#140) #62
  • Remove PR # from randomization fcccaf6
  • Released v1.0.0 f939398

v0.27.0

21 July 2016

  • Array helpers - map, filter, reduce #185
  • Link to free EmberMap video #182
  • Released v0.27.0 c1caef3
  • Auto merge of #180 - DockYard:update-ember-cli, r=poteto e8944a8
  • Update ember-cli to 2.6.0 ed12251

v0.26.2

10 June 2016

  • Released v0.26.2 f92408b
  • Auto merge of #167 - martndemus:fix-closure-action-import-canary, r=martndemus 934d34d
  • Fix loading ACTION symbol on canary 4031aab

v0.26.1

8 June 2016

  • Released v0.26.1 1bc9128
  • Auto merge of #174 - martndemus:fix-inc-with-strings, r=martndemus 304f818
  • Fix inc/dec with string values 04eb96f

v0.26.0

31 May 2016

  • Add optional args to the toggle helper #169
  • Add optional args to the toggle helper (#169) #168
  • Released v0.26.0 24fce12

v0.25.0

27 May 2016

  • Auto merge of #163 - martndemus:optional-action, r=martndemus #162
  • Auto merge of #164 - martndemus:reorder-shuffle, r=martndemus #150
  • Released v0.25.0 718193f
  • Auto merge of #166 - martndemus:fix-flatten-helper, r=martndemus ccaf0ea
  • Auto merge of #165 - martndemus:test-recent-ember-versions, r=martndemus 103ad0a

v0.24.1

13 May 2016

  • Auto merge of #157 - martndemus:array-length-proofing, r=martndemus #149
  • Released v0.24.1 b9280b2
  • Auto merge of #123 - martndemus:add-create-multi-array-helper, r=martndemus 1321ec6
  • DRY up append, intersect and union 6e9e5d3

v0.24.0

12 May 2016

  • Released v0.24.0 13658da
  • Auto merge of #156 - martndemus:inc-or-dec-by-zero, r=martndemus bb214ff
  • Be able to use {{inc}} or {{dec}} with 0 02c5d4c

v0.23.1

28 April 2016

  • Auto merge of #148 - blimmer:bug/chunk-with-array-proxy, r=martndemus #147
  • Allow chunk helper to work with CP length. #147
  • Released v0.23.1 bdab3b3

v0.23.0

27 April 2016

  • Auto merge of #146 - DockYard:shuffle-helper, r=poteto #132
  • Auto merge of #143 - zigahertz:array-helper, r=poteto #142
  • Added shuffle helper 02214fa
  • adds array helper and tests 639be28
  • Small updates to the array helper ade3075

v0.22.1

25 April 2016

  • Released v0.22.1 5ec37ca
  • Auto merge of #141 - cibernox:filter-by-observes-value, r=martndemus eacfa4f
  • [BUGFIX] {{filter-by}} must also observe changes in the value 7738959

v0.22.0

19 April 2016

  • Released v0.22.0 5674ded
  • Auto merge of #135 - romulomachado:create-truncate-helper, r=poteto 6ad0802
  • Auto merge of #138 - patrickberkeley:patch-1, r=poteto b62e2e6

v0.21.1

2 April 2016

  • Updated README to include missing closing parens #129
  • Released v0.21.1 c146d34
  • Auto merge of #130 - skeate:patch-1, r=poteto 4367f49
  • Fix path in toggle-action 3efe992

v0.21.0

31 March 2016

  • Released v0.21.0 d75afca
  • Auto merge of #128 - DockYard:closure-actionify, r=poteto 586dd98
  • Create closure action form of action helpers fcd55f4

v0.20.0

23 March 2016

  • Auto merge of #122 - martndemus:user-app-shims, r=martndemus #107
  • Auto merge of #117 - martndemus:fix-sortby-with-array, r=martndemus #105
  • Released v0.20.0 86fa630
  • Auto merge of #124 - martndemus:string-helper, r=poteto 11b8e62
  • Auto merge of #121 - henrymazza:master, r=poteto 055e27d

v0.19.0

11 March 2016

  • Auto merge of #116 - DockYard:14-without, r=poteto #14
  • Add Without helper #14
  • Auto merge of #115 - martndemus:filter-by-test, r=martndemus #88
  • Released v0.19.0 76903f7
  • Auto merge of #118 - yapplabs:nested-addon-usage, r=poteto 7cc6358
  • Add test for filter-by recompute on false values f771aac

v0.18.0

7 March 2016

  • Released v0.18.0 1824abd
  • Auto merge of #106 - DockYard:update-ember-cli, r=poteto 075b2d5
  • Update ember-cli to 2.4.2 f277d7f

v0.17.2

5 March 2016

  • Released v0.17.2 bbf7936
  • Auto merge of #104 - DockYard:typeof-troll, r=poteto aecaab6
  • Update object check to include instance 7e807af

v0.17.1

5 March 2016

  • Auto merge of #103 - DockYard:duck-type-is-promise, r=poteto #102
  • Add test to assert that pipe chain breaks when promise rejects 3cc52ca
  • Make pipe work with PromiseProxies 08305b4
  • Released v0.17.1 9961a51

v0.17.0

5 March 2016

  • Auto merge of #99 - DockYard:promise-aware-pipe, r=poteto #85
  • Make pipe helper promise aware #85
  • Released v0.17.0 e1f599f
  • Auto merge of #100 - DockYard:allowed-failures, r=poteto cb18439
  • Allow beta failures in Travis 9007b49

v0.16.0

26 February 2016

  • Released v0.16.0 26c176b
  • Auto merge of #93 - vikram7:vr-add-classify, r=poteto 87d17d0
  • Add classify helper fe655d2

v0.15.0

26 February 2016

  • Auto merge of #92 - vikram7:vr-add-camelize, r=poteto #68
  • Add {{reject-by}} helper 577db36
  • Add {{find-by}} helper 8ec5572
  • Add camelize helper 60fa94f

v0.14.0

26 February 2016

  • Released v0.14.0 0620349
  • Auto merge of #87 - vikram7:vr-add-underscore, r=poteto d56d20c
  • add string underscore helper 6b39d8b

v0.13.0

25 February 2016

  • Auto merge of #84 - vikram7:vr-add-dasherize, r=poteto #66
  • add dasherize helper fa779a3
  • Released v0.13.0 788e390

v0.12.0

25 February 2016

  • Released v0.12.0 a222015
  • Auto merge of #83 - DockYard:update-toc, r=poteto b70ce75
  • Update TOC with missing capitalize helper b691888

v0.11.1

24 February 2016

  • Released v0.11.1 8361ad7
  • Auto merge of #81 - DockYard:tweak-append, r=poteto 5d56987
  • Remove unused methods and semicolon 70c98c3

v0.11.0

24 February 2016

  • Released v0.11.0 f5e7d1e
  • Auto merge of #80 - DockYard:array-concat, r=poteto d1ad881
  • Adds Append helper ff6c91e

v0.10.2

23 February 2016

  • Released v0.10.2 3505800
  • Auto merge of #79 - DockYard:leaky-pipes, r=poteto a27c150
  • Fix undefined leaking through pipe 8d81c7c

v0.10.1

23 February 2016

  • Released v0.10.1 633c579
  • Auto merge of #78 - DockYard:fix-pipe-helper, r=poteto 3ea3e31
  • Fix return value passing in pipe helper 72342b1

v0.10.0

23 February 2016

  • Auto merge of #76 - martndemus:subject-last, r=poteto #54
  • Auto merge of #74 - DockYard:contains-helper, r=martndemus #13
  • Implement Contains helper #13
  • Switch to subject last d78e7dd
  • adds compacy helper 4b1ab63
  • Removed all <property>: null from helpers 9c4d7a7

v0.9.0

22 February 2016

  • Auto merge of #40 - DockYard:29-shake-the-tree, r=poteto #29
  • Tree shake helpers using only or except #29
  • Released v0.9.0 9d3ea1e
  • Auto merge of #61 - DockYard:add-index-test, r=poteto c97d3c5
  • Add unit test to index 19469d9

v0.8.0

22 February 2016

  • Auto merge of #52 - martndemus:revert-inequality-helpers, r=martndemus #50
  • Auto merge of #51 - DockYard:remove-pipe-acceptance, r=poteto #12
  • Replace Pipe acceptance test with integration test #12
  • Released v0.8.0 51edc9f
  • Auto merge of #53 - martndemus:rename-addon, r=martndemus 9030511
  • Revert "Auto merge of #47 - martndemus:inequality-helpers, r=martndemus" c381e78

v0.7.0

21 February 2016

  • Auto merge of #45 - martndemus:union-intersection, r=martndemus #15 #16
  • Auto merge of #43 - martndemus:words, r=martndemus #21
  • Auto merge of #42 - martndemus:join-helper, r=martndemus #23
  • Add {{intersect}} and {{union}} helper a231aa0
  • Add {{w}} helper 1e3b363
  • Add {{join}} helper 3eea0cb

v0.6.0

20 February 2016

  • Auto merge of #37 - DockYard:31-lets-get-mathematical, r=poteto #31
  • Simple Math helpers #31
  • Auto merge of #36 - DockYard:25-readme-toc, r=poteto #25
  • Reorganize readme #25
  • Auto merge of #35 - DockYard:fix-repeat, r=poteto #34
  • Fix Repeat helper #34
  • Released v0.6.0 9aec669
  • Auto merge of #38 - DockYard:toggle-helper, r=poteto b666ca2
  • Toggle action helper 922514b

v0.5.0

19 February 2016

  • Auto merge of #24 - DockYard:range-helper, r=poteto #22
  • Add Range helper #22
  • Released v0.5.0 3944c83
  • Auto merge of #28 - rtablada:fix/readme-typo, r=poteto 2267ec3
  • Silly ending block param pipe 1d84eef

v0.4.0

19 February 2016

  • Auto merge of #27 - DockYard:repeat-helper, r=poteto #26
  • Add Repeat helper #26
  • Released v0.4.0 bb04310
  • Auto merge of #6 - martndemus:group-by-helper, r=martndemus 0644bd7
  • Add {{group-by}} helper 8543fa2

v0.3.0

19 February 2016

  • Released v0.3.0 c50c315
  • Auto merge of #7 - martndemus:compute-helper, r=martndemus 9d3daf8
  • Add {{compute}} helper 626a530

v0.2.0

18 February 2016

  • Released v0.2.0 37a3a1e
  • Auto merge of #3 - DockYard:pipe, r=poteto 752f6cb
  • Auto merge of #2 - DockYard:martndemus-patch-1, r=poteto 1153ff8

v0.1.0

18 February 2016

  • Released v0.1.0 b94f4c5
  • Auto merge of #1 - DockYard:compose, r=poteto 58d93fa
  • Initial Commit from Ember CLI v2.3.0 f4396cc