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: {