@node-red/nodes 3.1.0-beta.4 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/core/common/20-inject.html +1 -1
  2. package/core/common/20-inject.js +2 -3
  3. package/core/common/21-debug.html +136 -1
  4. package/core/common/60-link.html +1 -1
  5. package/core/common/lib/debug/debug-utils.js +17 -138
  6. package/core/common/lib/debug/debug.js +5 -0
  7. package/core/function/10-function.html +10 -9
  8. package/core/function/10-function.js +2 -1
  9. package/core/function/10-switch.html +32 -3
  10. package/core/function/15-change.html +26 -55
  11. package/core/function/16-range.html +6 -1
  12. package/core/function/80-template.html +1 -1
  13. package/core/function/89-delay.js +1 -1
  14. package/core/function/90-exec.html +1 -1
  15. package/core/function/rbe.html +4 -2
  16. package/core/network/10-mqtt.html +2 -2
  17. package/core/network/10-mqtt.js +17 -17
  18. package/core/network/21-httprequest.js +1 -4
  19. package/core/parsers/70-CSV.js +16 -13
  20. package/core/parsers/70-HTML.html +2 -2
  21. package/core/parsers/70-JSON.html +1 -0
  22. package/core/parsers/70-XML.html +2 -1
  23. package/core/parsers/70-YAML.html +1 -0
  24. package/core/sequence/17-split.html +17 -2
  25. package/core/storage/10-file.html +2 -2
  26. package/core/storage/10-file.js +6 -1
  27. package/icons/arduino.svg +1 -0
  28. package/icons/bluetooth.svg +1 -0
  29. package/icons/leveldb.svg +1 -0
  30. package/icons/mongodb.svg +1 -0
  31. package/icons/mouse.svg +1 -0
  32. package/icons/rbe.svg +1 -0
  33. package/icons/redis.svg +1 -0
  34. package/locales/de/function/10-function.html +1 -1
  35. package/locales/en-US/function/10-function.html +1 -1
  36. package/locales/fr/common/20-inject.html +1 -1
  37. package/locales/fr/function/10-function.html +1 -1
  38. package/locales/fr/messages.json +82 -82
  39. package/locales/ja/function/10-function.html +1 -1
  40. package/locales/ko/function/10-function.html +1 -1
  41. package/locales/pt-BR/function/10-function.html +1 -1
  42. package/locales/pt-BR/messages.json +0 -0
  43. package/locales/ru/function/10-function.html +1 -1
  44. package/locales/zh-CN/function/10-function.html +1 -1
  45. package/locales/zh-TW/function/10-function.html +1 -1
  46. package/package.json +4 -4
  47. package/icons/arduino.png +0 -0
  48. package/icons/bluetooth.png +0 -0
  49. package/icons/leveldb.png +0 -0
  50. package/icons/mongodb.png +0 -0
  51. package/icons/mouse.png +0 -0
  52. package/icons/rbe.png +0 -0
  53. package/icons/redis.png +0 -0
@@ -56,9 +56,11 @@
56
56
  inout: {value:"out"},
57
57
  septopics: {value:true},
58
58
  property: {value:"payload", required:true,
59
- label:RED._("node-red:rbe.label.property")},
59
+ label:RED._("node-red:rbe.label.property"),
60
+ validate: RED.validators.typedInput({ type: 'msg' })},
60
61
  topi: {value:"topic", required:true,
61
- label:RED._("node-red:rbe.label.topic")}
62
+ label:RED._("node-red:rbe.label.topic"),
63
+ validate: RED.validators.typedInput({ type: 'msg' })}
62
64
  },
63
65
  inputs:1,
64
66
  outputs:1,
@@ -492,12 +492,12 @@
492
492
  let ok = true;
