Fix some error background.ts
convert to typescript class
This commit is contained in:
		
							
								
								
									
										6
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										6
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -920,6 +920,12 @@ | ||||
|         "@types/node": "*" | ||||
|       } | ||||
|     }, | ||||
|     "@types/lodash": { | ||||
|       "version": "4.14.123", | ||||
|       "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz", | ||||
|       "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "@types/minimatch": { | ||||
|       "version": "3.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", | ||||
|   | ||||
| @@ -26,6 +26,7 @@ | ||||
|     "vue-property-decorator": "^7.0.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/lodash": "^4.14.123", | ||||
|     "@vue/cli-plugin-babel": "^3.5.0", | ||||
|     "@vue/cli-plugin-eslint": "^3.5.0", | ||||
|     "@vue/cli-service": "^3.5.0", | ||||
|   | ||||
| @@ -1,262 +1,333 @@ | ||||
| 'use strict' | ||||
|  | ||||
| import path from 'path' | ||||
| import pick from 'lodash/pick' | ||||
| import * as path from 'path' | ||||
| import { pick } from 'lodash' | ||||
| import { | ||||
|   app, | ||||
|   protocol, | ||||
|   shell, | ||||
|   BrowserWindow, | ||||
|   Menu | ||||
|     app, | ||||
|     ipcMain, | ||||
|     protocol, | ||||
|     shell, | ||||
|     BrowserWindow, | ||||
|     Menu, | ||||
| } from 'electron' | ||||
| // Electron types | ||||
| import { | ||||
|     App, | ||||
|     BrowserWindowConstructorOptions, | ||||
|     Event, | ||||
|     MenuItemConstructorOptions, | ||||
| } from 'electron' | ||||
|  | ||||
| import ContextMenu from 'electron-context-menu' | ||||
| import { | ||||
|   createProtocol, | ||||
|   installVueDevtools | ||||
|     createProtocol, | ||||
|     installVueDevtools | ||||
| } from 'vue-cli-plugin-electron-builder/lib' | ||||
| import localShortcut from 'electron-localshortcut' | ||||
| // tslint:disable-next-line:no-var-requires | ||||
| const localShortcut = require('electron-localshortcut') | ||||
|  | ||||
| export type PackageJson = typeof import('../package.json'); | ||||
| import { bugs, homepage } from '../package.json' | ||||
| import thedeskInfo from '../info.json' | ||||
| import TheDeskInfo from '../info.json' | ||||
| export type TheDeskInfoObject = typeof TheDeskInfo; | ||||
|  | ||||
| global.TheDeskInfo = JSON.stringify(Object.assign({ | ||||
|   productName: app.getName(), | ||||
|   homePage: homepage, | ||||
|   versions: Object.assign(pick(process.versions, ["chrome","electron","node"]), {internal: app.getVersion()}), | ||||
| }, thedeskInfo)) | ||||
| declare const __static: string; | ||||
|  | ||||
| ipcMain.on('thedesk-info', (event: Event) => { | ||||
|     event.returnValue =  Object.assign({ | ||||
|         productName: app.getName(), | ||||
|         homePage: homepage, | ||||
|         versions: Object.assign(pick(process.versions, ["chrome","electron","node"]), {internal: app.getVersion()}), | ||||
|     }, TheDeskInfo) | ||||
| }) | ||||
|  | ||||
| const isDevelopment = process.env.NODE_ENV !== 'production' | ||||
|  | ||||
| // イベントリスナや`createWindow`関数が参照するグローバル変数 | ||||
| let createdAppProtocol = false | ||||
|   , windows = {} | ||||
| if (isDevelopment) { | ||||
|     if (process.platform === 'win32') { | ||||
|         process.on('message', data => { | ||||
|             if (data === 'graceful-exit') { | ||||
|                 app.quit() | ||||
|             } | ||||
|         }) | ||||
|     } else { | ||||
|         process.on('SIGTERM', () => { | ||||
|             app.quit() | ||||
|         }) | ||||
|     } | ||||
| } | ||||
|  | ||||
| ContextMenu() | ||||
|  | ||||
| // Standard schemeはreadyの前に登録する必要がある | ||||
| protocol.registerStandardSchemes(['app'], { secure: true }) | ||||
|  | ||||
| // Windowを作る | ||||
| async function createWindow(windowName, loadPath, windowOptions, singleton, lastAction, openDevTools) { | ||||
|   if (typeof windows[windowName] !== 'undefined') { | ||||
|     windows[windowName].show() | ||||
|     return | ||||
|   } | ||||
|  | ||||
|   // 引数のバリデーション | ||||
|   if (typeof windowOptions !== 'object') windowOptions = {} | ||||
|   if (typeof lastAction !== 'function') lastAction = () => {} | ||||
|  | ||||
|   let win = new BrowserWindow(windowOptions) | ||||
|  | ||||
|   // ページの表示が完了するまで非表示にする | ||||
|   win.hide() | ||||
|   win.webContents.on('did-finish-load', () => { | ||||
|     windows[windowName].show() | ||||
|   }) | ||||
|  | ||||
|   win.on('closed', () => { | ||||
|     windows[windowName] = undefined | ||||
|   }) | ||||
|  | ||||
|   let openUrl = (event, url) => { | ||||
|     if (url === process.env.WEBPACK_DEV_SERVER_URL + loadPath) { | ||||
|       return | ||||
|     } | ||||
|     event.preventDefault() | ||||
|     shell.openExternal(url, { | ||||
|       activate: false | ||||
|     }, (err) => { | ||||
|       if (err) console.log(err) | ||||
|     }) | ||||
|   } | ||||
|   win.webContents.on('will-navigate', openUrl) | ||||
|   win.webContents.on('new-window', openUrl) | ||||
|  | ||||
|   if (process.env.WEBPACK_DEV_SERVER_URL) { | ||||
|     // `electron:serve`で起動した時の読み込み | ||||
|     win.loadURL(process.env.WEBPACK_DEV_SERVER_URL + loadPath) | ||||
|   } else { | ||||
|     // ビルドしたアプリでの読み込み | ||||
|     if (!createdAppProtocol) { | ||||
|       createProtocol('app') | ||||
|       createdAppProtocol = true | ||||
|     } | ||||
|     win.loadURL(`app://./${loadPath}`) | ||||
|   } | ||||
|  | ||||
|   if (isDevelopment && openDevTools) win.webContents.openDevTools() | ||||
|  | ||||
|   lastAction(win) | ||||
|  | ||||
|   windows[windowName] = win | ||||
| interface CreateWindowOptions { | ||||
|     windowName: string | ||||
|     loadPath: string | ||||
|     windowOptions?: BrowserWindowConstructorOptions | ||||
|     singleton?: boolean | ||||
|     lastAction?: (win: BrowserWindow) => void | ||||
|     openDevTools?: boolean | ||||
| } | ||||
|  | ||||
| function openMainWindow() { | ||||
|   const winOpts = { | ||||
|     icon: path.join(__static, 'icon.png'), | ||||
|     width: 800, | ||||
|     height: 600, | ||||
|     autoHideMenuBar: true, | ||||
|   } | ||||
|   createWindow('main', 'index.html', winOpts, true, (win) => { | ||||
|     localShortcut.register(win, 'F5', () => windows.main.reload()) | ||||
|   }, !process.env.IS_TEST) | ||||
| } | ||||
| class Application { | ||||
|     public app: App; | ||||
|     public windows: { [key: string]: BrowserWindow } = {}; | ||||
|  | ||||
| // Quit when all windows are closed. | ||||
| app.on('window-all-closed', () => { | ||||
|   // On macOS 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 macOS 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 (typeof windows.main === 'undefined') { | ||||
|     openMainWindow() | ||||
|   } | ||||
| }) | ||||
|  | ||||
| // 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', async () => { | ||||
|   if (isDevelopment && !process.env.IS_TEST) { | ||||
|     // Install Vue Devtools | ||||
|     try { | ||||
|       await installVueDevtools() | ||||
|     } catch (e) { | ||||
|       console.error('Vue Devtools failed to install:', e.toString()) | ||||
|     constructor(app: App) { | ||||
|         this.app = app; | ||||
|         ContextMenu() | ||||
|         this.app.on('window-all-closed', () => this.onWindowAllClosed()) | ||||
|         this.app.on('ready', () => this.onReady()); | ||||
|         this.app.on('activate', () => this.onActivated()); | ||||
|     } | ||||
|   } | ||||
|   openMainWindow() | ||||
| }) | ||||
|  | ||||
| // Exit cleanly on request from parent process in development mode. | ||||
| if (isDevelopment) { | ||||
|   if (process.platform === 'win32') { | ||||
|     process.on('message', data => { | ||||
|       if (data === 'graceful-exit') { | ||||
|         app.quit() | ||||
|       } | ||||
|     }) | ||||
|   } else { | ||||
|     process.on('SIGTERM', () => { | ||||
|       app.quit() | ||||
|     }) | ||||
|   } | ||||
| } | ||||
|  | ||||
| const template = [ | ||||
|   { | ||||
|     label: app.getName(), | ||||
|     submenu: [ | ||||
|       { | ||||
|         label: process.platform !== 'darwin' ? 'About' : `About ${app.getName()}`, | ||||
|         click: () => { | ||||
|           const winOpts = { | ||||
|             width: 296, | ||||
|             height: 432, | ||||
|             resizable: false, | ||||
|             minimizable: false, | ||||
|             maximizable: false, | ||||
|             fullscreenable: false, | ||||
|             autoHideMenuBar: true, | ||||
|             titleBarStyle: 'hiddenInset', | ||||
|           } | ||||
|           createWindow('about', 'about.html', winOpts, true, (win) => { | ||||
|             win.setMenuBarVisibility(false) | ||||
|             win.webContents.on('before-input-event', (event, input) => { | ||||
|               if (typeof windows.about !== 'undefined') | ||||
|                 windows.about.webContents.setIgnoreMenuShortcuts(input.key !== "Escape") | ||||
|             }) | ||||
|             localShortcut.register(win, 'Esc', () => windows.about.destroy()) | ||||
|           }) | ||||
|     private onWindowAllClosed() { | ||||
|         if (process.platform !== 'darwin') { | ||||
|             this.app.quit() | ||||
|         } | ||||
|       }, | ||||
|     ] | ||||
|   }, | ||||
|   { | ||||
|     label: 'Edit', | ||||
|     submenu: [ | ||||
|       { role: 'undo' }, | ||||
|       { role: 'redo' }, | ||||
|       { type: 'separator' }, | ||||
|       { role: 'cut' }, | ||||
|       { role: 'copy' }, | ||||
|       { role: 'paste' }, | ||||
|       { role: 'pasteandmatchstyle' }, | ||||
|       { role: 'delete' }, | ||||
|       { role: 'selectall' }, | ||||
|     ] | ||||
|   }, | ||||
|   { | ||||
|     label: 'View', | ||||
|     submenu: [ | ||||
|       { role: 'reload' }, | ||||
|       { role: 'forcereload' }, | ||||
|       { role: 'toggledevtools' }, | ||||
|       { type: 'separator' }, | ||||
|       { role: 'togglefullscreen' }, | ||||
|     ] | ||||
|   }, | ||||
|   { | ||||
|     role: 'Window', | ||||
|     submenu: [ | ||||
|       { role: 'minimize' }, | ||||
|       { role: 'close' }, | ||||
|     ] | ||||
|   }, | ||||
|   { | ||||
|     role: 'help', | ||||
|     submenu: [ | ||||
|       { | ||||
|         label: 'Report an issue', | ||||
|         click: () => shell.openExternal(`${bugs.url}/new`), | ||||
|       }, | ||||
|       { | ||||
|         label: 'Learn More', | ||||
|         click: () => shell.openExternal(thedeskInfo.documentURL), | ||||
|       } | ||||
|     ] | ||||
|   } | ||||
| ] | ||||
|  | ||||
| if (process.platform === 'darwin') { | ||||
|   template[0].submenu.push( | ||||
|     { type: 'separator' }, | ||||
|     { role: 'services' }, | ||||
|     { type: 'separator' }, | ||||
|     { role: 'hide' }, | ||||
|     { role: 'hideothers' }, | ||||
|     { role: 'unhide' }, | ||||
|     { type: 'separator' }, | ||||
|     { role: 'quit' }, | ||||
|   ) | ||||
|  | ||||
|   template[1].submenu.push( | ||||
|     { type: 'separator' }, | ||||
|     { | ||||
|       label: 'Speech', | ||||
|       submenu: [ | ||||
|         { role: 'startspeaking' }, | ||||
|         { role: 'stopspeaking' }, | ||||
|       ] | ||||
|     } | ||||
|   ) | ||||
|  | ||||
|   template[3].submenu = [ | ||||
|     { role: 'close' }, | ||||
|     { role: 'minimize' }, | ||||
|     { role: 'zoom' }, | ||||
|     { type: 'separator' }, | ||||
|     { role: 'front' }, | ||||
|   ] | ||||
|     private async onReady() { | ||||
|         if (isDevelopment && !process.env.IS_TEST) { | ||||
|             // Install Vue Devtools | ||||
|             try { | ||||
|                 await installVueDevtools() | ||||
|             } catch (e) { | ||||
|                 //console.error('Vue Devtools failed to install:', e.toString()) | ||||
|             } | ||||
|         } | ||||
|         if (!process.env.WEBPACK_DEV_SERVER_URL) createProtocol('app') | ||||
|         this.openMainWindow() | ||||
|     } | ||||
|  | ||||
|     private onActivated() { | ||||
|         if (typeof this.windows.main === 'undefined') { | ||||
|             this.openMainWindow() | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public openMainWindow() { | ||||
|         const opts: CreateWindowOptions = { | ||||
|             windowName: 'main', | ||||
|             loadPath: 'index.html', | ||||
|             windowOptions: { | ||||
|                 icon: path.join(__static, 'icon.png'), | ||||
|                 width: 800, | ||||
|                 height: 600, | ||||
|                 autoHideMenuBar: true, | ||||
|             }, | ||||
|             singleton: true, | ||||
|             lastAction: (win) => { | ||||
|                 localShortcut.register(win, 'F5', () => this.windows.main.reload()) | ||||
|             }, | ||||
|             openDevTools: !process.env.IS_TEST | ||||
|         } | ||||
|         this.createWindow(opts) | ||||
|     } | ||||
|  | ||||
|     public openAboutWindow() { | ||||
|         const opts: CreateWindowOptions = { | ||||
|             windowName: 'about', | ||||
|             loadPath: 'about.html', | ||||
|             windowOptions: { | ||||
|                 width: 296, | ||||
|                 height: 432, | ||||
|                 resizable: false, | ||||
|                 minimizable: false, | ||||
|                 maximizable: false, | ||||
|                 fullscreenable: false, | ||||
|                 autoHideMenuBar: true, | ||||
|                 titleBarStyle: 'hiddenInset', | ||||
|             }, | ||||
|             singleton: true, | ||||
|             lastAction: (win) => { | ||||
|                 win.setMenuBarVisibility(false) | ||||
|                 win.webContents.on('before-input-event', (event, input) => { | ||||
|                     if (typeof this.windows.about !== 'undefined') | ||||
|                         this.windows.about.webContents.setIgnoreMenuShortcuts((input.meta || input.control) && input.key !== "R" || input.key === "F5") | ||||
|                 }) | ||||
|                 localShortcut.register(win, 'Esc', () => this.windows.about.destroy()) | ||||
|             }, | ||||
|             openDevTools: !process.env.IS_TEST | ||||
|         } | ||||
|         this.createWindow(opts) | ||||
|     } | ||||
|  | ||||
|     private async createWindow(options: CreateWindowOptions) { | ||||
|         if (typeof this.windows[options.windowName] !== 'undefined') { | ||||
|             this.windows[options.windowName].show() | ||||
|             return | ||||
|         } | ||||
|         let win = new BrowserWindow(options.windowOptions) | ||||
|         win.hide() | ||||
|         win.webContents.on('did-finish-load', () => { | ||||
|             this.windows[options.windowName].show() | ||||
|         }) | ||||
|  | ||||
|         win.on('closed', () => { | ||||
|             delete this.windows[options.windowName] | ||||
|         }) | ||||
|  | ||||
|         let openUrl = (event: Event, url: string) => { | ||||
|             if (url === process.env.WEBPACK_DEV_SERVER_URL + options.loadPath) { | ||||
|                 return | ||||
|             } | ||||
|             event.preventDefault() | ||||
|             shell.openExternal(url, { | ||||
|                 activate: false | ||||
|             }, (err) => { | ||||
|                 //if (err) console.log(err) | ||||
|             }) | ||||
|         } | ||||
|         win.webContents.on('will-navigate', openUrl) | ||||
|         win.webContents.on('new-window', openUrl) | ||||
|  | ||||
|         if (process.env.WEBPACK_DEV_SERVER_URL) { | ||||
|             // `electron:serve`で起動した時の読み込み | ||||
|             win.loadURL(process.env.WEBPACK_DEV_SERVER_URL + options.loadPath) | ||||
|         } else { | ||||
|             // ビルドしたアプリでの読み込み | ||||
|             win.loadURL(`app://./${options.loadPath}`) | ||||
|         } | ||||
|  | ||||
|         if (isDevelopment && options.openDevTools) win.webContents.openDevTools() | ||||
|  | ||||
|         if (typeof options.lastAction === 'function') options.lastAction(win) | ||||
|  | ||||
|         this.windows[options.windowName] = win | ||||
|     } | ||||
| } | ||||
|  | ||||
| const menu = Menu.buildFromTemplate(template) | ||||
| Menu.setApplicationMenu(menu) | ||||
| class ApplicationMenu { | ||||
|     private app: Application; | ||||
|  | ||||
|     // Mac only menu. prefix `macOnly`. First Item always separator | ||||
|     private macOnlyAppMenu: MenuItemConstructorOptions[] = [ | ||||
|         { type: 'separator' }, | ||||
|         { role: 'services' }, | ||||
|         { type: 'separator' }, | ||||
|         { role: 'hide' }, | ||||
|         { role: 'hideOthers' }, | ||||
|         { role: 'unhide' }, | ||||
|     ]; | ||||
|     private macOnlyEditMenu: MenuItemConstructorOptions[] = [ | ||||
|         { type: 'separator' }, | ||||
|         { | ||||
|             label: 'Speech', | ||||
|             submenu: [ | ||||
|                 { role: 'startspeaking' }, | ||||
|                 { role: 'stopspeaking' }, | ||||
|             ] | ||||
|         } | ||||
|     ]; | ||||
|  | ||||
|     private get aboutMenuItem(): MenuItemConstructorOptions { | ||||
|         return { | ||||
|             label: process.platform !== 'darwin' ? 'About' : `About ${this.app.app.getName()}`, | ||||
|             click: () => this.app.openAboutWindow(), | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     constructor(app: Application) { | ||||
|         this.app = app; | ||||
|     } | ||||
|  | ||||
|     public setApplicationMenu() { | ||||
|         const menu = Menu.buildFromTemplate(this.buildTemplate(process.platform === 'darwin')) | ||||
|         Menu.setApplicationMenu(menu) | ||||
|     } | ||||
|  | ||||
|     private buildTemplate(isMac: boolean): MenuItemConstructorOptions[] { | ||||
|         return [ | ||||
|             this.AppMenu(isMac), | ||||
|             this.EditMenu(isMac), | ||||
|             this.ViewMenu(), | ||||
|             this.WindowMenu(isMac), | ||||
|             this.HelpMenu(), | ||||
|         ] | ||||
|     } | ||||
|  | ||||
|     private AppMenu(isMac: boolean): MenuItemConstructorOptions { | ||||
|         let appMenu: MenuItemConstructorOptions[] = [ | ||||
|             this.aboutMenuItem, | ||||
|             ...(isMac ? this.macOnlyAppMenu : []), | ||||
|             { type: 'separator' }, | ||||
|             { role: 'quit' }, | ||||
|         ] | ||||
|         return { | ||||
|             label: this.app.app.getName(), | ||||
|             submenu: appMenu, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private EditMenu(isMac: boolean): MenuItemConstructorOptions { | ||||
|         let editMenu: MenuItemConstructorOptions[] = [ | ||||
|             { role: 'undo' }, | ||||
|             { role: 'redo' }, | ||||
|             { type: 'separator' }, | ||||
|             { role: 'cut' }, | ||||
|             { role: 'copy' }, | ||||
|             { role: 'paste' }, | ||||
|             { role: 'pasteandmatchstyle' }, | ||||
|             { role: 'delete' }, | ||||
|             { role: 'selectall' }, | ||||
|             ...(isMac ? this.macOnlyEditMenu : []), | ||||
|         ] | ||||
|         return { | ||||
|             label: 'Edit', | ||||
|             submenu: editMenu, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private ViewMenu(): MenuItemConstructorOptions { | ||||
|         let viewMenu: MenuItemConstructorOptions[] = [ | ||||
|             { role: 'reload' }, | ||||
|             { role: 'forcereload' }, | ||||
|             { role: 'toggledevtools' }, | ||||
|             { type: 'separator' }, | ||||
|             { role: 'togglefullscreen' }, | ||||
|         ] | ||||
|         return { | ||||
|             label: 'View', | ||||
|             submenu: viewMenu | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private WindowMenu(isMac: boolean): MenuItemConstructorOptions { | ||||
|         let windowMenu: MenuItemConstructorOptions[] = isMac ? [ | ||||
|             { role: 'close' }, | ||||
|             { role: 'minimize' }, | ||||
|             { role: 'zoom' }, | ||||
|             { type: 'separator' }, | ||||
|             { role: 'front' }, | ||||
|         ] : [ | ||||
|             { role: 'minimize' }, | ||||
|             { role: 'close' }, | ||||
|         ] | ||||
|         return { | ||||
|             label: 'Window', | ||||
|             submenu: windowMenu, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private HelpMenu(): MenuItemConstructorOptions { | ||||
|         let helpMenu: MenuItemConstructorOptions[] = [ | ||||
|             { | ||||
|                 label: 'Report an issue', | ||||
|                 click: () => shell.openExternal(`${bugs.url}/new`), | ||||
|             }, | ||||
|             { | ||||
|                 label: 'Learn More', | ||||
|                 click: () => shell.openExternal(TheDeskInfo.documentURL), | ||||
|             } | ||||
|         ] | ||||
|         return { | ||||
|             label: 'Help', | ||||
|             submenu: helpMenu, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| const TheDeskVueApp: Application = new Application(app) | ||||
| const MainMenu: ApplicationMenu = new ApplicationMenu(TheDeskVueApp) | ||||
| MainMenu.setApplicationMenu() | ||||
|  | ||||
|   | ||||
| @@ -7,6 +7,7 @@ | ||||
|     "importHelpers": true, | ||||
|     "moduleResolution": "node", | ||||
|     "experimentalDecorators": true, | ||||
|     "resolveJsonModule": true, | ||||
|     "esModuleInterop": true, | ||||
|     "allowSyntheticDefaultImports": true, | ||||
|     "sourceMap": true, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	