Skip to content
Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Build Status Ember Observer Score Code Climate Dependency Status devDependency Status Ember Version

Computed Property Macros for Ember


Version 2.0+ will only work with Ember 2.0+ Version 3.0+ is only tested in the last 2 LTS.


Just run ember install ember-cpm


Just import individual macros from ember-cpm/macros/* or all macros from ember-cpm.

// Import only one macros
import ifNull from "ember-cpm/macros/if-null";
// or alternatively import all the namespace
import EmberCPM from "ember-cpm";


To generate a new computed property macros with ember-cli

  • Run ember g macro <dasherized-macro-name>. This will generate a few files
    • ./addon/macros/dasherized-macro-name.js (the macro)
    • ./addon/tests/dummy/unit/macro/dasherized-macro-name-test.js (a test)*
    • and modify ./addon/ember-cpm.js
// import the macro
import camelizedMacroName from './macros/dasherized-macro-name.js'

var Macros = {
  // allows use via EmberCPM.Macros.camelizedMacroName
  camelizedMacroName: camelizedMacroName,

ember d macro <dasherized-macro-name> will do the reverse of these changes

Provided Macros

  • among -- returns true if the original value is among the given literals (testing using ===)
  • encodeURIComponent -- calls encodeURIComponent on the original value
  • encodeURI -- calls encodeURI on the original value
  • firstPresent -- returns the first property with a value, as determined by Ember.isPresent
  • fmt -- pass the original values into a format-string
  • htmlEscape -- escapes the original value with Handlebars.Utils.escapeExpression and wraps the result in a Handlebars.SafeString (since it's now safe)
  • ifNull -- fall back on a default value
  • promise -- wraps the original value in an already-resolved promise
  • safeString -- wraps the original value in a Handlebars.SafeString
  • join -- joins the supplied values together with a provided sepatator
  • quotient -- divides one numeric property or literal by another
  • difference -- subtracts one numeric property or literal from another
  • product -- multiplies numeric properties and literals together
  • sum -- sums numeric properties and literals together
  • conditional -- returns values based on a boolean property (good replacement for ternary operator)
  • computedPromise -- Updates computed property when supplied callback (which must return a promise) is resolved

Composable Computed Property Macros

Unlike Ember's computed property macros, the macros in this addon are composable. That means you define macros inside other macros without defining them in a separate key.

import Ember from 'ember';
import EmberCPM from 'ember-cpm';

const { Macros: { sum, difference, product } } = EmberCPM;

export default Ember.Component.extend({
  num1: 45,
  num2: 3.5,
  num3: 13.4,
  num4: -2,

  total: sum(
    sum('num1', 'num2', 'num3'),
    difference('num3', 'num2'),
    product(difference('num2', 'num1'), 'num4')