diff --git a/_includes/creating-nodes-toc.html b/_includes/creating-nodes-toc.html index 8619bd8b..c3fbfed1 100644 --- a/_includes/creating-nodes-toc.html +++ b/_includes/creating-nodes-toc.html @@ -16,6 +16,7 @@
  • Help style guide
  • Packaging
  • Internationalisation
  • +
  • Node generator
  • diff --git a/_includes/docs-toc.html b/_includes/docs-toc.html index 35c4351f..f875a1ee 100644 --- a/_includes/docs-toc.html +++ b/_includes/docs-toc.html @@ -59,6 +59,7 @@
  • Configuration nodes
  • Packaging
  • Internationalisation
  • +
  • Node generator
  • diff --git a/docs/creating-nodes/images/library.png b/docs/creating-nodes/images/library.png new file mode 100755 index 00000000..6ee94cb3 Binary files /dev/null and b/docs/creating-nodes/images/library.png differ diff --git a/docs/creating-nodes/index.md b/docs/creating-nodes/index.md index dab6cdf2..a4bdb4b5 100644 --- a/docs/creating-nodes/index.md +++ b/docs/creating-nodes/index.md @@ -19,6 +19,7 @@ The following sections exist and are largely complete: - [Help style guide](help-style-guide) - [Packaging](packaging) - [Internationalisation](i18n) + - [Node generator](node-generator) To do: diff --git a/docs/creating-nodes/node-generator.md b/docs/creating-nodes/node-generator.md new file mode 100755 index 00000000..79c7c719 --- /dev/null +++ b/docs/creating-nodes/node-generator.md @@ -0,0 +1,552 @@ +--- +layout: docs +toc: creating-nodes-toc.html +title: Node generator +--- + +The [Node generator](https://www.npmjs.com/package/node-red-nodegen) is a tool that can automatically generate an original node by using one command. +You can use Node generator to develop a custom node based on a function node and Open API document with a minimum of effort. +This page explains how to use this approach to node development. + +The general procedure for generating a node using Node generator is as follows: + +1. Install Node generator into local PC +2. Prepare or create source file (e.g. Open API document or JavaScript code in function node) +3. Use a Node generator command to generate the custom node. +4. Add a description, test cases, and other elements to the custom node. + +Using this tool enables automatic generation of the following files that make up an original node. +For this reason, the node developer can drastically reduce the man-hours for node development. + +* Original node (the node's js file, html file, node icon file, and language files) +* Files required to package an original node (README.md, package.json, LICENSE) +* Test cases + +The latest information about the node generator can be obtained from the GitHub project for the Node generator (https://github.com/node-red/node-red-nodegen). + +The following explains the steps in developing a custom node. +Note that this procedure assumes that you are using Node-RED installed in the local environment. + +### How to use Node generator +To install Node generator to your local PC, you need to input the following "npm install" command on command prompt (Windows) or terminal (macOS/Linux). +Because the command execution needs root permission, "sudo" is required before "npm install" command on macOS or Linux environment. + + npm install -g node-red-nodegen + +The current version of Node generator supports function node and Open API document as source files. +Simply, Node generator command, node-red-nodegen converts to a node from the file which is specified in the argument of the command as follows. + + node-red-nodegen -> The command tool outputs the node from the source file + +The following documentation explains methods of creating nodes from two types of source files. + + - [How to create a node from Open API document](#how-to-create-a-node-from-open-api-document) + - [How to create a node from function node](#how-to-create-a-node-from-function-node) + +### How to create a node from Open API document +You can specify the URL or file path of Open API document as the first argument of the node-red-nodegen command. + +(1) Generate node using node-red-nodegen command + + node-red-nodegen http://petstore.swagger.io/v2/swagger.json + +Node-RED users typically import the generated node to the palette of Node-RED flow editor using the following procedures. + +(2) Change directory to the generated node's directory + + cd node-red-contrib-swagger-petstore + +(3) Prepare the symbolic link + + sudo npm link + +(4) Change current directory to Node-RED home directory (Typically, Node-RED home directory is ".node-red" under the home directory) + + cd ~/.node-red + +(5) Create a symbolic link + + npm link node-red-contrib-swagger-petstore + +(6) Start Node-RED + + node-red + +(7) Access the Node-RED flow editor (http://localhost:1880) + +-> You can see the generated node on the palette of the Node-RED flow editor. + +(8) Drag and drop the generated node to the workspace + +(9) Select a method on the node property setting + +(When the Open API document does not contain a hostname or has authentication settings, the node property will have a property to set hostname and authentication settings.) + +(10) Create flow on the Node-RED flow editor + +-> The flow which consists of inject node, the generated node and debug node are suitable for the first step. +(If the generated node uses POST method, you need to set JSON data to msg.payload of the inject node) + +(11) Run the flow + +-> In this example, After clicking the button on the inject node, you can get the received data on debug tab. + +### Command line options +If you want to customize the generated node, the following procedures and command line options will be helpful. + +#### Module name +Node generator uses "node-red-contrib-" as the default prefix of the module name. +Therefore, when the node name is "swagger-petstore", the module name becomes "node-red-contrib-swagger-petstore". +If you want to change the default module name, you can specify the module name using --module or --prefix option. + + node-red-nodegen http://petstore.swagger.io/v2/swagger.json --module node-red-node-swagger-petstore + node-red-nodegen http://petstore.swagger.io/v2/swagger.json --prefix node-red-node + +#### Node name +In the case of the node generated from Open API document, "info.title" value in Open API document is used as the generated node's name. +Node generator will replace uppercase characters and spaces with hyphens to convert appropriate name for npm module and Node-RED node. + +##### Example of Open API document +``` +{ + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server.", + "version": "1.0.0", + "title": "Swagger Petstore", <- Node generator converts this value to "swagger-petstore" and uses it as node name. + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.io", + "basePath": "/v2", + "schemes": [ + "https" + ], + ... +} +``` + +If you want to change the default name, you can set node name using --name option. +Especially, you need to specify node name using --name option when "info.title" value contains a double-byte character instead of alphabet and number because Node generator cannot create node correctly. + + node-red-nodegen http://petstore.swagger.io/v2/swagger.json --name new-node-name + +#### Version +As the default, Node generator uses "info.version" value as the module version number. + +##### Example of Open API document +``` +{ + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server.", + "version": "1.0.0", <- Node generator uses this version number as the module version number. + "title": "Swagger Petstore", + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.io", + "basePath": "/v2", + "schemes": [ + "https" + ], + ... +} +``` + +When you update the version number of the module without incrementing the version number in Open API document, you need to specify --version option. +Especially, conflict error will occur when you publish the module which has the same version number as the previously published module using "npm publish" command. +In this case, the --version option needs to be specified to update the version number of the module. + + node-red-nodegen http://petstore.swagger.io/v2/swagger.json --version 0.0.2 + +#### Keywords +--keywords is a useful option for keywords of the module in the flow library. +On the flow library website, visitors will search the module using the keywords. +For example, if you want to use "petstore" as a keyword, you can specify the word using --keywords option. +By default, Node generator uses "node-red-nodegen" as a keyword. + + node-red-nodegen http://petstore.swagger.io/v2/swagger.json --keywords petstore + +To add more than two keywords, you can also use comma-separated keywords. + + node-red-nodegen http://petstore.swagger.io/v2/swagger.json --keywords petstore,petshop + +When "--keywords node-red" is specified before publishing the generated node, your node will be registered on the flow library and you can install the node via Node-RED flow editor. + + node-red-nodegen http://petstore.swagger.io/v2/swagger.json --keywords petstore,petshop,node-red + +#### Category +On the palette of Node-RED flow editor, the generated node is in the function category as the default. +To change the category or use the product name, you can use --category option. +For example, the generated node which the following command outputs will be in the "analysis" category on the Node-RED flow editor. + + node-red-nodegen http://petstore.swagger.io/v2/swagger.json --category analysis + +#### Node icon +Node generator command supports --icon option to specify icon file for the generated node. +You can use PNG file path or [file name of stock icons](https://nodered.org/docs/creating-nodes/appearance) for the option. The icon should have white on a transparent background. + + node-red-nodegen http://petstore.swagger.io/v2/swagger.json --icon + +#### Node color +In the default, Node generator uses default node color defined in the node templates. If you need to change it, you can use the --color option of the command line. The option value should be the sequence of the hexadecimal numbers ("RRGGBB" formats) which represents node color. + + node-red-nodegen http://petstore.swagger.io/v2/swagger.json --color FFFFFF + +#### Node information in info tab +Node generator automatically generates the node information in the info tab using the following values in Open API document. + +- info.description : Node description +- paths.[path].[http method].summary : Method description +- paths.[path].[http method].operationId : Method name + +##### Example of Open API document +``` +{ + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server.", <- Node generator uses this value as the node description. + "version": "1.0.0", + "title": "Swagger Petstore", + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.io", + "basePath": "/v2", + "schemes": [ + "https" + ], + ... + "paths": { + "/pet": { + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new pet to the store", <- Node generator uses this value as the method description. + "description": "", + "operationId": "addPet", <- Node generator uses this value as the method name. + ... +} +``` + +If you want to modify node information in info tab, you can manually edit the node's HTML file at the end of the section. + + vi node-red-contrib-swagger-petstore/node.html + +```html: + +``` + +#### README +To explain the details of the node, you need to write documentation in README.md file. +The documentation will be used in the flow library website if you publish your node on the flow library. +Because the Node generator outputs the template file of README.md, you just modify it. + + vi node-red-contrib-swagger-petstore/README.md + +``` +node-red-contrib-swagger-petstore +===================== + +Node-RED node for swagger-petstore + +This is a sample server Petstore server. + +Install +------- + +Run the following command in your Node-RED home directory, typically `~/.node-red` + + npm install node-red-contrib-swagger-petstore +``` + +#### Test cases +The set of test cases is the most important to maintain the quality of the generated node in production use. +Node generator outputs the template file ("test/node_spec.js") of test cases into the generated directory. +You need to modify the following three lines, (1),(2) and (3) in the test case file. +If Open API document does not contain hostname in "info" section, you need to write hostname as (4) in each test case manually. + + vi node-red-contrib-swagger-petstore/test/node_spec.js + +```JavaScript: + it('should handle addPet()', function (done) { + var flow = [ + { id: 'n1', type: 'swagger-petstore', name: 'swagger-petstore', + method: 'addPet', + addPet_body: '', // (1) define node properties + wires: [['n3']] + }, + { id: 'n3', type: 'helper' } + ]; + helper.load(node, flow, function () { + var n3 = helper.getNode('n3'); + var n1 = helper.getNode('n1'); + n3.on('input', function (msg) { + try { + msg.should.have.property('payload', { "id": 4513 }); // (3) define output message + done(); + } catch (e) { + done(e); + } + }); + n1.receive({ payload: { "id": 4513 } }); // (2) define input message + }); + }); +``` + +In this example, the generated node sends data, "{ "id": 4513 }" to pet store REST API. +And then, REST API returns the same data, "{ "id": 4513 }". +You can run the test cases using the "npm test" command under the generated directory. + + cd node-red-contrib-swagger-petstore + npm install + npm test + +#### Message catalogs +As the default, Node generator outputs template files of English, Japanese, Chinese and German languages. +When you want to support internationalization of node properties, you need to add language messages of parameters into the files. + + vi node-red-contrib-swagger-petstore/locales/ja/node.json + +``` +{ + "SwaggerPetstore": { + "label": { + "service": "サービス", + "method": "メソッド", + "host": "ホスト", + "header": "ヘッダ", + "value": "値", + "isQuery": "クエリ" + }, + "status": { + "requesting": "要求中" + }, + "parameters": { + "addPet": "addPet", + "body": "body", + "updatePet": "updatePet", + "findPetsByStatus": "findPetsByStatus", + ... + "optionalParameters": "任意項目" + } + } +} +``` + +If your node does not support some languages, you can delete the language directory. +(For example, delete "zh-CN" directory, if you do not want to support the Chinese language in the node) + +### How to create a node from function node +After writing JavaScript code in a function node, you can export the JavaScript code as js file using "Save to Library..." menu in function node. +Because Node generator uses function node name as the generated node name, it is better to input node name before exporting the function node. +Node-RED saves the js file to the directory, "/.node-red/lib/functions/". +Therefore, you need to specify the directory and file path as the argument of the command line. + +(1) Export function node as a js file + +![Export function node](images/library.png) + +(2) Generate node using node-red-nodegen command + + node-red-nodegen ~/.node-red/lib/functions/lower-case.js + +Node-RED users typically import generated node to the palette of Node-RED flow editor using the following procedures. + +(3) Change the current directory to generated node's directory + + cd node-red-contrib-lower-case + +(4) Prepare a symbolic link + + sudo npm link + +(5) Change directory to Node-RED home directory (Typically, Node-RED home directory is ".node-red" under the home directory) + + cd ~/.node-red + +(6) Create a symbolic link + + npm link node-red-contrib-lower-case + +(7) Start Node-RED + + node-red + +(8) Access the Node-RED flow editor (http://localhost:1880) + +-> You can see the generated node on the palette of the Node-RED flow editor. + +(9) Drag and drop the generated node to the workspace + +(10) Create flow on the Node-RED flow editor + +-> The flow which consists of inject node, the generated node and debug node are suitable for the first step. + +(11) Run the flow + +-> In this example, After clicking the button on the inject node, you can get the received data on debug tab. + +### Command line options +If you want to customize the generated node, the following procedures and command line options will be helpful. + +#### Module name +Node generator uses "node-red-contrib-" as default prefix of the module name. +Therefore, module name is "node-red-contrib-lower-case" when node name is "lower-case". +If you want to change the default module name, you can specify module name using --module or --prefix option. + + node-red-nodegen ~/.node-red/lib/functions/lower-case.js --module node-red-node-lower-case + node-red-nodegen ~/.node-red/lib/functions/lower-case.js --prefix node-red-node + +#### Node name +In the case of function node, node name in function node is used as the generated node's name. +If you want to change the default name, you can set node name using --name option. + + node-red-nodegen ~/.node-red/lib/functions/lower-case.js --name new-node-name + +#### Version +As the default, the version number of the module is always "0.0.1". +When you update the version number of the module, you need to specify --version option. +Especially, conflict error will occur when you publish the module which has the same version number as the previously published module using "npm publish" command. +In this case, the --version option needs to be specified to update the version number of the module. + + node-red-nodegen ~/.node-red/lib/functions/lower-case.js --version 0.0.2 + +#### Keywords +--keywords is a useful option for keywords of the module on flow library. +On the flow library website, visitors will search the module using the keywords. +For example, if you want to use "lower-case" as a keyword, you can specify the word using --keywords option. +As the default, Node generator uses "node-red-nodegen" as a keyword. + + node-red-nodegen ~/.node-red/lib/functions/lower-case.js --keywords lower-case + +To add more than two keywords, you can also use comma-separated keywords. + + node-red-nodegen ~/.node-red/lib/functions/lower-case.js --keywords lower-case,function + +When "--keywords node-red" is specified before publishing the generated node, your node will be registered on flow library and you can install the node via Node-RED flow editor. + + node-red-nodegen ~/.node-red/lib/functions/lower-case.js --keywords lower-case,function,node-red + +#### Category +On the palette of Node-RED flow editor, the generated node is in the function category as the default. +To change the category or use product name, you can use --category option. +For example, the generated node which the following command outputs will be in the "analysis" category on Node-RED flow editor. + + node-red-nodegen ~/.node-red/lib/functions/lower-case.js --category analysis + +#### Node icon +Node generator command supports --icon option to specify icon file for the generated node. +You can use PNG file path or [file name of stock icons](https://nodered.org/docs/creating-nodes/appearance) for the option. The icon should have white on a transparent background. + + node-red-nodegen ~/.node-red/lib/functions/lower-case.js --icon + +#### Node color +In the default, Node generator uses default node color defined in the node templates. If you need to change it, you can use the --color option of the command line. The option value should be hexadecimal numbers ("RRGGBB" formats) which represent node color. + + node-red-nodegen ~/.node-red/lib/functions/lower-case.js --color FFFFFF + +#### Node information in info tab +Node generator outputs the template of node information into the node.html file. +You need to modify the template along with your node. +(Node developer will be able to use node description property to use node information in the future version of Node-RED and Node generator) + + vi node-red-contrib-lower-case/node.html + +```html: + +``` + +In the template, there are both a summary of the node and three sections. +Inputs section has properties information of inputted messages. +Outputs section has properties explanation of outputted messages. +Details section will contain additional information about the generated node. + +#### README +To explain the details of the node, you need to write documentation in README.md file. +The documentation will be used in the flow library website if you publish your node on npmjs. +Because Node generator outputs the README.md template file, you just modify it. + + vi node-red-contrib-lower-case/README.md + +``` +node-red-contrib-lower-case +===================== + +Node-RED node for lower case + +Install +------- + +Run the following command in your Node-RED home directory, typically `~/.node-red` + + npm install node-red-contrib-lower-case +``` + +#### Test cases +The set of test cases is the most important to maintain the quality of the generated node in production use. +Node generator outputs the template file of test cases into the file, "test/node_spec.js" under the generated directory. +You need to modify the following two lines, (1) and (2) in the test case file. + + vi node-red-contrib-lower-case/test/node_spec.js + +```JavaScript: + it('should have payload', function (done) { + var flow = [ + { id: "n1", type: "lower-case", name: "lower-case", wires: [["n2"]] }, + { id: "n2", type: "helper" } + ]; + helper.load(node, flow, function () { + var n2 = helper.getNode("n2"); + var n1 = helper.getNode("n1"); + n2.on("input", function (msg) { + msg.should.have.property('payload', 'abcd'); // (2) define output message + done(); + }); + n1.receive({ payload: "AbCd" }); // (1) define input message + }); + }); +``` + +In this example, the generated node converts upper case characters to lower case characters. +Therefore, the input message is "AbCd" and the output message is "abcd". +You can run the test cases using "npm test" command under the generated directory. + + cd node-red-contrib-lower-case + npm install + npm test