mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
parent
08b11addec
commit
0c7705beff
@ -110,13 +110,13 @@ module.exports = function(grunt) {
|
|||||||
"editor/js/nodes.js",
|
"editor/js/nodes.js",
|
||||||
"editor/js/history.js",
|
"editor/js/history.js",
|
||||||
"editor/js/validators.js",
|
"editor/js/validators.js",
|
||||||
|
"editor/js/ui/utils.js",
|
||||||
"editor/js/ui/common/editableList.js",
|
"editor/js/ui/common/editableList.js",
|
||||||
"editor/js/ui/common/menu.js",
|
"editor/js/ui/common/menu.js",
|
||||||
"editor/js/ui/common/popover.js",
|
"editor/js/ui/common/popover.js",
|
||||||
"editor/js/ui/common/searchBox.js",
|
"editor/js/ui/common/searchBox.js",
|
||||||
"editor/js/ui/common/tabs.js",
|
"editor/js/ui/common/tabs.js",
|
||||||
"editor/js/ui/common/typedInput.js",
|
"editor/js/ui/common/typedInput.js",
|
||||||
"editor/js/ui/utils.js",
|
|
||||||
"editor/js/ui/actions.js",
|
"editor/js/ui/actions.js",
|
||||||
"editor/js/ui/deploy.js",
|
"editor/js/ui/deploy.js",
|
||||||
"editor/js/ui/diff.js",
|
"editor/js/ui/diff.js",
|
||||||
|
@ -14,82 +14,13 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
(function($) {
|
(function($) {
|
||||||
function validateExpression(str) {
|
|
||||||
var length = str.length;
|
|
||||||
var start = 0;
|
|
||||||
var inString = false;
|
|
||||||
var inBox = false;
|
|
||||||
var quoteChar;
|
|
||||||
var v;
|
|
||||||
for (var i=0;i<length;i++) {
|
|
||||||
var c = str[i];
|
|
||||||
if (!inString) {
|
|
||||||
if (c === "'" || c === '"') {
|
|
||||||
if (!inBox) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
inString = true;
|
|
||||||
quoteChar = c;
|
|
||||||
start = i+1;
|
|
||||||
} else if (c === '.') {
|
|
||||||
if (i===0 || i===length-1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// Next char is a-z
|
|
||||||
if (!/[a-z0-9]/i.test(str[i+1])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
start = i+1;
|
|
||||||
} else if (c === '[') {
|
|
||||||
if (i === 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (i===length-1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// Next char is either a quote or a number
|
|
||||||
if (!/["'\d]/.test(str[i+1])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
start = i+1;
|
|
||||||
inBox = true;
|
|
||||||
} else if (c === ']') {
|
|
||||||
if (!inBox) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (start != i) {
|
|
||||||
v = str.substring(start,i);
|
|
||||||
if (!/^\d+$/.test(v)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
start = i+1;
|
|
||||||
inBox = false;
|
|
||||||
} else if (c === ' ') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (c === quoteChar) {
|
|
||||||
// Next char must be a ]
|
|
||||||
if (!/\]/.test(str[i+1])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
start = i+1;
|
|
||||||
inString = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if (inBox || inString) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var allOptions = {
|
var allOptions = {
|
||||||
msg: {value:"msg",label:"msg.",validate:validateExpression},
|
msg: {value:"msg",label:"msg.",validate:RED.utils.validatePropertyExpression},
|
||||||
flow: {value:"flow",label:"flow.",validate:validateExpression},
|
flow: {value:"flow",label:"flow.",validate:RED.utils.validatePropertyExpression},
|
||||||
global: {value:"global",label:"global.",validate:validateExpression},
|
global: {value:"global",label:"global.",validate:RED.utils.validatePropertyExpression},
|
||||||
str: {value:"str",label:"string",icon:"red/images/typedInput/az.png"},
|
str: {value:"str",label:"string",icon:"red/images/typedInput/az.png"},
|
||||||
num: {value:"num",label:"number",icon:"red/images/typedInput/09.png",validate:/^[+-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$/},
|
num: {value:"num",label:"number",icon:"red/images/typedInput/09.png",validate:/^[+-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$/},
|
||||||
bool: {value:"bool",label:"boolean",icon:"red/images/typedInput/bool.png",options:["true","false"]},
|
bool: {value:"bool",label:"boolean",icon:"red/images/typedInput/bool.png",options:["true","false"]},
|
||||||
|
@ -279,7 +279,88 @@ RED.utils = (function() {
|
|||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function validatePropertyExpression(str) {
|
||||||
|
// This must be kept in sync with normalisePropertyExpression
|
||||||
|
// in red/runtime/util.js
|
||||||
|
|
||||||
|
var length = str.length;
|
||||||
|
var start = 0;
|
||||||
|
var inString = false;
|
||||||
|
var inBox = false;
|
||||||
|
var quoteChar;
|
||||||
|
var v;
|
||||||
|
for (var i=0;i<length;i++) {
|
||||||
|
var c = str[i];
|
||||||
|
if (!inString) {
|
||||||
|
if (c === "'" || c === '"') {
|
||||||
|
if (i != start) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
inString = true;
|
||||||
|
quoteChar = c;
|
||||||
|
start = i+1;
|
||||||
|
} else if (c === '.') {
|
||||||
|
if (i===0 || i===length-1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Next char is a-z
|
||||||
|
if (!/[a-z0-9]/i.test(str[i+1])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
start = i+1;
|
||||||
|
} else if (c === '[') {
|
||||||
|
if (i === 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (i===length-1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Next char is either a quote or a number
|
||||||
|
if (!/["'\d]/.test(str[i+1])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
start = i+1;
|
||||||
|
inBox = true;
|
||||||
|
} else if (c === ']') {
|
||||||
|
if (!inBox) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (start != i) {
|
||||||
|
v = str.substring(start,i);
|
||||||
|
if (!/^\d+$/.test(v)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
start = i+1;
|
||||||
|
inBox = false;
|
||||||
|
} else if (c === ' ') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (c === quoteChar) {
|
||||||
|
if (i-start === 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Next char must be a ]
|
||||||
|
if (inBox && !/\]/.test(str[i+1])) {
|
||||||
|
return false;
|
||||||
|
} else if (!inBox && i+1!==length && !/[\[\.]/.test(str[i+1])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
start = i+1;
|
||||||
|
inString = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (inBox || inString) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
createObjectElement: buildMessageElement,
|
createObjectElement: buildMessageElement,
|
||||||
|
validatePropertyExpression: validatePropertyExpression
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
@ -185,7 +185,7 @@
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (ptype === 'flow' || ptype === 'global' ) {
|
} else if (ptype === 'flow' || ptype === 'global' ) {
|
||||||
return /^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]+)*/i.test(v);
|
return RED.utils.validatePropertyExpression(v);
|
||||||
} else if (ptype === 'num') {
|
} else if (ptype === 'num') {
|
||||||
return /^[+-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$/.test(v);
|
return /^[+-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$/.test(v);
|
||||||
}
|
}
|
||||||
|
@ -129,6 +129,9 @@ function compareObjects(obj1,obj2) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function normalisePropertyExpression(str) {
|
function normalisePropertyExpression(str) {
|
||||||
|
// This must be kept in sync with validatePropertyExpression
|
||||||
|
// in editor/js/ui/utils.js
|
||||||
|
|
||||||
var length = str.length;
|
var length = str.length;
|
||||||
var parts = [];
|
var parts = [];
|
||||||
var start = 0;
|
var start = 0;
|
||||||
@ -140,7 +143,7 @@ function normalisePropertyExpression(str) {
|
|||||||
var c = str[i];
|
var c = str[i];
|
||||||
if (!inString) {
|
if (!inString) {
|
||||||
if (c === "'" || c === '"') {
|
if (c === "'" || c === '"') {
|
||||||
if (!inBox) {
|
if (i != start) {
|
||||||
throw new Error("Invalid property expression: unexpected "+c+" at position "+i);
|
throw new Error("Invalid property expression: unexpected "+c+" at position "+i);
|
||||||
}
|
}
|
||||||
inString = true;
|
inString = true;
|
||||||
@ -201,10 +204,15 @@ function normalisePropertyExpression(str) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (c === quoteChar) {
|
if (c === quoteChar) {
|
||||||
|
if (i-start === 0) {
|
||||||
|
throw new Error("Invalid property expression: zero-length string at position "+start);
|
||||||
|
}
|
||||||
parts.push(str.substring(start,i));
|
parts.push(str.substring(start,i));
|
||||||
// Next char must be a ]
|
// If inBox, next char must be a ]. Otherwise it may be [ or .
|
||||||
if (!/\]/.test(str[i+1])) {
|
if (inBox && !/\]/.test(str[i+1])) {
|
||||||
throw new Error("Invalid property expression: unexpected array expression at position "+start);
|
throw new Error("Invalid property expression: unexpected array expression at position "+start);
|
||||||
|
} else if (!inBox && i+1!==length && !/[\[\.]/.test(str[i+1])) {
|
||||||
|
throw new Error("Invalid property expression: unexpected "+str[i+1]+" expression at position "+(i+1));
|
||||||
}
|
}
|
||||||
start = i+1;
|
start = i+1;
|
||||||
inString = false;
|
inString = false;
|
||||||
|
@ -332,6 +332,10 @@ describe("red/util", function() {
|
|||||||
it("pass a.0.c",function() { testABC("a.0.c",['a',0,'c']); })
|
it("pass a.0.c",function() { testABC("a.0.c",['a',0,'c']); })
|
||||||
it("pass a['a.b[0]'].c",function() { testABC("a['a.b[0]'].c",['a','a.b[0]','c']); })
|
it("pass a['a.b[0]'].c",function() { testABC("a['a.b[0]'].c",['a','a.b[0]','c']); })
|
||||||
it("pass a[0][0][0]",function() { testABC("a[0][0][0]",['a',0,0,0]); })
|
it("pass a[0][0][0]",function() { testABC("a[0][0][0]",['a',0,0,0]); })
|
||||||
|
it("pass '1.2.3.4'",function() { testABC("'1.2.3.4'",['1.2.3.4']); })
|
||||||
|
it("pass 'a.b'[1]",function() { testABC("'a.b'[1]",['a.b',1]); })
|
||||||
|
it("pass 'a.b'.c",function() { testABC("'a.b'.c",['a.b','c']); })
|
||||||
|
|
||||||
|
|
||||||
it("fail a'b'.c",function() { testInvalid("a'b'.c"); })
|
it("fail a'b'.c",function() { testInvalid("a'b'.c"); })
|
||||||
it("fail a['b'.c",function() { testInvalid("a['b'.c"); })
|
it("fail a['b'.c",function() { testInvalid("a['b'.c"); })
|
||||||
@ -350,5 +354,8 @@ describe("red/util", function() {
|
|||||||
it("fail a. b",function() { testInvalid("a. b"); })
|
it("fail a. b",function() { testInvalid("a. b"); })
|
||||||
it("fail a.b",function() { testInvalid(" a.b"); })
|
it("fail a.b",function() { testInvalid(" a.b"); })
|
||||||
it("fail a[0].[1]",function() { testInvalid("a[0].[1]"); })
|
it("fail a[0].[1]",function() { testInvalid("a[0].[1]"); })
|
||||||
|
it("fail a['']",function() { testInvalid("a['']"); })
|
||||||
|
it("fail 'a.b'c",function() { testInvalid("'a.b'c"); })
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user