major upgrade to latest electron and builder

still need to do readme and merge
pull/9/head
Dave Conway-Jones 2019-10-23 17:40:06 +01:00
rodzic 2a4a1d3ba7
commit b164f0b777
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 302A6725C594817F
17 zmienionych plików z 154 dodań i 5037 usunięć

28
.gitignore vendored
Wyświetl plik

@ -1,32 +1,7 @@
# Logs
logs
*.log
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
dist/* dist/*
lib/* lib/*
build/*
# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules node_modules
.config.json .config.json
.flows.json.backup .flows.json.backup
@ -37,3 +12,6 @@ node_modules
*.back *.back
.config.json.backup .config.json.backup
*.backup *.backup
*lock*
logs
*.log

Wyświetl plik

@ -1 +0,0 @@
ln -s /opt/node-red/Node-RED /usr/bin/Node-RED

Wyświetl plik

@ -1 +0,0 @@
rm -f /usr/bin/Node-RED

Wyświetl plik

@ -1,10 +0,0 @@
{
"title": "Node-RED Electron installer",
"icon": "nodered.icns",
"background": "appbkg.png",
"icon-size": 80,
"contents": [
{ "x": 448, "y": 344, "type": "link", "path": "/Applications" },
{ "x": 192, "y": 344, "type": "file", "path": "build/Node-RED-darwin-x64/Node-RED.app" }
]
}

Wyświetl plik

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 75 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 75 KiB

BIN
build/icon.ico 100644

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 22 KiB

BIN
build/icon.png 100644

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 37 KiB

Wyświetl plik

@ -1,21 +0,0 @@
npm i
# cd node_modules/electron-winstaller
# npm i is-property
# cd ../..
rm -rf node_modules/node-red/node_modules/node-red-node-serialport node_modules/node-red/node_modules/node-red-node-feedparser node_modules/node-red/node_modules/node-red-node-email
# ./node_modules/.bin/electron-rebuild node_modules/serialport/build
$(npm bin)/electron-rebuild
npm run clean
npm run build:osx
rm -rf build/
npm run build:linux32
rm -rf build/
npm run build:linux64
# rm -rf build/
# npm run build:armv7l
rm -rf build/
npm run build:win32
rm -rf build/ ../electron-bin/*.nupkg ../electron-bin/RELEASES
npm run build:win64
rm -rf build/ ../electron-bin/*.nu* ../electron-bin/RELEASES

Wyświetl plik

@ -5,15 +5,8 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Node-RED Console</title> <title>Node-RED Console</title>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0, maximum-scale=1, minimum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0, maximum-scale=1, minimum-scale=1">
</head>
<body style="margin:0;" onload="scrollDown()" >
<font style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif; font-size:9pt;">
<div id="header" style="background-color:#910000; position:fixed; height:16px; width:100%; padding:8px;"><input type="button" value="Clear Log" onclick="clearList()";/></div>
<div id="debug" style="padding:4px; padding-left:8px; padding-top:34px;"></div>
</font>
<script> <script>
const logLength = 250; const logLength = 250;
const { ipcRenderer } = require('electron');
const ipc = require('electron').ipcRenderer; const ipc = require('electron').ipcRenderer;
var list = []; var list = [];
var scrollDown = function() { var scrollDown = function() {
@ -37,5 +30,11 @@
window.scrollTo(0,document.body.scrollHeight); window.scrollTo(0,document.body.scrollHeight);
}); });
</script> </script>
</head>
<body style="margin:0;" onload="scrollDown()" >
<font style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif; font-size:9pt;">
<div id="header" style="background-color:#910000; position:fixed; height:16px; width:100%; padding:8px;"><input type="button" value="Clear Log" onclick="clearList()";/></div>
<div id="debug" style="padding:4px; padding-left:8px; padding-top:34px;"></div>
</font>
</body> </body>
</html> </html>

1
dockbuild 100755
Wyświetl plik

@ -0,0 +1 @@
docker run --rm -ti --env-file <(env | grep -iE 'DEBUG|NODE_|ELECTRON_|YARN_|NPM_|CI|CIRCLE|TRAVIS_TAG|TRAVIS|TRAVIS_REPO_|TRAVIS_BUILD_|TRAVIS_BRANCH|TRAVIS_PULL_REQUEST_|APPVEYOR_|CSC_|GH_|GITHUB_|BT_|AWS_|STRIP|BUILD_') --env ELECTRON_CACHE="/root/.cache/electron" --env ELECTRON_BUILDER_CACHE="/root/.cache/electron-builder" -v ${PWD}:/project -v ${PWD##*/}-node-modules:/project/node_modules -v ~/.cache/electron:/root/.cache/electron -v ~/.cache/electron-builder:/root/.cache/electron-builder electronuserland/builder:wine && yarn && yarn dist

