diff --git a/package.json b/package.json
index 4f4338dc6d..772aa7f436 100644
--- a/package.json
+++ b/package.json
@@ -1,17 +1,23 @@
{
"name": "bitwarden",
"version": "0.0.0",
+ "main": "main.js",
"scripts": {
"dev": "webpack --config webpack.dev.js",
"dev:watch": "webpack --config webpack.dev.js --watch",
"lint": "tslint src/**/*.ts || true",
"lint:fix": "tslint src/**/*.ts --fix",
- "server": "webpack-dev-server --inline --progress --port 8080 --config webpack.dev.js"
+ "server": "webpack-dev-server --inline --progress --port 8080 --config webpack.dev.js",
+ "electron:dev": "npm run dev && tsc src/main.ts --outDir build && electron ./build --serve"
},
"devDependencies": {
+ "@bitwarden/jslib": "git+https://github.com/bitwarden/jslib.git",
"clean-webpack-plugin": "^0.1.17",
"copy-webpack-plugin": "^4.2.0",
"css-loader": "^0.28.7",
+ "electron": "1.7.10",
+ "electron-builder": "19.53.7",
+ "electron-reload": "1.2.2",
"extract-text-webpack-plugin": "^3.0.1",
"file-loader": "^1.1.5",
"font-awesome": "4.7.0",
@@ -41,7 +47,6 @@
"@angular/upgrade": "5.2.0",
"core-js": "^2.4.1",
"rxjs": "^5.5.6",
- "zone.js": "^0.8.19",
- "@bitwarden/jslib": "git+https://github.com/bitwarden/jslib.git"
+ "zone.js": "^0.8.19"
}
}
diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts
index 6553851039..fc858be02e 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app-routing.module.ts
@@ -14,7 +14,10 @@ const routes: Routes = [
];
@NgModule({
- imports: [RouterModule.forRoot(routes/*, { enableTracing: true }*/)],
+ imports: [RouterModule.forRoot(routes, {
+ useHash: true,
+ /*enableTracing: true,*/
+ })],
exports: [RouterModule],
})
export class AppRoutingModule { }
diff --git a/src/app/main.ts b/src/app/main.ts
new file mode 100644
index 0000000000..87aa2a76be
--- /dev/null
+++ b/src/app/main.ts
@@ -0,0 +1,6 @@
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app.module';
+
+platformBrowserDynamic().bootstrapModule(AppModule);
diff --git a/src/index.html b/src/index.html
index ea3ed4b3ab..e5c9d1eae0 100644
--- a/src/index.html
+++ b/src/index.html
@@ -4,7 +4,7 @@
bitwarden
-
+
diff --git a/src/main.ts b/src/main.ts
index 541acb2b08..de00fd1989 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,6 +1,72 @@
-import { enableProdMode } from '@angular/core';
-import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { app, BrowserWindow, screen } from 'electron';
+import * as path from 'path';
+import * as url from 'url';
-import { AppModule } from './app/app.module';
+let win: BrowserWindow;
+const args = process.argv.slice(1);
+const serve = args.some((val) => val === '--serve');
-platformBrowserDynamic().bootstrapModule(AppModule);
+if (serve) {
+ require('electron-reload')(__dirname, {});
+}
+
+function createWindow() {
+ const electronScreen = screen;
+ const size = electronScreen.getPrimaryDisplay().workAreaSize;
+
+ // Create the browser window.
+ win = new BrowserWindow({
+ x: 0,
+ y: 0,
+ width: size.width,
+ height: size.height,
+ });
+
+ // and load the index.html of the app.
+ win.loadURL(url.format({
+ protocol: 'file:',
+ pathname: path.join(__dirname, '/app/index.html'),
+ slashes: true,
+ }));
+
+ // Open the DevTools.
+ if (serve) {
+ win.webContents.openDevTools();
+ }
+
+ // Emitted when the window is closed.
+ win.on('closed', () => {
+ // Dereference the window object, usually you would store window
+ // in an array if your app supports multi windows, this is the time
+ // when you should delete the corresponding element.
+ win = null;
+ });
+}
+
+try {
+ // This method will be called when Electron has finished
+ // initialization and is ready to create browser windows.
+ // Some APIs can only be used after this event occurs.
+ app.on('ready', createWindow);
+
+ // Quit when all windows are closed.
+ app.on('window-all-closed', () => {
+ // On OS X it is common for applications and their menu bar
+ // to stay active until the user quits explicitly with Cmd + Q
+ if (process.platform !== 'darwin') {
+ app.quit();
+ }
+ });
+
+ app.on('activate', () => {
+ // On OS X it's common to re-create a window in the app when the
+ // dock icon is clicked and there are no other windows open.
+ if (win === null) {
+ createWindow();
+ }
+ });
+
+} catch (e) {
+ // Catch Error
+ // throw e;
+}
diff --git a/src/package.json b/src/package.json
new file mode 100644
index 0000000000..f246745e0b
--- /dev/null
+++ b/src/package.json
@@ -0,0 +1,5 @@
+{
+ "name": "bitwarden",
+ "version": "0.0.1",
+ "main": "main.js"
+}
diff --git a/webpack.common.js b/webpack.common.js
index 04105a2b01..13ab356d4d 100644
--- a/webpack.common.js
+++ b/webpack.common.js
@@ -22,7 +22,7 @@ module.exports = {
stats: 'minimal'
},
entry: {
- 'app': './src/main.ts'
+ 'app/main': './src/app/main.ts'
},
module: {
rules: [
@@ -47,17 +47,17 @@ module.exports = {
path.resolve(__dirname, 'build/*')
]),
new webpack.optimize.CommonsChunkPlugin({
- name: 'vendor',
- chunks: ['app'],
+ name: 'app/vendor',
+ chunks: ['app/main'],
minChunks: isVendorModule
}),
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html',
- chunks: ['vendor', 'app']
+ chunks: ['app/vendor', 'app/main']
}),
new CopyWebpackPlugin([
-
+ './src/package.json',
])
],
resolve: {