mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Compare commits
	
		
			167 Commits
		
	
	
		
			fix-auto-c
			...
			4133-mqtt-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | a790136164 | ||
|  | 32a49a1ef1 | ||
|  | 4b88775183 | ||
|  | 29db82625f | ||
|  | 2b6c9e3439 | ||
|  | 9ea4853c89 | ||
|  | 3b5e21761b | ||
|  | 2d76bf29cf | ||
|  | c21f7abe4e | ||
|  | 8c191263c0 | ||
|  | 2679ff277c | ||
|  | 9e3f148273 | ||
|  | 7e9042e9f7 | ||
|  | 67c5a248ad | ||
|  | e8ddee24a9 | ||
|  | be4eab65f6 | ||
|  | c0650cc0f5 | ||
|  | 02c7d014cb | ||
|  | 67dd7e30fa | ||
|  | e9a08af73b | ||
|  | 08b1ef2766 | ||
|  | 667d8673d4 | ||
|  | d44ea9d558 | ||
|  | 86dfe86813 | ||
|  | 246409970d | ||
|  | 841f1849c8 | ||
|  | 00e7e4d43c | ||
|  | ee43a845aa | ||
|  | a7cc66af93 | ||
|  | f8701cfed0 | ||
|  | 6b205bf303 | ||
|  | 6fbcec8b98 | ||
|  | c30e57c31d | ||
|  | df3dc36874 | ||
|  | 7b71d8d212 | ||
|  | 2eaae4b83f | ||
|  | 3c66af9506 | ||
|  | e5d579c1bb | ||
|  | ee811ca89b | ||
|  | 8e4933041d | ||
|  | 1f3559e14f | ||
|  | f1fa1bbe4e | ||
|  | 5eb46c570d | ||
|  | 24178beafc | ||
|  | e30df544db | ||
|  | 6044871438 | ||
|  | e612bb6a38 | ||
|  | 81ea67d6da | ||
|  | 06e35baeaa | ||
|  | c9d72d7a1d | ||
|  | 62e9572070 | ||
|  | fea68c8acc | ||
|  | 929f0e90ac | ||
|  | 81331e68d2 | ||
|  | 4fda59a585 | ||
|  | ede3ac4282 | ||
|  | 16f8b78b39 | ||
|  | 892d21fb77 | ||
|  | adfc5b3e98 | ||
|  | f3d7016ab2 | ||
|  | 8382665bbb | ||
|  | e799cfc16a | ||
|  | 055d0081e1 | ||
|  | 1824108d09 | ||
|  | 149e8ce9b0 | ||
|  | f4661eec75 | ||
|  | 0f7a1a42e4 | ||
|  | 5bda221f9d | ||
|  | fd42becbdc | ||
|  | 7dca148349 | ||
|  | ffff8aeb91 | ||
|  | ae92ea9476 | ||
|  | c7017ee84b | ||
|  | 0346294c59 | ||
|  | 8d240ca797 | ||
|  | 7dbbafec1b | ||
|  | c49330f9d1 | ||
|  | 10324d8260 | ||
|  | 8f27dae7ea | ||
|  | 7c306a8430 | ||
|  | 74794fea09 | ||
|  | 1efd1a52a7 | ||
|  | 4d202a7a37 | ||
|  | e0d71abdc6 | ||
|  | 550eb6ee2f | ||
|  | f737162697 | ||
|  | ce57ba80eb | ||
|  | b3ce0c0079 | ||
|  | 4adc6b269c | ||
|  | 920b0178ec | ||
|  | 7870830367 | ||
|  | 4c1d7ad2d2 | ||
|  | 661b07c856 | ||
|  | 5670bd8265 | ||
|  | 156c3984a7 | ||
|  | f91af2153a | ||
|  | 805f8a5ee7 | ||
|  | 113d42ef35 | ||
|  | c18018f017 | ||
|  | e804addf0a | ||
|  | 4bb2b91ee6 | ||
|  | 5bb66ed7d4 | ||
|  | 95a7980ada | ||
|  | 281e9d1357 | ||
|  | 14e74afb07 | ||
|  | 742f05f59d | ||
|  | 79db4f8aa1 | ||
|  | c4e216f839 | ||
|  | 2a49e7c8ef | ||
|  | 02af01d2ca | ||
|  | ee4af4c7bf | ||
|  | 3d565e74a5 | ||
|  | 3cb84222f8 | ||
|  | 1b013bb73b | ||
|  | fd54e625d5 | ||
|  | 77f6412d3b | ||
|  | c81cd5450f | ||
|  | 0b663abe50 | ||
|  | 14c362d4ba | ||
|  | fce43b4e1d | ||
|  | 1d547500e8 | ||
|  | 94690fad7a | ||
|  | d693af9615 | ||
|  | 8b398f49c0 | ||
|  | 902ce68164 | ||
|  | cd0474ce7b | ||
|  | 946def022f | ||
|  | c62a101635 | ||
|  | 69a575097d | ||
|  | b40551a8fa | ||
|  | 5b27bcd781 | ||
|  | 75725a38df | ||
|  | 24b055b1b8 | ||
|  | 32999ffa84 | ||
|  | f06c53f1f1 | ||
|  | a9eec28360 | ||
|  | 5cda972872 | ||
|  | 087946876b | ||
|  | 318f0f1b7e | ||
|  | f4d7b71984 | ||
|  | 6d1a12af4b | ||
|  | a40e5dbcd4 | ||
|  | 7c79ca7878 | ||
|  | 93c1600980 | ||
|  | c3d1e6181f | ||
|  | 87e7f3a61c | ||
|  | e724f216bf | ||
|  | e6b379358a | ||
|  | b0abba15a6 | ||
|  | 81b4874a7c | ||
|  | f11b9c1e18 | ||
|  | e15ecc00ce | ||
|  | 3e4c45ac6a | ||
|  | 4115c13a65 | ||
|  | f872e2ab80 | ||
|  | a81b1aa0cb | ||
|  | efc0f1ab91 | ||
|  | ce31edc803 | ||
|  | 199caccbc3 | ||
|  | f060309002 | ||
|  | fc3d86e6ff | ||
|  | 7507a7b459 | ||
|  | d657817211 | ||
|  | 954649007c | ||
|  | 7bd7c99dd4 | ||
|  | 6a19d8246c | ||
|  | d6bb3a558f | 
							
								
								
									
										3
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -5,6 +5,9 @@ on: | ||||
|   release: | ||||
|     types: [published] | ||||
|  | ||||
| permissions: | ||||
|   contents: read | ||||
|  | ||||
| jobs: | ||||
|   generate: | ||||
|     name: 'Update node-red-docker image' | ||||
|   | ||||
							
								
								
									
										20
									
								
								.github/workflows/tests.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/tests.yml
									
									
									
									
										vendored
									
									
								
							| @@ -6,16 +6,22 @@ on: | ||||