File diff suppressed because one or more lines are too long

184
main.js
Wyświetl plik

@ -11,6 +11,7 @@ const urldash = "/ui/#/0"; // Start on the dashboard page
const urledit = "/red"; // url for the editor page const urledit = "/red"; // url for the editor page
const urlconsole = "/console.htm"; // url for the console page const urlconsole = "/console.htm"; // url for the console page
const urlmap = "/worldmap"; // url for the worldmap const urlmap = "/worldmap"; // url for the worldmap
const nrIcon = "nodered.png" // Icon for the app in root dir (usually 256x256)
// tcp port to use // tcp port to use
//const listenPort = "18880"; // fix it if you like //const listenPort = "18880"; // fix it if you like
@ -24,14 +25,10 @@ const http = require('http');
const express = require("express"); const express = require("express");
const electron = require('electron'); const electron = require('electron');
const app = electron.app; const {app, Menu} = electron;
const ipc = electron.ipcMain; const ipc = electron.ipcMain;
const dialog = electron.dialog; const dialog = electron.dialog;
const BrowserWindow = electron.BrowserWindow; const BrowserWindow = electron.BrowserWindow;
const {Menu, MenuItem} = electron;
// this should be placed at top of main.js to handle squirrel setup events quickly
if (handleSquirrelEvent()) { return; }
var RED = require("node-red"); var RED = require("node-red");
var red_app = express(); var red_app = express();
@ -94,11 +91,13 @@ let mainWindow;
let conWindow; let conWindow;
let logBuffer = []; let logBuffer = [];
let logLength = 250; // No. of lines of console log to keep. let logLength = 250; // No. of lines of console log to keep.
const levels = [ "", "fatal", "error", "warn", "info", "debug", "trace" ];
ipc.on('clearLogBuffer', function(event, arg) { logBuffer = []; }); ipc.on('clearLogBuffer', function(event, arg) { logBuffer = []; });
// Create the settings object - see default settings.js file for other options // Create the settings object - see default settings.js file for other options
var settings = { var settings = {
uiHost: "127.0.0.1", // only allow local connections
httpAdminRoot: "/red", // set to false to disable editor/deploy httpAdminRoot: "/red", // set to false to disable editor/deploy
httpNodeRoot: "/", httpNodeRoot: "/",
userDir: userdir, userDir: userdir,
@ -114,7 +113,13 @@ var settings = {
if (editable) { // No logging if not editable if (editable) { // No logging if not editable
var ts = (new Date(msg.timestamp)).toISOString(); var ts = (new Date(msg.timestamp)).toISOString();
ts = ts.replace("Z"," ").replace("T"," "); ts = ts.replace("Z"," ").replace("T"," ");
var line = ts+" : "+msg.msg; var line = "";
if (msg.type && msg.id) {
line = ts+" : ["+levels[msg.level/10]+"] ["+msg.type+":"+msg.id+"] "+msg.msg;
}
else {
line = ts+" : ["+levels[msg.level/10]+"] "+msg.msg;
}
logBuffer.push(line); logBuffer.push(line);
if (conWindow) { conWindow.webContents.send('debugMsg', line); } if (conWindow) { conWindow.webContents.send('debugMsg', line); }
if (logBuffer.length > logLength) { logBuffer.shift(); } if (logBuffer.length > logLength) { logBuffer.shift(); }
@ -127,7 +132,7 @@ var settings = {
if (!editable) { if (!editable) {
settings.httpAdminRoot = false; settings.httpAdminRoot = false;
settings.readOnly = true; settings.readOnly = true;
} }
// Initialise the runtime with a server and settings // Initialise the runtime with a server and settings
RED.init(server,settings); RED.init(server,settings);
@ -141,18 +146,27 @@ if (settings.httpAdminRoot !== false) {
red_app.use(settings.httpNodeRoot,RED.httpNode); red_app.use(settings.httpNodeRoot,RED.httpNode);
// Create the Application's main menu // Create the Application's main menu
var template = [ var template = [];
// {label: "Application", if (process.platform === 'darwin') {
// submenu: [ template.push( {
// //{ role: 'about' }, label: app.getName(),
// //{ type: "separator" },
// { role: 'togglefullscreen' },
// { role: 'quit' }
// ]},
{ label: 'Node-RED',
submenu: [ submenu: [
{ type: 'separator' }, { type: 'separator' },
{ type: 'separator' }, { type: 'separator' },
{ role: 'about' },
{ type: 'separator' },
{ role: 'hide' },
{ role: 'hideothers' },
{ role: 'unhide' },
{ type: 'separator' },
{ role: 'togglefullscreen' },
{ role: 'quit' }
]
} )
}
template.push(
{ label: 'Node-RED',
submenu: [
{ label: 'Import Flow', { label: 'Import Flow',
accelerator: "Shift+CmdOrCtrl+O", accelerator: "Shift+CmdOrCtrl+O",
click() { openFlow(); } click() { openFlow(); }
@ -179,6 +193,7 @@ var template = [
click() { mainWindow.loadURL("http://localhost:"+listenPort+urlmap); } click() { mainWindow.loadURL("http://localhost:"+listenPort+urlmap); }
}, },
{ type: 'separator' }, { type: 'separator' },
{ type: 'separator' },
{ label: 'Documentation', { label: 'Documentation',
click() { electron.shell.openExternal('https://nodered.org/docs') } click() { electron.shell.openExternal('https://nodered.org/docs') }
}, },
@ -187,49 +202,27 @@ var template = [
}, },
{ label: 'Discourse Forum', { label: 'Discourse Forum',
click() { electron.shell.openExternal('https://discourse.nodered.org/') } click() { electron.shell.openExternal('https://discourse.nodered.org/') }
}, }
{ type: "separator" }, ]
{ role: 'togglefullscreen' }, }
{ role: 'quit' } );
]}
// ,{label: "Edit",
// submenu: [
// { label: "Undo", accelerator: "CmdOrCtrl+Z", selector: "undo:" },
// { label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", selector: "redo:" },
// { type: "separator" },
// { label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:" },
// { label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" },
// { label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" },
// { label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:" }
// ]}
// ,{ label: 'View',
// submenu: [
// { label: 'Reload',
// accelerator: 'CmdOrCtrl+R',
// click(item, focusedWindow) { if (focusedWindow) { focusedWindow.reload(); }}
// },
// { label: 'Toggle Developer Tools',
// accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I',
// click(item, focusedWindow) { if (focusedWindow) { focusedWindow.webContents.toggleDevTools(); }}
// },
// { type: 'separator' },
// { role: 'resetzoom' },
// { role: 'zoomin' },
// { role: 'zoomout' },
// { type: 'separator' },
// { role: 'togglefullscreen' },
// { role: 'minimize' }
// ]}
];
if (!showMap) { template[0].submenu.splice(8,1); } var tempNum = template.length - 1;
// Add quit and toggle full screen to this menu if not on Mac
if (!editable) { if (process.platform !== 'darwin') {
template[0].submenu.splice(3,1); template[tempNum].submenu.push({ type: "separator" });
template[0].submenu.splice(4,1); template[tempNum].submenu.push({ role: 'togglefullscreen' });
template[tempNum].submenu.push({ role: 'quit' });
} }
if (!allowLoadSave) { template[0].submenu.splice(0,2); } if (!showMap) { template[tempNum].submenu.splice(8,1); }
if (!editable) {
template[tempNum].submenu.splice(3,1);
template[tempNum].submenu.splice(4,1);
}
if (!allowLoadSave) { template[tempNum].submenu.splice(0,2); }
let fileName = ""; let fileName = "";
function saveFlow() { function saveFlow() {
@ -243,7 +236,7 @@ function saveFlow() {
if (err) { dialog.showErrorBox('Error', err); } if (err) { dialog.showErrorBox('Error', err); }
else { else {
dialog.showMessageBox({ dialog.showMessageBox({
icon: "nodered.png", icon: nrIcon,
message:"Flow file saved as\n\n"+file_path, message:"Flow file saved as\n\n"+file_path,
buttons: ["OK"] buttons: ["OK"]
}); });
@ -286,11 +279,14 @@ function createConsole() {
title: "Node-RED Console", title: "Node-RED Console",
width: 800, width: 800,
height: 600, height: 600,
icon: path.join(__dirname, 'nodered.png'), icon: path.join(__dirname, nrIcon),
autoHideMenuBar: true autoHideMenuBar: true,
webPreferences: {
nodeIntegration: true
}
}); });
conWindow.loadURL(url.format({ conWindow.loadURL(url.format({
pathname: path.join(__dirname, 'console.htm'), pathname: path.join(__dirname, urlconsole),
protocol: 'file:', protocol: 'file:',
slashes: true slashes: true
})) }))
@ -310,13 +306,16 @@ function createWindow() {
//titleBarStyle: "hidden", //titleBarStyle: "hidden",
width: 1024, width: 1024,
height: 768, height: 768,
icon: path.join(__dirname, 'nodered.png'), icon: path.join(__dirname, nrIcon),
fullscreenable: true, fullscreenable: true,
autoHideMenuBar: true, autoHideMenuBar: true,
webPreferences: { webPreferences: {
nodeIntegration: false nodeIntegration: false
} }
}); });
const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);
mainWindow.loadURL(`file://${__dirname}/load.html`); mainWindow.loadURL(`file://${__dirname}/load.html`);
//if (process.platform !== 'darwin') { mainWindow.setAutoHideMenuBar(true); } //if (process.platform !== 'darwin') { mainWindow.setAutoHideMenuBar(true); }
@ -324,7 +323,6 @@ function createWindow() {
if ((httpResponseCode == 404) && (newURL == ("http://localhost:"+listenPort+urldash))) { if ((httpResponseCode == 404) && (newURL == ("http://localhost:"+listenPort+urldash))) {
setTimeout(mainWindow.webContents.reload, 250); setTimeout(mainWindow.webContents.reload, 250);
} }
Menu.setApplicationMenu(Menu.buildFromTemplate(template));
}); });
// mainWindow.webContents.on('did-finish-load', () => { // mainWindow.webContents.on('did-finish-load', () => {
@ -354,6 +352,10 @@ function createWindow() {
//mainWindow.webContents.openDevTools(); //mainWindow.webContents.openDevTools();
} }
app.on('orderFrontStandardAboutPanel', function() {
createConsole();
});
// Called when Electron has finished initialization and is ready to create browser windows. // Called when Electron has finished initialization and is ready to create browser windows.
app.on('ready', createWindow ); app.on('ready', createWindow );
@ -379,61 +381,3 @@ RED.start().then(function() {
mainWindow.loadURL("http://127.0.0.1:"+listenPort+urldash); mainWindow.loadURL("http://127.0.0.1:"+listenPort+urldash);
}); });
}); });
///////////////////////////////////////////////////////
// All this Squirrel stuff is for the Windows installer
function handleSquirrelEvent() {
if (process.argv.length === 1) { return false; }
const path = require('path');
const ChildProcess = require('child_process');
const appFolder = path.resolve(process.execPath, '..');
const rootAtomFolder = path.resolve(appFolder, '..');
const updateDotExe = path.resolve(path.join(rootAtomFolder, 'Update.exe'));
const exeName = path.basename(process.execPath);
const spawn = function(command, args) {
let spawnedProcess, error;
try { spawnedProcess = ChildProcess.spawn(command, args, {detached: true}); }
catch (error) {}
return spawnedProcess;
};
const spawnUpdate = function(args) {
return spawn(updateDotExe, args);
};
const squirrelEvent = process.argv[1];
switch (squirrelEvent) {
case '--squirrel-install':
case '--squirrel-updated':
// Optionally do things such as:
// - Add your .exe to the PATH
// - Write to the registry for things like file associations and
// explorer context menus
// Install desktop and start menu shortcuts
spawnUpdate(['--createShortcut', exeName]);
setTimeout(app.quit, 1000);
return true;
case '--squirrel-uninstall':
// Undo anything you did in the --squirrel-install and
// --squirrel-updated handlers
// Remove desktop and start menu shortcuts
spawnUpdate(['--removeShortcut', exeName]);
setTimeout(app.quit, 1000);
return true;
case '--squirrel-obsolete':
// This is called on the outgoing version of your app before
// we update to the new version - it's the opposite of
// --squirrel-updated
app.quit();
return true;
}
}

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 34 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 1.3 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 22 KiB