493
493
  if ($("#node-config-input-clientid").length) {
494
494
  // Currently editing the node
495
- let needClientId = !$("#node-config-input-cleansession").is(":checked") || !$("#node-config-input-autoUnsubscribe").is(":checked")
495
+ let needClientId = !$("#node-config-input-cleansession").is(":checked")
496
496
  if (needClientId) {
497
497
  ok = (v||"").length > 0;
498
498
  }
499
499
  } else {
500
- let needClientId = !(this.cleansession===undefined || this.cleansession) || this.autoUnsubscribe;
500
+ let needClientId = !(this.cleansession===undefined || this.cleansession)
501
501
  if (needClientId) {
502
502
  ok = (v||"").length > 0;
503
503
  }
@@ -24,7 +24,6 @@ module.exports = function(RED) {
24
24
  "text/css":"string",
25
25
  "text/html":"string",
26
26
  "text/plain":"string",
27
- "text/html":"string",
28
27
  "application/json":"json",
29
28
  "application/octet-stream":"buffer",
30
29
  "application/pdf":"buffer",
@@ -105,6 +104,7 @@ module.exports = function(RED) {
105
104
  * @returns `true` if it is a valid topic
106
105
  */
107
106
  function isValidPublishTopic(topic) {
107
+ if (topic.length === 0) return false;
108
108
  return !/[\+#\b\f\n\r\t\v\0]/.test(topic);
109
109
  }
110
110
 
@@ -220,8 +220,8 @@ module.exports = function(RED) {
220
220
  */
221
221
  function subscriptionHandler(node, datatype ,topic, payload, packet) {
222
222
  const msg = {topic:topic, payload:null, qos:packet.qos, retain:packet.retain};
223
- const v5 = (node && node.brokerConn)
224
- ? node.brokerConn.v5()
223
+ const v5 = (node && node.brokerConn)
224
+ ? node.brokerConn.v5()
225
225
  : Object.prototype.hasOwnProperty.call(packet, "properties");
226
226
  if(v5 && packet.properties) {
227
227
  setStrProp(packet.properties, msg, "responseTopic");
@@ -452,7 +452,7 @@ module.exports = function(RED) {
452
452
 
453
453
  /**
454
454
  * Perform the disconnect action
455
- * @param {MQTTInNode|MQTTOutNode} node
455
+ * @param {MQTTInNode|MQTTOutNode} node
456
456
  * @param {Function} done
457
457
  */
458
458
  function handleDisconnectAction(node, done) {
@@ -612,7 +612,7 @@ module.exports = function(RED) {
612
612
  node.brokerurl = node.url;
613
613
  } else {
614
614
  // if the broker is ws:// or wss:// or tcp://
615
- if (node.broker.indexOf("://") > -1) {
615
+ if ((typeof node.broker === 'string') && node.broker.indexOf("://") > -1) {
616
616
  node.brokerurl = node.broker;
617
617
  // Only for ws or wss, check if proxy env var for additional configuration
618
618
  if (node.brokerurl.indexOf("wss://") > -1 || node.brokerurl.indexOf("ws://") > -1) {
@@ -866,7 +866,7 @@ module.exports = function(RED) {
866
866
  * Call end and wait for the client to end (or timeout)
867
867
  * @param {mqtt.MqttClient} client The broker client
868
868
  * @param {number} ms The time to wait for the client to end
869
- * @returns
869
+ * @returns
870
870
  */
871
871
  let waitEnd = (client, ms) => {
872
872
  return new Promise( (resolve, reject) => {
@@ -906,7 +906,7 @@ module.exports = function(RED) {
906
906
  node.subid = 1;
907
907
 
908
908
  //typedef for subscription object:
909
- /**
909
+ /**
910
910
  * @typedef {Object} Subscription
911
911
  * @property {String} topic - topic to subscribe to
912
912
  * @property {Object} [options] - options object
@@ -934,7 +934,7 @@ module.exports = function(RED) {
934
934
  const ref = _ref || 0;
935
935
  let options
936
936
  let qos = 1 // default to QoS 1 (AWS and several other brokers don't support QoS 2)
937
-
937
+
938
938
  // if options is an object, then clone it
939
939
  if (typeof _options == "object") {
940
940
  options = RED.util.cloneMessage(_options || {})
@@ -948,7 +948,7 @@ module.exports = function(RED) {
948
948
  if (typeof qos === "number" && qos >= 0 && qos <= 2) {
949
949
  options.qos = qos;
950
950
  }
951
-
951
+
952
952
  subscription.topic = _topic;
953
953
  subscription.qos = qos;
954
954
  subscription.options = RED.util.cloneMessage(options);
@@ -958,16 +958,16 @@ module.exports = function(RED) {
958
958
  }
959
959
 
960
960
  /**
961
- * If topic is a subscription object, then use that, otherwise look up the topic in
961
+ * If topic is a subscription object, then use that, otherwise look up the topic in
962
962
  * the subscriptions object. If the topic is not found, then create a new subscription
963
963
  * object and add it to the subscriptions object.
964
- * @param {Subscription|String} topic
965
- * @param {*} options
966
- * @param {*} callback
967
- * @param {*} ref
964
+ * @param {Subscription|String} topic
965
+ * @param {*} options
966
+ * @param {*} callback
967
+ * @param {*} ref
968
968
  */
969
969
  node.subscribe = function (topic, options, callback, ref) {
970
- /** @type {Subscription} */
970
+ /** @type {Subscription} */
971
971
  let subscription
972
972
  let doCompare = false
973
973
  let changesFound = false
@@ -1005,7 +1005,7 @@ module.exports = function(RED) {
1005
1005
  _brokerConn.unsubscribe(sub.topic, sub.ref, true)
1006
1006
  }
1007
1007
  })
1008
-
1008
+
1009
1009
  // if subscription is found (or sent in as a parameter), then check for changes.
1010
1010
  // if there are any changes requested, tidy up the old subscription
1011
1011
  if (subscription) {
@@ -1092,7 +1092,7 @@ module.exports = function(RED) {
1092
1092
  delete sub[ref]
1093
1093
  }
1094
1094
  }
1095
- // if instructed to remove the actual MQTT client subscription
1095
+ // if instructed to remove the actual MQTT client subscription
1096
1096
  if (unsub) {
1097
1097
  // if there are no more subscriptions for the topic, then remove the topic
1098
1098
  if (Object.keys(sub).length === 0) {
@@ -452,10 +452,6 @@ in your Node-RED user directory (${RED.settings.userDir}).
452
452
  formData.append(opt, val);
453
453
  } else if (typeof val === 'object' && val.hasOwnProperty('value')) {
454
454
  formData.append(opt,val.value,val.options || {});
455
- } else if (Array.isArray(val)) {
456
- for (var i=0; i<val.length; i++) {
457
- formData.append(opt, val[i])
458
- }
459
455
  } else {
460
456
  formData.append(opt,JSON.stringify(val));
461
457
  }
@@ -637,6 +633,7 @@ in your Node-RED user directory (${RED.settings.userDir}).
637
633
  msg.payload = msg.payload.toString('utf8'); // txt
638
634
 
639
635
  if (node.ret === "obj") {
636
+ if (msg.statusCode == 204){msg.payload= "{}"};
640
637
  try { msg.payload = JSON.parse(msg.payload); } // obj
641
638
  catch(e) { node.warn(RED._("httpin.errors.json-error")); }
642
639
  }
@@ -63,7 +63,7 @@ module.exports = function(RED) {
63
63
  if (!(notemplate && (msg.hasOwnProperty("parts") && msg.parts.hasOwnProperty("index") && msg.parts.index > 0))) {
64
64
  template = clean(node.template);
65
65
  }
66
- var ou = "";
66
+ const ou = [];
67
67
  if (!Array.isArray(msg.payload)) { msg.payload = [ msg.payload ]; }
68
68
  if (node.hdrout !== "none" && node.hdrSent === false) {
69
69
  if ((template.length === 1) && (template[0] === '')) {
@@ -74,7 +74,7 @@ module.exports = function(RED) {
74
74
  template = Object.keys(msg.payload[0]);
75
75
  }
76
76
  }
77
- ou += template.map(v => v.indexOf(node.sep)!==-1 ? '"'+v+'"' : v).join(node.sep) + node.ret;
77
+ ou.push(template.map(v => v.indexOf(node.sep)!==-1 ? '"'+v+'"' : v).join(node.sep));
78
78
  if (node.hdrout === "once") { node.hdrSent = true; }
79
79
  }
80
80
  for (var s = 0; s < msg.payload.length; s++) {
@@ -93,7 +93,7 @@ module.exports = function(RED) {
93
93
  msg.payload[s][t] = node.quo + msg.payload[s][t].toString() + node.quo;
94
94
  }
95
95
  }
96
- ou += msg.payload[s].join(node.sep) + node.ret;
96
+ ou.push(msg.payload[s].join(node.sep));
97
97
  }
98
98
  else {
99
99
  if ((template.length === 1) && (template[0] === '') && (msg.hasOwnProperty("columns"))) {
@@ -105,6 +105,7 @@ module.exports = function(RED) {
105
105
  node.warn(RED._("csv.errors.obj_csv"));
106
106
  tmpwarn = false;
107
107
  }
108
+ const row = [];
108
109
  for (var p in msg.payload[0]) {
109
110
  /* istanbul ignore else */
110
111
  if (msg.payload[s].hasOwnProperty(p)) {
@@ -118,21 +119,22 @@ module.exports = function(RED) {
118
119
  }
119
120
  if (q.indexOf(node.quo) !== -1) { // add double quotes if any quotes
120
121
  q = q.replace(/"/g, '""');
121
- ou += node.quo + q + node.quo + node.sep;
122
+ row.push(node.quo + q + node.quo);
122
123
  }
123
124
  else if (q.indexOf(node.sep) !== -1 || p.indexOf("\n") !== -1) { // add quotes if any "commas" or "\n"
124
- ou += node.quo + q + node.quo + node.sep;
125
+ row.push(node.quo + q + node.quo);
125
126
  }
126
- else { ou += q + node.sep; } // otherwise just add
127
+ else { row.push(q); } // otherwise just add
127
128
  }
128
129
  }
129
130
  }
130
- ou = ou.slice(0,-1) + node.ret;
131
+ ou.push(row.join(node.sep)); // add separator
131
132
  }
132
133
  else {
134
+ const row = [];
133
135
  for (var t=0; t < template.length; t++) {
134
136
  if (template[t] === '') {
135
- ou += node.sep;
137
+ row.push('');
136
138
  }
137
139
  else {
138
140
  var tt = template[t];
@@ -146,19 +148,20 @@ module.exports = function(RED) {
146
148
  p = RED.util.ensureString(p);
147
149
  if (p.indexOf(node.quo) !== -1) { // add double quotes if any quotes
148
150
  p = p.replace(/"/g, '""');
149
- ou += node.quo + p + node.quo + node.sep;
151
+ row.push(node.quo + p + node.quo);
150
152
  }
151
153
  else if (p.indexOf(node.sep) !== -1 || p.indexOf("\n") !== -1) { // add quotes if any "commas" or "\n"
152
- ou += node.quo + p + node.quo + node.sep;
154
+ row.push(node.quo + p + node.quo);
153
155
  }
154
- else { ou += p + node.sep; } // otherwise just add
156
+ else { row.push(p); } // otherwise just add
155
157
  }
156
158
  }
157
- ou = ou.slice(0,-1) + node.ret; // remove final "comma" and add "newline"
159
+ ou.push(row.join(node.sep)); // add separator
158
160
  }
159
161
  }
160
162
  }
161
- msg.payload = ou;
163
+ // join lines, don't forget to add the last new line
164
+ msg.payload = ou.join(node.ret) + node.ret;
162
165
  msg.columns = template.map(v => v.indexOf(',')!==-1 ? '"'+v+'"' : v).join(',');
163
166
  if (msg.payload !== '') { send(msg); }
164
167
  done();
@@ -41,8 +41,8 @@
41
41
  color:"#DEBD5C",
42
42
  defaults: {
43
43
  name: {value:""},
44
- property: {value:"payload"},
45
- outproperty: {value:"payload"},
44
+ property: {value:"payload", validate: RED.validators.typedInput({ type: 'msg' }) },
45
+ outproperty: {value:"payload", validate: RED.validators.typedInput({ type: 'msg' }) },
46
46
  tag: {value:""},
47
47
  ret: {value:"html"},
48
48
  as: {value:"single"}
@@ -32,6 +32,7 @@
32
32
  defaults: {
33
33
  name: {value:""},
34
34
  property: {value:"payload",required:true,
35
+ validate: RED.validators.typedInput({ type: 'msg' }),
35
36
  label:RED._("node-red:json.label.property")},
36
37
  action: {value:""},
37
38
  pretty: {value:false}
@@ -27,7 +27,8 @@
27
27
  defaults: {
28
28
  name: {value:""},
29
29
  property: {value:"payload",required:true,
30
- label:RED._("node-red:common.label.property")},
30
+ label:RED._("node-red:common.label.property"),
31
+ validate: RED.validators.typedInput({ type: 'msg' })},
31
32
  attr: {value:""},
32
33
  chr: {value:""}
33
34
  },
@@ -16,6 +16,7 @@
16
16
  color:"#DEBD5C",
17
17
  defaults: {
18
18
  property: {value:"payload",required:true,
19
+ validate: RED.validators.typedInput({ type: 'msg' }),
19
20
  label:RED._("node-red:common.label.property")},
20
21
  name: {value:""}
21
22
  },
@@ -57,7 +57,7 @@
57
57
  arraySplt: {value:1},
58
58
  arraySpltType: {value:"len"},
59
59
  stream: {value:false},
60
- addname: {value:""}
60
+ addname: {value:"", validate: RED.validators.typedInput({ type: 'msg', allowBlank: true })}
61
61
  },
62
62
  inputs:1,
63
63
  outputs:1,
@@ -208,7 +208,22 @@
208
208
  validate:RED.validators.typedInput("propertyType", false)
209
209
  },
210
210
  propertyType: { value:"msg"},
211
- key: {value:"topic"},
211
+ key: {value:"topic", validate: (function () {
212
+ const typeValidator = RED.validators.typedInput({ type: 'msg' })
213
+ return function(v, opt) {
214
+ const joinMode = $("#node-input-mode").val() || this.mode
215
+ if (joinMode !== 'custom') {
216
+ return true
217
+ }
218
+ const buildType = $("#node-input-build").val() || this.build
219
+ if (buildType !== 'object') {
220
+ return true
221
+ } else {
222
+ return typeValidator(v, opt)
223
+ }
224
+ }
225
+ })()
226
+ },
212
227
  joiner: { value:"\\n"},
213
228
  joinerType: { value:"str"},
214
229
  accumulate: { value:"false" },
@@ -198,7 +198,7 @@
198
198
  category: 'storage',
199
199
  defaults: {
200
200
  name: {value:""},
201
- filename: {value:""},
201
+ filename: {value:"", validate: RED.validators.typedInput({ typeField: 'filenameType' })},
202
202
  filenameType: {value:"str"},
203
203
  appendNewline: {value:true},
204
204
  createDir: {value:false},
@@ -297,7 +297,7 @@
297
297
  category: 'storage',
298
298
  defaults: {
299
299
  name: {value:""},
300
- filename: {value:""},
300
+ filename: {value:"", validate: RED.validators.typedInput({ typeField: 'filenameType' }) },
301
301
  filenameType: {value:"str"},
302
302
  format: {value:"utf8"},
303
303
  chunk: {value:false},
@@ -68,6 +68,9 @@ module.exports = function(RED) {
68
68
  node.error(err,msg);
69
69
  return done();
70
70
  } else {
71
+ if (typeof value !== 'string' && value !== null && value !== undefined) {
72
+ value = value.toString();
73
+ }
71
74
  processMsg2(msg,nodeSend,value,done);
72
75
  }
73
76
  });
@@ -278,7 +281,6 @@ module.exports = function(RED) {
278
281
  }
279
282
  RED.nodes.registerType("file",FileNode);
280
283
 
281
-
282
284
  function FileInNode(n) {
283
285
  // Read a file
284
286
  RED.nodes.createNode(this,n);
@@ -314,6 +316,9 @@ module.exports = function(RED) {
314
316
  node.error(err,msg);
315
317
  return done();
316
318
  } else {
319
+ if (typeof value !== 'string' && value !== null && value !== undefined) {
320
+ value = value.toString();
321
+ }
317
322
  processMsg2(msg, nodeSend, (value || "").replace(/\t|\r|\n/g,''), nodeDone);
318
323
  }
319
324
  });
@@ -0,0 +1 @@
1
+ <svg width="40" height="60" viewBox="0, 0, 40, 60" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#fff"><path d="m9.7884 22.379c-5.2427-0.41732-9.6475 5.7885-7.4975 10.585 2.0949 5.2041 9.9782 6.6154 13.727 2.4477 3.633-3.5613 5.0332-9.0411 9.4821-11.853 4.5205-3.0872 11.797-0.172 12.68 5.3144 0.86 5.2537-4.8017 10.364-9.9231 8.8205-3.7873-0.85449-6.5051-4.0905-8.0487-7.4975-1.9019-3.2526-4.3882-6.7257-8.2693-7.6077-0.6891-0.15656-1.4003-0.21831-2.1059-0.21721z" stroke-width="3.3"/><path d="m6.7012 29.821h6.6154" stroke-width="1.4"/><path d="m26.988 29.821h5.5128m-2.8115-2.7564v5.5128" stroke-width="1.8"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg width="40" height="60" viewBox="0, 0, 40, 60" xmlns="http://www.w3.org/2000/svg"><path d="m8.3474 17.75 22.298 22.444-10.747 13.013v-46.497l10.747 12.428-22.298 21.859" fill="none" stroke="#fff" stroke-width="4"/></svg>
@@ -0,0 +1 @@
1
+ <svg width="40" height="60" viewBox="0, 0, 40, 60" xmlns="http://www.w3.org/2000/svg"><path d="m2.7078 12.986c0 7.7994-0.36386 21.569 0 32.545s35.118 9.8751 34.848 0c-0.26959-9.8751 0-24.82 0-32.545 0-7.7243-34.848-7.7995-34.848 0z" fill="none" stroke="#fff"/><g fill="#fff"><path d="m3.8741 13.406v8.955c0.021834 3.5781 19.543 5.0789 25.575 3.2543 0 0 0.02229-2.6683 0.02998-2.6673l5.5325 0.7238c0.64508 0.0844 1.1345-0.74597 1.134-1.3284v-8.573l-0.99896 0.93349-15.217-2.2765c4.5883 2.1798 9.808 4.1312 9.808 4.1312-9.3667 3.1562-25.846-0.31965-25.864-3.1525z"/><path d="m3.886 26.607v8.1052c3.2188 6.1087 29.901 5.8574 32.272 0v-8.1052c-3.3598 4.6685-29.204 5.1534-32.272 0z"/><path d="m4.0032 39.082v7.1522c2.556 7.4622 28.918 7.6072 32.272 0v-7.1522c-3.2345 4.9471-29.087 5.359-32.272 0z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg width="40" height="60" viewBox="0, 0, 40, 60" xmlns="http://www.w3.org/2000/svg"><path d="m23.515 13.831c-4.7594-5.8789-2.6084-5.7751-7.3474 0-8.0368 10.477-8.3322 24.431 2.5476 32.935 0.13181 2.0418 0.46056 4.9803 0.46056 4.9803h1.315s0.32875-2.9219 0.46017-4.9803c2.8458-2.2339 16.799-14.619 2.5641-32.935z" fill="#fff"/></svg>
@@ -0,0 +1 @@
1
+ <svg width="40" height="60" viewBox="0, 0, 40, 60" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#fff" stroke-width="3"><path d="m6 30c6 5 24 4 29-0.07"/><path d="m21 33 0.1-19c0.02-4 4-3 4-6s-4-2-4-5"/><path d="m6 22c0-11 29-10 29 0v21c0 18-29 19-29 0s4e-7 -11 0-21z"/></g></svg>
package/icons/rbe.svg ADDED
@@ -0,0 +1 @@
1
+ <svg width="40" height="60" viewBox="0, 0, 40, 60" xmlns="http://www.w3.org/2000/svg"><path d="m29 12s0.1 30 0.05 31-3 5-7 5-19 0.04-19 0.04c6-4 9-5 17-5 0 0 4-0.1 4-2 0-2 8e-3 -29 8e-3 -29z" fill="#fff"/><path d="m12 47s-0.1-30-0.05-31 3-5 7-5 19-0.04 19-0.04c-6 4-9 5-17 5 0 0-4 0.1-4 2 0 2-8e-3 29-8e-3 29z" fill="#fff"/></svg>
@@ -0,0 +1 @@
1
+ <svg width="40" height="60" viewBox="0, 0, 40, 60" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#fff" stroke-width="3"><path class="cls-4" d="m17.639 30.221c-1.7087-0.88225-12.465-5.6284-14.414-6.636-1.9492-1.0075-1.9868-1.7073-0.075164-2.5188 1.9117-0.81145 12.643-5.3861 14.91-6.2738 2.2675-0.8877 3.0517-0.91493 4.9785-0.14704 1.9267 0.76789 12.026 5.1329 13.923 5.8898 1.8966 0.75699 1.9843 1.386 0.02631 2.4861-1.958 1.1001-12.1 5.6611-14.285 6.8729s-3.355 1.2091-5.0636 0.32685z"/><path class="cls-4" d="m32.23 25.251c2.8239 1.2039 4.155 1.764 4.7307 1.9938 1.8966 0.75699 1.9843 1.386 0.0263 2.4861s-12.1 5.6611-14.285 6.8729c-2.1848 1.2117-3.3548 1.209-5.0634 0.32676-1.7087-0.88225-12.465-5.6284-14.414-6.636-1.9492-1.0075-1.9868-1.7073-0.075164-2.5188 10.883-4.6196-9.1087 3.8612 4.9598-2.1076"/><path class="cls-4" d="m32.23 31.961c2.8239 1.2039 4.155 1.764 4.7307 1.9938 1.8966 0.75699 1.9843 1.386 0.0263 2.4861s-12.1 5.6611-14.285 6.8729c-2.1848 1.2117-3.3548 1.209-5.0634 0.32676-1.7087-0.88225-12.465-5.6284-14.414-6.636-1.9492-1.0075-1.9868-1.7073-0.075164-2.5188 10.883-4.6196-9.1087 3.8612 4.9598-2.1076"/></g></svg>
@@ -25,7 +25,7 @@
25
25
  <p>Wenn ein promise-Objekt aus dem Start-Code zurückgegeben wird,
26
26
  beginnt danach die reguläre Verarbeitung der Eingangsnachrichten.</p>
27
27
  <h3>Details</h3>
28
- <p>Siehe <a target="_blank" href="http://nodered.org/docs/writing-functions.html">Onlinedokumentation</a>
28
+ <p>Siehe <a target="_blank" href="https://nodered.org/docs/writing-functions.html">Onlinedokumentation</a>
29
29
  für weitere Informationen zum Schreiben von Funktionen.</p>
30
30
  <h4><b>Nachrichten senden</b></h4>
31
31
  <p>Die Funktion kann die Nachrichten zurückgeben, die sie an die nächsten Nodes im Flow weitergeben möchte,
@@ -26,7 +26,7 @@
26
26
  <p>If the On Start code returns a Promise object, the node will not start handling messages
27
27
  until the promise is resolved.</p>
28
28
  <h3>Details</h3>
29
- <p>See the <a target="_blank" href="http://nodered.org/docs/writing-functions.html">online documentation</a>
29
+ <p>See the <a target="_blank" href="https://nodered.org/docs/writing-functions.html">online documentation</a>
30
30
  for more information on writing functions.</p>
31
31
  <h4>Sending messages</h4>
32
32
  <p>The function can either return the messages it wants to pass on to the next nodes
@@ -36,5 +36,5 @@
36
36
  <p><b>Remarque</b> : Les options <i>"Intervalle entre les heures"</i> et <i>"à une heure précise"</i> utilisent le système cron standard.
37
37
  Cela signifie que pour la première option, vous pouvez envoyer un message à intervalle régulier entre les heures voulues.
38
38
  Si vous voulez envoyer un message toutes les minutes à partir de maintenant, utiliser l'option <i>"intervalle"</i>.</p>
39
- <p><b>Remarque</b> : Pour inclure une nouvelle ligne dans une chaîne, vous devez utiliser un noeud de fonction pour créer la charge utile.</p>
39
+ <p><b>Remarque</b> : Pour inclure une nouvelle ligne dans une chaîne, vous devez utiliser soit un noeud de fonction soit le noeud template pour créer la charge utile.</p>
40
40
  </script>
@@ -26,7 +26,7 @@
26
26
  <p>Si le code 'Au démarrage' renvoie un objet Promise (promesse), le noeud ne commencera pas à gérer les messages
27
27
  jusqu'à ce que la promesse soit résolue.</p>
28
28
  <h3>Détails</h3>
29
- <p>Voir la <a target="_blank" href="http://nodered.org/docs/writing-functions.html">documentation en ligne</a>
29
+ <p>Voir la <a target="_blank" href="https://nodered.org/docs/writing-functions.html">documentation en ligne</a>
30
30
  pour plus d'informations sur les fonctions d'écriture.</p>
31
31
  <h4>Envoi de messages</h4>
32
32
  <p>La fonction peut envoyer les messages qu'elle souhaite transmettre aux noeuds suivants