|   pull_request: | ||||
|     branches: [ master, dev ] | ||||
|  | ||||
| permissions: | ||||
|   contents: read | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|     permissions: | ||||
|       checks: write  # for coverallsapp/github-action to create new checks | ||||
|       contents: read  # for actions/checkout to fetch code | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy: | ||||
|       matrix: | ||||
|         node-version: [14, 16] | ||||
|     steps: | ||||
|     - uses: actions/checkout@v2 | ||||
|     - uses: actions/checkout@v3 | ||||
|     - name: Use Node.js ${{ matrix.node-version }} | ||||
|       uses: actions/setup-node@v2 | ||||
|       uses: actions/setup-node@v3 | ||||
|       with: | ||||
|         node-version: ${{ matrix.node-version }} | ||||
|     - name: Install Dependencies | ||||
| @@ -23,8 +29,8 @@ jobs: | ||||
|     - name: Run tests | ||||
|       run: | | ||||
|         npm run test | ||||
|     - name: Publish to coveralls.io | ||||
|       if: ${{ matrix.node-version == 14 }} | ||||
|       uses: coverallsapp/github-action@v1.1.2 | ||||
|       with: | ||||
|         github-token: ${{ github.token }} | ||||
|     # - name: Publish to coveralls.io | ||||
|     #   if: ${{ matrix.node-version == 14 }} | ||||
|     #   uses: coverallsapp/github-action@v1.1.2 | ||||
|     #   with: | ||||
|     #     github-token: ${{ github.token }} | ||||
|   | ||||
| @@ -2,8 +2,7 @@ | ||||
|  | ||||
| http://nodered.org | ||||
|  | ||||
| [](https://travis-ci.org/node-red/node-red) | ||||
| [](https://coveralls.io/r/node-red/node-red?branch=master) | ||||
| [](https://github.com/node-red/node-red/actions?query=branch%3Amaster) | ||||
|  | ||||
| Low-code programming for event-driven applications. | ||||
|  | ||||
|   | ||||
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/de/editor.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/de/editor.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/de/infotips.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/de/infotips.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/de/jsonata.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/de/jsonata.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										3
									
								
								packages/node_modules/@node-red/editor-client/locales/en-US/editor.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										3
									
								
								packages/node_modules/@node-red/editor-client/locales/en-US/editor.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -491,6 +491,7 @@ | ||||
|         "unassigned": "Unassigned", | ||||
|         "global": "global", | ||||
|         "workspace": "workspace", | ||||
|         "editor": "edit dialog", | ||||
|         "selectAll": "Select all", | ||||
|         "selectNone": "Select none", | ||||
|         "selectAllConnected": "Select connected", | ||||
| @@ -683,6 +684,8 @@ | ||||
|             "empty": "empty", | ||||
|             "globalConfig": "Global Configuration Nodes", | ||||
|             "triggerAction": "Trigger action", | ||||
|             "showFlow": "Show", | ||||
|             "hideFlow": "Hide", | ||||
|             "find": "Find in workspace" | ||||
|         }, | ||||
|         "help": { | ||||
|   | ||||
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/en-US/infotips.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/en-US/infotips.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -491,6 +491,7 @@ | ||||
|         "unassigned": "未割当", | ||||
|         "global": "グローバル", | ||||
|         "workspace": "ワークスペース", | ||||
|         "editor": "編集ダイアログ", | ||||
|         "selectAll": "全てのノードを選択", | ||||
|         "selectNone": "選択を外す", | ||||
|         "selectAllConnected": "接続されたノードを選択", | ||||
| @@ -683,6 +684,8 @@ | ||||
|             "empty": "空", | ||||
|             "globalConfig": "グローバル設定ノード", | ||||
|             "triggerAction": "アクションを実行", | ||||
|             "showFlow": "表示", | ||||
|             "hideFlow": "非表示", | ||||
|             "find": "ワークスペース内を検索" | ||||
|         }, | ||||
|         "help": { | ||||
| @@ -935,11 +938,11 @@ | ||||
|         "errors": { | ||||
|             "invalid-expr": "不正なJSONata式:\n  __message__", | ||||
|             "invalid-msg": "不正なJSONメッセージ例:\n  __message__", | ||||
|             "context-unsupported": "$flowContext や $globalContextの\nコンテキスト機能をテストできません", | ||||
|             "context-unsupported": "$flowContext や $globalContextの\nコンテキスト関数をテストできません", | ||||
|             "env-unsupported": "$env関数はテストできません", | ||||
|             "moment-unsupported": "$moment関数はテストできません", | ||||
|             "clone-unsupported": "$clone関数はテストできません", | ||||
|             "eval": "表現評価エラー:\n  __message__" | ||||
|             "eval": "式評価エラー:\n  __message__" | ||||
|         } | ||||
|     }, | ||||
|     "monaco": { | ||||
|   | ||||
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ko/editor.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ko/editor.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ko/infotips.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ko/infotips.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ko/jsonata.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ko/jsonata.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ru/editor.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ru/editor.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ru/infotips.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ru/infotips.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ru/jsonata.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/locales/ru/jsonata.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -1965,7 +1965,7 @@ RED.nodes = (function() { | ||||
|                         } | ||||
|                     } | ||||
|                 } else { | ||||
|                     const keepNodesCurrentZ = reimport && n.z && RED.workspaces.contains(n.z) | ||||
|                     const keepNodesCurrentZ = reimport && n.z && (RED.workspaces.contains(n.z) || RED.nodes.subflow(n.z)) | ||||
|                     if (!keepNodesCurrentZ && n.z && !workspace_map[n.z] && !subflow_map[n.z]) { | ||||
|                         n.z = activeWorkspace; | ||||
|                     } | ||||
| @@ -2067,7 +2067,7 @@ RED.nodes = (function() { | ||||
|                         node.id = getID(); | ||||
|                     } else { | ||||
|                         node.id = n.id; | ||||
|                         const keepNodesCurrentZ = reimport && node.z && RED.workspaces.contains(node.z) | ||||
|                         const keepNodesCurrentZ = reimport && node.z && (RED.workspaces.contains(node.z) || RED.nodes.subflow(node.z)) | ||||
|                         if (!keepNodesCurrentZ && (node.z == null || (!workspace_map[node.z] && !subflow_map[node.z]))) { | ||||
|                             if (createMissingWorkspace) { | ||||
|                                 if (missingWorkspace === null) { | ||||
| @@ -2095,16 +2095,27 @@ RED.nodes = (function() { | ||||
|                     } else if (n.type.substring(0,7) === "subflow") { | ||||
|                         var parentId = n.type.split(":")[1]; | ||||
|                         var subflow = subflow_denylist[parentId]||subflow_map[parentId]||getSubflow(parentId); | ||||
|                         if (createNewIds || options.importMap[n.id] === "copy") { | ||||
|                             parentId = subflow.id; | ||||
|                             node.type = "subflow:"+parentId; | ||||
|                             node._def = registry.getNodeType(node.type); | ||||
|                             delete node.i; | ||||
|                         if (!subflow){ | ||||
|                             node._def = { | ||||
|                                 color:"#fee", | ||||
|                                 defaults: {}, | ||||
|                                 label: "unknown: "+n.type, | ||||
|                                 labelStyle: "red-ui-flow-node-label-italic", | ||||
|                                 outputs: n.outputs|| (n.wires && n.wires.length) || 0, | ||||
|                                 set: registry.getNodeSet("node-red/unknown") | ||||
|                             } | ||||
|                         } else { | ||||
|                             if (createNewIds || options.importMap[n.id] === "copy") { | ||||
|                                 parentId = subflow.id; | ||||
|                                 node.type = "subflow:"+parentId; | ||||
|                                 node._def = registry.getNodeType(node.type); | ||||
|                                 delete node.i; | ||||
|                             } | ||||
|                             node.name = n.name; | ||||
|                             node.outputs = subflow.out.length; | ||||
|                             node.inputs = subflow.in.length; | ||||
|                             node.env = n.env; | ||||
|                         } | ||||
|                         node.name = n.name; | ||||
|                         node.outputs = subflow.out.length; | ||||
|                         node.inputs = subflow.in.length; | ||||
|                         node.env = n.env; | ||||
|                     } else if (n.type === 'junction') { | ||||
|                          node._def = {defaults:{}} | ||||
|                          node._config.x = node.x | ||||
| @@ -2740,6 +2751,7 @@ RED.nodes = (function() { | ||||
|                     } | ||||
|                 }); | ||||
|  | ||||
|                 const nodeGroupMap = {} | ||||
|                 var replaceNodeIds = Object.keys(replaceNodes); | ||||
|                 if (replaceNodeIds.length > 0) { | ||||
|                     var reimportList = []; | ||||
| @@ -2750,6 +2762,12 @@ RED.nodes = (function() { | ||||
|                         } else { | ||||
|                             allNodes.removeNode(n); | ||||
|                         } | ||||
|                         if (n.g) { | ||||
|                             // reimporting a node *without* including its group object | ||||
|                             // will cause the g property to be cleared. Cache it | ||||
|                             // here so we can restore it | ||||
|                             nodeGroupMap[n.id] = n.g | ||||
|                         } | ||||
|                         reimportList.push(convertNode(n)); | ||||
|                         RED.events.emit('nodes:remove',n); | ||||
|                     }); | ||||
| @@ -2771,6 +2789,18 @@ RED.nodes = (function() { | ||||
|                     var newNodeMap = {}; | ||||
|                     result.nodes.forEach(function(n) { | ||||
|                         newNodeMap[n.id] = n; | ||||
|                         if (nodeGroupMap[n.id]) { | ||||
|                             // This node is in a group - need to substitute the | ||||
|                             // node reference inside the group | ||||
|                             n.g = nodeGroupMap[n.id] | ||||
|                             const group = RED.nodes.group(n.g) | ||||
|                             if (group) { | ||||
|                                 var index = group.nodes.findIndex(gn => gn.id === n.id) | ||||
|                                 if (index > -1) { | ||||
|                                     group.nodes[index] = n | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     }); | ||||
|                     RED.nodes.eachLink(function(l) { | ||||
|                         if (newNodeMap.hasOwnProperty(l.source.id)) { | ||||
|   | ||||
| @@ -321,6 +321,8 @@ var RED = (function() { | ||||
|                         loader.end() | ||||
|                         RED.notify($("<p>").text(message)); | ||||
|                         RED.sidebar.info.refresh() | ||||
|                         RED.menu.setDisabled('menu-item-projects-open',false); | ||||
|                         RED.menu.setDisabled('menu-item-projects-settings',false); | ||||
|                     }); | ||||
|                 }); | ||||
|                 return; | ||||
|   | ||||
| @@ -47,7 +47,7 @@ RED.actionList = (function() { | ||||
|         var searchDiv = $("<div>",{class:"red-ui-search-container"}).appendTo(dialog); | ||||
|         searchInput = $('<input type="text" data-i18n="[placeholder]keyboard.filterActions">').appendTo(searchDiv).searchBox({ | ||||
|             change: function() { | ||||
|                 filterTerm = $(this).val().trim(); | ||||
|                 filterTerm = $(this).val().trim().toLowerCase(); | ||||
|                 filterTerms = filterTerm.split(" "); | ||||
|                 searchResults.editableList('filter'); | ||||
|                 searchResults.find("li.selected").removeClass("selected"); | ||||
|   | ||||
| @@ -37,13 +37,13 @@ RED.clipboard = (function() { | ||||
|             // IE11 workaround | ||||
|             // IE does not support data uri scheme for downloading data | ||||
|             var blob = new Blob([data], { | ||||
|                 type: "data:text/plain;charset=utf-8" | ||||
|                 type: "data:application/json;charset=utf-8" | ||||
|             }); | ||||
|             navigator.msSaveBlob(blob, file); | ||||
|         } | ||||
|         else { | ||||
|             var element = document.createElement('a'); | ||||
|             element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(data)); | ||||
|             element.setAttribute('href', 'data:application/json;charset=utf-8,' + encodeURIComponent(data)); | ||||
|             element.setAttribute('download', file); | ||||
|             element.style.display = 'none'; | ||||
|             document.body.appendChild(element); | ||||
|   | ||||
| @@ -45,11 +45,13 @@ RED.editor = (function() { | ||||
|         var hasChanged; | ||||
|         if (node.type.indexOf("subflow:")===0) { | ||||
|             subflow = RED.nodes.subflow(node.type.substring(8)); | ||||
|             isValid = subflow.valid; | ||||
|             hasChanged = subflow.changed; | ||||
|             if (isValid === undefined) { | ||||
|                 isValid = validateNode(subflow); | ||||
|             if (subflow){ | ||||
|                 isValid = subflow.valid; | ||||
|                 hasChanged = subflow.changed; | ||||
|                 if (isValid === undefined) { | ||||
|                     isValid = validateNode(subflow); | ||||
|                     hasChanged = subflow.changed; | ||||
|                 } | ||||
|             } | ||||
|             validationErrors = validateNodeProperties(node, node._def.defaults, node); | ||||
|             node.valid = isValid && validationErrors.length === 0; | ||||
| @@ -238,6 +240,7 @@ RED.editor = (function() { | ||||
|             var valid = validateNodeProperty(node, defaults, property,value); | ||||
|             if (((typeof valid) === "string") || !valid) { | ||||
|                 input.addClass("input-error"); | ||||
|                 input.next(".red-ui-typedInput-container").addClass("input-error"); | ||||
|                 if ((typeof valid) === "string") { | ||||
|                     var tooltip = input.data("tooltip"); | ||||
|                     if (tooltip) { | ||||
| @@ -250,6 +253,7 @@ RED.editor = (function() { | ||||
|                 } | ||||
|             } else { | ||||
|                 input.removeClass("input-error"); | ||||
|                 input.next(".red-ui-typedInput-container").removeClass("input-error"); | ||||
|                 var tooltip = input.data("tooltip"); | ||||
|                 if (tooltip) { | ||||
|                     input.data("tooltip", null); | ||||
|   | ||||
| @@ -491,7 +491,11 @@ RED.keyboard = (function() { | ||||
|                 okButton.attr("disabled",!valid); | ||||
|             }); | ||||
|  | ||||
|             var scopeSelect = $('<select><option value="*" data-i18n="keyboard.global"></option><option value="red-ui-workspace" data-i18n="keyboard.workspace"></option></select>').appendTo(scope); | ||||
|             var scopeSelect = $('<select>'+ | ||||
|                 '<option value="*" data-i18n="keyboard.global"></option>'+ | ||||
|                 '<option value="red-ui-workspace" data-i18n="keyboard.workspace"></option>'+ | ||||
|                 '<option value="red-ui-editor-stack" data-i18n="keyboard.editor"></option>'+ | ||||
|                 '</select>').appendTo(scope); | ||||
|             scopeSelect.i18n(); | ||||
|             if (object.scope === "workspace") { | ||||
|                 object.scope = "red-ui-workspace"; | ||||
|   | ||||
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/editor-client/src/js/ui/library.js
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/editor-client/src/js/ui/library.js
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										2
									
								
								packages/node_modules/@node-red/editor-client/src/js/ui/palette.js
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										2
									
								
								packages/node_modules/@node-red/editor-client/src/js/ui/palette.js
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -432,6 +432,7 @@ RED.palette = (function() { | ||||
|                 categoryNode.find(".red-ui-palette-content").slideToggle(); | ||||
|                 categoryNode.find("i").toggleClass("expanded"); | ||||
|             } | ||||
|             categoryNode.hide(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -510,6 +511,7 @@ RED.palette = (function() { | ||||
|                     currentCategoryNode.find(".red-ui-palette-content").slideToggle(); | ||||
|                     currentCategoryNode.find("i").toggleClass("expanded"); | ||||
|                 } | ||||
|                 currentCategoryNode.hide(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|   | ||||
							
								
								
									
										6
									
								
								packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										6
									
								
								packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -747,14 +747,14 @@ RED.projects = (function() { | ||||
|                         var row = $('<div class="form-row"></div>').appendTo(body); | ||||
|                         $('<label for="red-ui-projects-dialog-screen-create-project-file">'+RED._("projects.default-files.flow-file")+'</label>').appendTo(row); | ||||
|                         var subrow = $('<div style="position:relative;"></div>').appendTo(row); | ||||
|                         var defaultFlowFile = (createProjectOptions.files &&createProjectOptions.files.flow) || (RED.settings.files && RED.settings.files.flow)||"flow.json"; | ||||
|                         var defaultFlowFile = (createProjectOptions.files &&createProjectOptions.files.flow) || (RED.settings.files && RED.settings.files.flow) || "flows.json"; | ||||
|                         projectFlowFileInput = $('<input id="red-ui-projects-dialog-screen-create-project-file" type="text">').val(defaultFlowFile) | ||||
|                             .on("change keyup paste",validateForm) | ||||
|                             .appendTo(subrow); | ||||
|                         $('<div class="red-ui-projects-dialog-screen-input-status"></div>').appendTo(subrow); | ||||
|                         $('<label class="red-ui-projects-edit-form-sublabel"><small>*.json</small></label>').appendTo(row); | ||||
|  | ||||
|                         var defaultCredentialsFile = (createProjectOptions.files &&createProjectOptions.files.credentials) || (RED.settings.files && RED.settings.files.credentials)||"flow_cred.json"; | ||||
|                         var defaultCredentialsFile = (createProjectOptions.files &&createProjectOptions.files.credentials) || (RED.settings.files && RED.settings.files.credentials) || "flows_cred.json"; | ||||
|                         row = $('<div class="form-row"></div>').appendTo(body); | ||||
|                         $('<label for="red-ui-projects-dialog-screen-create-project-credfile">'+RED._("projects.default-files.credentials-file")+'</label>').appendTo(row); | ||||
|                         subrow = $('<div style="position:relative;"></div>').appendTo(row); | ||||
| @@ -1257,7 +1257,7 @@ RED.projects = (function() { | ||||
|                         row = $('<div class="form-row red-ui-projects-dialog-screen-create-row red-ui-projects-dialog-screen-create-row-empty"></div>').appendTo(container); | ||||
|                         $('<label for="red-ui-projects-dialog-screen-create-project-file">'+RED._("projects.create.flow-file")+'</label>').appendTo(row); | ||||
|                         subrow = $('<div style="position:relative;"></div>').appendTo(row); | ||||
|                         projectFlowFileInput = $('<input id="red-ui-projects-dialog-screen-create-project-file" type="text">').val("flow.json") | ||||
|                         projectFlowFileInput = $('<input id="red-ui-projects-dialog-screen-create-project-file" type="text">').val("flows.json") | ||||
|                             .on("change keyup paste",validateForm) | ||||
|                             .appendTo(subrow); | ||||
|                         $('<div class="red-ui-projects-dialog-screen-input-status"></div>').appendTo(subrow); | ||||
|   | ||||
| @@ -663,24 +663,23 @@ RED.subflow = (function() { | ||||
|         var candidateOutputs = []; | ||||
|         var candidateInputNodes = {}; | ||||
|  | ||||
|         var boundingBox = [nodeList[0].x, | ||||
|             nodeList[0].y, | ||||
|             nodeList[0].x, | ||||
|             nodeList[0].y]; | ||||
|         var boundingBox = [nodeList[0].x-(nodeList[0].w/2), | ||||
|             nodeList[0].y-(nodeList[0].h/2), | ||||
|             nodeList[0].x+(nodeList[0].w/2), | ||||
|             nodeList[0].y+(nodeList[0].h/2)]; | ||||
|  | ||||
|         for (i=0;i<nodeList.length;i++) { | ||||
|             n = nodeList[i]; | ||||
|             nodes[n.id] = {n:n,outputs:{}}; | ||||
|             boundingBox = [ | ||||
|                 Math.min(boundingBox[0],n.x), | ||||
|                 Math.min(boundingBox[1],n.y), | ||||
|                 Math.max(boundingBox[2],n.x), | ||||
|                 Math.max(boundingBox[3],n.y) | ||||
|                 Math.min(boundingBox[0],n.x-(n.w/2)), | ||||
|                 Math.min(boundingBox[1],n.y-(n.h/2)), | ||||
|                 Math.max(boundingBox[2],n.x+(n.w/2)), | ||||
|                 Math.max(boundingBox[3],n.y+(n.h/2)) | ||||
|             ] | ||||
|         } | ||||
|         var offsetX = snapToGrid(boundingBox[0] - 200); | ||||
|         var offsetY = snapToGrid(boundingBox[1] - 80); | ||||
|  | ||||
|         var offsetX = snapToGrid(boundingBox[0] - 140); | ||||
|         var offsetY = snapToGrid(boundingBox[1] - 60); | ||||
|  | ||||
|         var center = [ | ||||
|             snapToGrid((boundingBox[2]+boundingBox[0]) / 2), | ||||
|   | ||||
| @@ -135,6 +135,10 @@ RED.sidebar.info.outliner = (function() { | ||||
|                     RED.workspaces.show(n.id, null, true); | ||||
|                 } | ||||
|             }); | ||||
|             RED.popover.tooltip(toggleVisibleButton, function () { | ||||
|                 var isHidden = !div.hasClass("red-ui-info-outline-item-hidden"); | ||||
|                 return RED._("sidebar.info." + (isHidden ? "hideFlow" : "showFlow")); | ||||
|             }); | ||||
|         } | ||||
|         if (n.type !== 'subflow') { | ||||
|             var toggleButton = $('<button type="button" class="red-ui-info-outline-item-control-disable red-ui-button red-ui-button-small"><i class="fa fa-circle-thin"></i><i class="fa fa-ban"></i></button>').appendTo(controls).on("click",function(evt) { | ||||
| @@ -613,6 +617,9 @@ RED.sidebar.info.outliner = (function() { | ||||
|                 objects[n.id].children = missingParents[n.id]; | ||||
|                 delete missingParents[n.id] | ||||
|             } | ||||
|             if (objects[n.id].children.length === 0) { | ||||
|                 objects[n.id].children.push(getEmptyItem(n.id)); | ||||
|             } | ||||
|         } | ||||
|         var parent = n.g||n.z||"__global__"; | ||||
|  | ||||
|   | ||||
							
								
								
									
										98
									
								
								packages/node_modules/@node-red/editor-client/src/js/ui/view.js
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										98
									
								
								packages/node_modules/@node-red/editor-client/src/js/ui/view.js
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -586,11 +586,28 @@ RED.view = (function() { | ||||
|  | ||||
|                 var group = $(ui.helper).data("group"); | ||||
|                 if (group) { | ||||
|                     var oldX = group.x;  | ||||
|                     var oldY = group.y;  | ||||
|                     RED.group.addToGroup(group, nn); | ||||
|                     var moveEvent = null; | ||||
|                     if ((group.x !== oldX) || | ||||
|                         (group.y !== oldY)) { | ||||
|                         moveEvent = { | ||||
|                             t: "move", | ||||
|                             nodes: [{n: group, | ||||
|                                      ox: oldX, oy: oldY, | ||||
|                                      dx: group.x -oldX, | ||||
|                                      dy: group.y -oldY}], | ||||
|                             dirty: true | ||||
|                         }; | ||||
|                     } | ||||
|                     historyEvent = { | ||||
|                         t: 'multi', | ||||
|                         events: [historyEvent], | ||||
|  | ||||
|                     }; | ||||
|                     if (moveEvent) { | ||||
|                         historyEvent.events.push(moveEvent) | ||||
|                     } | ||||
|                     historyEvent.events.push({ | ||||
|                         t: "addToGroup", | ||||
| @@ -1350,19 +1367,35 @@ RED.view = (function() { | ||||
|                 RED.editor.validateNode(nn); | ||||
|  | ||||
|                 if (targetGroup) { | ||||
|                     var oldX = targetGroup.x;  | ||||
|                     var oldY = targetGroup.y;  | ||||
|                     RED.group.addToGroup(targetGroup, nn); | ||||
|                     var moveEvent = null; | ||||
|                     if ((targetGroup.x !== oldX) || | ||||
|                         (targetGroup.y !== oldY)) { | ||||
|                         moveEvent = { | ||||
|                             t: "move", | ||||
|                             nodes: [{n: targetGroup, | ||||
|                                      ox: oldX, oy: oldY, | ||||
|                                      dx: targetGroup.x -oldX, | ||||
|                                      dy: targetGroup.y -oldY}], | ||||
|                             dirty: true | ||||
|                         }; | ||||
|                     } | ||||
|                     if (historyEvent.t !== "multi") { | ||||
|                         historyEvent = { | ||||
|                             t:'multi', | ||||
|                             events: [historyEvent] | ||||
|                         } | ||||
|                         }; | ||||
|                     } | ||||
|                     historyEvent.events.push({ | ||||
|                         t: "addToGroup", | ||||
|                         group: targetGroup, | ||||
|                         nodes: nn | ||||
|                     }) | ||||
|  | ||||
|                     }); | ||||
|                     if (moveEvent) { | ||||
|                         historyEvent.events.push(moveEvent); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 if (spliceLink) { | ||||
| @@ -1698,6 +1731,7 @@ RED.view = (function() { | ||||
|  | ||||
|             // Check link splice or group-add | ||||
|             if (movingSet.length() === 1 && movingSet.get(0).n.type !== "group") { | ||||
|             //}{//NIS | ||||
|                 node = movingSet.get(0); | ||||
|                 if (spliceActive) { | ||||
|                     if (!spliceTimer) { | ||||
| @@ -2057,11 +2091,25 @@ RED.view = (function() { | ||||
|         if (mouse_mode == RED.state.MOVING_ACTIVE) { | ||||
|             if (movingSet.length() > 0) { | ||||
|                 var addedToGroup = null; | ||||
|                 var moveEvent = null; | ||||
|                 if (activeHoverGroup) { | ||||
|                     var oldX = activeHoverGroup.x;  | ||||
|                     var oldY = activeHoverGroup.y;  | ||||
|                     for (var j=0;j<movingSet.length();j++) { | ||||
|                         var n = movingSet.get(j); | ||||
|                         RED.group.addToGroup(activeHoverGroup,n.n); | ||||
|                     } | ||||
|                     if ((activeHoverGroup.x !== oldX) || | ||||
|                         (activeHoverGroup.y !== oldY)) { | ||||
|                         moveEvent = { | ||||
|                             t: "move", | ||||
|                             nodes: [{n: activeHoverGroup, | ||||
|                                      ox: oldX, oy: oldY, | ||||
|                                      dx: activeHoverGroup.x -oldX, | ||||
|                                      dy: activeHoverGroup.y -oldY}], | ||||
|                             dirty: true | ||||
|                         }; | ||||
|                     } | ||||
|                     addedToGroup = activeHoverGroup; | ||||
|  | ||||
|                     activeHoverGroup.hovered = false; | ||||
| @@ -2107,6 +2155,12 @@ RED.view = (function() { | ||||
|                         historyEvent.addToGroup = addedToGroup; | ||||
|                     } | ||||
|                     RED.nodes.dirty(true); | ||||
|                     if (moveEvent) { | ||||
|                         historyEvent = { | ||||
|                             t: "multi", | ||||
|                             events: [moveEvent, historyEvent] | ||||
|                         }; | ||||
|                     } | ||||
|                     RED.history.push(historyEvent); | ||||
|                 } | ||||
|             } | ||||
| @@ -2592,6 +2646,16 @@ RED.view = (function() { | ||||
|                         var result = RED.nodes.removeJunction(node) | ||||
|                         removedJunctions.push(node); | ||||
|                         removedLinks = removedLinks.concat(result.links); | ||||
|                         if (node.g) { | ||||
|                             var group = RED.nodes.group(node.g); | ||||
|                             if (selectedGroups.indexOf(group) === -1) { | ||||
|                                 // Don't use RED.group.removeFromGroup as that emits | ||||
|                                 // a change event on the node - but we're deleting it | ||||
|                                 var index = group.nodes.indexOf(node); | ||||
|                                 group.nodes.splice(index,1); | ||||
|                                 RED.group.markDirty(group); | ||||
|                             } | ||||
|                         } | ||||
|                     } else { | ||||
|                         if (node.direction === "out") { | ||||
|                             removedSubflowOutputs.push(node); | ||||
| @@ -3369,6 +3433,9 @@ RED.view = (function() { | ||||
|         } | ||||
|         if (dblClickPrimed && mousedown_node == d && clickElapsed > 0 && clickElapsed < dblClickInterval) { | ||||
|             mouse_mode = RED.state.DEFAULT; | ||||
|             // Avoid dbl click causing text selection. | ||||
|             d3.event.preventDefault() | ||||
|             document.getSelection().removeAllRanges() | ||||
|             if (d.type != "subflow") { | ||||
|                 if (/^subflow:/.test(d.type) && (d3.event.ctrlKey || d3.event.metaKey)) { | ||||
|                     RED.workspaces.show(d.type.substring(8)); | ||||
| @@ -3463,11 +3530,25 @@ RED.view = (function() { | ||||
|                 updateActiveNodes(); | ||||
|             } | ||||
|  | ||||
|             var moveEvent = null; | ||||
|             if (activeHoverGroup) { | ||||
|                 var oldX = activeHoverGroup.x;  | ||||
|                 var oldY = activeHoverGroup.y;  | ||||
|                 for (var j=0;j<movingSet.length();j++) { | ||||
|                     var n = movingSet.get(j); | ||||
|                     RED.group.addToGroup(activeHoverGroup,n.n); | ||||
|                 } | ||||
|                 if ((activeHoverGroup.x !== oldX) || | ||||
|                     (activeHoverGroup.y !== oldY)) { | ||||
|                     moveEvent = { | ||||
|                         t: "move", | ||||
|                         nodes: [{n: activeHoverGroup, | ||||
|                                  ox: oldX, oy: oldY, | ||||
|                                  dx: activeHoverGroup.x -oldX, | ||||
|                                  dy: activeHoverGroup.y -oldY}], | ||||
|                         dirty: true | ||||
|                     }; | ||||
|                 } | ||||
|                 historyEvent.addedToGroup = activeHoverGroup; | ||||
|  | ||||
|                 activeHoverGroup.hovered = false; | ||||
| @@ -3476,7 +3557,6 @@ RED.view = (function() { | ||||
|                 activeGroup.selected = true; | ||||
|                 activeHoverGroup = null; | ||||
|             } | ||||
|  | ||||
|             if (mouse_mode == RED.state.DETACHED_DRAGGING) { | ||||
|                 var ns = []; | ||||
|                 for (var j=0;j<movingSet.length();j++) { | ||||
| @@ -3487,7 +3567,15 @@ RED.view = (function() { | ||||
|                         n.n.moved = true; | ||||
|                     } | ||||
|                 } | ||||
|                 RED.history.replace({t:"multi",events:[historyEvent,{t:"move",nodes:ns}],dirty: historyEvent.dirty}) | ||||
|                 var event = {t:"multi",events:[historyEvent,{t:"move",nodes:ns}],dirty: historyEvent.dirty}; | ||||
|                 if (moveEvent) { | ||||
|                     event.events.push(moveEvent); | ||||
|                 } | ||||
|                 RED.history.replace(event) | ||||
|             } | ||||
|             else if(moveEvent) { | ||||
|                 var event = {t:"multi", events:[historyEvent, moveEvent], dirty: true}; | ||||
|                 RED.history.replace(event); | ||||
|             } | ||||
|  | ||||
|             updateSelection(); | ||||
|   | ||||
| @@ -124,7 +124,7 @@ | ||||
|     list-style-type: none; | ||||
|     margin: 0; | ||||
|     padding:0; | ||||
|  | ||||
|     overflow-wrap: anywhere; | ||||
|     li { | ||||
|         display: inline-block; | ||||
|         padding:0; | ||||
|   | ||||
| @@ -32,7 +32,8 @@ | ||||
|     color: var(--red-ui-primary-text-color); | ||||
|     border: 1px solid var(--red-ui-notification-border-default); | ||||
|     border-left-width: 16px; | ||||
|     overflow: hidden; | ||||
|     overflow: auto; | ||||
|     max-height: 80vh; | ||||
|     .ui-dialog-buttonset { | ||||
|         margin-top: 20px; | ||||
|         margin-bottom: 10px; | ||||
|   | ||||
| @@ -55,7 +55,7 @@ | ||||
| .red-ui-palette-search { | ||||
|     position: relative; | ||||
|     overflow: hidden; | ||||
|     background: var(--red-ui-secondary-background); | ||||
|     background: var(--red-ui-form-input-background); | ||||
|     text-align: center; | ||||
|     height: 35px; | ||||
|     padding: 3px; | ||||
|   | ||||
| @@ -35,6 +35,7 @@ | ||||
|     padding: 8px; | ||||
|     border-radius: 2px; | ||||
|     background: var(--red-ui-popover-background); | ||||
|     overflow-wrap: anywhere; | ||||
| } | ||||
| .red-ui-popover:after, .red-ui-popover:before { | ||||
|     border: solid transparent; | ||||
|   | ||||
| @@ -41,6 +41,7 @@ | ||||
|     height: 50px; | ||||
|     background: var(--red-ui-secondary-background); | ||||
|     border: 2px solid var(--red-ui-primary-border-color); | ||||
|     color: var(--red-ui-primary-text-color); | ||||
|     text-align: center; | ||||
|     line-height:50px; | ||||
|  | ||||
| @@ -51,7 +52,7 @@ | ||||
|  | ||||
| .red-ui-editor-radial-menu-opt-disabled { | ||||
|     border-color: var(--red-ui-tertiary-border-color); | ||||
|     color: var(--red-ui-tertiary-border-color); | ||||
|     color: var(--red-ui-secondary-text-color-disabled); | ||||
| } | ||||
| .red-ui-editor-radial-menu-opt-active { | ||||
|     background: var(--red-ui-secondary-background-hover); | ||||
|   | ||||
| @@ -108,6 +108,8 @@ | ||||
|     } | ||||
|     .red-ui-search-result-node-label { | ||||
|         color: var(--red-ui-secondary-text-color); | ||||
|         width: 240px; | ||||
|         overflow-wrap: anywhere; | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -31,6 +31,7 @@ | ||||
|     > span { | ||||
|         display: inline-block; | ||||
|         margin-left: 5px; | ||||
|         overflow-wrap: anywhere; | ||||
|     } | ||||
|     border-bottom: 1px solid var(--red-ui-secondary-border-color); | ||||
| } | ||||
|   | ||||
| @@ -95,45 +95,64 @@ module.exports = function(RED) { | ||||
|         } | ||||
|  | ||||
|         this.on("input", function(msg, send, done) { | ||||
|             var errors = []; | ||||
|             var props = this.props; | ||||
|             const errors = []; | ||||
|             let props = this.props; | ||||
|             if (msg.__user_inject_props__ && Array.isArray(msg.__user_inject_props__)) { | ||||
|                 props = msg.__user_inject_props__; | ||||
|             } | ||||
|             delete msg.__user_inject_props__; | ||||
|             props.forEach(p => { | ||||
|                 var property = p.p; | ||||
|                 var value = p.v ? p.v : ''; | ||||
|                 var valueType = p.vt ? p.vt : 'str'; | ||||
|             props = [...props] | ||||
|             function evaluateProperty(doneEvaluating) { | ||||
|                 if (props.length === 0) {  | ||||
|                     doneEvaluating() | ||||
|                     return | ||||
|                 } | ||||
|                 const p = props.shift() | ||||
|                 const property = p.p; | ||||
|                 const value = p.v ? p.v : ''; | ||||
|                 const valueType = p.vt ? p.vt : 'str'; | ||||
|  | ||||
|                 if (!property) return; | ||||
|  | ||||
|                 if (valueType === "jsonata") { | ||||
|                     if (p.v) { | ||||
|                         try { | ||||
|                             var exp = RED.util.prepareJSONataExpression(p.v, node); | ||||
|                             var val = RED.util.evaluateJSONataExpression(exp, msg); | ||||
|                             RED.util.setMessageProperty(msg, property, val, true); | ||||
|                 if (property) { | ||||
|                     if (valueType === "jsonata") { | ||||
|                         if (p.v) { | ||||
|                             try { | ||||
|                                 var exp = RED.util.prepareJSONataExpression(p.v, node); | ||||
|                                 var val = RED.util.evaluateJSONataExpression(exp, msg); | ||||
|                                 RED.util.setMessageProperty(msg, property, val, true); | ||||
|                             } | ||||
|                             catch  (err) { | ||||
|                                 errors.push(err.message); | ||||
|                             } | ||||
|                         } | ||||
|                         catch  (err) { | ||||
|                             errors.push(err.message); | ||||
|                         evaluateProperty(doneEvaluating) | ||||
|                     } else { | ||||
|                         try { | ||||
|                             RED.util.evaluateNodeProperty(value, valueType, node, msg, (err, newValue) => { | ||||
|                                 if (err) { | ||||
|                                     errors.push(err.toString()) | ||||
|                                 } else { | ||||
|                                     RED.util.setMessageProperty(msg,property,newValue,true); | ||||
|                                 } | ||||
|                                 evaluateProperty(doneEvaluating) | ||||
|                             }) | ||||
|                         } catch (err) { | ||||
|                             errors.push(err.toString()); | ||||
|                             evaluateProperty(doneEvaluating) | ||||
|                         } | ||||
|                     } | ||||
|                     return; | ||||
|                 } else { | ||||
|                     evaluateProperty(doneEvaluating) | ||||
|                 } | ||||
|                 try { | ||||
|                     RED.util.setMessageProperty(msg,property,RED.util.evaluateNodeProperty(value, valueType, this, msg),true); | ||||
|                 } catch (err) { | ||||
|                     errors.push(err.toString()); | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             if (errors.length) { | ||||
|                 done(errors.join('; ')); | ||||
|             } else { | ||||
|                 send(msg); | ||||
|                 done(); | ||||
|             } | ||||
|             | ||||
|             evaluateProperty(() => { | ||||
|                 if (errors.length) { | ||||
|                     done(errors.join('; ')); | ||||
|                 } else { | ||||
|                     send(msg); | ||||
|                     done(); | ||||
|                 } | ||||
|             }) | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,16 @@ | ||||
|         color:"#c0edc0", | ||||
|         defaults: { | ||||
|             name: {value:""}, | ||||
|             scope: {value:[], type:"*[]"}, | ||||
|             scope: { | ||||
|                 value: [], | ||||
|                 type: "*[]", | ||||
|                 validate: function (v, opt) { | ||||
|                     if (v.length > 0) { | ||||
|                         return true; | ||||
|                     } | ||||
|                     return RED._("node-red:complete.errors.scopeUndefined"); | ||||
|                 } | ||||
|             }, | ||||
|             uncaught: {value:false} | ||||
|         }, | ||||
|         inputs:0, | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|         <label style="width: auto" for="node-input-scope" data-i18n="catch.label.source"></label> | ||||
|         <select id="node-input-scope-select"> | ||||
|             <option value="all" data-i18n="catch.scope.all"></option> | ||||
|             <option value="target" data-i18n="catch.scope.selected"></options> | ||||
|             <option value="target" data-i18n="catch.scope.selected"></option> | ||||
|         </select> | ||||
|     </div> | ||||
|     <div class="form-row node-input-uncaught-row"> | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|         <label style="width: auto" for="node-input-scope" data-i18n="status.label.source"></label> | ||||
|         <select id="node-input-scope-select"> | ||||
|             <option value="all" data-i18n="status.scope.all"></option> | ||||
|             <option value="target" data-i18n="status.scope.selected"></options> | ||||
|             <option value="target" data-i18n="status.scope.selected"></option> | ||||
|         </select> | ||||
|     </div> | ||||
|     <div class="form-row node-input-target-row"> | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
|  | ||||
| <script type="text/html" data-template-name="link in"> | ||||
|     <div class="form-row"> | ||||
|         <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label> | ||||
| @@ -272,7 +271,17 @@ | ||||
|         color:"#ddd",//"#87D8CF", | ||||
|         defaults: { | ||||
|             name: { value: "" }, | ||||
|             links: { value: [], type:"link in[]" }, | ||||
|             links: { | ||||
|                 value: [], | ||||
|                 type: "link in[]", | ||||
|                 validate: function (v, opt) { | ||||
|                     if ((this.linkType === "static" && v.length > 0) | ||||
|                       || this.linkType === "dynamic") { | ||||
|                         return true; | ||||
|                     } | ||||
|                     return RED._("node-red:link.errors.linkUndefined"); | ||||
|                 } | ||||
|             }, | ||||
|             linkType: { value:"static" }, | ||||
|             timeout: { | ||||
|                 value: "30", | ||||
|   | ||||
| @@ -164,10 +164,10 @@ module.exports = function(RED) { | ||||
|                     if (returnNode && returnNode.returnLinkMessage) { | ||||
|                         returnNode.returnLinkMessage(messageEvent.id, msg); | ||||
|                     } else { | ||||
|                         node.warn(RED._("link.error.missingReturn")) | ||||
|                         node.warn(RED._("link.errors.missingReturn")); | ||||
|                     } | ||||
|                 } else { | ||||
|                     node.warn(RED._("link.error.missingReturn")) | ||||
|                     node.warn(RED._("link.errors.missingReturn")); | ||||
|                 } | ||||
|                 done(); | ||||
|             } else if (mode === "link") { | ||||
|   | ||||
| @@ -17,6 +17,8 @@ | ||||
|             display: flex; | ||||
|             background: var(--red-ui-tertiary-background); | ||||
|             padding-right: 75px; | ||||
|             border-top-left-radius: 3px; | ||||
|             border-top-right-radius: 3px; | ||||
|         } | ||||
|         #node-input-libs-container-row .red-ui-editableList-header > div { | ||||
|             flex-grow: 1; | ||||
| @@ -451,11 +453,13 @@ | ||||
|             tabs.activateTab("func-tab-body"); | ||||
|  | ||||
|             $( "#node-input-outputs" ).spinner({ | ||||
|                 min:0, | ||||
|                 min: 0, | ||||
|                 max: 500, | ||||
|                 change: function(event, ui) { | ||||
|                     var value = this.value; | ||||
|                     if (!value.match(/^\d+$/)) { value = 1;  } | ||||
|                     else if (value < this.min) { value = this.min; } | ||||
|                     var value = parseInt(this.value); | ||||
|                     value = isNaN(value) ? 1 : value; | ||||
|                     value = Math.max(value, parseInt($(this).attr("aria-valuemin"))); | ||||
|                     value = Math.min(value, parseInt($(this).attr("aria-valuemax"))); | ||||
|                     if (value !== this.value) { $(this).spinner("value", value); } | ||||
|                 } | ||||
|             }); | ||||
|   | ||||
| @@ -318,7 +318,7 @@ module.exports = function(RED) { | ||||
|             } | ||||
|             var r = node.rules[currentRule]; | ||||
|             if (r.t === "move") { | ||||
|                 if ((r.tot !== r.pt) || (r.p.indexOf(r.to) !== -1)) { | ||||
|                 if ((r.tot !== r.pt) || (r.p.indexOf(r.to) !== -1) && (r.p !== r.to)) { | ||||
|                     applyRule(msg,{t:"set", p:r.to, pt:r.tot, to:r.p, tot:r.pt},(err,msg) => { | ||||
|                         applyRule(msg,{t:"delete", p:r.p, pt:r.pt}, (err,msg) => { | ||||
|                             completeApplyingRules(msg,currentRule,done); | ||||
|   | ||||
| @@ -21,6 +21,7 @@ | ||||
|                 <option value="javascript">JavaScript</option> | ||||
|                 <option value="css">CSS</option> | ||||
|                 <option value="markdown">Markdown</option> | ||||
|                 <option value="php">PHP</option> | ||||
|                 <option value="python">Python</option> | ||||
|                 <option value="sql">SQL</option> | ||||
|                 <option value="yaml">YAML</option> | ||||
|   | ||||
| @@ -35,7 +35,11 @@ module.exports = function(RED) { | ||||
|                 } | ||||
|                 else { node.previous = {}; } | ||||
|             } | ||||
|             var value = RED.util.getMessageProperty(msg,node.property); | ||||
|             var value; | ||||
|             try { | ||||
|                 value = RED.util.getMessageProperty(msg,node.property); | ||||
|             } | ||||
|             catch(e) { } | ||||
|             if (value !== undefined) { | ||||
|                 var t = "_no_topic"; | ||||
|                 if (node.septopics) { t = topic || t; } | ||||
|   | ||||
| @@ -421,7 +421,11 @@ | ||||
| <script type="text/javascript"> | ||||
| (function() { | ||||
|  | ||||
|     var typedInputNoneOpt = { value: 'none', label: '', hasValue: false }; | ||||
|     var typedInputNoneOpt = { | ||||
|         value: 'none', | ||||
|         label: RED._("node-red:mqtt.label.none"), | ||||
|         hasValue: false | ||||
|     }; | ||||
|     var makeTypedInputOpt = function(value){ | ||||
|         return { | ||||
|             value: value, | ||||
| @@ -436,7 +440,11 @@ | ||||
|         makeTypedInputOpt("text/csv"), | ||||
|         makeTypedInputOpt("text/html"), | ||||
|         makeTypedInputOpt("text/plain"), | ||||
|         {value:"other", label:""} | ||||
|         { | ||||
|             value: "other", | ||||
|             label: RED._("node-red:mqtt.label.other"), | ||||
|             icon: "red/images/typedInput/az.svg" | ||||
|         } | ||||
|     ]; | ||||
|  | ||||
|     function getDefaultContentType(value) { | ||||
| @@ -499,17 +507,17 @@ | ||||
|             cleansession: {value: true}, | ||||
|             birthTopic: {value:"", validate:validateMQTTPublishTopic}, | ||||
|             birthQos: {value:"0"}, | ||||
|             birthRetain: {value:false}, | ||||
|             birthRetain: {value:"false"}, | ||||
|             birthPayload: {value:""}, | ||||
|             birthMsg: { value: {}}, | ||||
|             closeTopic: {value:"", validate:validateMQTTPublishTopic}, | ||||
|             closeQos: {value:"0"}, | ||||
|             closeRetain: {value:false}, | ||||
|             closeRetain: {value:"false"}, | ||||
|             closePayload: {value:""}, | ||||
|             closeMsg: { value: {}}, | ||||
|             willTopic: {value:"", validate:validateMQTTPublishTopic}, | ||||
|             willQos: {value:"0"}, | ||||
|             willRetain: {value:false}, | ||||
|             willRetain: {value:"false"}, | ||||
|             willPayload: {value:""}, | ||||
|             willMsg: { value: {}}, | ||||
|             userProps: { value: ""}, | ||||
|   | ||||
| @@ -295,7 +295,7 @@ module.exports = function(RED) { | ||||
|                         /* mute error - it simply isnt JSON, just leave payload as a string */ | ||||
|                     } | ||||
|                 } | ||||
|             } //else {  | ||||
|             } //else { | ||||
|                 //leave as buffer | ||||
|             //} | ||||
|         } | ||||
| @@ -357,7 +357,7 @@ module.exports = function(RED) { | ||||
|                         return; | ||||
|                     } | ||||
|                     done(err); | ||||
|                 });  | ||||
|                 }); | ||||
|             } else { | ||||
|                 done(); | ||||
|             } | ||||
| @@ -366,6 +366,16 @@ module.exports = function(RED) { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function updateStatus(node, allNodes) { | ||||
|         let setStatus = setStatusDisconnected | ||||
|         if(node.connecting) { | ||||
|             setStatus = setStatusConnecting | ||||
|         } else if(node.connected) { | ||||
|             setStatus = setStatusConnected | ||||
|         } | ||||
|         setStatus(node, allNodes) | ||||
|     } | ||||
|  | ||||
|     function setStatusDisconnected(node, allNodes) { | ||||
|         if(allNodes) { | ||||
|             for (var id in node.users) { | ||||
| @@ -459,7 +469,6 @@ module.exports = function(RED) { | ||||
|             if(!opts || typeof opts !== "object") { | ||||
|                 return; //nothing to change, simply return | ||||
|             } | ||||
|             const originalBrokerURL = node.brokerurl; | ||||
|  | ||||
|             //apply property changes (only if the property exists in the opts object) | ||||
|             setIfHasProperty(opts, node, "url", init); | ||||
| @@ -468,7 +477,6 @@ module.exports = function(RED) { | ||||
|             setIfHasProperty(opts, node, "clientid", init); | ||||
|             setIfHasProperty(opts, node, "autoConnect", init); | ||||
|             setIfHasProperty(opts, node, "usetls", init); | ||||
|             setIfHasProperty(opts, node, "usews", init); | ||||
|             setIfHasProperty(opts, node, "verifyservercert", init); | ||||
|             setIfHasProperty(opts, node, "compatmode", init); | ||||
|             setIfHasProperty(opts, node, "protocolVersion", init); | ||||
| @@ -571,9 +579,6 @@ module.exports = function(RED) { | ||||
|             if (typeof node.usetls === 'undefined') { | ||||
|                 node.usetls = false; | ||||
|             } | ||||
|             if (typeof node.usews === 'undefined') { | ||||
|                 node.usews = false; | ||||
|             } | ||||
|             if (typeof node.verifyservercert === 'undefined') { | ||||
|                 node.verifyservercert = false; | ||||
|             } | ||||
| @@ -692,7 +697,8 @@ module.exports = function(RED) { | ||||
|                 node.options.rejectUnauthorized = (node.verifyservercert == "true" || node.verifyservercert === true); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         node.v5 = () => node.options && node.options.protocolVersion == 5 | ||||
|         node.subscriptionIdentifiersAvailable = () => node.v5() && node.serverProperties && node.serverProperties.subscriptionIdentifiersAvailable | ||||
|         n.autoConnect = n.autoConnect === "false" || n.autoConnect === false ? false : true; | ||||
|         node.setOptions(n, true); | ||||
|  | ||||
| @@ -702,16 +708,21 @@ module.exports = function(RED) { | ||||
|             if (Object.keys(node.users).length === 1) { | ||||
|                 if(node.autoConnect) { | ||||
|                     node.connect(); | ||||
|                     //update nodes status | ||||
|                     setTimeout(function() { | ||||
|                         updateStatus(node, true) | ||||
|                     }, 1) | ||||
|                 } | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         node.deregister = function(mqttNode,done) { | ||||
|         node.deregister = function(mqttNode, done, autoDisconnect) { | ||||
|             delete node.users[mqttNode.id]; | ||||
|             if (!node.closing && node.connected && Object.keys(node.users).length === 0) { | ||||
|                 node.disconnect(); | ||||
|             if (autoDisconnect && !node.closing && node.connected && Object.keys(node.users).length === 0) { | ||||
|                 node.disconnect(done); | ||||
|             } else { | ||||
|                 done(); | ||||
|             } | ||||
|             done(); | ||||
|         }; | ||||
|         node.canConnect = function() { | ||||
|             return !node.connected && !node.connecting; | ||||
| @@ -845,7 +856,7 @@ module.exports = function(RED) { | ||||
|             let waitEnd = (client, ms) => { | ||||
|                 return new Promise( (resolve, reject) => { | ||||
|                     node.closing = true; | ||||
|                     if(!client) {  | ||||
|                     if(!client) { | ||||
|                         resolve(); | ||||
|                      } else { | ||||
|                         const t = setTimeout(() => { | ||||
| @@ -910,7 +921,12 @@ module.exports = function(RED) { | ||||
|             }; | ||||
|             node.subscriptions[topic][ref] = sub; | ||||
|             if (node.connected) { | ||||
|                 const subIdsAvailable = node.subscriptionIdentifiersAvailable() | ||||
|                 node._clientOn('message',sub.handler); | ||||
|                 // if the broker doesn't support subscription identifiers (e.g. AWS core), then don't send them | ||||
|                 if (options.properties && options.properties.subscriptionIdentifier && subIdsAvailable !== true) { | ||||
|                     delete options.properties.subscriptionIdentifier | ||||
|                 } | ||||
|                 node.client.subscribe(topic, options); | ||||
|             } | ||||
|         }; | ||||
| @@ -1000,7 +1016,7 @@ module.exports = function(RED) { | ||||
|                     node.client.publish(msg.topic, msg.payload, options, function (err) { | ||||
|                         if (done) { | ||||
|                             done(err) | ||||
|                         } else { | ||||
|                         } else if(err) { | ||||
|                             node.error(err, msg) | ||||
|                         } | ||||
|                     }) | ||||
| @@ -1024,7 +1040,7 @@ module.exports = function(RED) { | ||||
|  | ||||
|         /** | ||||
|          * Add event handlers to the MQTT.js client and track them so that | ||||
|          * we do not remove any handlers that the MQTT client uses internally.   | ||||
|          * we do not remove any handlers that the MQTT client uses internally. | ||||
|          * Use {@link node._clientRemoveListeners `node._clientRemoveListeners`} to remove handlers | ||||
|          * @param {string} event The name of the event | ||||
|          * @param {function} handler The handler for this event | ||||
| @@ -1032,11 +1048,11 @@ module.exports = function(RED) { | ||||
|          node._clientOn = function(event, handler) { | ||||
|             node.clientListeners.push({event, handler}) | ||||
|             node.client.on(event, handler) | ||||
|         }  | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|          * Remove event handlers from the MQTT.js client & only the events  | ||||
|          * that we attached in {@link node._clientOn `node._clientOn`}.   | ||||
|          * Remove event handlers from the MQTT.js client & only the events | ||||
|          * that we attached in {@link node._clientOn `node._clientOn`}. | ||||
|          * * If `event` is omitted, then all events matching `handler` are removed | ||||
|          * * If `handler` is omitted, then all events named `event` are removed | ||||
|          * * If both parameters are omitted, then all events are removed | ||||
| @@ -1225,7 +1241,7 @@ module.exports = function(RED) { | ||||
|                     } else { | ||||
|                         node.brokerConn.unsubscribe(node.topic,node.id, removed); | ||||
|                     } | ||||
|                     node.brokerConn.deregister(node, done); | ||||
|                     node.brokerConn.deregister(node, done, removed); | ||||
|                     node.brokerConn = null; | ||||
|                 } else { | ||||
|                     done(); | ||||
| @@ -1288,9 +1304,9 @@ module.exports = function(RED) { | ||||
|                 node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"}); | ||||
|             } | ||||
|             node.brokerConn.register(node); | ||||
|             node.on('close', function(done) { | ||||
|             node.on('close', function(removed, done) { | ||||
|                 if (node.brokerConn) { | ||||
|                     node.brokerConn.deregister(node,done); | ||||
|                     node.brokerConn.deregister(node, done, removed) | ||||
|                     node.brokerConn = null; | ||||
|                 } else { | ||||
|                     done(); | ||||
|   | ||||
| @@ -46,7 +46,7 @@ module.exports = function(RED) { | ||||
|                     isText = true; | ||||
|                 } else if (parsedType.type !== "application") { | ||||
|                     isText = false; | ||||
|                 } else if ((parsedType.subtype !== "octet-stream")  | ||||
|                 } else if ((parsedType.subtype !== "octet-stream") | ||||
|                     && (parsedType.subtype !== "cbor") | ||||
|                     && (parsedType.subtype !== "x-protobuf")) { | ||||
|                     checkUTF = true; | ||||
| @@ -200,6 +200,15 @@ module.exports = function(RED) { | ||||
|             this.callback = function(req,res) { | ||||
|                 var msgid = RED.util.generateId(); | ||||
|                 res._msgid = msgid; | ||||
|                 // Since Node 15, req.headers are lazily computed and the property | ||||
|                 // marked as non-enumerable. | ||||
|                 // That means it doesn't show up in the Debug sidebar. | ||||
|                 // This redefines the property causing it to be evaluated *and* | ||||
|                 // marked as enumerable again. | ||||
|                 Object.defineProperty(req, 'headers', { | ||||
|                     value: req.headers, | ||||
|                     enumerable: true | ||||
|                 }) | ||||
|                 if (node.method.match(/^(post|delete|put|options|patch)$/)) { | ||||
|                     node.send({_msgid:msgid,req:req,res:createResponseWrapper(node,res),payload:req.body}); | ||||
|                 } else if (node.method == "get") { | ||||
| @@ -282,7 +291,7 @@ module.exports = function(RED) { | ||||
|         RED.nodes.createNode(this,n); | ||||
|         var node = this; | ||||
|         this.headers = n.headers||{}; | ||||
|         this.statusCode = n.statusCode; | ||||
|         this.statusCode = parseInt(n.statusCode); | ||||
|         this.on("input",function(msg,_send,done) { | ||||
|             if (msg.res) { | ||||
|                 var headers = RED.util.cloneMessage(node.headers); | ||||
| @@ -323,7 +332,7 @@ module.exports = function(RED) { | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 var statusCode = node.statusCode || msg.statusCode || 200; | ||||
|                 var statusCode = node.statusCode || parseInt(msg.statusCode) || 200; | ||||
|                 if (typeof msg.payload == "object" && !Buffer.isBuffer(msg.payload)) { | ||||
|                     msg.res._res.status(statusCode).jsonp(msg.payload); | ||||
|                 } else { | ||||
|   | ||||
| @@ -435,6 +435,10 @@ in your Node-RED user directory (${RED.settings.userDir}). | ||||
|                                     formData.append(opt, val); | ||||
|                                 } else if (typeof val === 'object' && val.hasOwnProperty('value')) { | ||||
|                                     formData.append(opt,val.value,val.options || {}); | ||||
|                                 } else if (Array.isArray(val)) { | ||||
|                                     for (var i=0; i<val.length; i++) { | ||||
|                                         formData.append(opt, val[i]) | ||||
|                                     } | ||||
|                                 } else { | ||||
|                                     formData.append(opt,JSON.stringify(val)); | ||||
|                                 } | ||||
|   | ||||
| @@ -110,7 +110,12 @@ module.exports = function(RED) { | ||||
|                                         if (msg.payload[s].hasOwnProperty(p)) { | ||||
|                                             /* istanbul ignore else */ | ||||
|                                             if (typeof msg.payload[s][p] !== "object") { | ||||
|                                                 var q = "" + msg.payload[s][p]; | ||||
|                                             // Fix to honour include null values flag | ||||
|                                             //if (typeof msg.payload[s][p] !== "object" || (node.include_null_values === true && msg.payload[s][p] === null)) { | ||||
|                                                 var q = ""; | ||||
|                                                 if (msg.payload[s][p] !== undefined) { | ||||
|                                                     q += msg.payload[s][p]; | ||||
|                                                 } | ||||
|                                                 if (q.indexOf(node.quo) !== -1) { // add double quotes if any quotes | ||||
|                                                     q = q.replace(/"/g, '""'); | ||||
|                                                     ou += node.quo + q + node.quo + node.sep; | ||||
| @@ -130,9 +135,15 @@ module.exports = function(RED) { | ||||
|                                             ou += node.sep; | ||||
|                                         } | ||||
|                                         else { | ||||
|                                             var p = RED.util.ensureString(RED.util.getMessageProperty(msg,"payload["+s+"]['"+template[t]+"']")); | ||||
|                                             var tt = template[t]; | ||||
|                                             if (template[t].indexOf('"') >=0 ) { tt = "'"+tt+"'"; } | ||||
|                                             else { tt = '"'+tt+'"'; } | ||||
|                                             var p = RED.util.getMessageProperty(msg,'payload["'+s+'"]['+tt+']'); | ||||
|                                             /* istanbul ignore else */ | ||||
|                                             if (p === "undefined") { p = ""; } | ||||
|                                             if (p === undefined) { p = ""; } | ||||
|                                             // fix to honour include null values flag | ||||
|                                             //if (p === null && node.include_null_values !== true) { p = "";} | ||||
|                                             p = RED.util.ensureString(p); | ||||
|                                             if (p.indexOf(node.quo) !== -1) { // add double quotes if any quotes | ||||
|                                                 p = p.replace(/"/g, '""'); | ||||
|                                                 ou += node.quo + p + node.quo + node.sep; | ||||
|   | ||||
| @@ -251,7 +251,9 @@ module.exports = function(RED) { | ||||
|                         } | ||||
|                         else { | ||||
|                             node.buffer = buff.slice(p,buff.length); | ||||
|                             node.pendingDones.push(done); | ||||
|                             if (node.buffer.length > 0) { | ||||
|                                 node.pendingDones.push(done); | ||||
|                             } | ||||
|                         } | ||||
|                         if (node.buffer.length == 0) { | ||||
|                             done(); | ||||
|   | ||||
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/core/storage/10-file.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/core/storage/10-file.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -117,7 +117,9 @@ module.exports = function(RED) { | ||||
|                 } | ||||
|                 if (typeof data === "boolean") { data = data.toString(); } | ||||
|                 if (typeof data === "number") { data = data.toString(); } | ||||
|                 if ((node.appendNewline) && (!Buffer.isBuffer(data))) { data += os.EOL; } | ||||
|                 var aflg = true; | ||||
|                 if (msg.hasOwnProperty("parts") && msg.parts.type === "string" && (msg.parts.count === msg.parts.index + 1)) { aflg = false; } | ||||
|                 if ((node.appendNewline) && (!Buffer.isBuffer(data)) && aflg) { data += os.EOL; } | ||||
|                 var buf; | ||||
|                 if (node.encoding === "setbymsg") { | ||||
|                     buf = encode(data, msg.encoding || "none"); | ||||
| @@ -314,7 +316,6 @@ module.exports = function(RED) { | ||||
|             }); | ||||
|             filename = filename || ""; | ||||
|             var fullFilename = filename; | ||||
|             var filePath = ""; | ||||
|             if (filename && RED.settings.fileWorkingDirectory && !path.isAbsolute(filename)) { | ||||
|                 fullFilename = path.resolve(path.join(RED.settings.fileWorkingDirectory,filename)); | ||||
|             } | ||||
|   | ||||
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/20-inject.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/20-inject.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/21-debug.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/21-debug.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/25-catch.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/25-catch.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/25-status.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/25-status.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/60-link.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/60-link.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/90-comment.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/90-comment.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/98-unknown.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/common/98-unknown.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/10-function.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/10-function.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/10-switch.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/10-switch.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/15-change.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/15-change.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/16-range.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/16-range.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/80-template.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/80-template.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/89-delay.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/89-delay.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/89-trigger.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/89-trigger.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/90-exec.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/function/90-exec.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/messages.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/messages.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/05-tls.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/05-tls.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/06-httpproxy.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/06-httpproxy.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/10-mqtt.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/10-mqtt.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/21-httpin.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/21-httpin.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/21-httprequest.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/21-httprequest.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/22-websocket.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/22-websocket.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/31-tcpin.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/31-tcpin.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/32-udp.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/network/32-udp.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/parsers/70-CSV.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/parsers/70-CSV.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/parsers/70-XML.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/parsers/70-XML.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/parsers/70-YAML.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/parsers/70-YAML.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/sequence/17-split.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/sequence/17-split.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/sequence/18-sort.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/sequence/18-sort.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/sequence/19-batch.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/sequence/19-batch.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/storage/10-file.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/storage/10-file.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/storage/23-watch.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/de/storage/23-watch.html
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -18,5 +18,5 @@ | ||||
|     <p>A node you can use to add comments to your flows.</p> | ||||
|     <h3>Details</h3> | ||||
|     <p>The edit panel will accept Markdown syntax. The text will be rendered into | ||||
|     this information side panel.</p> | ||||
|     the information side panel.</p> | ||||
| </script> | ||||
|   | ||||
| @@ -52,4 +52,7 @@ | ||||
|        used to mark the templated sections. For example, to use <code>[[ ]]</code> | ||||
|        instead, add the following line to the top of the template:</p> | ||||
|     <pre>{{=[[ ]]=}}</pre> | ||||
|     <h4>Using environment variables</h4> | ||||
|     <p>The template node can access environment variables using the syntax:</p> | ||||
|     <pre>My favourite colour is {{env.COLOUR}}.</pre> | ||||
| </script> | ||||
|   | ||||
| @@ -119,7 +119,10 @@ | ||||
|         } | ||||
|     }, | ||||
|     "complete": { | ||||
|         "completeNodes": "complete: __number__" | ||||
|         "completeNodes": "complete: __number__", | ||||
|         "errors": { | ||||
|             "scopeUndefined": "scope undefined" | ||||
|         } | ||||
|     }, | ||||
|     "debug": { | ||||
|         "output": "Output", | ||||
| @@ -181,8 +184,9 @@ | ||||
|         "staticLinkCall": "Fixed target", | ||||
|         "dynamicLinkCall": "Dynamic target (msg.target)", | ||||
|         "dynamicLinkLabel": "Dynamic", | ||||
|         "error": { | ||||
|             "missingReturn": "Missing return node information" | ||||
|         "errors": { | ||||
|             "missingReturn": "Missing return node information", | ||||
|             "linkUndefined": "link undefined" | ||||
|         } | ||||
|     }, | ||||
|     "tls": { | ||||
| @@ -446,7 +450,9 @@ | ||||
|             "staticTopic": "Subscribe to single topic", | ||||
|             "dynamicTopic": "Dynamic subscription", | ||||
|             "auto-connect": "Connect automatically", | ||||
|             "auto-mode-depreciated": "This option is depreciated. Please use the new auto-detect mode." | ||||
|             "auto-mode-depreciated": "This option is depreciated. Please use the new auto-detect mode.", | ||||
|             "none": "none", | ||||
|             "other": "other" | ||||
|         }, | ||||
|         "sections-label": { | ||||
|             "birth-message": "Message sent on connection (birth message)", | ||||
|   | ||||
| @@ -48,4 +48,7 @@ | ||||
|     <p><b>注: </b>デフォルトでは、<i>mustache</i>形式は置換対象のHTML要素をエスケープします。これを抑止するには<code>{{{三重}}}</code>括弧形式を使います。</p> | ||||
|     <p>もし、コンテンツの中で<code>{{ }}</code>を出力する必要がある場合は、テンプレートで使われる記号文字を変えることもできます。例えば、<code>[[ ]]</code>を代わりに用いるには、テンプレートの先頭に以下の行を追加します。</p> | ||||
|     <pre>{{=[[ ]]=}}</pre> | ||||
|     <h4>環境変数の利用</h4> | ||||
|     <p>templateノードでは、次の構文を用いると環境変数にアクセスできます:</p> | ||||
|     <pre>私の好きな色は{{env.COLOUR}}です。</pre> | ||||
| </script> | ||||
|   | ||||
| @@ -119,7 +119,10 @@ | ||||
|         } | ||||
|     }, | ||||
|     "complete": { | ||||
|         "completeNodes": "complete: __number__" | ||||
|         "completeNodes": "complete: __number__", | ||||
|         "errors": { | ||||
|             "scopeUndefined": "スコープが未定義" | ||||
|         } | ||||
|     }, | ||||
|     "debug": { | ||||
|         "output": "対象", | ||||
| @@ -181,8 +184,9 @@ | ||||
|         "staticLinkCall": "対象を固定で指定", | ||||
|         "dynamicLinkCall": "対象を動的に指定 (msg.target)", | ||||
|         "dynamicLinkLabel": "動的", | ||||
|         "error": { | ||||
|             "missingReturn": "返却するノードの情報が存在しません" | ||||
|         "errors": { | ||||
|             "missingReturn": "返却するノードの情報が存在しません", | ||||
|             "linkUndefined": "リンクが未定義" | ||||
|         } | ||||
|     }, | ||||
|     "tls": { | ||||
| @@ -446,7 +450,9 @@ | ||||
|             "staticTopic": "1つのトピックを購読", | ||||
|             "dynamicTopic": "動的な購読", | ||||
|             "auto-connect": "自動接続", | ||||
|             "auto-mode-depreciated": "本オプションは非推奨になりました。新しい自動判定モードを使用してください。" | ||||
|             "auto-mode-depreciated": "本オプションは非推奨になりました。新しい自動判定モードを使用してください。", | ||||
|             "none": "なし", | ||||
|             "other": "その他" | ||||
|         }, | ||||
|         "sections-label": { | ||||
|             "birth-message": "接続時の送信メッセージ(Birthメッセージ)", | ||||
|   | ||||
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/ko/messages.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/ko/messages.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/ru/messages.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/node_modules/@node-red/nodes/locales/ru/messages.json
									
									
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -43,37 +43,40 @@ function load(disableNodePathScan) { | ||||
|     return loadModuleFiles(modules); | ||||
| } | ||||
|  | ||||
| function splitPath(p) { | ||||
|     return path.posix.normalize((p || '').replace(/\\/g, path.sep)).split(path.sep) | ||||
| } | ||||
|  | ||||
| function loadModuleTypeFiles(module, type) { | ||||
|     const things = module[type]; | ||||
|     var first = true; | ||||
|     var promises = []; | ||||
|     for (var thingName in things) { | ||||
|     let first = true; | ||||
|     const promises = []; | ||||
|     for (let thingName in things) { | ||||
|         /* istanbul ignore else */ | ||||
|         if (things.hasOwnProperty(thingName)) { | ||||
|             if (module.name != "node-red" && first) { | ||||
|                 // Check the module directory exists | ||||
|                 first = false; | ||||
|                 var fn = things[thingName].file; | ||||
|                 var parts = fn.split("/"); | ||||
|                 var i = parts.length-1; | ||||
|                 for (;i>=0;i--) { | ||||
|                     if (parts[i] == "node_modules") { | ||||
|                         break; | ||||
|                     } | ||||
|                 let moduleFn = module.path | ||||
|                 const fn = things[thingName].file | ||||
|                 const parts = splitPath(fn) | ||||
|                 const nmi = parts.indexOf('node_modules') | ||||
|                 if(nmi > -1) { | ||||
|                     moduleFn = parts.slice(0,nmi+2).join(path.sep); | ||||
|                 } | ||||
|                 if (!moduleFn) { | ||||
|                     // shortcut - skip calling statSync on empty string  | ||||
|                     break; // Module not found, don't attempt to load its nodes | ||||
|                 } | ||||
|                 var moduleFn = parts.slice(0,i+2).join("/"); | ||||
|  | ||||
|                 try { | ||||
|                     var stat = fs.statSync(moduleFn); | ||||
|                     const stat = fs.statSync(moduleFn); | ||||
|                 } catch(err) { | ||||
|                     // Module not found, don't attempt to load its nodes | ||||
|                     break; | ||||
|                     break; // Module not found, don't attempt to load its nodes | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             try { | ||||
|                 var promise; | ||||
|                 let promise; | ||||
|                 if (type === "nodes") { | ||||
|                     promise = loadNodeConfig(things[thingName]); | ||||
|                 } else if (type === "plugins") { | ||||
| @@ -82,8 +85,7 @@ function loadModuleTypeFiles(module, type) { | ||||
|                 promises.push( | ||||
|                     promise.then( | ||||
|                         (function() { | ||||
|                             var m = module.name; | ||||
|                             var n = thingName; | ||||
|                             const n = thingName; | ||||
|                             return function(nodeSet) { | ||||
|                                 things[n] = nodeSet; | ||||
|                                 return nodeSet; | ||||
| @@ -93,7 +95,6 @@ function loadModuleTypeFiles(module, type) { | ||||
|                 ); | ||||
|             } catch(err) { | ||||
|                 console.log(err) | ||||
|                 // | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -125,38 +126,24 @@ function loadModuleFiles(modules) { | ||||
|     } | ||||
|     var pluginList; | ||||
|     var nodeList; | ||||
|  | ||||
|     return Promise.all(pluginPromises).then(function(results) { | ||||
|         pluginList = results.filter(r => !!r); | ||||
|         // Initial plugin load has happened. Ensure modules that provide | ||||
|         // plugins are in the registry now. | ||||
|         for (var module in modules) { | ||||
|             if (modules.hasOwnProperty(module)) { | ||||
|                 if (modules[module].plugins && Object.keys(modules[module].plugins).length > 0) { | ||||
|                     // Add the modules for plugins | ||||
|                     if (!modules[module].err) { | ||||
|                         registry.addModule(modules[module]); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return loadNodeSetList(pluginList); | ||||
|     }).then(function() { | ||||
|         return Promise.all(nodePromises); | ||||
|         return Promise.all(nodePromises) | ||||
|     }).then(function(results) { | ||||
|         nodeList = results.filter(r => !!r); | ||||
|         // Initial node load has happened. Ensure remaining modules are in the registry | ||||
|         for (var module in modules) { | ||||
|             if (modules.hasOwnProperty(module)) { | ||||
|                 if (!modules[module].plugins || Object.keys(modules[module].plugins).length === 0) { | ||||
|                     if (!modules[module].err) { | ||||
|                         registry.addModule(modules[module]); | ||||
|                     } | ||||
|                 if (!modules[module].err) { | ||||
|                     registry.addModule(modules[module]); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     }).then(function() { | ||||
|         return loadNodeSetList(pluginList); | ||||
|     }).then(function() { | ||||
|         return loadNodeSetList(nodeList); | ||||
|     }); | ||||
|     }) | ||||
| } | ||||
|  | ||||
| async function loadPluginTemplate(plugin) { | ||||
|   | ||||
| @@ -106,8 +106,8 @@ function getLocalNodeFiles(dir, skipValidNodeRedModules) { | ||||
|     // when loading local files, if the path is a valid node-red module | ||||
|     // dont include it (will be picked up in scanTreeForNodesModules) | ||||
|     if(skipValidNodeRedModules && files.indexOf("package.json") >= 0) { | ||||
|         const package = getPackageDetails(dir) | ||||
|         if(package.isNodeRedModule) { | ||||
|         const packageDetails = getPackageDetails(dir) | ||||
|         if(packageDetails.isNodeRedModule) { | ||||
|             return {files: [], icons: []}; | ||||
|         } | ||||
|     } | ||||
| @@ -135,17 +135,17 @@ function getLocalNodeFiles(dir, skipValidNodeRedModules) { | ||||
|     return {files: result, icons: icons} | ||||
| } | ||||
|  | ||||
| function scanDirForNodesModules(dir,moduleName,package) { | ||||
| function scanDirForNodesModules(dir,moduleName,packageDetails) { | ||||
|     let results = []; | ||||
|     let scopeName; | ||||
|     let files | ||||
|     try { | ||||
|         let isNodeRedModule = false | ||||
|         if(package) { | ||||
|             dir = path.join(package.moduleDir,'..') | ||||
|             files = [path.basename(package.moduleDir)] | ||||
|             moduleName =  (package.package ? package.package.name : null) || moduleName | ||||
|             isNodeRedModule = package.isNodeRedModule | ||||
|         if(packageDetails) { | ||||
|             dir = path.join(packageDetails.moduleDir,'..') | ||||
|             files = [path.basename(packageDetails.moduleDir)] | ||||
|             moduleName =  (packageDetails.package ? packageDetails.package.name : null) || moduleName | ||||
|             isNodeRedModule = packageDetails.isNodeRedModule | ||||
|         } else { | ||||
|             files = fs.readdirSync(dir); | ||||
|             if (moduleName) { | ||||
| @@ -156,6 +156,16 @@ function scanDirForNodesModules(dir,moduleName,package) { | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // if we have found a package.json, this IS a node_module, lets see if it is a node-red node | ||||
|         if (!isNodeRedModule && files.indexOf('package.json') > -1) { | ||||
|             packageDetails = getPackageDetails(dir) // get package details | ||||
|             if(packageDetails && packageDetails.isNodeRedModule) { | ||||
|                 isNodeRedModule = true | ||||
|                 files = ['package.json'] // shortcut the file scan | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         for (let i=0;i<files.length;i++) { | ||||
|             let fn = files[i]; | ||||
|             if (!isNodeRedModule && /^@/.test(fn)) { | ||||
| @@ -169,8 +179,8 @@ function scanDirForNodesModules(dir,moduleName,package) { | ||||
|             } else { | ||||
|                 if ((isNodeRedModule || (!moduleName || fn == moduleName)) && (isIncluded(fn) && !isExcluded(fn))) { | ||||
|                     try { | ||||
|                         const moduleDir = isNodeRedModule ? package.moduleDir : path.join(dir,fn); | ||||
|                         const pkg = package || getPackageDetails(moduleDir) | ||||
|                         const moduleDir = isNodeRedModule ? packageDetails.moduleDir : path.join(dir,fn); | ||||
|                         const pkg = packageDetails || getPackageDetails(moduleDir) | ||||
|                         if(pkg.error) { | ||||
|                             throw pkg.error | ||||
|                         } | ||||
|   | ||||
| @@ -185,10 +185,17 @@ function loadNodeConfigs() { | ||||
| function addModule(module) { | ||||
|     moduleNodes[module.name] = []; | ||||
|     moduleConfigs[module.name] = module; | ||||
|     // console.log("registry.js.addModule",module.name,"user?",module.user,"usedBy",module.usedBy,"dependencies",module.dependencies) | ||||
|     for (var setName in module.nodes) { | ||||
|     for (const setName in module.nodes) { | ||||
|         if (module.nodes.hasOwnProperty(setName)) { | ||||
|             var set = module.nodes[setName]; | ||||
|             const set = module.nodes[setName]; | ||||
|             if (!set.types) { | ||||
|                 const err = new Error("Set has no types") | ||||
|                 err.code = "set_has_no_types" | ||||
|                 err.details = { | ||||
|                     ...set | ||||
|                 } | ||||
|                 set.err = err | ||||
|             } | ||||
|             moduleNodes[module.name].push(set.name); | ||||
|             nodeList.push(set.id); | ||||
|             if (!set.err) { | ||||
|   | ||||
| @@ -818,6 +818,16 @@ function handlePreRoute(flow, sendEvent, reportError) { | ||||
|     }) | ||||
| } | ||||
|  | ||||
| function deliverMessageToDestination(sendEvent) { | ||||
|     if (sendEvent?.destination?.node) { | ||||
|         try { | ||||
|             sendEvent.destination.node.receive(sendEvent.msg); | ||||
|         } catch(err) { | ||||
|             Log.error(`Error delivering message to node:${sendEvent.destination.node._path} [${sendEvent.destination.node.type}]`) | ||||
|             Log.error(err.stack) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| function handlePreDeliver(flow,sendEvent, reportError) { | ||||
|     // preDeliver - the local router has identified the node it is going to send to. At this point, the message has been cloned if needed. | ||||
|     hooks.trigger("preDeliver",sendEvent,(err) => { | ||||
| @@ -827,15 +837,10 @@ function handlePreDeliver(flow,sendEvent, reportError) { | ||||
|         } else if (err !== false) { | ||||
|             if (asyncMessageDelivery) { | ||||
|                 setImmediate(function() { | ||||
|                     if (sendEvent.destination.node) { | ||||
|                         sendEvent.destination.node.receive(sendEvent.msg); | ||||
|                     } | ||||
|                     deliverMessageToDestination(sendEvent) | ||||
|                 }) | ||||
|             } else { | ||||
|                 if (sendEvent.destination.node) { | ||||
|                     sendEvent.destination.node.receive(sendEvent.msg); | ||||
|  | ||||
|                 } | ||||
|                 deliverMessageToDestination(sendEvent) | ||||
|             } | ||||
|             // postDeliver - the message has been dispatched to be delivered asynchronously (unless the sync delivery flag is set, in which case it would be continue as synchronous delivery) | ||||
|             hooks.trigger("postDeliver", sendEvent, function(err) { | ||||
|   | ||||
| @@ -641,6 +641,7 @@ function getFlow(id) { | ||||
|                 if (node.type === 'link out') { | ||||
|                     delete node.wires; | ||||
|                 } | ||||
|                 delete node.credentials; | ||||
|                 return node; | ||||
|             }) | ||||
|         } | ||||
| @@ -648,7 +649,10 @@ function getFlow(id) { | ||||
|     if (flow.configs) { | ||||
|         var configIds = Object.keys(flow.configs); | ||||
|         result.configs = configIds.map(function(configId) { | ||||
|             return clone(flow.configs[configId]); | ||||
|             const node = clone(flow.configs[configId]); | ||||
|             delete node.credentials; | ||||
|             return node | ||||
|  | ||||
|         }) | ||||
|         if (result.configs.length === 0) { | ||||
|             delete result.configs; | ||||
| @@ -660,12 +664,16 @@ function getFlow(id) { | ||||
|             var subflow = clone(flow.subflows[subflowId]); | ||||
|             var nodeIds = Object.keys(subflow.nodes); | ||||
|             subflow.nodes = nodeIds.map(function(id) { | ||||
|                 return subflow.nodes[id]; | ||||
|                 const node = clone(subflow.nodes[id]) | ||||
|                 delete node.credentials | ||||
|                 return node | ||||
|             }); | ||||
|             if (subflow.configs) { | ||||
|                 var configIds = Object.keys(subflow.configs); | ||||
|                 subflow.configs = configIds.map(function(id) { | ||||
|                     return subflow.configs[id]; | ||||
|                     const node = clone(subflow.configs[id]) | ||||
|                     delete node.credentials | ||||
|                     return node | ||||
|                 }) | ||||
|             } | ||||
|             delete subflow.instances; | ||||
|   | ||||
| @@ -199,7 +199,9 @@ function parseConfig(config) { | ||||
|                if (subflowDetails) { | ||||
|                    var subflowType = subflowDetails[1] | ||||
|                    n.subflow = subflowType; | ||||
|                    flow.subflows[subflowType].instances.push(n) | ||||
|                    if (flow.subflows[subflowType]) { | ||||
|                        flow.subflows[subflowType].instances.push(n) | ||||
|                    } | ||||
|                } | ||||
|                if (container) { | ||||
|                    container.nodes[n.id] = n; | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user