Skip to content

Commit 38eaac7

Browse files
author
Dave Conway-Jones
committed
Add merger capability to make grabbing projects easier
1 parent 1ec358a commit 38eaac7

File tree

8 files changed

+189
-7
lines changed

8 files changed

+189
-7
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ then retry the command.
4545

4646
Runtimes are created in the `dist` directory under the `electron-node-red` project.
4747

48+
The `merger.js` utility can be pointed at an existing Node-RED projects directory and it will try to copy over and package up the relevant files into this project ready to install and build - so the simple flow would be
49+
50+
```
51+
./merger.js {path to my Node-RED project directory} && yarn && yarn start
52+
```
53+
4854
### Building for other platforms
4955

5056
Generally you can just add the required parameter to the command

example/electronflow.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"id":"41f61d2.fbe09e4","type":"tab","label":"Flow 1"},{"id":"52a903f3.ad56fc","type":"ui_tab","z":"41f61d2.fbe09e4","name":"Home","icon":"dashboard"},{"id":"30e652f.d9de3ae","type":"ui_group","z":"41f61d2.fbe09e4","name":"Panel 2","tab":"52a903f3.ad56fc","order":5,"disp":true,"width":"6"},{"id":"a8ecb9.c60f4348","type":"ui_group","z":"41f61d2.fbe09e4","name":"Introduction","tab":"52a903f3.ad56fc","order":1,"disp":false,"width":"4","collapse":false},{"id":"bbdf3e02.e8fee","type":"ui_group","z":"41f61d2.fbe09e4","name":"Panel 1","tab":"52a903f3.ad56fc","order":2,"disp":true,"width":"6"},{"id":"d9ba26fa.6d2b18","type":"ui_base","theme":{"name":"theme-light","lightTheme":{"default":"#0094CE","baseColor":"#8e0d17","baseFont":"Gill Sans,Geneva,sans-serif","edited":true,"reset":false},"darkTheme":{"default":"#097479","baseColor":"#097479","baseFont":"Helvetica Neue","edited":false},"customTheme":{"name":"Untitled Theme 1","default":"#4B7930","baseColor":"#4B7930","baseFont":"Helvetica Neue"},"themeState":{"base-color":{"default":"#0094CE","value":"#d80005","edited":true},"page-titlebar-backgroundColor":{"value":"#8e0d17","edited":false},"page-backgroundColor":{"value":"#fafafa","edited":false},"page-sidebar-backgroundColor":{"value":"#000000","edited":false},"group-textColor":{"value":"#d41322","edited":false},"group-borderColor":{"value":"#ffffff","edited":false},"group-backgroundColor":{"value":"#ffffff","edited":false},"widget-textColor":{"value":"#111111","edited":false},"widget-backgroundColor":{"value":"#8e0d17","edited":false},"widget-borderColor":{"value":"#ffffff","edited":false},"base-font":{"value":"Gill Sans,Geneva,sans-serif"}}},"site":{"name":"Node-RED Dashboard","hideToolbar":"false","allowSwipe":"false","dateFormat":"DD/MM/YYYY","sizes":{"sx":48,"sy":48,"gx":6,"gy":6,"cx":6,"cy":6,"px":0,"py":0}}},{"id":"87356b62.92e3d8","type":"ui_group","z":"","name":"Text to Speech","tab":"52a903f3.ad56fc","order":3,"disp":true,"width":"6"},{"id":"c75ad4f0.0cede8","type":"ui_group","z":"","name":"Map","tab":"52a903f3.ad56fc","order":4,"disp":true,"width":"6"},{"id":"189cf871.681118","type":"ui_template","z":"41f61d2.fbe09e4","group":"a8ecb9.c60f4348","name":"Welcome","order":1,"width":"4","height":"9","format":"<h3>Welcome to the <font color=\"#CE2020\">Node-RED</font> Dashboard</h3>\n<p>On the right you will see a graph and a gauge logging data from the sliders underneath.</p>\n<p>There is also an example of embedding a small map.</p>","storeOutMessages":false,"fwdInMessages":false,"templateScope":"local","x":100,"y":60,"wires":[[]]},{"id":"9f19ee5c.beaef","type":"ui_chart","z":"41f61d2.fbe09e4","name":"","group":"bbdf3e02.e8fee","order":1,"width":"0","height":"0","label":"","chartType":"line","xformat":"HH:mm:ss","interpolate":"basis","nodata":"No Data","dot":false,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"60","cutout":"","colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":2,"x":270,"y":200,"wires":[[],[]]},{"id":"799d9318.fd385c","type":"ui_gauge","z":"41f61d2.fbe09e4","name":"","group":"30e652f.d9de3ae","order":2,"width":"","height":"","gtype":"gage","title":"Title","label":"gauge","format":"{{value}}","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"x":270,"y":140,"wires":[]},{"id":"6f18b200.666a4","type":"ui_button","z":"41f61d2.fbe09e4","name":"","group":"87356b62.92e3d8","order":2,"width":0,"height":0,"label":"press to talk","color":"","bgcolor":"","icon":"fa-volume-up","payload":"Hello to Jason Isaacs","payloadType":"str","topic":"","x":110,"y":320,"wires":[["f897d7c2.467a58"]]},{"id":"f897d7c2.467a58","type":"ui_audio","z":"41f61d2.fbe09e4","name":"","group":"30e652f.d9de3ae","voice":"0","x":300,"y":320,"wires":[]},{"id":"da0f7e67.0d38a","type":"ui_slider","z":"41f61d2.fbe09e4","name":"","label":"slider","group":"30e652f.d9de3ae","order":4,"width":0,"height":0,"passthru":true,"topic":"","min":0,"max":"100","step":1,"x":90,"y":140,"wires":[["799d9318.fd385c","219da65f.e0b0da"]]},{"id":"eabf2bd7.f4e0c8","type":"ui_slider","z":"41f61d2.fbe09e4","name":"","label":"slider","group":"bbdf3e02.e8fee","order":4,"width":0,"height":0,"passthru":true,"topic":"","min":0,"max":"100","step":1,"x":130,"y":200,"wires":[["9f19ee5c.beaef","ccee40e3.c1618"]]},{"id":"45508d88.744a54","type":"function","z":"41f61d2.fbe09e4","name":"","func":"// create random position\nvar lat = 51 + Math.random() * 0.2;\nvar lon = -1.45 + Math.random() * 0.2;\nmsg.payload={lat:lat, lon:lon, name:\"Jason\", icon:\"male\", url:\"<a href=\\\"/red/ui/#/0\\\">IBM link</a>\"};\nreturn msg;","outputs":1,"noerr":0,"x":290,"y":400,"wires":[["f76b15b1.dd27a8"]]},{"id":"6ca8cfc2.e0bce","type":"ui_button","z":"41f61d2.fbe09e4","name":"","group":"c75ad4f0.0cede8","order":1,"width":0,"height":0,"passthru":false,"label":"Where's Jason ?","color":"","bgcolor":"#910000","icon":"fa-male","payload":"","payloadType":"str","topic":"","x":110,"y":400,"wires":[["45508d88.744a54"]]},{"id":"219da65f.e0b0da","type":"debug","z":"41f61d2.fbe09e4","name":"","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","x":300,"y":100,"wires":[]},{"id":"ccee40e3.c1618","type":"debug","z":"41f61d2.fbe09e4","name":"","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","targetType":"msg","x":300,"y":260,"wires":[]},{"id":"1c597308.3cfc0d","type":"worldmap in","z":"41f61d2.fbe09e4","name":"worldmap in","path":"","events":"","x":110,"y":480,"wires":[["7d6cb82c.3f3ea8"]]},{"id":"7d6cb82c.3f3ea8","type":"debug","z":"41f61d2.fbe09e4","name":"","active":true,"tosidebar":false,"console":true,"tostatus":false,"complete":"payload","x":350,"y":480,"wires":[]},{"id":"762cecef.af00d4","type":"inject","z":"41f61d2.fbe09e4","name":"","topic":"","payload":"26","payloadType":"num","repeat":"","crontab":"","once":true,"onceDelay":"2","x":90,"y":260,"wires":[["eabf2bd7.f4e0c8"]]},{"id":"f76b15b1.dd27a8","type":"ui_worldmap","z":"41f61d2.fbe09e4","group":"c75ad4f0.0cede8","order":1,"width":"6","height":"7","name":"","lat":"51.17","lon":"-1.4","zoom":"","layer":"","cluster":"","maxage":"","usermenu":"hide","layers":"hide","panit":"false","panlock":"false","zoomlock":"false","hiderightclick":"true","coords":"none","showgrid":"false","path":"/worldmap","x":440,"y":400,"wires":[]}]

example/electronflow_cred.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"$":"8dbcfcd6d9f25932aa00994065774d5ctxk="}

