From 315a9ceba31bf2627e8c9ac30364d2ac0595b620 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 25 Jul 2018 09:27:27 +0100 Subject: [PATCH] Add RED.util.get/setObjectProperty to avoid stripping msg. --- red/runtime/util.js | 16 ++++++++++++---- test/red/runtime/util_spec.js | 21 +++++++++++++++++++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/red/runtime/util.js b/red/runtime/util.js index 86616f1c3..d5643fcd5 100644 --- a/red/runtime/util.js +++ b/red/runtime/util.js @@ -235,10 +235,13 @@ function normalisePropertyExpression(str) { } function getMessageProperty(msg,expr) { - var result = null; if (expr.indexOf('msg.')===0) { expr = expr.substring(4); } + return getObjectProperty(msg,expr); +} +function getObjectProperty(msg,expr) { + var result = null; var msgPropParts = normalisePropertyExpression(expr); var m; msgPropParts.reduce(function(obj, key) { @@ -249,12 +252,15 @@ function getMessageProperty(msg,expr) { } function setMessageProperty(msg,prop,value,createMissing) { - if (typeof createMissing === 'undefined') { - createMissing = (typeof value !== 'undefined'); - } if (prop.indexOf('msg.')===0) { prop = prop.substring(4); } + return setObjectProperty(msg,prop,value,createMissing); +} +function setObjectProperty(msg,prop,value,createMissing) { + if (typeof createMissing === 'undefined') { + createMissing = (typeof value !== 'undefined'); + } var msgPropParts = normalisePropertyExpression(prop); var depth = 0; var length = msgPropParts.length; @@ -584,6 +590,8 @@ module.exports = { generateId: generateId, getMessageProperty: getMessageProperty, setMessageProperty: setMessageProperty, + getObjectProperty: getObjectProperty, + setObjectProperty: setObjectProperty, evaluateNodeProperty: evaluateNodeProperty, normalisePropertyExpression: normalisePropertyExpression, normaliseNodeTypeName: normaliseNodeTypeName, diff --git a/test/red/runtime/util_spec.js b/test/red/runtime/util_spec.js index d8bc16934..3792b157b 100644 --- a/test/red/runtime/util_spec.js +++ b/test/red/runtime/util_spec.js @@ -141,7 +141,15 @@ describe("red/util", function() { cloned.res.should.equal(msg.res); }); }); - + describe('getObjectProperty', function() { + it('gets a property beginning with "msg."', function() { + // getMessageProperty strips off `msg.` prefixes. + // getObjectProperty does not + var obj = { msg: { a: "foo"}, a: "bar"}; + var v = util.getObjectProperty(obj,"msg.a"); + v.should.eql("foo"); + }) + }); describe('getMessageProperty', function() { it('retrieves a simple property', function() { var v = util.getMessageProperty({a:"foo"},"msg.a"); @@ -169,7 +177,16 @@ describe("red/util", function() { }); }); - + describe('setObjectProperty', function() { + it('set a property beginning with "msg."', function() { + // setMessageProperty strips off `msg.` prefixes. + // setObjectProperty does not + var obj = {}; + util.setObjectProperty(obj,"msg.a","bar"); + obj.should.have.property("msg"); + obj.msg.should.have.property("a","bar"); + }) + }); describe('setMessageProperty', function() { it('sets a property', function() { var msg = {a:"foo"};