mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	| @@ -369,6 +369,12 @@ module.exports = function(grunt) { | ||||
|                     { | ||||
|                         src: 'CHANGELOG.md', | ||||
|                         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'); | ||||
|                     expressionEditor = RED.editor.createEditor({ | ||||
|                         id: 'node-input-js', | ||||
|                         mode: 'ace/mode/javascript', | ||||
|                         mode: options.mode || 'ace/mode/javascript', | ||||
|                         value: value, | ||||
|                         globals: { | ||||
|                             msg:true, | ||||
|   | ||||
| @@ -96,7 +96,7 @@ | ||||
|  | ||||
|             this.editor = RED.editor.createEditor({ | ||||
|                 id: 'node-input-func-editor', | ||||
|                 mode: 'ace/mode/javascript', | ||||
|                 mode: 'ace/mode/nrjavascript', | ||||
|                 value: $("#node-input-func").val(), | ||||
|                 globals: { | ||||
|                     msg:true, | ||||
| @@ -118,7 +118,7 @@ | ||||
|                 url:"functions", // where to get the data from | ||||
|                 type:"function", // the type of object the library is for | ||||
|                 editor:this.editor, // the field name the main text body goes to | ||||
|                 mode:"ace/mode/javascript", | ||||
|                 mode:"ace/mode/nrjavascript", | ||||
|                 fields:['name','outputs'] | ||||
|             }); | ||||
|             this.editor.focus(); | ||||
| @@ -130,6 +130,7 @@ | ||||
|                     value: value, | ||||
|                     width: "Infinity", | ||||
|                     cursor: that.editor.getCursorPosition(), | ||||
|                     mode: "ace/mode/nrjavascript", | ||||
|                     complete: function(v,cursor) { | ||||
|                         that.editor.setValue(v, -1); | ||||
|                         that.editor.gotoLine(cursor.row+1,cursor.column,false); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user