diff --git a/package.json b/package.json index cddf1f76e..2c0bb30d0 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "grunt-jsdoc": "2.4.1", "grunt-jsdoc-to-markdown": "5.0.0", "grunt-jsonlint": "2.1.3", - "grunt-mkdir": "~1.0.0", + "grunt-mkdir": "~1.1.0", "grunt-npm-command": "~0.1.2", "grunt-sass": "~3.1.0", "grunt-simple-mocha": "~0.4.1", diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/locales.js b/packages/node_modules/@node-red/editor-api/lib/editor/locales.js index a7f300cd3..f9453f55b 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/locales.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/locales.js @@ -39,9 +39,12 @@ module.exports = { }, get: function(req,res) { var namespace = req.params[0]; - var lngs = req.query.lng; namespace = namespace.replace(/\.json$/,""); var lang = req.query.lng || i18n.defaultLang; //apiUtil.determineLangFromHeaders(req.acceptsLanguages() || []); + if (/[^a-z\-\*]/i.test(lang)) { + res.json({}); + return; + } var prevLang = i18n.i.language; // Trigger a load from disk of the language if it is not the default i18n.i.changeLanguage(lang, function(){ diff --git a/packages/node_modules/@node-red/editor-client/locales/ru/editor.json b/packages/node_modules/@node-red/editor-client/locales/ru/editor.json index 1f91d4b0b..04ff361ba 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ru/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ru/editor.json @@ -246,8 +246,8 @@ "import": { "import": "Импортировать в", "importSelected": "Импортировать выбранные", - "importCopy": "Импортировать копию", - "viewNodes": "Посмотреть узлы...", + "importCopy": "Импортировать копии", + "viewNodes": "Показать узлы...", "newFlow": "новый поток", "replace": "заменить", "errors": { @@ -257,7 +257,7 @@ "missingType": "Недопустимый поток - у элемента __index__ отсутствует свойство 'type'" }, "conflictNotification1": "Некоторые импортируемые Вами узлы уже существуют в рабочей области.", - "conflictNotification2": "Выберите, какие узлы импортировать и следует ли заменить существующие узлы или импортировать их копию." + "conflictNotification2": "Выберите, какие узлы импортировать и следует ли заменить ими существующие узлы или импортировать их копии." }, "copyMessagePath": "Путь скопирован", "copyMessageValue": "Значение скопировано", @@ -373,12 +373,12 @@ "configAdd": "Добавить", "configUpdate": "Обновить", "configDelete": "Удалить", - "nodesUse": "__count__ узел использует эту конфигурацию", - "nodesUse_plural_2": "__count__ узла используют эту конфигурацию", - "nodesUse_plural_5": "__count__ узлов используют эту конфигурацию", - "addNewConfig": "Добавить новый конфигурационный узел __type__", + "nodesUse": "__count__ узел использует этот конфиг", + "nodesUse_plural_2": "__count__ узла используют этот конфиг", + "nodesUse_plural_5": "__count__ узлов используют этот конфиг", + "addNewConfig": "Добавить новый конфиг узел __type__", "editNode": "Изменить узел __type__", - "editConfig": "Изменить конфигурационный узел __type__", + "editConfig": "Изменить конфиг узел __type__", "addNewType": "Добавить новый __type__...", "nodeProperties": "свойства узла", "label": "Метка", @@ -615,7 +615,7 @@ "info": { "name": "Информация", "tabName": "Имя", - "label": "сведения", + "label": "инфо", "node": "Узел", "type": "Тип", "group": "Группа", @@ -648,8 +648,8 @@ "showTips":"Вы можете открыть советы из панели настроек", "outline": "Структура", "empty": "пусто", - "globalConfig": "Узлы глобальной конфигурации", - "triggerAction": "Запустить действие", + "globalConfig": "Глобальные конфиг узлы", + "triggerAction": "Вызвать действие", "find": "Найти в рабочей области", "search": { "configNodes": "Узлы конфигурации", @@ -671,8 +671,8 @@ }, "config": { "name": "Узлы конфигураций", - "label": "конфигурация", - "global": "На всех потока", + "label": "конфиг", + "global": "На всех потоках", "none": "нет", "subflows": "подпотоки", "flows": "потоки", @@ -690,8 +690,8 @@ "none": "ничего не выбрано", "refresh": "обновите, чтобы загрузить", "empty": "пусто", - "node": "Узел", - "flow": "Поток", + "node": "Узловой", + "flow": "Потоковый", "global": "Глобальный", "deleteConfirm": "Вы уверены, что хотите удалить этот элемент?", "autoRefresh": "Обновить при изменении выбора", @@ -877,7 +877,7 @@ "bool": "логический тип", "json": "JSON", "bin": "буфер", - "date": "отметка времени", + "date": "метка времени", "jsonata": "выражение", "env": "переменная среды", "cred": "учетные данные" diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 1a82a3e89..0e7367ebf 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -401,7 +401,8 @@ RED.palette = (function() { RED.workspaces.show(nt.substring(8)); e.preventDefault(); }); - nodeInfo = RED.utils.renderMarkdown(def.info||""); + var subflow = RED.nodes.subflow(nt.substring(8)); + nodeInfo = RED.utils.renderMarkdown(subflow.info||""); } setLabel(nt,d,label,nodeInfo); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/base.scss b/packages/node_modules/@node-red/editor-client/src/sass/base.scss index 391ddf83f..ca1a5807f 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/base.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/base.scss @@ -15,6 +15,9 @@ **/ +body { + overflow: hidden; +} .red-ui-editor { font-size: $primary-font-size; diff --git a/packages/node_modules/@node-red/nodes/core/sequence/17-split.js b/packages/node_modules/@node-red/nodes/core/sequence/17-split.js index dc422f3da..318319f3d 100644 --- a/packages/node_modules/@node-red/nodes/core/sequence/17-split.js +++ b/packages/node_modules/@node-red/nodes/core/sequence/17-split.js @@ -737,7 +737,10 @@ module.exports = function(RED) { group.msg = Object.assign(group.msg, msg); group.send = send; var tcnt = group.targetCount; - if (msg.hasOwnProperty("parts")) { tcnt = group.targetCount || msg.parts.count; } + if (msg.hasOwnProperty("parts")) { + tcnt = group.targetCount || msg.parts.count; + group.targetCount = tcnt; + } if ((tcnt > 0 && group.currentCount >= tcnt) || msg.hasOwnProperty('complete')) { completeSend(partId); } @@ -759,3 +762,4 @@ module.exports = function(RED) { } RED.nodes.registerType("join",JoinNode); } + diff --git a/packages/node_modules/@node-red/nodes/locales/ru/common/20-inject.html b/packages/node_modules/@node-red/nodes/locales/ru/common/20-inject.html index e265fccc6..5b762bc7d 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/common/20-inject.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/common/20-inject.html @@ -16,7 +16,7 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ru/common/21-debug.html b/packages/node_modules/@node-red/nodes/locales/ru/common/21-debug.html index 66edb72cc..7804e6af5 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/common/21-debug.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/common/21-debug.html @@ -16,24 +16,24 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ru/common/24-complete.html b/packages/node_modules/@node-red/nodes/locales/ru/common/24-complete.html index 3709f82dc..672310d6f 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/common/24-complete.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/common/24-complete.html @@ -16,7 +16,7 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ru/common/25-catch.html b/packages/node_modules/@node-red/nodes/locales/ru/common/25-catch.html index 867e9b203..af1627c22 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/common/25-catch.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/common/25-catch.html @@ -16,7 +16,7 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ru/common/60-link.html b/packages/node_modules/@node-red/nodes/locales/ru/common/60-link.html index 1ef3079af..f2894da97 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/common/60-link.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/common/60-link.html @@ -21,13 +21,13 @@

Подробности

- Этот узел может быть подключен к любому узлу link out на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом. + Этот узел может быть подключен к любому link out узлу на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом.

- Связи между link-узлами отображаются, только когда выбран link-узел. Если есть какие-либо провода к другим вкладкам, отображается виртуальный узел, по которому можно кликнуть, чтобы перейти на соответствующую вкладку. + Связи между link-узлами отображаются, только когда выбран один из соединенных link узлов. Если есть какие-либо провода, ведущие на другие вкладки, они отображаются в виде виртуального узла, по которому можно кликнуть, чтобы перейти на соответствующую вкладку.

- Примечание: Связи не могут идти внутрь подпотока или изнутри подпотока наружу. + Примечание: Провод не может вести внутрь подпотока или изнутри подпотока наружу.

@@ -38,12 +38,12 @@

Подробности

- Узел может быть подключен к любому узлу link in на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом. + Узел может быть подключен к любому link in узлу на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом.

- Связи между link-узлами отображаются, только когда выбран link-узел. Если есть какие-либо провода к другим вкладкам, отображается виртуальный узел, по которому можно кликнуть, чтобы перейти на соответствующую вкладку. + Связи между link-узлами отображаются, только когда выбран один из соединенных link узлов. Если есть какие-либо провода, ведущие на другие вкладки, они отображаются в виде виртуального узла, по которому можно кликнуть, чтобы перейти на соответствующую вкладку.

- Примечание: Связи не могут идти внутрь подпотока или изнутри подпотока наружу. + Примечание: Провод не может вести внутрь подпотока или изнутри подпотока наружу.

diff --git a/packages/node_modules/@node-red/nodes/locales/ru/common/90-comment.html b/packages/node_modules/@node-red/nodes/locales/ru/common/90-comment.html index f8cb254bd..69ba9ba12 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/common/90-comment.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/common/90-comment.html @@ -16,11 +16,11 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ru/common/98-unknown.html b/packages/node_modules/@node-red/nodes/locales/ru/common/98-unknown.html index 6ffb5a03a..f9fd62285 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/common/98-unknown.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/common/98-unknown.html @@ -16,22 +16,22 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ru/function/10-function.html b/packages/node_modules/@node-red/nodes/locales/ru/function/10-function.html index f99408605..9ba16d4be 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/function/10-function.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/function/10-function.html @@ -16,22 +16,22 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ru/function/89-delay.html b/packages/node_modules/@node-red/nodes/locales/ru/function/89-delay.html index 2a86fd64c..4489155ac 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/function/89-delay.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/function/89-delay.html @@ -21,20 +21,20 @@

Принимает

delay число
-
Устанавливает задержку в миллисекундах, которая будет применена к сообщению. Этот параметр применяется только в том случае, если узел настроен на то, чтобы разрешать сообщению переопределять установленный интервал задержки по умолчанию.
+
Устанавливает задержку в миллисекундах, которая будет применена к сообщению. Этот параметр применяется только в том случае, если узел настроен так, чтобы разрешать сообщению переопределять установленный интервал задержки по умолчанию.
reset
-
Если в полученном сообщении этому свойству присвоено какое-либо значение, все ожидающие сообщения, удерживаемые узлом, очищаются без дальнейшей отправки.
+
Если в полученном сообщении этому свойству присвоено какое-либо значение, все ожидающие сообщения, удерживаемые узлом, сбрасываются без дальнейшей отправки.
flush
Если в полученном сообщении этому свойству присвоено какое-либо значение, все ожидающие сообщения, удерживаемые узлом, немедленно отправляются далее.

Подробности

- Когда настроено задерживать сообщения, интервал задержки может быть фиксированным значением, случайным значением в пределах диапазона или динамически установленным для каждого сообщения. Каждое сообщение задерживается независимо от любых других сообщений, основываясь на времени его прибытия. + Когда узел настроен на задержку сообщений, интервал задержки может быть фиксированным значением, случайным значением в пределах диапазона или динамически установленным для каждого сообщения. Каждое сообщение задерживается независимо от любых других сообщений, основываясь на времени его прибытия в узел.

- Когда настроено ограничивать скорость сообщений, их доставка распределяется по настроенному периоду времени. Статус показывает количество сообщений, находящихся в данный момент в очереди. Если выбрано он может отбрасывать промежуточные сообщений по мере их поступления. + Когда узел настроен на ограничение скорости сообщений, их доставка распределяется по установленному периоду времени. Статус показывает количество сообщений, находящихся в данный момент в очереди. При необходимости узел может быть настроен на отбрасывание промежуточных сообщений по мере их поступления.

- Ограничение скорости может применяться ко всем сообщениям или группировать их в соответствии со значением msg.topic. При группировании промежуточные сообщения автоматически отбрасываются. В каждом интервале времени узел может либо выпустить самое последнее сообщение для всех тем, либо выпустить самое последнее сообщение для следующей темы. + Ограничение скорости может применяться ко всем сообщениям или группам сообщений в соответствии с их значением темы (msg.topic). При группировании промежуточные сообщения автоматически отбрасываются. В каждом интервале времени узел может либо выпустить самое последнее сообщение для всех тем, либо выпустить самое последнее сообщение для следующей темы.

diff --git a/packages/node_modules/@node-red/nodes/locales/ru/function/89-trigger.html b/packages/node_modules/@node-red/nodes/locales/ru/function/89-trigger.html index c53058235..9a8d687cf 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/function/89-trigger.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/function/89-trigger.html @@ -16,7 +16,7 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ru/function/90-exec.html b/packages/node_modules/@node-red/nodes/locales/ru/function/90-exec.html index b654673fe..708ddfbc9 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/function/90-exec.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/function/90-exec.html @@ -19,16 +19,16 @@ Запускает системную команду и возвращает ее вывод.

- Узел может быть настроен либо на ожидание завершения команды, либо на отправку своих выходных данных, пока команда их генерирует. + Узел может быть настроен либо на ожидание завершения выполнения команды, либо на отправку выходных данных по мере их генерации в ходе выполнения.

- Выполняемая команда может быть настроена в узле или предоставлена полученным сообщением. + Выполняемая команда может быть установлена в настройках узла или полученным сообщением.

Принимает

payload строка
-
будет добавлено к выполненной команде, если настроено так делать.
+
будет добавлено к выполняемой команде, если узел настроен так делать.
kill строка
тип сигнала уничтожения для отправки существующему процессу узла exec.
pid число|строка
@@ -44,7 +44,7 @@
rc объект
-
только в exec режиме, копия объекта кода возврата (также доступна на порту 3)
+
только в exec режиме, копия объекта кода возврата (также доступна по 3-му порту)
  • Стандартный вывод ошибок @@ -54,7 +54,7 @@
    rc объект
    -
    только в exec режиме, копия объекта кода возврата (также доступна на порту 3)
    +
    только в exec режиме, копия объекта кода возврата (также доступна по 3-му порту)
  • Код возврата @@ -73,7 +73,7 @@ При желании вместо этого можно использовать spawn, который возвращает выходные данные из stdout и stderr по ходу выполнения команды, обычно по одной строке за раз. После завершения он возвращает объект на 3-й порт. Например, успешная команда должна вернуть {code: 0}.

    - Ошибки могут возвращать дополнительную информацию на 3-м порту в msg.payload, такую как строка message, строка signal. + Ошибки могут возвращать на 3-й порт дополнительную информацию в msg.payload, такую как строка message, строка signal.

    Выполняемая команда настраивается в узле, с возможностью добавления к ней msg.payload и дополнительного набора параметров. @@ -82,25 +82,25 @@ Команды или параметры с пробелами должны быть заключены в кавычки - "Это один параметр"

    - Возвращаемый payload обычно представляет собой строку, пока не обнаружены символы, отличные от UTF8, в этом случае это буфер. + Возвращаемый payload обычно представляет собой строку, пока не обнаружены символы, отличные от UTF8, в этом случае возвращаемое значение будет иметь тип буфер.

    - Значок состояния узла и PID будут видны, пока узел активен. Изменения в статусе могут быть прочитаны узлом Status. + Значок статуса узла и PID будут видны, когда узел активен. Изменения в статусе можно отслеживать узлом Status.

    Уничтожения процессов

    - Отправка msg.kill уничтожит один активный процесс. msg.kill должен быть строкой, содержащей тип передаваемого сигнала, например, SIGINT, SIGQUIT или SIGHUP. По умолчанию SIGTERM, если задана пустая строка. + Отправка msg.kill уничтожит один активный процесс. msg.kill должен быть строкой, содержащей тип передаваемого сигнала, например, SIGINT, SIGQUIT или SIGHUP. По умолчанию будет передан SIGTERM, если задана пустая строка.

    - Если узлом запущено более одного процесса, тогда в msg.pid также должно быть установлено значение PID для уничтожения. + Если узлом запущено более одного процесса, тогда в msg.pid также должно быть установлено значение PID процесса для уничтожения.

    - Если в поле Тайм-аут указано значение, то, если процесс не завершится по истечении указанного количества секунд, он будет автоматически уничтожен + Если в поле Тайм-аут введено значение, тогда, если процесс не завершится по истечении указанного количества секунд, он будет автоматически уничтожен.

    - Совет: если Вы запускаете Python приложение, Вам может потребоваться использовать параметр -u, чтобы остановить буферизацию вывода. + Совет: если вы запускаете Python приложение, вам может потребоваться использование параметра -u, чтобы остановить буферизацию вывода.

    diff --git a/packages/node_modules/@node-red/nodes/locales/ru/messages.json b/packages/node_modules/@node-red/nodes/locales/ru/messages.json index 63e597526..08e2b6b73 100755 --- a/packages/node_modules/@node-red/nodes/locales/ru/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ru/messages.json @@ -46,7 +46,7 @@ "bool": "логический тип", "json": "объект", "bin": "буфер", - "date": "отметка времени", + "date": "метка времени", "env": "переменная среды", "object": "объект", "string": "строка", @@ -55,7 +55,7 @@ "Array": "массив", "invalid": "Неверный объект JSON" }, - "timestamp": "отметка времени", + "timestamp": "метка времени", "none": "нет", "interval": "с интервалом", "interval-time": "с интервалом в промежутке", diff --git a/packages/node_modules/@node-red/nodes/locales/ru/network/05-tls.html b/packages/node_modules/@node-red/nodes/locales/ru/network/05-tls.html index 33c790ed0..4818af0fb 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/network/05-tls.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/network/05-tls.html @@ -15,5 +15,5 @@ --> diff --git a/packages/node_modules/@node-red/nodes/locales/ru/network/06-httpproxy.html b/packages/node_modules/@node-red/nodes/locales/ru/network/06-httpproxy.html index 85fe4eb81..fb7b5ddc9 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/network/06-httpproxy.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/network/06-httpproxy.html @@ -21,6 +21,6 @@

    Подробности

    - При доступе к хосту, находящемуся в списке игнорируемых хостов, прокси не будет использоваться. + При обращении к хосту, находящемуся в списке игнорируемых хостов, прокси не будет использоваться.

    diff --git a/packages/node_modules/@node-red/nodes/locales/ru/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/ru/network/10-mqtt.html index ce10a9515..fab155c5a 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/network/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/network/10-mqtt.html @@ -13,7 +13,7 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ru/network/31-tcpin.html b/packages/node_modules/@node-red/nodes/locales/ru/network/31-tcpin.html index f23bd974a..7a3dcf2f3 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/network/31-tcpin.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/network/31-tcpin.html @@ -16,16 +16,16 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ru/network/32-udp.html b/packages/node_modules/@node-red/nodes/locales/ru/network/32-udp.html index 2a1026e8b..d014c4279 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/network/32-udp.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/network/32-udp.html @@ -16,13 +16,13 @@ @@ -37,6 +37,6 @@ Если Вы выберете широковещательную рассылку, то либо задайте в качестве адреса локальный широковещательный IP-адрес, либо попробуйте 255.255.255.255, который является глобальным широковещательным адресом.

    - Примечание. В некоторых системах Вам могут потребоваться права root или администратора для доступа к портам ниже 1024 и/или широковещательной рассылки. + Примечание. В некоторых системах вам могут потребоваться права root или администратора для доступа к портам ниже 1024 и/или широковещательной рассылки.

    diff --git a/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-CSV.html b/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-CSV.html index de94a1fd8..66186eb7e 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-CSV.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-CSV.html @@ -30,10 +30,10 @@
    payloadобъект | массив | строка
    @@ -46,7 +46,7 @@ При преобразовании в CSV шаблон столбцов используется для определения того, какие свойства извлекать из объекта и в каком порядке.

    - Если шаблон пуст, то узел может использовать простой список свойств, разделенных запятыми, предоставленных в msg.columns, чтобы определить, что извлечь. Если этого нет, то все свойства объекта выводятся в том порядке, в котором они были найдены в первой строке. + Если шаблон пуст, то узел может использовать простой список свойств, разделенных запятыми, предоставленных в msg.columns, чтобы определить, что извлечь. Если его нет, то все свойства объекта выводятся в том порядке, в котором они были найдены в первой строке.

    Если входные данные являются массивом, то шаблон столбцов используется только для необязательного генерирования строки с заголовками столбцов. diff --git a/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-JSON.html b/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-JSON.html index 0b663ed05..a2dc2da78 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-JSON.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-JSON.html @@ -37,7 +37,7 @@

    schemaErrorмассив
    -
    Если проверка JSON-схемы завершится неудачно, узел catch будет иметь свойство schemaError, содержащее массив ошибок.
    +
    Если проверка JSON-схемы завершится неудачно, узлом catch можно получить свойство schemaError, содержащее массив ошибок.

    Подробности

    @@ -45,10 +45,10 @@ По умолчанию узел работает с msg.payload, но его можно настроить для преобразования любого свойства сообщения.

    - Узел также может быть сконфигурирован для обеспечения конкретной кодировки вместо переключения между ними. Это можно использовать, например, с узлом HTTP In, чтобы гарантировать, что данные payload являются объектом, даже если входящий запрос неправильно установил свой тип содержимого для узла HTTP In, чтобы выполнить преобразование. + Узел также может быть сконфигурирован для обеспечения конкретной кодировки вместо переключения между ними. Это можно использовать, например, при работе с узлом HTTP In, чтобы гарантировать, что данные payload всегда будут являться объектом, даже если входящий запрос неправильно установил свой тип содержимого для узла HTTP In, чтобы выполнить преобразование.

    - Если узел настроен на то, чтобы свойство кодировалось как строка, и он получает строку, дальнейшие проверки этого свойства выполняться не будут. Он не будет проверять, является ли строка допустимым JSON, и не будет переформатировать ее, если выбрана опция форматирования. + Если узел настроен так, чтобы свойство кодировалось как строка, и он получает строку, дальнейшие проверки этого свойства выполняться не будут. Он не будет проверять, является ли строка допустимым JSON, и не будет переформатировать ее, если выбрана опция форматирования.

    Подробнее о JSON-схеме Вы можете узнать в спецификации здесь. diff --git a/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-XML.html b/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-XML.html index ed6fe6c44..d600826bd 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-XML.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-XML.html @@ -32,8 +32,8 @@

    payloadобъект | строка
    diff --git a/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-YAML.html b/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-YAML.html index b0049330b..8d8ac5f9b 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-YAML.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/parsers/70-YAML.html @@ -30,8 +30,8 @@
    payloadобъект | строка
    diff --git a/packages/node_modules/@node-red/nodes/locales/ru/sequence/17-split.html b/packages/node_modules/@node-red/nodes/locales/ru/sequence/17-split.html index cf7397157..717c6de75 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/sequence/17-split.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/sequence/17-split.html @@ -24,7 +24,7 @@
    payloadобъект | строка | массив | буфер
    Поведение узла определяется типом msg.payload: @@ -34,7 +34,7 @@

    Выводит

    partsобъект
    -
    Это свойство содержит информацию о том, как сообщение было отделено от исходного сообщения. При передаче на узел join последовательность может быть собрана в одно сообщение. Свойство имеет следующие свойства: +
    Это свойство содержит информацию о том, как сообщение было отделено от исходного сообщения. При передаче на узел join последовательность может быть собрана обратно в одно сообщение. Объект содержит следующие свойства:
    • id - идентификатор группы сообщений
    • index - позиция в группе
    • @@ -49,7 +49,7 @@

      Подробности

      - Этот узел облегчает создание потока, который выполняет общие действия над последовательностью сообщений, перед тем как с помощью узла join объединить последовательность в одно сообщение. + Этот узел облегчает создание потока, который выполняет общие действия над последовательностью сообщений, перед тем как с помощью узла join объединить последовательность обратно в одно сообщение.

      Он использует свойство msg.parts для отслеживания отдельных частей последовательности. @@ -60,7 +60,7 @@ Узел также может использоваться для переформатирования потока сообщений. Например, последовательное устройство, которое отправляет завершенные новой строкой команды, может доставлять одно сообщение с частичной командой в конце. В 'потоковом режиме' этот узел будет разбивать сообщение и отправлять каждый завершенный сегмент. Если в конце есть частичный сегмент, узел удержит его и добавит к следующему полученному сообщению.

      - При работе в этом режиме узел не будет устанавливать свойство msg.parts.count, так как он не знает, сколько сообщений ожидать в потоке. Это означает, что его нельзя использовать с узлом join в его автоматическом режиме. + При работе в этом режиме узел не будет устанавливать свойство msg.parts.count, так как он не знает, сколько сообщений ожидать в потоке. Это означает, что его нельзя использовать вместе с узлом join в его автоматическом режиме.

      @@ -73,7 +73,7 @@

      автоматический
      -
      При использовании с узлом split он автоматически объединит сообщения, чтобы отменить выполненное разделение.
      +
      При использовании с узлом split он автоматически объединит сообщения, чтобы восстановить структуру сообщения, которая была до разделения.
      ручной
      Объединяет последовательности сообщений различными способами.
      агрегация последовательности
      @@ -103,7 +103,7 @@

      Подробности

      Автоматический режим

      - В автоматическом режиме используется свойство parts входящих сообщений, чтобы определить способ объединения последовательности. Это позволяет автоматически отменять действие узла split. + В автоматическом режиме используется свойство parts входящих сообщений, чтобы определить способ объединения последовательности. Это позволяет автоматически выполнять обратное действие для узла split.

      Ручной режим

      @@ -123,7 +123,7 @@ Свойство кол-во может быть установлено для количества сообщений, которое должно быть получено перед генерацией выходного сообщения. Для выходных данных объекта, когда это число достигнуто, узел может быть настроен на отправку сообщения для каждого последующего полученного сообщения.

      - Свойство время (сек) может быть установлено, чтобы инициировать отправку нового сообщения с использованием того, что было получено до сих пор. + Свойство время (сек) может быть установлено, чтобы инициировать отправку нового сообщения с использованием всего, что было получено до сих пор.

      Если сообщение получено с установленным свойством msg.complete, выходное сообщение завершается и отправляется. Это сбрасывает любой подсчет частей. diff --git a/packages/node_modules/@node-red/nodes/locales/ru/sequence/18-sort.html b/packages/node_modules/@node-red/nodes/locales/ru/sequence/18-sort.html index efd183854..64efa3967 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/sequence/18-sort.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/sequence/18-sort.html @@ -48,7 +48,7 @@

    - Примечание. Этот узел внутренне хранит сообщения для своей работы. Чтобы предотвратить непредвиденное использование памяти, можно указать максимальное количество хранимых сообщений. По умолчанию количество сообщений не ограничено. + Примечание. Этот узел буферизирует сообщения внутри для своей работы. Чтобы предотвратить непредвиденное использование памяти, можно указать максимальное количество хранимых сообщений. По умолчанию количество сообщений не ограничено.

    • Свойство nodeMessageBufferMaxLength устанавливается в settings.js.
    diff --git a/packages/node_modules/@node-red/nodes/locales/ru/sequence/19-batch.html b/packages/node_modules/@node-red/nodes/locales/ru/sequence/19-batch.html index ecda13154..2589233be 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/sequence/19-batch.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/sequence/19-batch.html @@ -37,7 +37,7 @@

    Хранение сообщений

    - Этот узел будет буферизировать сообщения внутри, чтобы работать между последовательностями. Параметр nodeMessageBufferMaxLength можно использовать для ограничения количества сообщений, которые узел будут буферизовать. + Этот узел будет буферизировать сообщения внутри, чтобы работать с последовательностями. Параметр nodeMessageBufferMaxLength можно использовать для ограничения количества сообщений, которые узел будут буферизовать.

    Если сообщение получено с установленным свойством msg.reset, буферизованные сообщения удаляются и не отправляются. diff --git a/packages/node_modules/@node-red/nodes/locales/ru/storage/10-file.html b/packages/node_modules/@node-red/nodes/locales/ru/storage/10-file.html index e1c8bf456..8a4a64f24 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/storage/10-file.html +++ b/packages/node_modules/@node-red/nodes/locales/ru/storage/10-file.html @@ -16,7 +16,7 @@ diff --git a/packages/node_modules/@node-red/registry/lib/library.js b/packages/node_modules/@node-red/registry/lib/library.js index 90b0fda82..b305456a5 100644 --- a/packages/node_modules/@node-red/registry/lib/library.js +++ b/packages/node_modules/@node-red/registry/lib/library.js @@ -27,17 +27,19 @@ async function getFlowsFromPath(path) { var validFiles = []; return fs.readdir(path).then(files => { var promises = []; - files.forEach(function(file) { - var fullPath = fspath.join(path,file); - var stats = fs.lstatSync(fullPath); - if (stats.isDirectory()) { - validFiles.push(file); - promises.push(getFlowsFromPath(fullPath)); - } else if (/\.json$/.test(file)){ - validFiles.push(file); - promises.push(Promise.resolve(file.split(".")[0])) - } - }) + if (files) { + files.forEach(function(file) { + var fullPath = fspath.join(path,file); + var stats = fs.lstatSync(fullPath); + if (stats.isDirectory()) { + validFiles.push(file); + promises.push(getFlowsFromPath(fullPath)); + } else if (/\.json$/.test(file)){ + validFiles.push(file); + promises.push(Promise.resolve(file.split(".")[0])) + } + }) + } return Promise.all(promises) }).then(results => { results.forEach(function(r,i) { diff --git a/packages/node_modules/@node-red/runtime/lib/api/nodes.js b/packages/node_modules/@node-red/runtime/lib/api/nodes.js index 556e57df9..db4ed32a5 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/nodes.js +++ b/packages/node_modules/@node-red/runtime/lib/api/nodes.js @@ -94,6 +94,10 @@ var api = module.exports = { getNodeConfig: async function(opts) { var id = opts.id; var lang = opts.lang; + if (/[^a-z\-\*]/i.test(opts.lang)) { + reject(new Error("Invalid language: "+opts.lang)); + return + } var result = runtime.nodes.getNodeConfig(id,lang); if (result) { runtime.log.audit({event: "nodes.config.get",id:id}, opts.req); @@ -116,6 +120,10 @@ var api = module.exports = { * @memberof @node-red/runtime_nodes */ getNodeConfigs: async function(opts) { + if (/[^a-z\-\*]/i.test(opts.lang)) { + reject(new Error("Invalid language: "+opts.lang)); + return + } runtime.log.audit({event: "nodes.configs.get"}, opts.req); return runtime.nodes.getNodeConfigs(opts.lang); }, @@ -374,6 +382,10 @@ var api = module.exports = { getModuleCatalogs: async function(opts) { var namespace = opts.module; var lang = opts.lang; + if (/[^a-z\-\*]/i.test(lang)) { + reject(new Error("Invalid language: "+lang)); + return + } var prevLang = runtime.i18n.i.language; // Trigger a load from disk of the language if it is not the default return new Promise( (resolve,reject) => { @@ -404,6 +416,10 @@ var api = module.exports = { getModuleCatalog: async function(opts) { var namespace = opts.module; var lang = opts.lang; + if (/[^a-z\-\*]/i.test(lang)) { + reject(new Error("Invalid language: "+lang)); + return + } var prevLang = runtime.i18n.i.language; // Trigger a load from disk of the language if it is not the default return new Promise(resolve => { diff --git a/packages/node_modules/@node-red/util/lib/i18n.js b/packages/node_modules/@node-red/util/lib/i18n.js index e9dbedace..96a66ba1d 100644 --- a/packages/node_modules/@node-red/util/lib/i18n.js +++ b/packages/node_modules/@node-red/util/lib/i18n.js @@ -23,7 +23,7 @@ var i18n = require("i18next"); var path = require("path"); -var fs = require("fs"); +var fs = require("fs-extra"); var defaultLang = "en-US"; @@ -81,36 +81,28 @@ function mergeCatalog(fallback,catalog) { } -function readFile(lng, ns) { - return new Promise((resolve, reject) => { - if (resourceCache[ns] && resourceCache[ns][lng]) { - resolve(resourceCache[ns][lng]); - } else if (resourceMap[ns]) { - var file = path.join(resourceMap[ns].basedir, lng, resourceMap[ns].file); - fs.readFile(file, "utf8", function (err, content) { - if (err) { - reject(err); - } else { - try { - resourceCache[ns] = resourceCache[ns] || {}; - resourceCache[ns][lng] = JSON.parse(content.replace(/^\uFEFF/, '')); - var baseLng = lng.split('-')[0]; - if (baseLng !== lng && resourceCache[ns][baseLng]) { - mergeCatalog(resourceCache[ns][baseLng], resourceCache[ns][lng]); - } - if (lng !== defaultLang) { - mergeCatalog(resourceCache[ns][defaultLang], resourceCache[ns][lng]); - } - resolve(resourceCache[ns][lng]); - } catch (e) { - reject(e); - } - } - }); - } else { - reject(new Error("Unrecognised namespace")); +async function readFile(lng, ns) { + if (/[^a-z\-]/i.test(lng)) { + throw new Error("Invalid language: "+lng) + } + if (resourceCache[ns] && resourceCache[ns][lng]) { + return resourceCache[ns][lng]; + } else if (resourceMap[ns]) { + const file = path.join(resourceMap[ns].basedir, lng, resourceMap[ns].file); + const content = await fs.readFile(file, "utf8"); + resourceCache[ns] = resourceCache[ns] || {}; + resourceCache[ns][lng] = JSON.parse(content.replace(/^\uFEFF/, '')); + var baseLng = lng.split('-')[0]; + if (baseLng !== lng && resourceCache[ns][baseLng]) { + mergeCatalog(resourceCache[ns][baseLng], resourceCache[ns][lng]); } - }); + if (lng !== defaultLang) { + mergeCatalog(resourceCache[ns][defaultLang], resourceCache[ns][lng]); + } + return resourceCache[ns][lng]; + } else { + throw new Error("Unrecognised namespace"); + } } var MessageFileLoader = { @@ -181,6 +173,10 @@ function init(settings) { function getCatalog(namespace,lang) { var result = null; lang = lang || defaultLang; + if (/[^a-z\-]/i.test(lang)) { + throw new Error("Invalid language: "+lng) + } + if (resourceCache.hasOwnProperty(namespace)) { result = resourceCache[namespace][lang]; if (!result) { diff --git a/test/nodes/core/sequence/17-split_spec.js b/test/nodes/core/sequence/17-split_spec.js index 3ffa424b6..a216be90b 100644 --- a/test/nodes/core/sequence/17-split_spec.js +++ b/test/nodes/core/sequence/17-split_spec.js @@ -1759,13 +1759,13 @@ describe('JOIN node', function() { { msg: {seq:0, payload:"A", parts:{id:1, type:"string", ch:",", index:0, count:3}}, delay:0, avr:500, var:100}, { msg: {seq:1, payload:"B", parts:{id:1, type:"string", ch:",", index:1, count:3}}, delay:200, avr:500, var:100}, { msg: {seq:2, payload:"dummy", reset: true, parts:{id:1}}, delay:500, avr:500, var:100} - ]); + ]); }); it('should call done() when timed out', function (done) { mapiDoneJoinTestHelper(done, {mode:"custom", joiner:",", build:"string", timeout:0.5}, [ { msg: {seq:0, payload:"A"}, delay:0, avr:500, var:100}, { msg: {seq:1, payload:"B"}, delay:200, avr:500, var:100}, - ]); + ]); }); it('should call done() when all messages are reduced', function (done) { mapiDoneJoinTestHelper(done, {mode:"reduce", reduceRight:false, reduceExp:"$A+payload", reduceInit:"0", @@ -1785,4 +1785,40 @@ describe('JOIN node', function() { ]); }); }); + + it('should handle msg.parts even if messages are out of order in auto mode if exactly one message has count set', function (done) { + var flow = [{ id: "n1", type: "join", wires: [["n2"]], mode: "auto" }, + { id: "n2", type: "helper" }]; + helper.load(joinNode, flow, function () { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + + n2.on("input", function (msg) { + msg.payload.length.should.be.eql(5); + msg.payload.should.be.eql([0,1,2,3,4]); + done(); + }); + + var msg = {}; + msg.parts = { + id: RED.util.generateId() + }; + for(var elem = 1; elem < 5; ++elem) { + var _msg = RED.util.cloneMessage(msg); + _msg.parts.index = elem; + if(elem == 4) { + _msg.parts.count = 5; + } + _msg.payload = elem; + n1.receive(_msg); + } + + var _msg = RED.util.cloneMessage(msg); + delete _msg.parts.count; + _msg.parts.index = 0; + _msg.payload = 0; + n1.receive(_msg); + }); + + }) });