mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Compare commits
18 Commits
4401-fix-d
...
fix-nested
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2963f3f1b8 | ||
|
|
f3dd5770d9 | ||
|
|
eebab4a921 | ||
|
|
b06494c5be | ||
|
|
eff063a748 | ||
|
|
94abaaff1e | ||
|
|
8a04eb2e29 | ||
|
|
1777fc749d | ||
|
|
fd32ee09ff | ||
|
|
4bb2157cab | ||
|
|
47f20cc86a | ||
|
|
5fc4526c70 | ||
|
|
9fe653f821 | ||
|
|
55da21ed15 | ||
|
|
7ebf84f38c | ||
|
|
d42e75ebd0 | ||
|
|
28825049fe | ||
|
|
60593fed4a |
6
.github/workflows/release.yml
vendored
6
.github/workflows/release.yml
vendored
@@ -27,12 +27,12 @@ jobs:
|
||||
with:
|
||||
repository: 'node-red/node-red.github.io'
|
||||
path: 'node-red.github.io'
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '16'
|
||||
- run: node ./node-red/.github/scripts/update-node-red-docker.js
|
||||
- name: Create Docker Pull Request
|
||||
uses: peter-evans/create-pull-request@v2
|
||||
uses: peter-evans/create-pull-request@v5
|
||||
with:
|
||||
token: ${{ secrets.NR_REPO_TOKEN }}
|
||||
committer: GitHub <noreply@github.com>
|
||||
@@ -48,7 +48,7 @@ jobs:
|
||||
This PR was auto-generated by a GitHub Action. Any questions, speak to @knolleary
|
||||
- run: node ./node-red/.github/scripts/update-node-red-website.js
|
||||
- name: Create Website Pull Request
|
||||
uses: peter-evans/create-pull-request@v2
|
||||
uses: peter-evans/create-pull-request@v5
|
||||
with:
|
||||
token: ${{ secrets.NR_REPO_TOKEN }}
|
||||
committer: GitHub <noreply@github.com>
|
||||
|
||||
2
.github/workflows/tests.yml
vendored
2
.github/workflows/tests.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Install Dependencies
|
||||
|
||||
54
CHANGELOG.md
54
CHANGELOG.md
@@ -1,3 +1,57 @@
|
||||
#### 3.1.1: Maintenance Release
|
||||
|
||||
Editor
|
||||
|
||||
- Fix debug filter (#4461) @knolleary
|
||||
- Fix various issues with debug pop-out window (#4459) @knolleary
|
||||
- Ensure subflow instances keep track of their groups (#4457) @knolleary
|
||||
- Fix `validateNodeProperty` without validator provided (#4455) @GogoVega
|
||||
- Debounce node-removed notifications (#4453) @knolleary
|
||||
- Don't try to load the parents of the first commit (#4448) @bonanitech
|
||||
- Allow a theme to specifiy which theme mermaid should use (#4441) @knolleary
|
||||
- Update browser title with flow name if set (#4427) @knolleary
|
||||
- Ensure typeSearch handles undefined node definitions (#4423) @knolleary
|
||||
- Ensure group w/h are imported if present (#4426) @knolleary
|
||||
- Hide node status background when there is no status to show (#4425) @knolleary
|
||||
- Add a close button to the restart-required notification (#4407) @knolleary
|
||||
- Extend typedInput "num" type validity check to NaN, binary, octal & hex (#4371) @ralphwetzel
|
||||
- Fix unintended new line in node name (#4399) @kazuhitoyokoi
|
||||
- Ctrl-Enter does not close tray (Monaco) #4377 (#4382) @hazymat
|
||||
- fix buffer viewer to handle 0b style binary (#4393) @dceejay
|
||||
- Rework mermaid integration to support off-DOM rendering (#4364) @knolleary
|
||||
- Add missing nls labels to context menu (#4365) @knolleary
|
||||
|
||||
Runtime
|
||||
|
||||
- Bump the github-actions group with 2 updates (#4404) @app/dependabot
|
||||
- Handle unknown node reference inside subflow module (#4460) @knolleary
|
||||
- Add modules.install audit event when external module installed (#4452) @knolleary
|
||||
- Allow import of modules with subpath in specifier (#4451) @knolleary
|
||||
- Update node-red-admin version (#4438) @knolleary
|
||||
- Handle false-like env vars properly (#4411) @knolleary
|
||||
- Only save settings once during node load process (#4409) @knolleary
|
||||
- Ensure global-config nodes lookup cred values properly (#4405) @knolleary
|
||||
- Handle credential env var evaluation when no value set (#4362) @knolleary
|
||||
- Don't commit package-lock.json (#4354) @bonanitech
|
||||
- Fix env evaluation when one env references another in the same object (#4361) @knolleary
|
||||
- Add dependabot for Github Actions (#4312) @Rotzbua
|
||||
- Update outdated Github Actions (#4311) @Rotzbua
|
||||
- github: Request `npm run test` in PR template (#4348) @ZJvandeWeg
|
||||
- Add French translation of v3.1.0-beta.4 changes + slight improvements (#4329) @GogoVega
|
||||
- Handle nodes with multiple input handlers properly (#4332) @knolleary
|
||||
- Soften the language around unrequited PRs (#4351) @knolleary
|
||||
|
||||
Nodes
|
||||
|
||||
- CSV: make CSV export way faster by not re-allocating and handling huge string (#4349) @Fadoli
|
||||
- Delay: Fix regression in delay node to not pass on msg.reset (#4350) @dceejay
|
||||
- Link Call: Handle undefined linkType value for existing link-call nodes (#4331) @knolleary
|
||||
- MQTT: Guard against node.broker being undefined (#4454) @knolleary
|
||||
- MQTT: check topic length > 0 before publish (#4416) @dceejay
|
||||
- Switch/Change: Improve validation of switch/change node rules (#4368) @knolleary
|
||||
- Template: Fix height of description editor in template node (#4346) @kazuhitoyokoi
|
||||
- Various: Add validators to any fields using msg-typed Input (#4440) @knolleary
|
||||
|
||||
#### 3.1.0: Milestone Release
|
||||
|
||||
Editor
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "node-red",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.1",
|
||||
"description": "Low-code programming for event-driven applications",
|
||||
"homepage": "https://nodered.org",
|
||||
"license": "Apache-2.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@node-red/editor-api",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.1",
|
||||
"license": "Apache-2.0",
|
||||
"main": "./lib/index.js",
|
||||
"repository": {
|
||||
@@ -16,8 +16,8 @@
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"@node-red/util": "3.1.0",
|
||||
"@node-red/editor-client": "3.1.0",
|
||||
"@node-red/util": "3.1.1",
|
||||
"@node-red/editor-client": "3.1.1",
|
||||
"bcryptjs": "2.4.3",
|
||||
"body-parser": "1.20.2",
|
||||
"clone": "2.1.2",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@node-red/editor-client",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.1",
|
||||
"license": "Apache-2.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -56,6 +56,9 @@ RED.validators = {
|
||||
if (options.allowBlank && v === '') {
|
||||
return true
|
||||
}
|
||||
if (options.allowUndefined && v === undefined) {
|
||||
return true
|
||||
}
|
||||
const result = RED.utils.validateTypedProperty(v, ptype, opt)
|
||||
if (result === true || opt) {
|
||||
// Valid, or opt provided - return result as-is
|
||||
|
||||
@@ -114,6 +114,7 @@
|
||||
pointer-events: stroke;
|
||||
}
|
||||
.red-ui-flow-group-outline-select {
|
||||
cursor: move;
|
||||
fill: none;
|
||||
stroke: var(--red-ui-node-selected-color);
|
||||
pointer-events: none;
|
||||
|
||||
@@ -509,6 +509,26 @@
|
||||
}
|
||||
}
|
||||
|
||||
function containsDebug(sid, map) {
|
||||
var item = map[sid];
|
||||
if (item) {
|
||||
if (item.debug === undefined) {
|
||||
var sfs = Object.keys(item.subflows);
|
||||
var contain = false;
|
||||
for (var i = 0; i < sfs.length; i++) {
|
||||
var sf = sfs[i];
|
||||
if (containsDebug(sf, map)) {
|
||||
contain = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
item.debug = contain;
|
||||
}
|
||||
return item.debug;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
$("#red-ui-sidebar-debug-open").on("click", function(e) {
|
||||
e.preventDefault();
|
||||
subWindow = window.open(document.location.toString().replace(/[?#].*$/,"")+"debug/view/view.html"+document.location.search,"nodeREDDebugView","menubar=no,location=no,toolbar=no,chrome,height=500,width=600");
|
||||
|
||||
@@ -248,28 +248,6 @@ RED.debug = (function() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
function containsDebug(sid, map) {
|
||||
var item = map[sid];
|
||||
if (item) {
|
||||
if (item.debug === undefined) {
|
||||
var sfs = Object.keys(item.subflows);
|
||||
var contain = false;
|
||||
for (var i = 0; i < sfs.length; i++) {
|
||||
var sf = sfs[i];
|
||||
if (containsDebug(sf, map)) {
|
||||
contain = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
item.debug = contain;
|
||||
}
|
||||
return item.debug;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
function refreshDebugNodeList(data) {
|
||||
debugNodeTreeList.treeList("data", data);
|
||||
}
|
||||
|
||||
@@ -176,14 +176,16 @@
|
||||
for (var i=0;i<rules.length;i++) {
|
||||
const opt = { label: RED._('node-red:switch.label.rule')+' '+(i+1) }
|
||||
const r = rules[i];
|
||||
if (r.hasOwnProperty('v')) {
|
||||
if ((msg = RED.utils.validateTypedProperty(r.v,r.vt,opt)) !== true) {
|
||||
errors.push(msg)
|
||||
if (r.t !== 'istype') {
|
||||
if (r.hasOwnProperty('v')) {
|
||||
if ((msg = RED.utils.validateTypedProperty(r.v,r.vt,opt)) !== true) {
|
||||
errors.push(msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (r.hasOwnProperty('v2')) {
|
||||
if ((msg = RED.utils.validateTypedProperty(r.v2,r.v2t,opt)) !== true) {
|
||||
errors.push(msg)
|
||||
if (r.hasOwnProperty('v2')) {
|
||||
if ((msg = RED.utils.validateTypedProperty(r.v2,r.v2t,opt)) !== true) {
|
||||
errors.push(msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,11 +58,8 @@
|
||||
round: {value:false},
|
||||
property: {value:"payload",required:true,
|
||||
label:RED._("node-red:common.label.property"),
|
||||
validate: RED.validators.typedInput({ type: 'msg' })
|
||||
validate: RED.validators.typedInput({ type: 'msg', allowBlank: true })
|
||||
},
|
||||
|
||||
|
||||
// RED.validators.typedInput("propertyType", false)},
|
||||
name: {value:""}
|
||||
},
|
||||
inputs: 1,
|
||||
|
||||
@@ -57,10 +57,10 @@
|
||||
septopics: {value:true},
|
||||
property: {value:"payload", required:true,
|
||||
label:RED._("node-red:rbe.label.property"),
|
||||
validate: RED.validators.typedInput({ type: 'msg' })},
|
||||
validate: RED.validators.typedInput({ type: 'msg', allowUndefined: true })},
|
||||
topi: {value:"topic", required:true,
|
||||
label:RED._("node-red:rbe.label.topic"),
|
||||
validate: RED.validators.typedInput({ type: 'msg' })}
|
||||
validate: RED.validators.typedInput({ type: 'msg', allowUndefined: true })}
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
|
||||
@@ -41,8 +41,8 @@
|
||||
color:"#DEBD5C",
|
||||
defaults: {
|
||||
name: {value:""},
|
||||
property: {value:"payload", validate: RED.validators.typedInput({ type: 'msg' }) },
|
||||
outproperty: {value:"payload", validate: RED.validators.typedInput({ type: 'msg' }) },
|
||||
property: {value:"payload", validate: RED.validators.typedInput({ type: 'msg', allowUndefined: true }) },
|
||||
outproperty: {value:"payload", validate: RED.validators.typedInput({ type: 'msg', allowUndefined: true }) },
|
||||
tag: {value:""},
|
||||
ret: {value:"html"},
|
||||
as: {value:"single"}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
defaults: {
|
||||
name: {value:""},
|
||||
property: {value:"payload",required:true,
|
||||
validate: RED.validators.typedInput({ type: 'msg' }),
|
||||
validate: RED.validators.typedInput({ type: 'msg', allowUndefined: true}),
|
||||
label:RED._("node-red:json.label.property")},
|
||||
action: {value:""},
|
||||
pretty: {value:false}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
name: {value:""},
|
||||
property: {value:"payload",required:true,
|
||||
label:RED._("node-red:common.label.property"),
|
||||
validate: RED.validators.typedInput({ type: 'msg' })},
|
||||
validate: RED.validators.typedInput({ type: 'msg', allowUndefined: true })},
|
||||
attr: {value:""},
|
||||
chr: {value:""}
|
||||
},
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
color:"#DEBD5C",
|
||||
defaults: {
|
||||
property: {value:"payload",required:true,
|
||||
validate: RED.validators.typedInput({ type: 'msg' }),
|
||||
validate: RED.validators.typedInput({ type: 'msg', allowUndefined: true }),
|
||||
label:RED._("node-red:common.label.property")},
|
||||
name: {value:""}
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@node-red/nodes",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.1",
|
||||
"license": "Apache-2.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@node-red/registry",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.1",
|
||||
"license": "Apache-2.0",
|
||||
"main": "./lib/index.js",
|
||||
"repository": {
|
||||
@@ -16,7 +16,7 @@
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"@node-red/util": "3.1.0",
|
||||
"@node-red/util": "3.1.1",
|
||||
"clone": "2.1.2",
|
||||
"fs-extra": "11.1.1",
|
||||
"semver": "7.5.4",
|
||||
|
||||
@@ -112,6 +112,7 @@ class Subflow extends Flow {
|
||||
|
||||
remapSubflowNodes(subflowInternalFlowConfig.configs,node_map);
|
||||
remapSubflowNodes(subflowInternalFlowConfig.nodes,node_map);
|
||||
remapSubflowNodes(subflowInternalFlowConfig.groups,node_map);
|
||||
|
||||
// console.log("Instance config\n",JSON.stringify(subflowInternalFlowConfig,"",2));
|
||||
|
||||
@@ -248,7 +249,7 @@ class Subflow extends Flow {
|
||||
for (j=0;j<wires.length;j++) {
|
||||
if (wires[j].id != self.subflowDef.id) {
|
||||
node = self.node_map[wires[j].id];
|
||||
if (node._originalWires) {
|
||||
if (node && node._originalWires) {
|
||||
node.wires = clone(node._originalWires);
|
||||
}
|
||||
}
|
||||
@@ -265,8 +266,10 @@ class Subflow extends Flow {
|
||||
subflowInstanceModified = true;
|
||||
} else {
|
||||
node = self.node_map[wires[j].id];
|
||||
node.wires[wires[j].port] = node.wires[wires[j].port].concat(newWires[i]);
|
||||
modifiedNodes[node.id] = node;
|
||||
if (node) {
|
||||
node.wires[wires[j].port] = node.wires[wires[j].port].concat(newWires[i]);
|
||||
modifiedNodes[node.id] = node;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -294,10 +297,14 @@ class Subflow extends Flow {
|
||||
this.node._updateWires(subflowInstanceConfig.wires);
|
||||
} else {
|
||||
var node = self.node_map[wires[j].id];
|
||||
if (!node._originalWires) {
|
||||
node._originalWires = clone(node.wires);
|
||||
if (node) {
|
||||
if (!node._originalWires) {
|
||||
node._originalWires = clone(node.wires);
|
||||
}
|
||||
node.wires[wires[j].port] = (node.wires[wires[j].port]||[]).concat(this.subflowInstance.wires[i]);
|
||||
} else {
|
||||
this.error("Unknown node referenced inside subflow: " + wires[j].id)
|
||||
}
|
||||
node.wires[wires[j].port] = (node.wires[wires[j].port]||[]).concat(this.subflowInstance.wires[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -313,11 +320,15 @@ class Subflow extends Flow {
|
||||
this.node._updateWires(subflowInstanceConfig.wires);
|
||||
} else {
|
||||
var node = self.node_map[wires[j].id];
|
||||
if (!node._originalWires) {
|
||||
node._originalWires = clone(node.wires);
|
||||
if (node) {
|
||||
if (!node._originalWires) {
|
||||
node._originalWires = clone(node.wires);
|
||||
}
|
||||
node.wires[wires[j].port] = (node.wires[wires[j].port]||[]);
|
||||
node.wires[wires[j].port].push(subflowStatusId);
|
||||
} else {
|
||||
this.error("Unknown node referenced inside subflow: " + wires[j].id)
|
||||
}
|
||||
node.wires[wires[j].port] = (node.wires[wires[j].port]||[]);
|
||||
node.wires[wires[j].port].push(subflowStatusId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@node-red/runtime",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.1",
|
||||
"license": "Apache-2.0",
|
||||
"main": "./lib/index.js",
|
||||
"repository": {
|
||||
@@ -16,8 +16,8 @@
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"@node-red/registry": "3.1.0",
|
||||
"@node-red/util": "3.1.0",
|
||||
"@node-red/registry": "3.1.1",
|
||||
"@node-red/util": "3.1.1",
|
||||
"async-mutex": "0.4.0",
|
||||
"clone": "2.1.2",
|
||||
"express": "4.18.2",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@node-red/util",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.1",
|
||||
"license": "Apache-2.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
10
packages/node_modules/node-red/package.json
vendored
10
packages/node_modules/node-red/package.json
vendored
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "node-red",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.1",
|
||||
"description": "Low-code programming for event-driven applications",
|
||||
"homepage": "https://nodered.org",
|
||||
"license": "Apache-2.0",
|
||||
@@ -31,10 +31,10 @@
|
||||
"flow"
|
||||
],
|
||||
"dependencies": {
|
||||
"@node-red/editor-api": "3.1.0",
|
||||
"@node-red/runtime": "3.1.0",
|
||||
"@node-red/util": "3.1.0",
|
||||
"@node-red/nodes": "3.1.0",
|
||||
"@node-red/editor-api": "3.1.1",
|
||||
"@node-red/runtime": "3.1.1",
|
||||
"@node-red/util": "3.1.1",
|
||||
"@node-red/nodes": "3.1.1",
|
||||
"basic-auth": "2.0.1",
|
||||
"bcryptjs": "2.4.3",
|
||||
"express": "4.18.2",
|
||||
|
||||
Reference in New Issue
Block a user