From b36388f6eb0a68b4f86697a719ee1e3ddfc0f4a2 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Sun, 8 Mar 2015 17:49:37 -0400 Subject: [PATCH 1/4] Also process browser javascript --- gulpfile.js | 1 - package.json | 2 +- browser/main.js => src/browser.js | 0 3 files changed, 1 insertion(+), 2 deletions(-) rename browser/main.js => src/browser.js (100%) diff --git a/gulpfile.js b/gulpfile.js index e0afbf9d16..01395a07d6 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -102,7 +102,6 @@ gulp.task('dist', function () { 'mv ./dist/osx/<%= filename %>/Contents/MacOS/Atom ./dist/osx/<%= filename %>/Contents/MacOS/<%= name %>', 'mkdir -p ./dist/osx/<%= filename %>/Contents/Resources/app', 'mkdir -p ./dist/osx/<%= filename %>/Contents/Resources/app/node_modules', - 'cp -R browser dist/osx/<%= filename %>/Contents/Resources/app', 'cp package.json dist/osx/<%= filename %>/Contents/Resources/app/', 'mkdir -p dist/osx/<%= filename %>/Contents/Resources/app/resources', 'cp -v resources/* dist/osx/<%= filename %>/Contents/Resources/app/resources/ || :', diff --git a/package.json b/package.json index 9eeb633ae6..d7dde915f0 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "author": "Kitematic", "description": "Simple Docker Container management for Mac OS X.", "homepage": "https://kitematic.com/", - "main": "browser/main.js", + "main": "build/browser.js", "repository": { "type": "git", "url": "git@github.com:kitematic/kitematic.git" diff --git a/browser/main.js b/src/browser.js similarity index 100% rename from browser/main.js rename to src/browser.js From 2994b23825ec9aa9672380ecd3d8d384986121a5 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Sun, 8 Mar 2015 18:31:28 -0400 Subject: [PATCH 2/4] Better IPC naming --- src/Containers.react.js | 12 +++++------- src/Main.js | 4 ++-- src/browser.js | 20 +++++++++----------- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/Containers.react.js b/src/Containers.react.js index 8d2719fba7..af151dabca 100644 --- a/src/Containers.react.js +++ b/src/Containers.react.js @@ -37,12 +37,10 @@ var Containers = React.createClass({ this.transitionTo('containerHome', {name: this.state.sorted[0].Name}); } - ipc.on('notify', message => { - if (message === 'application:update-available') { - this.setState({ - updateAvailable: true - }); - } + ipc.on('application:update-available', () => { + this.setState({ + updateAvailable: true + }); }); autoUpdater.checkForUpdates(); }, @@ -102,7 +100,7 @@ var Containers = React.createClass({ }, handleAutoUpdateClick: function () { metrics.track('Restarted to Update'); - ipc.send('command', 'application:quit-install'); + ipc.send('application:quit-install'); }, handleClickPreferences: function () { metrics.track('Opened Preferences', { diff --git a/src/Main.js b/src/Main.js index dca15a15f7..31cc14f0ef 100644 --- a/src/Main.js +++ b/src/Main.js @@ -76,8 +76,8 @@ document.onkeydown = function (e) { } }; -ipc.on('notify', msg => { - if (msg === 'application:quitting' && localStorage.getItem('settings.closeVMOnQuit') === 'true') { +ipc.on('application:quitting', () => { + if (localStorage.getItem('settings.closeVMOnQuit') === 'true') { machine.stop(); } }); diff --git a/src/browser.js b/src/browser.js index 2acb00320d..10e2ba253e 100644 --- a/src/browser.js +++ b/src/browser.js @@ -5,21 +5,20 @@ var fs = require('fs'); var ipc = require('ipc'); var path = require('path'); -process.env.NODE_PATH = __dirname + '/../node_modules'; -process.env.RESOURCES_PATH = __dirname + '/../resources'; +process.env.NODE_PATH = path.join(__dirname, '/../node_modules'); +process.env.RESOURCES_PATH = path.join(__dirname, '/../resources'); process.chdir(path.join(__dirname, '..')); process.env.PATH = '/usr/local/bin:' + process.env.PATH; var size = {}, settingsjson = {}; try { - var sizeFile = JSON.parse(fs.readFileSync(path.join(process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME'], 'Library', 'Application\ Support', 'Kitematic', 'size'))); - size = sizeFile; + size = JSON.parse(fs.readFileSync(path.join(process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME'], 'Library', 'Application\ Support', 'Kitematic', 'size'))); } catch (err) {} try { settingsjson = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'settings.json'), 'utf8')); } catch (err) {} -app.on('ready', function() { +app.on('ready', function () { var mainWindow = new BrowserWindow({ width: size.width || 1000, height: size.height || 700, @@ -29,6 +28,7 @@ app.on('ready', function() { frame: false, show: true }); + mainWindow.loadUrl(path.normalize('file://' + path.join(__dirname, '..', 'build/index.html'))); app.on('activate-with-no-open-windows', function () { @@ -39,13 +39,11 @@ app.on('ready', function() { }); app.on('before-quit', function () { - mainWindow.webContents.send('notify', 'application:quitting'); + mainWindow.webContents.send('application:quitting'); }); - ipc.on('command', function (event, arg) { - if (arg === 'application:quit-install') { - autoUpdater.quitAndInstall(); - } + ipc.on('application:quit-install', function () { + autoUpdater.quitAndInstall(); }); mainWindow.webContents.on('new-window', function (e) { @@ -83,7 +81,7 @@ app.on('ready', function() { autoUpdater.on('update-downloaded', function (e, releaseNotes, releaseName, releaseDate, updateURL) { console.log('Update downloaded.'); console.log(releaseNotes, releaseName, releaseDate, updateURL); - mainWindow.webContents.send('notify', 'application:update-available'); + mainWindow.webContents.send('application:update-available'); }); autoUpdater.on('error', function (e, error) { From ebb87a632ac74152523c71105717dbaa2bb32865 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Sun, 8 Mar 2015 18:31:32 -0400 Subject: [PATCH 3/4] Fix sourcemaps --- gulpfile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 01395a07d6..2836301e15 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -44,10 +44,10 @@ gulp.task('js', function () { gutil.log(gutil.colors.red('Error (' + error.plugin + '): ' + error.message)); this.emit('end'); })) - .pipe(gulpif(options.dev, sourcemaps.init())) + .pipe(sourcemaps.init()) .pipe(react()) .pipe(babel({blacklist: ['regenerator']})) - .pipe(gulpif(options.dev, sourcemaps.write('.'))) + .pipe(sourcemaps.write()) .pipe(gulp.dest(options.dev ? './build' : './dist/osx/' + options.appFilename + '/Contents/Resources/app/build')) .pipe(gulpif(options.dev, livereload())); }); From e0fe1076a9aeb9f2c1e1f35dd69ca82508fe032f Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Sun, 8 Mar 2015 19:05:22 -0400 Subject: [PATCH 4/4] Adding WebUtil class for web & dom related startup tasks --- src/Main.js | 92 ++++++++++---------------------------------------- src/Util.js | 7 ++++ src/WebUtil.js | 67 ++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 74 deletions(-) create mode 100644 src/WebUtil.js diff --git a/src/Main.js b/src/Main.js index 31cc14f0ef..c0df3ed256 100644 --- a/src/Main.js +++ b/src/Main.js @@ -1,87 +1,24 @@ -var remote = require('remote'); require.main.paths.splice(0, 0, process.env.NODE_PATH); -var app = remote.require('app'); -var bugsnag = require('bugsnag-js'); +var remote = require('remote'); var ContainerStore = require('./ContainerStore'); -var fs = require('fs'); -var ipc = require('ipc'); var Menu = remote.require('menu'); -var metrics = require('./Metrics'); -var path = require('path'); var React = require('react'); -var router = require('./Router'); var SetupStore = require('./SetupStore'); -var template = require('./MenuTemplate'); -var util = require('./Util'); +var bugsnag = require('bugsnag-js'); +var ipc = require('ipc'); var machine = require('./DockerMachine'); +var metrics = require('./Metrics'); +var router = require('./Router'); +var template = require('./MenuTemplate'); +var webUtil = require('./WebUtil'); -window.addEventListener('resize', function () { - fs.writeFileSync(path.join(util.supportDir(), 'size'), JSON.stringify({ - width: window.outerWidth, - height: window.outerHeight - })); -}); +webUtil.addWindowSizeSaving(); +webUtil.addLiveReload(); +webUtil.addBugReporting(); +webUtil.disableGlobalBackspace(); Menu.setApplicationMenu(Menu.buildFromTemplate(template())); -var settingsjson; -try { - settingsjson = require(path.join(__dirname, '..', 'settings.json'), 'utf8'); -} catch (err) { - settingsjson = {}; -} - -if (process.env.NODE_ENV === 'development') { - var head = document.getElementsByTagName('head')[0]; - var script = document.createElement('script'); - script.type = 'text/javascript'; - script.src = 'http://localhost:35729/livereload.js'; - head.appendChild(script); -} - -if (settingsjson.bugsnag) { - bugsnag.apiKey = settingsjson.bugsnag; - bugsnag.autoNotify = true; - bugsnag.releaseStage = process.env.NODE_ENV === 'development' ? 'development' : 'production'; - bugsnag.notifyReleaseStages = ['production']; - bugsnag.appVersion = app.getVersion(); - bugsnag.metaData = { - beta: !!settingsjson.beta - }; - - bugsnag.beforeNotify = function(payload) { - var re = new RegExp(util.home().replace(/\s+/g, '\\s+'), 'g'); - payload.stacktrace = payload.stacktrace.replace(/%20/g, ' ').replace(re, ''); - payload.context = payload.context.replace(/%20/g, ' ').replace(re, ''); - payload.file = payload.file.replace(/%20/g, ' ').replace(re, ''); - payload.url = ''; - }; -} - -document.onkeydown = function (e) { - e = e || window.event; - var doPrevent; - if (e.keyCode === 8) { - var d = e.srcElement || e.target; - if (d.tagName.toUpperCase() === 'INPUT' || d.tagName.toUpperCase() === 'TEXTAREA') { - doPrevent = d.readOnly || d.disabled; - } else { - doPrevent = true; - } - } else { - doPrevent = false; - } - if (doPrevent) { - e.preventDefault(); - } -}; - -ipc.on('application:quitting', () => { - if (localStorage.getItem('settings.closeVMOnQuit') === 'true') { - machine.stop(); - } -}); - metrics.track('Started App'); metrics.track('app heartbeat'); setInterval(function () { @@ -89,6 +26,7 @@ setInterval(function () { }, 14400000); router.run(Handler => React.render(, document.body)); + SetupStore.setup().then(() => { Menu.setApplicationMenu(Menu.buildFromTemplate(template())); ContainerStore.on(ContainerStore.SERVER_ERROR_EVENT, (err) => { @@ -107,3 +45,9 @@ SetupStore.setup().then(() => { error: err }); }); + +ipc.on('application:quitting', () => { + if (localStorage.getItem('settings.closeVMOnQuit') === 'true') { + machine.stop(); + } +}); diff --git a/src/Util.js b/src/Util.js index 2853bbea17..a9ab1b2e0d 100644 --- a/src/Util.js +++ b/src/Util.js @@ -37,5 +37,12 @@ module.exports = { packagejson: function () { return JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8')); }, + settingsjson: function () { + var settingsjson = {}; + try { + settingsjson = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'settings.json'), 'utf8')); + } catch (err) {} + return settingsjson; + }, webPorts: ['80', '8000', '8080', '3000', '5000', '2368', '9200', '8983'] }; diff --git a/src/WebUtil.js b/src/WebUtil.js new file mode 100644 index 0000000000..dca2a9e67d --- /dev/null +++ b/src/WebUtil.js @@ -0,0 +1,67 @@ +var app = require('remote').require('app'); +var fs = require('fs'); +var util = require('./Util'); +var path = require('path'); +var bugsnag = require('bugsnag-js'); + +var WebUtil = { + addWindowSizeSaving: function () { + window.addEventListener('resize', function () { + fs.writeFileSync(path.join(util.supportDir(), 'size'), JSON.stringify({ + width: window.outerWidth, + height: window.outerHeight + })); + }); + }, + addLiveReload: function () { + if (process.env.NODE_ENV === 'development') { + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = 'http://localhost:35729/livereload.js'; + head.appendChild(script); + } + }, + addBugReporting: function () { + var settingsjson = util.settingsjson(); + if (settingsjson.bugsnag) { + bugsnag.apiKey = settingsjson.bugsnag; + bugsnag.autoNotify = true; + bugsnag.releaseStage = process.env.NODE_ENV === 'development' ? 'development' : 'production'; + bugsnag.notifyReleaseStages = ['production']; + bugsnag.appVersion = app.getVersion(); + bugsnag.metaData = { + beta: !!settingsjson.beta + }; + + bugsnag.beforeNotify = function(payload) { + var re = new RegExp(util.home().replace(/\s+/g, '\\s+'), 'g'); + payload.stacktrace = payload.stacktrace.replace(/%20/g, ' ').replace(re, ''); + payload.context = payload.context.replace(/%20/g, ' ').replace(re, ''); + payload.file = payload.file.replace(/%20/g, ' ').replace(re, ''); + payload.url = ''; + }; + } + }, + disableGlobalBackspace: function () { + document.onkeydown = function (e) { + e = e || window.event; + var doPrevent; + if (e.keyCode === 8) { + var d = e.srcElement || e.target; + if (d.tagName.toUpperCase() === 'INPUT' || d.tagName.toUpperCase() === 'TEXTAREA') { + doPrevent = d.readOnly || d.disabled; + } else { + doPrevent = true; + } + } else { + doPrevent = false; + } + if (doPrevent) { + e.preventDefault(); + } + }; + }, +}; + +module.exports = WebUtil;