From 2b557dce4cc30706f87d32b08c75da000d4dde2e Mon Sep 17 00:00:00 2001 From: bekzod Date: Wed, 15 Nov 2017 01:08:47 +0500 Subject: [PATCH] [BUGFIX beta] assert for passing brace expanding deps to `sum/max..` --- packages/ember-metal/lib/expand_properties.js | 2 +- .../lib/computed/reduce_computed_macros.js | 40 ++++++++++++++----- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/packages/ember-metal/lib/expand_properties.js b/packages/ember-metal/lib/expand_properties.js index 5f3ceeaefe9..d44fc62dd0e 100644 --- a/packages/ember-metal/lib/expand_properties.js +++ b/packages/ember-metal/lib/expand_properties.js @@ -4,7 +4,7 @@ import { assert } from 'ember-debug'; @module @ember/object */ -var END_WITH_EACH_REGEX = /\.@each$/; +const END_WITH_EACH_REGEX = /\.@each$/; /** Expands `pattern`, invoking `callback` for each expansion. diff --git a/packages/ember-runtime/lib/computed/reduce_computed_macros.js b/packages/ember-runtime/lib/computed/reduce_computed_macros.js index ab3503fd181..20bd4f41ca9 100644 --- a/packages/ember-runtime/lib/computed/reduce_computed_macros.js +++ b/packages/ember-runtime/lib/computed/reduce_computed_macros.js @@ -17,7 +17,12 @@ import compare from '../compare'; import { isArray } from '../utils'; import { A as emberA } from '../system/native_array'; -function reduceMacro(dependentKey, callback, initialValue) { +function reduceMacro(dependentKey, callback, initialValue, name) { + assert( + `Dependent key passed to Ember.computed.${name}() shouldn't contain brace expanding pattern.`, + !/[\[\]\{\}]/g.test(dependentKey) + ); + let cp = new ComputedProperty(function() { let arr = get(this, dependentKey); if (arr === null || typeof arr !== 'object') { return initialValue; } @@ -51,7 +56,11 @@ function arrayMacro(dependentKey, callback) { return cp; } -function multiArrayMacro(_dependentKeys, callback) { +function multiArrayMacro(_dependentKeys, callback, name) { + assert( + `Dependent keys passed to Ember.computed.${name}() shouldn't contain brace expanding pattern.`, + _dependentKeys.every((dependentKey)=> !/[\[\]\{\}]/g.test(dependentKey)) + ); let dependentKeys = _dependentKeys.map(key => `${key}.[]`); let cp = new ComputedProperty(function() { @@ -74,7 +83,7 @@ function multiArrayMacro(_dependentKeys, callback) { @public */ export function sum(dependentKey) { - return reduceMacro(dependentKey, (sum, item) => sum + item, 0); + return reduceMacro(dependentKey, (sum, item) => sum + item, 0, 'sum'); } /** @@ -120,7 +129,7 @@ export function sum(dependentKey) { @public */ export function max(dependentKey) { - return reduceMacro(dependentKey, (max, item) => Math.max(max, item), -Infinity); + return reduceMacro(dependentKey, (max, item) => Math.max(max, item), -Infinity, 'max'); } /** @@ -166,7 +175,7 @@ export function max(dependentKey) { @public */ export function min(dependentKey) { - return reduceMacro(dependentKey, (min, item) => Math.min(min, item), Infinity); + return reduceMacro(dependentKey, (min, item) => Math.min(min, item), Infinity, 'min'); } /** @@ -247,6 +256,10 @@ export function mapBy(dependentKey, propertyKey) { 'perhaps you meant to use "map"', typeof propertyKey === 'string' ); + assert( + `Dependent key passed to Ember.computed.mapBy() shouldn't contain brace expanding pattern.`, + !/[\[\]\{\}]/g.test(dependentKey) + ); return map(`${dependentKey}.@each.${propertyKey}`, item => get(item, propertyKey)); } @@ -346,8 +359,12 @@ export function filter(dependentKey, callback) { @public */ export function filterBy(dependentKey, propertyKey, value) { - let callback; + assert( + `Dependent key passed to Ember.computed.filterBy() shouldn't contain brace expanding pattern.`, + !/[\[\]\{\}]/g.test(dependentKey) + ); + let callback; if (arguments.length === 2) { callback = (item) => get(item, propertyKey); } else { @@ -404,7 +421,7 @@ export function uniq(...args) { }); return uniq; - }); + }, 'uniq'); } /** @@ -543,8 +560,7 @@ export function intersect(...args) { } return true; - }); - + }, 'intersect'); return emberA(results); }); @@ -588,6 +604,10 @@ export function setDiff(setAProperty, setBProperty) { assert('Ember.computed.setDiff requires exactly two dependent arrays.', arguments.length === 2 ); + assert( + `Dependent keys passed to Ember.computed.setDiff() shouldn't contain brace expanding pattern.`, + !/[\[\]\{\}]/g.test(setAProperty) && !/[\[\]\{\}]/g.test(setBProperty) + ); let cp = new ComputedProperty(function() { let setA = this.get(setAProperty); @@ -646,7 +666,7 @@ export function collect(...dependentKeys) { } } return res; - }); + }, 'collect'); } /**