example/package.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"name": "electron_node_red",
3+
"description": "Electron Node-RED application starter kit for development",
4+
"version": "1.0.2",
5+
"dependencies": {
6+
"node-red-contrib-play-audio": "*",
7+
"node-red-contrib-web-worldmap": "*",
8+
"node-red-dashboard": "*",
9+
"node-red-node-base64": "*",
10+
"node-red-node-geofence": "*",
11+
"node-red-node-random": "*",
12+
"node-red-node-smooth": "*"
13+
},
14+
"scripts": {
15+
"start": "node node_modules/node-red/red.js -u . electronflow.json"
16+
}
17+
}

main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ red_app.use("/",express.static("web"));
5050
// Create a server
5151
var server = http.createServer(red_app);
5252

53-
// Setup user directory and flowfile
53+
// Setup user directory and flowfile (if editable)
5454
var userdir = __dirname;
5555
if (editable) {
5656
// if running as raw electron use the current directory (mainly for dev)

merger.js

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#!/usr/bin/env node
2+
3+
const fs = require("fs");
4+
const path = require('path');
5+
const pkg = require("./package-template.json");
6+
7+
let arg = "./example";
8+
let flowfile = null;
9+
let dn = arg;
10+
let app;
11+
if (process.argv.length === 3 ) {
12+
arg = process.argv[2];
13+
14+
let dn = path.dirname(arg);
15+
if (path.extname(arg) === ".json") {
16+
if (path.basename(arg, '.json') !== "package") {
17+
flowfile = path.basename(arg);
18+
app = require(path.join(dn, "package.json"));
19+
}
20+
else {
21+
app = require(arg);
22+
}
23+
}
24+
else {
25+
app = require(path.join(arg, "package.json"));
26+
dn = arg;
27+
}
28+
}
29+
else {
30+
app = require(arg+"/package.json");
31+
}
32+
33+
const merge = {
34+
...app.dependencies,
35+
...pkg.dependencies
36+
};
37+
38+
pkg.dependencies = merge;
39+
// Try to get flow file name
40+
if (app.hasOwnProperty("node-red") && app["node-red"].hasOwnProperty("settings") && app["node-red"].settings.hasOwnProperty("flowFile") ) {
41+
pkg.NRelectron.flowFile = app["node-red"].settings.flowFile;
42+
}
43+
else if (app.hasOwnProperty("scripts") && app.scripts.hasOwnProperty("start")) {
44+
pkg.NRelectron.flowFile = app.scripts.start.split(' ').pop();
45+
}
46+
else {
47+
pkg.NRelectron.flowFile = flowfile || "flow.json";
48+
}
49+
50+
if (merge.hasOwnProperty("node-red-dashboard")) {
51+
pkg.NRelectron.start = "dashboard";
52+
}
53+
pkg.name = app.name;
54+
pkg.version = app.version;
55+
pkg.description = app.description;
56+
// console.log(pkg);
57+
58+
fs.copyFile(path.join(arg, pkg.NRelectron.flowFile), path.join("./", pkg.NRelectron.flowFile), (err) => {
59+
if (err) { console.log("Failed to copy flows file - "+path.join(arg, pkg.NRelectron.flowFile)); }
60+
else { console.log('Copied flows file - '+pkg.NRelectron.flowFile); }
61+
});
62+
const creds = path.basename(pkg.NRelectron.flowFile,".json")+"_cred.json";
63+
fs.copyFile(path.join(arg, creds), path.join("./", creds), (err) => {
64+
if (err) { console.log("Failed to copy creds file - "+path.join(arg, creds)); }
65+
else { console.log('Copied creds file - '+creds); }
66+
});
67+
68+
fs.writeFile("./package.json", JSON.stringify(pkg, null, 4), 'utf8', function (err) {
69+
if (err) { console.log("Failed to re-write package.json file."); }
70+
else {
71+
console.log("Merged package.json.");
72+
}
73+
});

package-template.json

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
{
2+
"name": "electron_node_red",
3+
"version": "1.0.2",
4+
"description": "Electron Node-RED application starter kit for development",
5+
"main": "main.js",
6+
"scripts": {
7+
"pack": "electron-builder --dir",
8+
"dist": "electron-builder",
9+
"release": "electron-builder build -p always",
10+
"postinstall": "electron-builder install-app-deps",
11+
"start": "electron main.js",
12+
"test": "echo \" Warning: no test specified \""
13+
},
14+
"repository": {
15+
"type": "git",
16+
"url": "git+https://github.com/dceejay/electron-node-red.git"
17+
},
18+
"dependencies": {
19+
"electron-is-dev": "*",
20+
"express": "^4.17.1",
21+
"node-red": "1.0.2"
22+
},
23+
"keywords": [
24+
"electron",
25+
"quick start",
26+
"node-red"
27+
],
28+
"author": {
29+
"name": "Dave Conway-Jones",
30+
"email": "[email protected]"
31+
},
32+
"license": "Apache-2.0",
33+
"bugs": {
34+
"url": "https://github.com/dceejay/electron-node-red/issues"
35+
},
36+
"homepage": "https://github.com/dceejay/electron-node-red#readme",
37+
"devDependencies": {
38+
"electron": "^7.1.1",
39+
"electron-builder": "^22.1.0"
40+
},
41+
"NRelectron": {
42+
"productName": "Node-RED Electron",
43+
"editable": true,
44+
"allowLoadSave": false,
45+
"showMap": false,
46+
"kioskMode": false,
47+
"flowFile": "electronflow.json",
48+
"start": "editor"
49+
},
50+
"build": {
51+
"appId": "com.electron.node-red",
52+
"productName": "Node-RED Electron",
53+
"copyright": "Copyright © 2019 D.Conway-Jones",
54+
"mac": {
55+
"category": "public.app-category.developer-tools",
56+
"target": "dmg"
57+
},
58+
"linux": {
59+
"target": [
60+
"rpm",
61+
"apk",
62+
{
63+
"target": "deb",
64+
"arch": [
65+
"x64",
66+
"armv7l"
67+
]
68+
}
69+
],
70+
"synopsis": "Node-RED Low Code development",
71+
"category": "Development"
72+
},
73+
"win": {
74+
"target": [
75+
{
76+
"target": "msi",
77+
"arch": [
78+
"x64"
79+
]
80+
}
81+
]
82+
}
83+
}
84+
}

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@
1616
"url": "git+https://github.com/dceejay/electron-node-red.git"
1717
},
1818
"dependencies": {
19-
"electron-is-dev": "*",
20-
"express": "^4.17.1",
21-
"node-red": "1.0.2",
2219
"node-red-contrib-play-audio": "*",
2320
"node-red-contrib-web-worldmap": "*",
2421
"node-red-dashboard": "*",
2522
"node-red-node-base64": "*",
2623
"node-red-node-geofence": "*",
2724
"node-red-node-random": "*",
28-
"node-red-node-smooth": "*"
25+
"node-red-node-smooth": "*",
26+
"electron-is-dev": "*",
27+
"express": "^4.17.1",
28+
"node-red": "1.0.2"
2929
},
3030
"keywords": [
3131
"electron",
@@ -50,7 +50,7 @@
5050
"editable": true,
5151
"allowLoadSave": false,
5252
"showMap": false,
53-
"kioskMode": false,
53+
"kioskMode": false,
5454
"flowFile": "electronflow.json",
5555
"start": "dashboard"
5656
},
@@ -88,4 +88,4 @@
8888
]
8989
}
9090
}
91-
}
91+
}

0 commit comments

Comments
 (0)