@node-red/runtime 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.
@@ -99,6 +99,9 @@ var api = module.exports = {
99
99
  safeSettings.markdownEditor = runtime.settings.editorTheme.markdownEditor || {};
100
100
  safeSettings.markdownEditor.mermaid = safeSettings.markdownEditor.mermaid || { enabled: true };
101
101
  }
102
+ if (runtime.settings.editorTheme.mermaid) {
103
+ safeSettings.mermaid = runtime.settings.editorTheme.mermaid
104
+ }
102
105
  }
103
106
  safeSettings.libraries = runtime.library.getLibraries();
104
107
  if (util.isArray(runtime.settings.paletteCategories)) {
package/lib/flows/Flow.js CHANGED
@@ -161,7 +161,8 @@ class Flow {
161
161
  for (let i = 0; i < configNodes.length; i++) {
162
162
  const node = this.flow.configs[configNodes[i]]
163
163
  if (node.type === 'global-config' && node.env) {
164
- const nodeEnv = await flowUtil.evaluateEnvProperties(this, node.env, credentials.get(node.id))
164
+ const globalCreds = credentials.get(node.id)?.map || {}
165
+ const nodeEnv = await flowUtil.evaluateEnvProperties(this, node.env, globalCreds)
165
166
  this._env = { ...this._env, ...nodeEnv }
166
167
  }
167
168
  }
@@ -73,9 +73,20 @@ class Subflow extends Flow {
73
73
  id: subflowInstance.id,
74
74
  configs: {},
75
75
  nodes: {},
76
+ groups: {},
76
77
  subflows: {}
77
78
  }
78
79
 
80
+ if (subflowDef.groups) {
81
+ // Clone all of the subflow group definitions and give them new IDs
82
+ for (i in subflowDef.groups) {
83
+ if (subflowDef.groups.hasOwnProperty(i)) {
84
+ node = createNodeInSubflow(subflowInstance.id,subflowDef.groups[i]);
85
+ node_map[node._alias] = node;
86
+ subflowInternalFlowConfig.groups[node.id] = node;
87
+ }
88
+ }
89
+ }
79
90
  if (subflowDef.configs) {
80
91
  // Clone all of the subflow config node definitions and give them new IDs
81
92
  for (i in subflowDef.configs) {
@@ -237,7 +248,7 @@ class Subflow extends Flow {
237
248
  for (j=0;j<wires.length;j++) {
238
249
  if (wires[j].id != self.subflowDef.id) {
239
250
  node = self.node_map[wires[j].id];
240
- if (node._originalWires) {
251
+ if (node && node._originalWires) {
241
252
  node.wires = clone(node._originalWires);
242
253
  }
243
254
  }
@@ -254,8 +265,10 @@ class Subflow extends Flow {
254
265
  subflowInstanceModified = true;
255
266
  } else {
256
267
  node = self.node_map[wires[j].id];
257
- node.wires[wires[j].port] = node.wires[wires[j].port].concat(newWires[i]);
258
- modifiedNodes[node.id] = node;
268
+ if (node) {
269
+ node.wires[wires[j].port] = node.wires[wires[j].port].concat(newWires[i]);
270
+ modifiedNodes[node.id] = node;
271
+ }
259
272
  }
260
273
  }
261
274
  }
@@ -283,10 +296,14 @@ class Subflow extends Flow {
283
296
  this.node._updateWires(subflowInstanceConfig.wires);
284
297
  } else {
285
298
  var node = self.node_map[wires[j].id];
286
- if (!node._originalWires) {
287
- node._originalWires = clone(node.wires);
299
+ if (node) {
300
+ if (!node._originalWires) {
301
+ node._originalWires = clone(node.wires);
302
+ }
303
+ node.wires[wires[j].port] = (node.wires[wires[j].port]||[]).concat(this.subflowInstance.wires[i]);
304
+ } else {
305
+ this.error("Unknown node referenced inside subflow: " + wires[j].id)
288
306
  }
289
- node.wires[wires[j].port] = (node.wires[wires[j].port]||[]).concat(this.subflowInstance.wires[i]);
290
307
  }
291
308
  }
292
309
  }
@@ -302,11 +319,15 @@ class Subflow extends Flow {
302
319
  this.node._updateWires(subflowInstanceConfig.wires);
303
320
  } else {
304
321
  var node = self.node_map[wires[j].id];
305
- if (!node._originalWires) {
306
- node._originalWires = clone(node.wires);
322
+ if (node) {
323
+ if (!node._originalWires) {
324
+ node._originalWires = clone(node.wires);
325
+ }
326
+ node.wires[wires[j].port] = (node.wires[wires[j].port]||[]);
327
+ node.wires[wires[j].port].push(subflowStatusId);
328
+ } else {
329
+ this.error("Unknown node referenced inside subflow: " + wires[j].id)
307
330
  }
308
- node.wires[wires[j].port] = (node.wires[wires[j].port]||[]);
309
- node.wires[wires[j].port].push(subflowStatusId);
310
331
  }
311
332
  }
312
333
  }
@@ -479,7 +500,7 @@ function remapSubflowNodes(nodes,nodeMap) {
479
500
  }
480
501
  }
481
502
  }
482
- if ((node.type === 'complete' || node.type === 'catch' || node.type === 'status') && node.scope) {
503
+ if ((node.type === 'complete' || node.type === 'catch' || node.type === 'status') && Array.isArray(node.scope)) {
483
504
  node.scope = node.scope.map(function(id) {
484
505
  return nodeMap[id]?nodeMap[id].id:""
485
506
  })
package/lib/flows/util.js CHANGED
@@ -57,18 +57,20 @@ var EnvVarPropertyRE = /^\${(\S+)}$/;
57
57
 
58
58
 
59
59
  function mapEnvVarProperties(obj,prop,flow,config) {
60
- var v = obj[prop];
60
+ const v = obj[prop];
61
61
  if (Buffer.isBuffer(v)) {
62
62
  return;
63
63
  } else if (Array.isArray(v)) {
64
- for (var i=0;i<v.length;i++) {
64
+ for (let i=0;i<v.length;i++) {
65
65
  mapEnvVarProperties(v,i,flow,config);
66
66
  }
67
67
  } else if (typeof obj[prop] === 'string') {
68
68
  if (obj[prop][0] === "$" && (EnvVarPropertyRE_old.test(v) || EnvVarPropertyRE.test(v)) ) {
69
- var envVar = v.substring(2,v.length-1);
70
- var r = redUtil.getSetting(config, envVar, flow);
71
- obj[prop] = r ? r : obj[prop];
69
+ const envVar = v.substring(2,v.length-1);
70
+ const r = redUtil.getSetting(config, envVar, flow);
71
+ if (r !== undefined && r !== '') {
72
+ obj[prop] = r
73
+ }
72
74
  }
73
75
  } else {
74
76
  for (var p in v) {
@@ -80,6 +82,7 @@ function mapEnvVarProperties(obj,prop,flow,config) {
80
82
  }
81
83
 
82
84
  async function evaluateEnvProperties(flow, env, credentials) {
85
+ credentials = credentials || {}
83
86
  const pendingEvaluations = []
84
87
  const evaluatedEnv = {}
85
88
  const envTypes = []
@@ -112,6 +115,7 @@ async function evaluateEnvProperties(flow, env, credentials) {
112
115
  if (pendingEvaluations.length > 0) {
113
116
  await Promise.all(pendingEvaluations)
114
117
  }
118
+ // Now loop over the env types and evaluate them properly
115
119
  for (let i = 0; i < envTypes.length; i++) {
116
120
  let { name, value, type } = envTypes[i]
117
121
  // If an env-var wants to lookup itself, delegate straight to the parent
@@ -122,7 +126,17 @@ async function evaluateEnvProperties(flow, env, credentials) {
122
126
  if (evaluatedEnv.hasOwnProperty(value)) {
123
127
  value = evaluatedEnv[value]
124
128
  } else {
125
- value = redUtil.evaluateNodeProperty(value, type, {_flow: flow}, null, null);
129
+ value = redUtil.evaluateNodeProperty(value, type, {_flow: {
130
+ // Provide a hook so when it tries to look up a flow setting,
131
+ // we can insert the just-evaluated value which hasn't yet
132
+ // been set on the flow object - otherwise delegate up to the flow
133
+ getSetting: function(name) {
134
+ if (evaluatedEnv.hasOwnProperty(name)){
135
+ return evaluatedEnv[name]
136
+ }
137
+ return flow.getSetting(name)
138
+ }
139
+ }}, null, null);
126
140
  }
127
141
  evaluatedEnv[name] = value
128
142
  }
package/lib/nodes/Node.js CHANGED
@@ -42,6 +42,7 @@ function Node(n) {
42
42
  this._closeCallbacks = [];
43
43
  this._inputCallback = null;
44
44
  this._inputCallbacks = null;
45
+ this._expectedDoneCount = 0;
45
46
 
46
47
  if (n.name) {
47
48
  this.name = n.name;
@@ -159,6 +160,9 @@ Node.prototype.on = function(event, callback) {
159
160
  if (event == "close") {
160
161
  this._closeCallbacks.push(callback);
161
162
  } else if (event === "input") {
163
+ if (callback.length === 3) {
164
+ this._expectedDoneCount++
165
+ }
162
166
  if (this._inputCallback) {
163
167
  this._inputCallbacks = [this._inputCallback, callback];
164
168
  this._inputCallback = null;
@@ -218,19 +222,17 @@ Node.prototype._emitInput = function(arg) {
218
222
  } else if (node._inputCallbacks) {
219
223
  // Multiple callbacks registered. Call each one, tracking eventual completion
220
224
  var c = node._inputCallbacks.length;
225
+ let doneCount = 0
221
226
  for (var i=0;i<c;i++) {
222
227
  var cb = node._inputCallbacks[i];
223
- if (cb.length === 2) {
224
- c++;
225
- }
226
228
  try {
227
229
  cb.call(
228
230
  node,
229
231
  arg,
230
232
  function() { node.send.apply(node,arguments) },
231
233
  function(err) {
232
- c--;
233
- if (c === 0) {
234
+ doneCount++;
235
+ if (doneCount === node._expectedDoneCount) {
234
236
  node._complete(arg,err);
235
237
  }
236
238
  }
@@ -257,6 +259,9 @@ Node.prototype._removeListener = Node.prototype.removeListener;
257
259
  Node.prototype.removeListener = function(name, listener) {
258
260
  var index;
259
261
  if (name === "input") {
262
+ if (listener.length === 3) {
263
+ this._expectedDoneCount--
264
+ }
260
265
  if (this._inputCallback && this._inputCallback === listener) {
261
266
  // Removing the only callback
262
267
  this._inputCallback = null;
@@ -431,7 +431,7 @@ module.exports = {
431
431
  return runGitCommand(args,cwd);
432
432
  },
433
433
  pull: function(cwd,remote,branch,allowUnrelatedHistories,auth,gitUser) {
434
- var args = ["pull"];
434
+ var args = ["pull", "--no-rebase"];
435
435
  if (remote && branch) {
436
436
  args.push(remote);
437
437
  args.push(branch);
@@ -71,30 +71,30 @@ function readFile(path,backupPath,emptyResponse,type) {
71
71
  });
72
72
  }
73
73
 
74
+ const writeFileLocks = {}
75
+
74
76
  module.exports = {
75
77
  /**
76
78
  * Write content to a file using UTF8 encoding.
77
79
  * This forces a fsync before completing to ensure
78
80
  * the write hits disk.
79
81
  */
80
- writeFile: function(path,content,backupPath) {
81
- var backupPromise;
82
- if (backupPath && fs.existsSync(path)) {
83
- backupPromise = fs.copy(path,backupPath);
84
- } else {
85
- backupPromise = Promise.resolve();
82
+ writeFile: async function(path,content,backupPath) {
83
+ if (!writeFileLocks[path]) {
84
+ writeFileLocks[path] = Promise.resolve()
86
85
  }
87
-
88
- const dirname = fspath.dirname(path);
89
- const tempFile = `${path}.$$$`;
90
-
91
- return backupPromise.then(() => {
92
- if (backupPath) {
86
+ const result = writeFileLocks[path].then(async () => {
87
+ var backupPromise;
88
+ if (backupPath && fs.existsSync(path)) {
89
+ await fs.copy(path,backupPath);
93
90
  log.trace(`utils.writeFile - copied ${path} TO ${backupPath}`)
94
91
  }
95
- return fs.ensureDir(dirname)
96
- }).then(() => {
97
- return new Promise(function(resolve,reject) {
92
+
93
+ const dirname = fspath.dirname(path);
94
+ const tempFile = `${path}.$$$`;
95
+ await fs.ensureDir(dirname)
96
+
97
+ await new Promise(function(resolve,reject) {
98
98
  var stream = fs.createWriteStream(tempFile);
99
99
  stream.on('open',function(fd) {
100
100
  stream.write(content,'utf8',function() {
@@ -110,10 +110,11 @@ module.exports = {
110
110
  log.warn(log._("storage.localfilesystem.fsync-fail",{path: tempFile, message: err.toString()}));
111
111
  reject(err);
112
112
  });
113
- });
114
- }).then(() => {
113
+ })
114
+
115
115
  log.trace(`utils.writeFile - written content to ${tempFile}`)
116
- return new Promise(function(resolve,reject) {
116
+
117
+ await new Promise(function(resolve,reject) {
117
118
  fs.rename(tempFile,path,err => {
118
119
  if (err) {
119
120
  log.warn(log._("storage.localfilesystem.fsync-fail",{path: path, message: err.toString()}));
@@ -122,8 +123,10 @@ module.exports = {
122
123
  log.trace(`utils.writeFile - renamed ${tempFile} to ${path}`)
123
124
  resolve();
124
125
  })
125
- });
126
- });
126
+ })
127
+ })
128
+ writeFileLocks[path] = result.catch(() => {})
129
+ return result
127
130
  },
128
131
  readFile: readFile,
129
132
 
@@ -48,7 +48,7 @@
48
48
  "port-in-use": "Erreur : port utilisé",
49
49
  "uncaught-exception": "Exception non reconnue :",
50
50
  "admin-ui-disabled": "Interface d'administration désactivée",
51
- "now-running": "Le serveur tourne maintenant sur __listenpath__",
51
+ "now-running": "Le serveur est disponible à l'adresse __listenpath__",
52
52
  "failed-to-start": "Échec lors du démarrage du serveur :",
53
53
  "headless-mode": "Fonctionne en mode sans interface graphique (headless)",
54
54
  "httpadminauth-deprecated": "L'utilisation de httpAdminAuth est DÉCONSEILLÉE. Utiliser adminAuth à la place",
@@ -100,7 +100,7 @@
100
100
  "error": "Erreur lors du chargement des identifiants : __message__",
101
101
  "error-saving": "Erreur lors de l'enregistrement des identifiants : __message__",
102
102
  "not-registered": "Le type d'identifiant '__type__' n'a pas été enregistré",
103
- "system-key-warning": "\n\n---------------------------------------------------------------------\nVotre fichier contenant les identifiants de flux est chiffré à l'aide d'une clé générée par le système.\n\nSi la clé générée par le système est perdue pour une raison quelconque, votre fichier contenant\nles identifiants ne sera pas récupérable, vous devrez le supprimer et ressaisir vos identifiants.\n\nVous pouvez définir votre propre clé en utilisant l'option 'credentialSecret' dans\nvotre fichier de paramètres. Node-RED rechiffrera alors votre fichier contenant les identifiants\nà l'aide de la clé que vous avez choisie la prochaine fois que vous déploierez une modification.\n---------------------------------------------------------------------\n",
103
+ "system-key-warning": "\n\n--------------------------------------------------------------------------------------------------------\nVotre fichier contenant les identifiants de flux est chiffré à l'aide d'une clé générée par le système.\n\nSi la clé générée par le système est perdue pour une raison quelconque, votre fichier contenant\nles identifiants ne sera pas récupérable, vous devrez le supprimer et ressaisir vos identifiants.\n\nVous pouvez définir votre propre clé en utilisant l'option 'credentialSecret' dans\nvotre fichier de paramètres. Node-RED rechiffrera alors votre fichier contenant les identifiants\nà l'aide de la clé que vous avez choisie la prochaine fois que vous déploierez une modification.\n--------------------------------------------------------------------------------------------------------\n",
104
104
  "unencrypted": "Utilisation d'identifiants non chiffrés",
105
105
  "encryptedNotFound": "Identifiants chiffrés introuvables"
106
106
  },
@@ -1,167 +1,167 @@
1
- {
2
- "runtime": {
3
- "welcome": "Node-RED에 오신것을 환영합니다.",
4
- "version": "__component__ 버전: __version__",
5
- "unsupported_version": "__component__는 지원하지 않는 버전입니다. 요구버전: __requires__ 현재버전: __version__",
6
- "paths": {
7
- "settings": "설정 파일 : __path__",
8
- "httpStatic": "HTTP Static : __path__"
9
- }
10
- },
11
- "server": {
12
- "loading": "팔렛트 노드 읽는 중",
13
- "palette-editor": {
14
- "disabled": "팔렛트 에디터 사용불가 : 사용자 설정",
15
- "npm-not-found": "팔렛트 에디터 사용불가 : npm 명령어가 없습니다.",
16
- "npm-too-old": "팔렛트 에디터 사용불가 : npm 버전이 너무 오래되었습니다. 3.x이상의 npm을 사용하세요."
17
- },
18
- "errors": "__count__개의 노드타입 등록 에러",
19
- "errors_plural": "__count__개의 노드타입 등록 에러",
20
- "errors-help": "-v 를 실행하여 상세내역을 확인하세요",
21
- "missing-modules": "노드모듈이 없습니다:",
22
- "node-version-mismatch": "버전이 잘못 되었습니다. 요구버전: __version__ ",
23
- "type-already-registered": "'__type__' 은 __module__ 으로 이미 등록되어 있습니다.",
24
- "removing-modules": "설정에서 모듈 제거중",
25
- "added-types": "노드타입 추가:",
26
- "removed-types": "노드타입 제거:",
27
- "install": {
28
- "invalid": "잘못된 모듈명",
29
- "installing": "모듈 설치중: __name__, 버전: __version__",
30
- "installed": "모듈이 설치되었습니다: __name__",
31
- "install-failed": "설치 실패",
32
- "install-failed-long": "__name__ 모듈 설치 실패:",
33
- "install-failed-not-found": "$t(install-failed-long) 모듈이 없습니다.",
34
- "upgrading": "모듈 업그레이드: __name__ to 버전: __version__",
35
- "upgraded": "모듈 업그레이드: __name__. 새 버전을 사용하기 위해 Node-RED를 재시작 합니다.",
36
- "upgrade-failed-not-found": "$t(server.install.install-failed-long) 버전이 없습니다.",
37
- "uninstalling": "모듈 제거중: __name__",
38
- "uninstall-failed": "제거 실패",
39
- "uninstall-failed-long": "__name__ 모듈 제거 실패:",
40
- "uninstalled": "모듈 제거: __name__"
41
- },
42
- "unable-to-listen": "__listenpath__에서 listen 할 수 없습니다.",
43
- "port-in-use": "에러: 포트 사용중",
44
- "uncaught-exception": "Uncaught Exception:",
45
- "admin-ui-disabled": "관리 UI 비활성화",
46
- "now-running": "__listenpath__에서 서버가 실행중 입니다.",
47
- "failed-to-start": "서버시작 실패:",
48
- "headless-mode": "headless 모드로 실행중입니다.",
49
- "httpadminauth-deprecated": "httpAdminAuth는 더 이상 사용되지 않습니다. adminAuth를 사용하세요."
50
- },
51
- "api": {
52
- "flows": {
53
- "error-save": "플로우 저장 에러: __message__",
54
- "error-reload": "플로우 새로고침 에러: __message__"
55
- },
56
- "library": {
57
- "error-load-entry": "라이브러리 '__path__'불러오기 에러: __message__",
58
- "error-save-entry": "라이브러리 '__path__'저장 에러: __message__",
59
- "error-load-flow": "플로우 '__path__'불러오기 에러: __message__",
60
- "error-save-flow": "플로우 '__path__'저장 에러: __message__"
61
- },
62
- "nodes": {
63
- "enabled": "노드타입 활성화:",
64
- "disabled": "노드타입 비활성화:",
65
- "error-enable": "노드 활성화 에러:"
66
- }
67
- },
68
- "comms": {
69
- "error": "통신채널 에러: __message__",
70
- "error-server": "통신서버 에러: __message__",
71
- "error-send": "전송 에러: __message__"
72
- },
73
- "settings": {
74
- "user-not-available": "사용자 설정을 저장할수 없습니다: __message__",
75
- "not-available": "설정을 사용할 수 없습니다.",
76
- "property-read-only": "'__prop__' 속성은 읽기 전용입니다."
77
- },
78
- "nodes": {
79
- "credentials": {
80
- "error": "인증정보 읽어오기 에러: __message__",
81
- "error-saving": "인증정보 저장 에러: __message__",
82
- "not-registered": "인증정보 '__type__'는 등록되어 있지않습니다.",
83
- "system-key-warning": "\n\n---------------------------------------------------------------------\n 시스템에서 생성한 키를 사용하여 플로우 자격증명 파일이 암호화되어 있습니다. \n\n 만일 시스템 생성 키가 어떤 이유로든 손실되면 자격증명파일을\n 복구 할 수 없습니다. 그러한 경우엔 삭제하고 자격증명을 다시 \n 입력해야 합니다.\n\n 'credentialSecret' 옵션을 사용하여 자신의 키를 설정해야 합니다. \n Node-RED는 변경내용을 다음 배포시에 선택한 키를 사용하여 \n 자격증명파일을 다시 암호화합니다.\n---------------------------------------------------------------------\n"
84
- },
85
- "flows": {
86
- "safe-mode": "[안전모드] 플로우가 정지되었습니다. 시작하려면 배포하세요.",
87
- "registered-missing": "누락된 노드를 등록합니다: __type__",
88
- "error": "플로우 불러오기 에러: __message__",
89
- "starting-modified-nodes": "수정된 노드 시작중",
90
- "starting-modified-flows": "수정된 플로우 시작중",
91
- "starting-flows": "플로우 시작중",
92
- "started-modified-nodes": "수정된 노드 시작됨",
93
- "started-modified-flows": "수정된 플로우 시작됨",
94
- "started-flows": "플로우 시작됨",
95
- "stopping-modified-nodes": "수정된 노드 중지중",
96
- "stopping-modified-flows": "수정된 플로우 중지중",
97
- "stopping-flows": "플로우 중지중",
98
- "stopped-modified-nodes": "수정된 노드 중지됨",
99
- "stopped-modified-flows": "수정된 플로우 중지됨",
100
- "stopped-flows": "플로우 중지됨",
101
- "stopped": "중지됨",
102
- "stopping-error": "노드 중지 오류: __message__",
103
- "added-flow": "플로우 추가: __label__",
104
- "updated-flow": "플로우 변경: __label__",
105
- "removed-flow": "플로우 삭제: __label__",
106
- "missing-types": "누락된 플로우타입이 등록되기를 기다림:",
107
- "missing-type-provided": " - __type__ (provided by npm module __module__)",
108
- "missing-type-install-1": "누락된 모듈을 설치하려면, 실행:",
109
- "missing-type-install-2": "디렉토리에서:"
110
- },
111
- "flow": {
112
- "unknown-type": "알수없는 타입: __type__",
113
- "missing-types": "누락된 타입",
114
- "error-loop": "메세지 최대 캐치수를 초과했습니다."
115
- },
116
- "index": {
117
- "unrecognised-id": "인식할 수 없는 ID: __id__",
118
- "type-in-use": "사용하는 타입: __msg__",
119
- "unrecognised-module": "인식할 수 없는 모듈: __module__"
120
- },
121
- "registry": {
122
- "localfilesystem": {
123
- "module-not-found": "'__module__' 모듈을 찾을 수 없습니다."
124
- }
125
- }
126
- },
127
- "storage": {
128
- "index": {
129
- "forbidden-flow-name": "올바르지 않은 플로우명"
130
- },
131
- "localfilesystem": {
132
- "user-dir": "사용자 디렉토리: __path__",
133
- "flows-file": "플로우 파일 : __path__",
134
- "create": "새로운 __type__ 파일 만듭니다.",
135
- "empty": "기존 __type__ 파일이 비어있습니다.",
136
- "invalid": "기존 __type__ 파일이 json형식이 아닙니다.",
137
- "restore": "__type__ 파일을 __path__ 에서 복원합니다.",
138
- "restore-fail": "__type__ 파일 복원 실패 : __message__",
139
- "fsync-fail": "__path__ 파일 디스크쓰기 실패 : __message__",
140
- "projects": {
141
- "changing-project": "프로젝트 설정: __project__",
142
- "active-project": "선택중인 프로젝트: __project__",
143
- "project-not-found": "프로젝트가 없습니다: __project__",
144
- "no-active-project": "선택된 프로젝트가 없습니다: 기본 플로우 파일을 사용합니다.",
145
- "disabled": "프로젝트가 비활성화 되어있습니다: editorTheme.projects.enabled=false",
146
- "disabledNoFlag": "프로젝트가 비활성화 되어있습니다: set editorTheme.projects.enabled=true to enable",
147
- "git-not-found": "프로젝트가 비활성화 되어있습니다: git 명령어가 없습니다.",
148
- "git-version-old": "프로젝트가 비활성화 되어있습니다: git __version__ 을 지원하지 않습니다. 2.x가 요구됩니다.",
149
- "summary": "Node-RED 프로젝트",
150
- "readme": "### 설명\n\n 이것은 프로젝트 README.md 파일입니다. 이 파일에는 프로젝트의 설명, \n 이용방법, 그 외 정보를 기재합니다."
151
- }
152
- }
153
- },
154
- "context": {
155
- "log-store-init": "Context 저장소 : '__name__' [__info__]",
156
- "error-loading-module": "context 저장소 불러오기 에러: __message__",
157
- "error-loading-module2": "context 저장소 불러오기 에러 '__module__': __message__ ",
158
- "error-module-not-defined": "Context 저장소 '__storage__'에 'module'옵션이 지정되지 않았습니다.",
159
- "error-invalid-module-name": "context 저장소 이름 에러: '__name__'",
160
- "error-invalid-default-module": "기본 context 저장소가 없음: '__storage__'",
161
- "unknown-store": "알 수 없는 context 저장소 '__name__' 가 지정되었습니다. 기본 저장소를 사용합니다.",
162
- "localfilesystem": {
163
- "error-circular": "Context __scope__ 는 지속할 수 없는 순환참조를 포함합니다.",
164
- "error-write": "context 저장 에러: __message__"
165
- }
166
- }
167
- }
1
+ {
2
+ "runtime": {
3
+ "welcome": "Node-RED에 오신것을 환영합니다.",
4
+ "version": "__component__ 버전: __version__",
5
+ "unsupported_version": "__component__는 지원하지 않는 버전입니다. 요구버전: __requires__ 현재버전: __version__",
6
+ "paths": {
7
+ "settings": "설정 파일 : __path__",
8
+ "httpStatic": "HTTP Static : __path__"
9
+ }
10
+ },
11
+ "server": {
12
+ "loading": "팔렛트 노드 읽는 중",
13
+ "palette-editor": {
14
+ "disabled": "팔렛트 에디터 사용불가 : 사용자 설정",
15
+ "npm-not-found": "팔렛트 에디터 사용불가 : npm 명령어가 없습니다.",
16
+ "npm-too-old": "팔렛트 에디터 사용불가 : npm 버전이 너무 오래되었습니다. 3.x이상의 npm을 사용하세요."
17
+ },
18
+ "errors": "__count__개의 노드타입 등록 에러",
19
+ "errors_plural": "__count__개의 노드타입 등록 에러",
20
+ "errors-help": "-v 를 실행하여 상세내역을 확인하세요",
21
+ "missing-modules": "노드모듈이 없습니다:",
22
+ "node-version-mismatch": "버전이 잘못 되었습니다. 요구버전: __version__ ",
23
+ "type-already-registered": "'__type__' 은 __module__ 으로 이미 등록되어 있습니다.",
24
+ "removing-modules": "설정에서 모듈 제거중",
25
+ "added-types": "노드타입 추가:",
26
+ "removed-types": "노드타입 제거:",
27
+ "install": {
28
+ "invalid": "잘못된 모듈명",
29
+ "installing": "모듈 설치중: __name__, 버전: __version__",
30
+ "installed": "모듈이 설치되었습니다: __name__",
31
+ "install-failed": "설치 실패",
32
+ "install-failed-long": "__name__ 모듈 설치 실패:",
33
+ "install-failed-not-found": "$t(install-failed-long) 모듈이 없습니다.",
34
+ "upgrading": "모듈 업그레이드: __name__ to 버전: __version__",
35
+ "upgraded": "모듈 업그레이드: __name__. 새 버전을 사용하기 위해 Node-RED를 재시작 합니다.",
36
+ "upgrade-failed-not-found": "$t(server.install.install-failed-long) 버전이 없습니다.",
37
+ "uninstalling": "모듈 제거중: __name__",
38
+ "uninstall-failed": "제거 실패",
39
+ "uninstall-failed-long": "__name__ 모듈 제거 실패:",
40
+ "uninstalled": "모듈 제거: __name__"
41
+ },
42
+ "unable-to-listen": "__listenpath__에서 listen 할 수 없습니다.",
43
+ "port-in-use": "에러: 포트 사용중",
44
+ "uncaught-exception": "Uncaught Exception:",
45
+ "admin-ui-disabled": "관리 UI 비활성화",
46
+ "now-running": "__listenpath__에서 서버가 실행중 입니다.",
47
+ "failed-to-start": "서버시작 실패:",
48
+ "headless-mode": "headless 모드로 실행중입니다.",
49
+ "httpadminauth-deprecated": "httpAdminAuth는 더 이상 사용되지 않습니다. adminAuth를 사용하세요."
50
+ },
51
+ "api": {
52
+ "flows": {
53
+ "error-save": "플로우 저장 에러: __message__",
54
+ "error-reload": "플로우 새로고침 에러: __message__"
55
+ },
56
+ "library": {
57
+ "error-load-entry": "라이브러리 '__path__'불러오기 에러: __message__",
58
+ "error-save-entry": "라이브러리 '__path__'저장 에러: __message__",
59
+ "error-load-flow": "플로우 '__path__'불러오기 에러: __message__",
60
+ "error-save-flow": "플로우 '__path__'저장 에러: __message__"
61
+ },
62
+ "nodes": {
63
+ "enabled": "노드타입 활성화:",
64
+ "disabled": "노드타입 비활성화:",
65
+ "error-enable": "노드 활성화 에러:"
66
+ }
67
+ },
68
+ "comms": {
69
+ "error": "통신채널 에러: __message__",
70
+ "error-server": "통신서버 에러: __message__",
71
+ "error-send": "전송 에러: __message__"
72
+ },
73
+ "settings": {
74
+ "user-not-available": "사용자 설정을 저장할수 없습니다: __message__",
75
+ "not-available": "설정을 사용할 수 없습니다.",
76
+ "property-read-only": "'__prop__' 속성은 읽기 전용입니다."
77
+ },
78
+ "nodes": {
79
+ "credentials": {
80
+ "error": "인증정보 읽어오기 에러: __message__",
81
+ "error-saving": "인증정보 저장 에러: __message__",
82
+ "not-registered": "인증정보 '__type__'는 등록되어 있지않습니다.",
83
+ "system-key-warning": "\n\n---------------------------------------------------------------------\n 시스템에서 생성한 키를 사용하여 플로우 자격증명 파일이 암호화되어 있습니다. \n\n 만일 시스템 생성 키가 어떤 이유로든 손실되면 자격증명파일을\n 복구 할 수 없습니다. 그러한 경우엔 삭제하고 자격증명을 다시 \n 입력해야 합니다.\n\n 'credentialSecret' 옵션을 사용하여 자신의 키를 설정해야 합니다. \n Node-RED는 변경내용을 다음 배포시에 선택한 키를 사용하여 \n 자격증명파일을 다시 암호화합니다.\n---------------------------------------------------------------------\n"
84
+ },
85
+ "flows": {
86
+ "safe-mode": "[안전모드] 플로우가 정지되었습니다. 시작하려면 배포하세요.",
87
+ "registered-missing": "누락된 노드를 등록합니다: __type__",
88
+ "error": "플로우 불러오기 에러: __message__",
89
+ "starting-modified-nodes": "수정된 노드 시작중",
90
+ "starting-modified-flows": "수정된 플로우 시작중",
91
+ "starting-flows": "플로우 시작중",
92
+ "started-modified-nodes": "수정된 노드 시작됨",
93
+ "started-modified-flows": "수정된 플로우 시작됨",
94
+ "started-flows": "플로우 시작됨",
95
+ "stopping-modified-nodes": "수정된 노드 중지중",
96
+ "stopping-modified-flows": "수정된 플로우 중지중",
97
+ "stopping-flows": "플로우 중지중",
98
+ "stopped-modified-nodes": "수정된 노드 중지됨",
99
+ "stopped-modified-flows": "수정된 플로우 중지됨",
100
+ "stopped-flows": "플로우 중지됨",
101
+ "stopped": "중지됨",
102
+ "stopping-error": "노드 중지 오류: __message__",
103
+ "added-flow": "플로우 추가: __label__",
104
+ "updated-flow": "플로우 변경: __label__",
105
+ "removed-flow": "플로우 삭제: __label__",
106
+ "missing-types": "누락된 플로우타입이 등록되기를 기다림:",
107
+ "missing-type-provided": " - __type__ (provided by npm module __module__)",
108
+ "missing-type-install-1": "누락된 모듈을 설치하려면, 실행:",
109
+ "missing-type-install-2": "디렉토리에서:"
110
+ },
111
+ "flow": {
112
+ "unknown-type": "알수없는 타입: __type__",
113
+ "missing-types": "누락된 타입",
114
+ "error-loop": "메세지 최대 캐치수를 초과했습니다."
115
+ },
116
+ "index": {
117
+ "unrecognised-id": "인식할 수 없는 ID: __id__",
118
+ "type-in-use": "사용하는 타입: __msg__",
119
+ "unrecognised-module": "인식할 수 없는 모듈: __module__"
120
+ },
121
+ "registry": {
122
+ "localfilesystem": {
123
+ "module-not-found": "'__module__' 모듈을 찾을 수 없습니다."
124
+ }
125
+ }
126
+ },
127
+ "storage": {
128
+ "index": {
129
+ "forbidden-flow-name": "올바르지 않은 플로우명"
130
+ },
131
+ "localfilesystem": {
132
+ "user-dir": "사용자 디렉토리: __path__",
133
+ "flows-file": "플로우 파일 : __path__",
134
+ "create": "새로운 __type__ 파일 만듭니다.",
135
+ "empty": "기존 __type__ 파일이 비어있습니다.",
136
+ "invalid": "기존 __type__ 파일이 json형식이 아닙니다.",
137
+ "restore": "__type__ 파일을 __path__ 에서 복원합니다.",
138
+ "restore-fail": "__type__ 파일 복원 실패 : __message__",
139
+ "fsync-fail": "__path__ 파일 디스크쓰기 실패 : __message__",
140
+ "projects": {
141
+ "changing-project": "프로젝트 설정: __project__",
142
+ "active-project": "선택중인 프로젝트: __project__",
143
+ "project-not-found": "프로젝트가 없습니다: __project__",
144
+ "no-active-project": "선택된 프로젝트가 없습니다: 기본 플로우 파일을 사용합니다.",
145
+ "disabled": "프로젝트가 비활성화 되어있습니다: editorTheme.projects.enabled=false",
146
+ "disabledNoFlag": "프로젝트가 비활성화 되어있습니다: set editorTheme.projects.enabled=true to enable",
147
+ "git-not-found": "프로젝트가 비활성화 되어있습니다: git 명령어가 없습니다.",
148
+ "git-version-old": "프로젝트가 비활성화 되어있습니다: git __version__ 을 지원하지 않습니다. 2.x가 요구됩니다.",
149
+ "summary": "Node-RED 프로젝트",
150
+ "readme": "### 설명\n\n 이것은 프로젝트 README.md 파일입니다. 이 파일에는 프로젝트의 설명, \n 이용방법, 그 외 정보를 기재합니다."
151
+ }
152
+ }
153
+ },
154
+ "context": {
155
+ "log-store-init": "Context 저장소 : '__name__' [__info__]",
156
+ "error-loading-module": "context 저장소 불러오기 에러: __message__",
157
+ "error-loading-module2": "context 저장소 불러오기 에러 '__module__': __message__ ",
158
+ "error-module-not-defined": "Context 저장소 '__storage__'에 'module'옵션이 지정되지 않았습니다.",
159
+ "error-invalid-module-name": "context 저장소 이름 에러: '__name__'",
160
+ "error-invalid-default-module": "기본 context 저장소가 없음: '__storage__'",
161
+ "unknown-store": "알 수 없는 context 저장소 '__name__' 가 지정되었습니다. 기본 저장소를 사용합니다.",
162
+ "localfilesystem": {
163
+ "error-circular": "Context __scope__ 는 지속할 수 없는 순환참조를 포함합니다.",
164
+ "error-write": "context 저장 에러: __message__"
165
+ }
166
+ }
167
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-red/runtime",
3
- "version": "3.1.0-beta.4",
3
+ "version": "3.1.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./lib/index.js",
6
6
  "repository": {
@@ -16,8 +16,8 @@
16
16
  }
17
17
  ],
18
18
  "dependencies": {
19
- "@node-red/registry": "3.1.0-beta.4",
20
- "@node-red/util": "3.1.0-beta.4",
19
+ "@node-red/registry": "3.1.1",
20
+ "@node-red/util": "3.1.1",
21
21
  "async-mutex": "0.4.0",
22
22
  "clone": "2.1.2",
23
23
  "express": "4.18.2",