From d85f09cbed5f3d2501f791e689011ae127df1cbb Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 9 Jan 2022 20:33:53 +0100 Subject: build: Add prettier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit eslint will also enforce prettier rules, so there is no need to call prettier separately in CI. Signed-off-by: Kristóf Marussy --- .../src/controllers/__tests__/initConfig.spec.ts | 20 +++- .../controllers/__tests__/initNativeTheme.spec.ts | 8 +- packages/main/src/controllers/initConfig.ts | 21 ++-- packages/main/src/devTools.ts | 16 +-- packages/main/src/index.ts | 108 ++++++++++++--------- packages/main/src/init.ts | 9 +- .../main/src/services/ConfigPersistenceService.ts | 4 +- .../services/impl/ConfigPersistenceServiceImpl.ts | 22 +++-- packages/main/src/stores/MainStore.ts | 46 +++++---- packages/main/src/stores/SharedStore.ts | 5 +- packages/main/src/utils/log.ts | 7 +- 11 files changed, 161 insertions(+), 105 deletions(-) (limited to 'packages/main/src') diff --git a/packages/main/src/controllers/__tests__/initConfig.spec.ts b/packages/main/src/controllers/__tests__/initConfig.spec.ts index e386a07..7b6d6ab 100644 --- a/packages/main/src/controllers/__tests__/initConfig.spec.ts +++ b/packages/main/src/controllers/__tests__/initConfig.spec.ts @@ -60,8 +60,12 @@ describe('when initializing', () => { }); it('should bail if there is an an error creating the config file', async () => { - mocked(persistenceService.writeConfig).mockRejectedValue(new Error('boo')); - await expect(() => initConfig(config, persistenceService)).rejects.toBeInstanceOf(Error); + mocked(persistenceService.writeConfig).mockRejectedValue( + new Error('boo'), + ); + await expect(() => + initConfig(config, persistenceService), + ).rejects.toBeInstanceOf(Error); }); }); @@ -85,7 +89,9 @@ describe('when initializing', () => { mocked(persistenceService.watchConfig).mockImplementationOnce(() => { throw new Error('boo'); }); - await expect(() => initConfig(config, persistenceService)).rejects.toBeInstanceOf(Error); + await expect(() => + initConfig(config, persistenceService), + ).rejects.toBeInstanceOf(Error); }); }); @@ -102,7 +108,9 @@ describe('when initializing', () => { it('should bail if it cannot determine whether there is a config file', async () => { mocked(persistenceService.readConfig).mockRejectedValue(new Error('boo')); - await expect(() => initConfig(config, persistenceService)).rejects.toBeInstanceOf(Error); + await expect(() => + initConfig(config, persistenceService), + ).rejects.toBeInstanceOf(Error); }); }); @@ -118,7 +126,9 @@ describe('when it has loaded the config', () => { }); mocked(persistenceService.watchConfig).mockReturnValueOnce(watcherDisposer); sutDisposer = await initConfig(config, persistenceService, throttleMs); - [[configChangedCallback]] = mocked(persistenceService.watchConfig).mock.calls; + [[configChangedCallback]] = mocked( + persistenceService.watchConfig, + ).mock.calls; jest.resetAllMocks(); }); diff --git a/packages/main/src/controllers/__tests__/initNativeTheme.spec.ts b/packages/main/src/controllers/__tests__/initNativeTheme.spec.ts index bd33f48..d4068af 100644 --- a/packages/main/src/controllers/__tests__/initNativeTheme.spec.ts +++ b/packages/main/src/controllers/__tests__/initNativeTheme.spec.ts @@ -58,14 +58,18 @@ it('should synchronize themeSource changes to the nativeTheme', () => { }); it('should synchronize shouldUseDarkColors changes to the store', () => { - const listener = mocked(nativeTheme.on).mock.calls.find(([event]) => event === 'updated')![1]; + const listener = mocked(nativeTheme.on).mock.calls.find( + ([event]) => event === 'updated', + )![1]; shouldUseDarkColors = true; listener(); expect(store.shared.shouldUseDarkColors).toBe(true); }); it('should remove the listener on dispose', () => { - const listener = mocked(nativeTheme.on).mock.calls.find(([event]) => event === 'updated')![1]; + const listener = mocked(nativeTheme.on).mock.calls.find( + ([event]) => event === 'updated', + )![1]; disposeSut(); expect(nativeTheme.off).toBeCalledWith('updated', listener); }); diff --git a/packages/main/src/controllers/initConfig.ts b/packages/main/src/controllers/initConfig.ts index 1d40762..e83b8da 100644 --- a/packages/main/src/controllers/initConfig.ts +++ b/packages/main/src/controllers/initConfig.ts @@ -59,20 +59,23 @@ export default async function initConfig( lastSnapshotOnDisk = snapshot; } - if (!await readConfig()) { + if (!(await readConfig())) { log.info('Config file was not found'); await writeConfig(); log.info('Created config file'); } - const disposeOnSnapshot = onSnapshot(config, debounce((snapshot) => { - // We can compare snapshots by reference, since it is only recreated on store changes. - if (lastSnapshotOnDisk !== snapshot) { - writeConfig().catch((err) => { - log.error('Failed to write config on config change', err); - }); - } - }, debounceTime)); + const disposeOnSnapshot = onSnapshot( + config, + debounce((snapshot) => { + // We can compare snapshots by reference, since it is only recreated on store changes. + if (lastSnapshotOnDisk !== snapshot) { + writeConfig().catch((err) => { + log.error('Failed to write config on config change', err); + }); + } + }, debounceTime), + ); const disposeWatcher = persistenceService.watchConfig(async () => { try { diff --git a/packages/main/src/devTools.ts b/packages/main/src/devTools.ts index 0486c36..69f1514 100644 --- a/packages/main/src/devTools.ts +++ b/packages/main/src/devTools.ts @@ -52,18 +52,12 @@ export async function installDevToolsExtensions(): Promise { @typescript-eslint/no-var-requires */ } = require('electron-devtools-installer') as typeof import('electron-devtools-installer'); - await installExtension( - [ - REACT_DEVELOPER_TOOLS, - REDUX_DEVTOOLS, - ], - { - forceDownload: false, - loadExtensionOptions: { - allowFileAccess: true, - }, + await installExtension([REACT_DEVELOPER_TOOLS, REDUX_DEVTOOLS], { + forceDownload: false, + loadExtensionOptions: { + allowFileAccess: true, }, - ); + }); } /** diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts index bc10b4c..1f80e44 100644 --- a/packages/main/src/index.ts +++ b/packages/main/src/index.ts @@ -33,12 +33,7 @@ import { MainToRendererIpcMessage, RendererToMainIpcMessage, } from '@sophie/shared'; -import { - app, - BrowserView, - BrowserWindow, - ipcMain, -} from 'electron'; +import { app, BrowserView, BrowserWindow, ipcMain } from 'electron'; import { ensureDirSync, readFile, readFileSync } from 'fs-extra'; import { autorun } from 'mobx'; import { getSnapshot, onPatch } from 'mobx-state-tree'; @@ -97,7 +92,9 @@ app.setAboutPanelOptions({ `Node.js: ${process.versions.node}`, `Platform: ${osName()}`, `Arch: ${arch()}`, - `Build date: ${new Date(Number(import.meta.env.BUILD_DATE)).toLocaleString()}`, + `Build date: ${new Date( + Number(import.meta.env.BUILD_DATE), + ).toLocaleString()}`, `Git SHA: ${import.meta.env.GIT_SHA}`, `Git branch: ${import.meta.env.GIT_BRANCH}`, ].join('\n'), @@ -123,11 +120,13 @@ const serviceInject: WebSource = { let mainWindow: BrowserWindow | null = null; const store = createMainStore(); -init(store).then((disposeCompositionRoot) => { - app.on('will-quit', disposeCompositionRoot); -}).catch((err) => { - log.log('Failed to initialize application', err); -}); +init(store) + .then((disposeCompositionRoot) => { + app.on('will-quit', disposeCompositionRoot); + }) + .catch((err) => { + log.log('Failed to initialize application', err); + }); const rendererBaseUrl = getResourceUrl('../renderer/'); function shouldCancelMainWindowRequest(url: string, method: string): boolean { @@ -141,12 +140,20 @@ function shouldCancelMainWindowRequest(url: string, method: string): boolean { return true; } if (isDevelopment) { - if (DEVMODE_ALLOWED_URL_PREFIXES.some((prefix) => normalizedUrl.startsWith(prefix))) { + if ( + DEVMODE_ALLOWED_URL_PREFIXES.some((prefix) => + normalizedUrl.startsWith(prefix), + ) + ) { return false; } if (import.meta.env.VITE_DEV_SERVER_URL !== undefined) { - const isHttp = normalizedUrl.startsWith(import.meta.env.VITE_DEV_SERVER_URL); - const isWs = normalizedUrl.startsWith(import.meta.env.VITE_DEV_SERVER_URL.replace(/^http:/, 'ws:')); + const isHttp = normalizedUrl.startsWith( + import.meta.env.VITE_DEV_SERVER_URL, + ); + const isWs = normalizedUrl.startsWith( + import.meta.env.VITE_DEV_SERVER_URL.replace(/^http:/, 'ws:'), + ); return !isHttp && !isWs; } } @@ -168,19 +175,24 @@ async function createWindow(): Promise { webContents.userAgent = originalUserAgent; - webContents.session.setPermissionRequestHandler((_webContents, _permission, callback) => { - callback(false); - }); + webContents.session.setPermissionRequestHandler( + (_webContents, _permission, callback) => { + callback(false); + }, + ); - webContents.session.webRequest.onBeforeRequest(({ url, method }, callback) => { - callback({ - cancel: shouldCancelMainWindowRequest(url, method), - }); - }); + webContents.session.webRequest.onBeforeRequest( + ({ url, method }, callback) => { + callback({ + cancel: shouldCancelMainWindowRequest(url, method), + }); + }, + ); - const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined) - ? import.meta.env.VITE_DEV_SERVER_URL - : getResourceUrl('../renderer/dist/index.html'); + const pageUrl = + isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined + ? import.meta.env.VITE_DEV_SERVER_URL + : getResourceUrl('../renderer/dist/index.html'); webContents.on('will-navigate', (event, url) => { if (url !== pageUrl) { @@ -273,9 +285,8 @@ async function createWindow(): Promise { webContents.send(MainToRendererIpcMessage.SharedStorePatch, patch); }); - ipcMain.handle( - ServiceToMainIpcMessage.ApiExposedInMainWorld, - (event) => (event.sender.id === browserView.webContents.id ? serviceInject : null), + ipcMain.handle(ServiceToMainIpcMessage.ApiExposedInMainWorld, (event) => + event.sender.id === browserView.webContents.id ? serviceInject : null, ); browserView.webContents.on('ipc-message', (_event, channel, ...args) => { @@ -305,7 +316,9 @@ async function createWindow(): Promise { browserView.webContents.session.webRequest.onBeforeSendHeaders( ({ url, requestHeaders }, callback) => { - const requestUserAgent = url.match(/^[^:]+:\/\/accounts\.google\.[^./]+\//) + const requestUserAgent = url.match( + /^[^:]+:\/\/accounts\.google\.[^./]+\//, + ) ? chromelessUserAgent : userAgent; callback({ @@ -317,9 +330,11 @@ async function createWindow(): Promise { }, ); - browserView.webContents.loadURL('https://gitlab.com/say-hi-to-sophie/sophie').catch((err) => { - log.error('Failed to load browser', err); - }); + browserView.webContents + .loadURL('https://gitlab.com/say-hi-to-sophie/sophie') + .catch((err) => { + log.error('Failed to load browser', err); + }); return mainWindow.loadURL(pageUrl); } @@ -342,17 +357,20 @@ app.on('window-all-closed', () => { } }); -app.whenReady().then(async () => { - if (isDevelopment) { - try { - await installDevToolsExtensions(); - } catch (err) { - log.error('Failed to install devtools extensions', err); +app + .whenReady() + .then(async () => { + if (isDevelopment) { + try { + await installDevToolsExtensions(); + } catch (err) { + log.error('Failed to install devtools extensions', err); + } } - } - return createWindow(); -}).catch((err) => { - log.error('Failed to create window', err); - process.exit(1); -}); + return createWindow(); + }) + .catch((err) => { + log.error('Failed to create window', err); + process.exit(1); + }); diff --git a/packages/main/src/init.ts b/packages/main/src/init.ts index 4487cc4..f3794bb 100644 --- a/packages/main/src/init.ts +++ b/packages/main/src/init.ts @@ -27,8 +27,13 @@ import { MainStore } from './stores/MainStore'; import type Disposer from './utils/Disposer'; export default async function init(store: MainStore): Promise { - const configPersistenceService = new ConfigPersistenceServiceImpl(app.getPath('userData')); - const disposeConfigController = await initConfig(store.config, configPersistenceService); + const configPersistenceService = new ConfigPersistenceServiceImpl( + app.getPath('userData'), + ); + const disposeConfigController = await initConfig( + store.config, + configPersistenceService, + ); const disposeNativeThemeController = initNativeTheme(store); return () => { diff --git a/packages/main/src/services/ConfigPersistenceService.ts b/packages/main/src/services/ConfigPersistenceService.ts index 7d508c5..ee5696d 100644 --- a/packages/main/src/services/ConfigPersistenceService.ts +++ b/packages/main/src/services/ConfigPersistenceService.ts @@ -21,7 +21,9 @@ import type { ConfigSnapshotOut } from '../stores/Config'; import type Disposer from '../utils/Disposer'; -export type ReadConfigResult = { found: true; data: unknown; } | { found: false; }; +export type ReadConfigResult = + | { found: true; data: unknown } + | { found: false }; export default interface ConfigPersistenceService { readConfig(): Promise; diff --git a/packages/main/src/services/impl/ConfigPersistenceServiceImpl.ts b/packages/main/src/services/impl/ConfigPersistenceServiceImpl.ts index df8c807..e92f706 100644 --- a/packages/main/src/services/impl/ConfigPersistenceServiceImpl.ts +++ b/packages/main/src/services/impl/ConfigPersistenceServiceImpl.ts @@ -32,7 +32,9 @@ import type { ReadConfigResult } from '../ConfigPersistenceService'; const log = getLogger('configPersistence'); -export default class ConfigPersistenceServiceImpl implements ConfigPersistenceService { +export default class ConfigPersistenceServiceImpl + implements ConfigPersistenceService +{ private readonly configFilePath: string; private writingConfig = false; @@ -92,13 +94,19 @@ export default class ConfigPersistenceServiceImpl implements ConfigPersistenceSe log.trace('Config file last modified at', mtime); } catch (err) { if ((err as NodeJS.ErrnoException).code === 'ENOENT') { - log.debug('Config file', this.configFilePath, 'was deleted after being changed'); + log.debug( + 'Config file', + this.configFilePath, + 'was deleted after being changed', + ); return; } throw err; } - if (!this.writingConfig - && (this.timeLastWritten === null || mtime > this.timeLastWritten)) { + if ( + !this.writingConfig && + (this.timeLastWritten === null || mtime > this.timeLastWritten) + ) { log.debug( 'Found a config file modified at', mtime, @@ -114,8 +122,10 @@ export default class ConfigPersistenceServiceImpl implements ConfigPersistenceSe }); watcher.on('change', (eventType, filename) => { - if (eventType === 'change' - && (filename === this.configFileName || filename === null)) { + if ( + eventType === 'change' && + (filename === this.configFileName || filename === null) + ) { configChanged()?.catch((err) => { log.error('Unhandled error while listening for config changes', err); }); diff --git a/packages/main/src/stores/MainStore.ts b/packages/main/src/stores/MainStore.ts index 7b26c52..eaf5b3c 100644 --- a/packages/main/src/stores/MainStore.ts +++ b/packages/main/src/stores/MainStore.ts @@ -24,26 +24,32 @@ import { applySnapshot, Instance, types } from 'mobx-state-tree'; import type { Config } from './Config.js'; import { sharedStore } from './SharedStore'; -export const mainStore = types.model('MainStore', { - browserViewBounds: types.optional(types.model('BrowserViewBounds', { - x: 0, - y: 0, - width: 0, - height: 0, - }), {}), - shared: types.optional(sharedStore, {}), -}).views((self) => ({ - get config(): Config { - return self.shared.config; - }, -})).actions((self) => ({ - setBrowserViewBounds(bounds: BrowserViewBounds): void { - applySnapshot(self.browserViewBounds, bounds); - }, - setShouldUseDarkColors(shouldUseDarkColors: boolean): void { - self.shared.shouldUseDarkColors = shouldUseDarkColors; - }, -})); +export const mainStore = types + .model('MainStore', { + browserViewBounds: types.optional( + types.model('BrowserViewBounds', { + x: 0, + y: 0, + width: 0, + height: 0, + }), + {}, + ), + shared: types.optional(sharedStore, {}), + }) + .views((self) => ({ + get config(): Config { + return self.shared.config; + }, + })) + .actions((self) => ({ + setBrowserViewBounds(bounds: BrowserViewBounds): void { + applySnapshot(self.browserViewBounds, bounds); + }, + setShouldUseDarkColors(shouldUseDarkColors: boolean): void { + self.shared.shouldUseDarkColors = shouldUseDarkColors; + }, + })); export interface MainStore extends Instance {} diff --git a/packages/main/src/stores/SharedStore.ts b/packages/main/src/stores/SharedStore.ts index c023fc7..73245cd 100644 --- a/packages/main/src/stores/SharedStore.ts +++ b/packages/main/src/stores/SharedStore.ts @@ -23,7 +23,10 @@ import { Instance, types } from 'mobx-state-tree'; import { config } from './Config'; -export type { SharedStoreSnapshotIn, SharedStoreSnapshotOut } from '@sophie/shared'; +export type { + SharedStoreSnapshotIn, + SharedStoreSnapshotOut, +} from '@sophie/shared'; export const sharedStore = originalSharedStore.props({ config: types.optional(config, {}), diff --git a/packages/main/src/utils/log.ts b/packages/main/src/utils/log.ts index c704797..5218721 100644 --- a/packages/main/src/utils/log.ts +++ b/packages/main/src/utils/log.ts @@ -46,9 +46,10 @@ prefix.apply(loglevel, { format(level, name, timestamp) { const levelColor = getColor(level); const timeStr = timestamp.toString(); - const nameStr = typeof name === 'undefined' - ? levelColor(':') - : ` ${chalk.green(`${name}:`)}`; + const nameStr = + typeof name === 'undefined' + ? levelColor(':') + : ` ${chalk.green(`${name}:`)}`; return `${chalk.gray(`[${timeStr}]`)} ${levelColor(level)}${nameStr}`; }, }); -- cgit v1.2.3-54-g00ecf