mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
parent
2a50c66df8
commit
b2f50da322
@ -369,6 +369,12 @@ module.exports = function(grunt) {
|
|||||||
{
|
{
|
||||||
src: 'CHANGELOG.md',
|
src: 'CHANGELOG.md',
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/red/about'
|
dest: 'packages/node_modules/@node-red/editor-client/public/red/about'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
cwd: 'packages/node_modules/@node-red/editor-client/src/ace/bin/',
|
||||||
|
src: '**',
|
||||||
|
expand: true,
|
||||||
|
dest: 'packages/node_modules/@node-red/editor-client/public/vendor/ace/'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
50
packages/node_modules/@node-red/editor-client/src/ace/README.md
vendored
Normal file
50
packages/node_modules/@node-red/editor-client/src/ace/README.md
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
How to build the custom ACE modes for Node-RED
|
||||||
|
----------------------------------------------
|
||||||
|
|
||||||
|
Node-RED includes custom JSONata and JavaScript modes.
|
||||||
|
|
||||||
|
|
||||||
|
## JSONata
|
||||||
|
|
||||||
|
The `ace/mode/jsonata` mode is maintained under `editor-client/src/vendor/jsonata`.
|
||||||
|
Those files are edited in place and copied into the build by Grunt.
|
||||||
|
|
||||||
|
## JavaScript
|
||||||
|
|
||||||
|
The `ace/mode/nrjavascript` mode is used exclusively by the Function node. It
|
||||||
|
inherits almost entirely from the normal JavaScript mode. The one key difference
|
||||||
|
is that it wraps the code with a Function before parsing. This is required to
|
||||||
|
avoid some false-flagged errors.
|
||||||
|
|
||||||
|
The source of the mode is under `editor-client/src/ace/mode`. If those files are
|
||||||
|
modified in anyway, they *must* be manually built to generate the files under
|
||||||
|
`editor-client/src/ace/bin` and checked in. Those files are the ones the Grunt
|
||||||
|
built copies out in the Node-RED build.
|
||||||
|
|
||||||
|
### Building the mode files
|
||||||
|
|
||||||
|
|
||||||
|
#### Setup build environment
|
||||||
|
|
||||||
|
cd /tmp/
|
||||||
|
git clone https://github.com/ajaxorg/ace.git
|
||||||
|
cd ace
|
||||||
|
npm install
|
||||||
|
|
||||||
|
#### Copy mode src files into build environment
|
||||||
|
|
||||||
|
cd <node-red-source-directory
|
||||||
|
cp packages/node_modules/@node-red/editor-client/src/ace/mode/* \
|
||||||
|
/tmp/ace/lib/ace/mode/
|
||||||
|
|
||||||
|
#### Run the build
|
||||||
|
|
||||||
|
cd /tmp/ace
|
||||||
|
node ./Makefile.dryice.js -m -nc
|
||||||
|
|
||||||
|
#### Copy the built versions back
|
||||||
|
|
||||||
|
cp build/src-min-noconflict/*-nrjavascript.js \
|
||||||
|
<node-red-source-directory>/packages/node_modules/@node-red/editor-client/src/ace/bin/
|
||||||
|
cp build/src-min-noconflict/snippets/nrjavascript.js \
|
||||||
|
<node-red-source-directory>/packages/node_modules/@node-red/editor-client/src/ace/bin/snippets/
|
9
packages/node_modules/@node-red/editor-client/src/ace/bin/mode-nrjavascript.js
vendored
Normal file
9
packages/node_modules/@node-red/editor-client/src/ace/bin/mode-nrjavascript.js
vendored
Normal file
File diff suppressed because one or more lines are too long
9
packages/node_modules/@node-red/editor-client/src/ace/bin/snippets/nrjavascript.js
vendored
Normal file
9
packages/node_modules/@node-red/editor-client/src/ace/bin/snippets/nrjavascript.js
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
ace.define("ace/snippets/nrjavascript",[],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="nrjavascript"});
|
||||||
|
(function() {
|
||||||
|
ace.require(["ace/snippets/nrjavascript"], function(m) {
|
||||||
|
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||||
|
module.exports = m;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
|
1
packages/node_modules/@node-red/editor-client/src/ace/bin/worker-nrjavascript.js
vendored
Normal file
1
packages/node_modules/@node-red/editor-client/src/ace/bin/worker-nrjavascript.js
vendored
Normal file
File diff suppressed because one or more lines are too long
49
packages/node_modules/@node-red/editor-client/src/ace/mode/nrjavascript.js
vendored
Normal file
49
packages/node_modules/@node-red/editor-client/src/ace/mode/nrjavascript.js
vendored
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/**
|
||||||
|
* Copyright JS Foundation and other contributors, http://js.foundation
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
**/
|
||||||
|
define(function(require, exports, module) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var JavaScriptMode = require("./javascript").Mode;
|
||||||
|
var WorkerClient = require("../worker/worker_client").WorkerClient;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
// Inherit everything from the standard JavaScript mode
|
||||||
|
JavaScriptMode.call(this);
|
||||||
|
};
|
||||||
|
oop.inherits(Mode, JavaScriptMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
// Insert our custom worker
|
||||||
|
this.createWorker = function(session) {
|
||||||
|
var worker = new WorkerClient(["ace"], "ace/mode/nrjavascript_worker", "NRJavaScriptWorker");
|
||||||
|
worker.attachToDocument(session.getDocument());
|
||||||
|
|
||||||
|
worker.on("annotate", function(results) {
|
||||||
|
session.setAnnotations(results.data);
|
||||||
|
});
|
||||||
|
|
||||||
|
worker.on("terminate", function() {
|
||||||
|
session.clearAnnotations();
|
||||||
|
});
|
||||||
|
|
||||||
|
return worker;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$id = "ace/mode/nrjavascript";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
189
packages/node_modules/@node-red/editor-client/src/ace/mode/nrjavascript_worker.js
vendored
Normal file
189
packages/node_modules/@node-red/editor-client/src/ace/mode/nrjavascript_worker.js
vendored
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Distributed under the BSD license:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Ajax.org B.V.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Ajax.org B.V. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
define(function(require, exports, module) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var Mirror = require("../worker/mirror").Mirror;
|
||||||
|
var lint = require("./javascript/jshint").JSHINT;
|
||||||
|
|
||||||
|
function startRegex(arr) {
|
||||||
|
return RegExp("^(" + arr.join("|") + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
var disabledWarningsRe = startRegex([
|
||||||
|
"Bad for in variable '(.+)'.",
|
||||||
|
'Missing "use strict"'
|
||||||
|
]);
|
||||||
|
var errorsRe = startRegex([
|
||||||
|
"Unexpected",
|
||||||
|
"Expected ",
|
||||||
|
"Confusing (plus|minus)",
|
||||||
|
"\\{a\\} unterminated regular expression",
|
||||||
|
"Unclosed ",
|
||||||
|
"Unmatched ",
|
||||||
|
"Unbegun comment",
|
||||||
|
"Bad invocation",
|
||||||
|
"Missing space after",
|
||||||
|
"Missing operator at"
|
||||||
|
]);
|
||||||
|
var infoRe = startRegex([
|
||||||
|
"Expected an assignment",
|
||||||
|
"Bad escapement of EOL",
|
||||||
|
"Unexpected comma",
|
||||||
|
"Unexpected space",
|
||||||
|
"Missing radix parameter.",
|
||||||
|
"A leading decimal point can",
|
||||||
|
"\\['{a}'\\] is better written in dot notation.",
|
||||||
|
"'{a}' used out of scope"
|
||||||
|
]);
|
||||||
|
|
||||||
|
var NRJavaScriptWorker = exports.NRJavaScriptWorker = function(sender) {
|
||||||
|
Mirror.call(this, sender);
|
||||||
|
this.setTimeout(500);
|
||||||
|
this.setOptions();
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(NRJavaScriptWorker, Mirror);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
this.setOptions = function(options) {
|
||||||
|
this.options = options || {
|
||||||
|
// undef: true,
|
||||||
|
// unused: true,
|
||||||
|
esnext: true,
|
||||||
|
moz: true,
|
||||||
|
devel: true,
|
||||||
|
browser: true,
|
||||||
|
node: true,
|
||||||
|
laxcomma: true,
|
||||||
|
laxbreak: true,
|
||||||
|
lastsemic: true,
|
||||||
|
onevar: false,
|
||||||
|
passfail: false,
|
||||||
|
maxerr: 100,
|
||||||
|
expr: true,
|
||||||
|
multistr: true,
|
||||||
|
globalstrict: true
|
||||||
|
};
|
||||||
|
this.doc.getValue() && this.deferredUpdate.schedule(100);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.changeOptions = function(newOptions) {
|
||||||
|
oop.mixin(this.options, newOptions);
|
||||||
|
this.doc.getValue() && this.deferredUpdate.schedule(100);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.isValidJS = function(str) {
|
||||||
|
try {
|
||||||
|
// evaluated code can only create variables in this function
|
||||||
|
eval("throw 0;" + str);
|
||||||
|
} catch(e) {
|
||||||
|
if (e === 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.onUpdate = function() {
|
||||||
|
var value = this.doc.getValue();
|
||||||
|
value = value.replace(/^#!.*\n/, "\n");
|
||||||
|
if (!value)
|
||||||
|
return this.sender.emit("annotate", []);
|
||||||
|
|
||||||
|
// [Node-RED] wrap the code in a function
|
||||||
|
value = "async function __nodered__(msg) {\n"+value+"\n}";
|
||||||
|
|
||||||
|
var errors = [];
|
||||||
|
// jshint reports many false errors
|
||||||
|
// report them as error only if code is actually invalid
|
||||||
|
var maxErrorLevel = this.isValidJS(value) ? "warning" : "error";
|
||||||
|
|
||||||
|
// var start = new Date();
|
||||||
|
lint(value, this.options, this.options.globals);
|
||||||
|
var results = lint.errors;
|
||||||
|
|
||||||
|
var errorAdded = false;
|
||||||
|
for (var i = 0; i < results.length; i++) {
|
||||||
|
var error = results[i];
|
||||||
|
if (!error)
|
||||||
|
continue;
|
||||||
|
var raw = error.raw;
|
||||||
|
var type = "warning";
|
||||||
|
|
||||||
|
if (raw == "Missing semicolon.") {
|
||||||
|
var str = error.evidence.substr(error.character);
|
||||||
|
str = str.charAt(str.search(/\S/));
|
||||||
|
if (maxErrorLevel == "error" && str && /[\w\d{(['"]/.test(str)) {
|
||||||
|
error.reason = 'Missing ";" before statement';
|
||||||
|
type = "error";
|
||||||
|
} else {
|
||||||
|
type = "info";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (disabledWarningsRe.test(raw)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (infoRe.test(raw)) {
|
||||||
|
type = "info";
|
||||||
|
}
|
||||||
|
else if (errorsRe.test(raw)) {
|
||||||
|
errorAdded = true;
|
||||||
|
type = maxErrorLevel;
|
||||||
|
}
|
||||||
|
else if (raw == "'{a}' is not defined.") {
|
||||||
|
type = "warning";
|
||||||
|
}
|
||||||
|
else if (raw == "'{a}' is defined but never used.") {
|
||||||
|
type = "info";
|
||||||
|
}
|
||||||
|
|
||||||
|
errors.push({
|
||||||
|
// [Node-RED] offset the row for the added line
|
||||||
|
row: error.line-2,
|
||||||
|
column: error.character-1,
|
||||||
|
text: error.reason,
|
||||||
|
type: type,
|
||||||
|
raw: raw
|
||||||
|
});
|
||||||
|
|
||||||
|
if (errorAdded) {
|
||||||
|
// break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// console.log("lint time: " + (new Date() - start));
|
||||||
|
|
||||||
|
this.sender.emit("annotate", errors);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(NRJavaScriptWorker.prototype);
|
||||||
|
|
||||||
|
});
|
@ -66,7 +66,7 @@ RED.editor.types._js = (function() {
|
|||||||
var dialogForm = RED.editor.buildEditForm(tray.find('.editor-tray-body'),'dialog-form',type,'editor');
|
var dialogForm = RED.editor.buildEditForm(tray.find('.editor-tray-body'),'dialog-form',type,'editor');
|
||||||
expressionEditor = RED.editor.createEditor({
|
expressionEditor = RED.editor.createEditor({
|
||||||
id: 'node-input-js',
|
id: 'node-input-js',
|
||||||
mode: 'ace/mode/javascript',
|
mode: options.mode || 'ace/mode/javascript',
|
||||||
value: value,
|
value: value,
|
||||||
globals: {
|
globals: {
|
||||||
msg:true,
|
msg:true,
|
||||||
|
@ -96,7 +96,7 @@
|
|||||||
|
|
||||||
this.editor = RED.editor.createEditor({
|
this.editor = RED.editor.createEditor({
|
||||||
id: 'node-input-func-editor',
|
id: 'node-input-func-editor',
|
||||||
mode: 'ace/mode/javascript',
|
mode: 'ace/mode/nrjavascript',
|
||||||
value: $("#node-input-func").val(),
|
value: $("#node-input-func").val(),
|
||||||
globals: {
|
globals: {
|
||||||
msg:true,
|
msg:true,
|
||||||
@ -118,7 +118,7 @@
|
|||||||
url:"functions", // where to get the data from
|
url:"functions", // where to get the data from
|
||||||
type:"function", // the type of object the library is for
|
type:"function", // the type of object the library is for
|
||||||
editor:this.editor, // the field name the main text body goes to
|
editor:this.editor, // the field name the main text body goes to
|
||||||
mode:"ace/mode/javascript",
|
mode:"ace/mode/nrjavascript",
|
||||||
fields:['name','outputs']
|
fields:['name','outputs']
|
||||||
});
|
});
|
||||||
this.editor.focus();
|
this.editor.focus();
|
||||||
@ -130,6 +130,7 @@
|
|||||||
value: value,
|
value: value,
|
||||||
width: "Infinity",
|
width: "Infinity",
|
||||||
cursor: that.editor.getCursorPosition(),
|
cursor: that.editor.getCursorPosition(),
|
||||||
|
mode: "ace/mode/nrjavascript",
|
||||||
complete: function(v,cursor) {
|
complete: function(v,cursor) {
|
||||||
that.editor.setValue(v, -1);
|
that.editor.setValue(v, -1);
|
||||||
that.editor.gotoLine(cursor.row+1,cursor.column,false);
|
that.editor.gotoLine(cursor.row+1,cursor.column,false);
|
||||||
|
Loading…
Reference in New Issue
Block a user