4780
package-lock.json wygenerowano

Plik diff jest za duży Load Diff

Wyświetl plik

@ -1,27 +1,14 @@
{ {
"name": "electron_node_red", "name": "electron_node_red",
"version": "1.0.2", "version": "1.0.2",
"description": "Electron Node-RED application starter", "description": "Electron Node-RED application starter kit for development",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {
"pack": "electron-builder --dir",
"dist": "electron-builder",
"postinstall": "electron-builder install-app-deps",
"start": "electron main.js", "start": "electron main.js",
"test": "echo \" Warning: no test specified \"", "test": "echo \" Warning: no test specified \""
"watch": "nodemon --exec \"npm run start\" --ext js,css,json --ignore build/",
"clean": "rm -rf ./build ../electron-bin && mkdir -p ./build ../electron-bin",
"pack": "npm run clean && electron-packager . Node-RED --icon=nodered.icns --all --out=build --overwrite",
"pack:osx": "electron-packager . Node-RED --icon=nodered.icns --platform=darwin --arch=x64 --out=build --overwrite",
"pack:linux32": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=ia32 --out=build --overwrite && cp after*.sh build/Node-RED-linux-ia32/",
"pack:linux64": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=x64 --out=build --overwrite && cp after*.sh build/Node-RED-linux-x64",
"pack:win32": "electron-packager . Node-RED --icon=nodered.icns --platform=win32 --arch=ia32 --out=build --asar --overwrite --win32metadata.CompanyName='IBM Corp.' --win32metadata.ProductName='Node-RED Electron'",
"pack:win64": "electron-packager . Node-RED --icon=nodered.icns --platform=win32 --arch=x64 --out=build --asar --overwrite --win32metadata.CompanyName='IBM Corp.' --win32metadata.ProductName='Node-RED Electron'",
"pack:armv7l": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=armv7l --out=build --overwrite && cp afterinst.sh build/Node-RED-linux-armv7l",
"build": "npm run clean && npm run build:osx && npm run build:linux64 && npm run build:linux32",
"build:osx": "npm run pack:osx && appdmg appdmg.json ../electron-bin/Node-RED-Electron_$npm_package_version.dmg",
"build:linux32": "npm run pack:linux32 && fpm -s dir -t deb -f -n node-red-electron -v $npm_package_version -m conway@uk.ibm.com -a i386 -p ../electron-bin -C build/Node-RED-linux-ia32 --prefix=/opt/node-red --after-install=afterinst.sh --after-remove=afterremove.sh ./",
"build:linux64": "npm run pack:linux64 && fpm -s dir -t deb -f -n node-red-electron -v $npm_package_version -m conway@uk.ibm.com -a x86_64 -p ../electron-bin -C build/Node-RED-linux-x64 --prefix=/opt/node-red --after-install=afterinst.sh --after-remove=afterremove.sh ./",
"build:win32": "npm run pack:win32 && node makewin32.js",
"build:win64": "npm run pack:win64 && node makewin64.js",
"build:armv7l": "npm run pack:armv7l && fpm -s dir -t deb -f -n node-red-electron -v $npm_package_version -m conway@uk.ibm.com -a armv7l -p ../electron-bin -C build/Node-RED-linux-armv7l --prefix=/opt/node-red --after-install=afterinst.sh ./"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -31,12 +18,11 @@
"express": "~4.17.1", "express": "~4.17.1",
"node-red": "1.0.2", "node-red": "1.0.2",
"node-red-contrib-play-audio": "*", "node-red-contrib-play-audio": "*",
"node-red-contrib-web-worldmap": "*", "node-red-contrib-web-worldmap": "~2.1.4",
"node-red-dashboard": "*", "node-red-dashboard": "~2.17.1",
"node-red-node-base64": "*", "node-red-node-base64": "*",
"node-red-node-geofence": "*", "node-red-node-geofence": "*",
"node-red-node-random": "*", "node-red-node-random": "*",
"node-red-node-serialport": "*",
"node-red-node-smooth": "*" "node-red-node-smooth": "*"
}, },
"keywords": [ "keywords": [
@ -44,23 +30,45 @@
"quick start", "quick start",
"node-red" "node-red"
], ],
"contributors": [ "author": {
{ "name": "Dave Conway-Jones",
"name": "Dave Conway-Jones" "email": "dceejay@gmail.com"
}, },
{
"name": "Nathanaël Lécaudé"
}
],
"license": "Apache-2.0", "license": "Apache-2.0",
"bugs": { "bugs": {
"url": "https://github.com/dceejay/electron-node-red/issues" "url": "https://github.com/dceejay/electron-node-red/issues"
}, },
"homepage": "https://github.com/dceejay/electron-node-red#readme", "homepage": "https://github.com/dceejay/electron-node-red#readme",
"devDependencies": { "devDependencies": {
"electron": "~2.0.18", "electron": "~6.0.12",
"electron-rebuild": "~1.8.6", "electron-builder": "^21.2.0",
"electron-squirrel-startup": "*", "electron-create-menu": "^3.0.0"
"electron-winstaller": "2.5.2" },
"build": {
"npmRebuild": false,
"appId": "com.electron.node-red",
"productName": "Node-RED",
"copyright": "Copyright © 2019 D.Conway-Jones",
"mac": {
"category": "public.app-category.developer-tools"
},
"linux": {
"target": [
"deb",
"rpm"
],
"synopsis": "Node-RED Low Code development",
"category": "Development"
},
"win": {
"target": [
{
"target": "msi",
"arch": [
"x64"
]
}
]
}
} }
} }