From 528aacfe86682df3fcb375277a5de83feaeb8e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20Marussy?= Date: Sun, 9 Jan 2022 23:34:24 +0100 Subject: build: Add eslint-plugin-promise MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristóf Marussy --- .eslintrc.cjs | 1 + package.json | 1 + packages/main/src/index.ts | 27 ++++----- scripts/watch.js | 141 ++++++++++++++++++++++++++------------------- yarn.lock | 10 ++++ 5 files changed, 109 insertions(+), 71 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index e984179..85c928c 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -12,6 +12,7 @@ module.exports = { 'plugin:jest/recommended', 'plugin:jest/style', 'plugin:prettier/recommended', + 'plugin:promise/recommended', 'plugin:unicorn/recommended', ], env: { diff --git a/package.json b/package.json index 9944155..819f26a 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "eslint-plugin-jest": "^25.3.4", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-promise": "^6.0.0", "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", "eslint-plugin-unicorn": "^40.0.0", diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts index 02e6cda..2830fa7 100644 --- a/packages/main/src/index.ts +++ b/packages/main/src/index.ts @@ -123,7 +123,9 @@ const serviceInject: WebSource = { let mainWindow: BrowserWindow | undefined; const store = createMainStore(); + init(store) + // eslint-disable-next-line promise/always-return -- `then` instead of top-level await. .then((disposeCompositionRoot) => { app.on('will-quit', disposeCompositionRoot); }) @@ -241,6 +243,15 @@ async function createWindow(): Promise { return getSnapshot(store.shared); }); + async function reloadServiceInject() { + try { + serviceInject.code = await readFile(serviceInjectPath, 'utf8'); + } catch (error) { + log.error('Error while reloading', serviceInjectPath, error); + } + browserView.webContents.reload(); + } + ipcMain.on(RendererToMainIpcMessage.DispatchAction, (event, rawAction) => { if (event.sender.id !== webContents.id) { log.warn( @@ -261,19 +272,9 @@ async function createWindow(): Promise { store.config.setThemeSource(actionToDispatch.themeSource); break; case 'reload-all-services': - readFile(serviceInjectPath, 'utf8') - .then((data) => { - serviceInject.code = data; - }) - .catch((error) => { - log.error('Error while reloading', serviceInjectPath, error); - }) - .then(() => { - browserView.webContents.reload(); - }) - .catch((error) => { - log.error('Failed to reload browserView', error); - }); + reloadServiceInject().catch((error) => { + log.error('Failed to reload browserView', error); + }); break; default: log.error('Unexpected action from UI renderer:', actionToDispatch); diff --git a/scripts/watch.js b/scripts/watch.js index 455cfd9..91f3583 100644 --- a/scripts/watch.js +++ b/scripts/watch.js @@ -35,7 +35,7 @@ const stderrIgnorePatterns = [ * @param {string} packageName * @param {string[]} [extraPaths] * @param {() => void} [callback] - * @return {Promise} + * @returns {Promise} */ async function setupEsbuildWatcher(packageName, extraPaths, callback) { /** @type {{ default: import('esbuild').BuildOptions }} */ @@ -56,47 +56,56 @@ async function setupEsbuildWatcher(packageName, extraPaths, callback) { ignoreInitial: true, persistent: true, }); + if (callback) { callback(); } - watcher.on('change', () => { - incrementalBuild - .rebuild?.() - .then(() => { - if (callback) { - console.log(`\u26A1 Reloading package ${packageName}`); - callback(); - } - }) - .catch((error) => { - if (typeof error === 'object' && 'errors' in error) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- We just checked. - const { errors } = error; - if (Array.isArray(errors)) { - const errCount = errors.length; - console.error( - '\uD83D\uDD25', - errCount, - errCount > 1 ? 'errors' : 'error', - 'while rebuilding package', - packageName, - ); - return; - } + + /** + * @returns {Promise} + */ + async function rebuild() { + try { + await incrementalBuild.rebuild?.(); + } catch (error) { + if (typeof error === 'object' && error !== null && 'errors' in error) { + const { errors } = /** @type {{ errors: unknown }} */ (error); + if (Array.isArray(errors)) { + const errCount = errors.length; + console.error( + '\uD83D\uDD25', + errCount, + errCount > 1 ? 'errors' : 'error', + 'while rebuilding package', + packageName, + ); + return; } - console.error( - '\uD83D\uDD25', - 'error while rebuilding package', - packageName, - error, - ); - }); + } + console.error( + '\uD83D\uDD25', + 'error while rebuilding package', + packageName, + error, + ); + return; + } + if (callback) { + console.log(`\u26A1 Reloading package ${packageName}`); + callback(); + } + } + + watcher.on('change', () => { + rebuild().catch((error) => { + console.error('Unexpected error while rebuilding', error); + }); }); } /** * @param {string} packageName - * @return {Promise} + * @returns {Promise} */ async function setupDevServer(packageName) { const viteDevServer = await createServer({ @@ -114,7 +123,7 @@ async function setupDevServer(packageName) { /** * @param {(event: import('vite').HMRPayload) => void} sendEvent - * @return {Promise} + * @returns {Promise} */ function setupPreloadPackageWatcher(sendEvent) { return setupEsbuildWatcher('preload', [sharedModule], () => { @@ -127,7 +136,7 @@ function setupPreloadPackageWatcher(sendEvent) { /** * @param {string} packageName * @param {(event: import('vite').HMRPayload) => void} sendEvent - * @return {Promise} + * @returns {Promise} */ function setupServicePackageWatcher(packageName, sendEvent) { return setupEsbuildWatcher(packageName, [serviceSharedModule], () => { @@ -140,7 +149,7 @@ function setupServicePackageWatcher(packageName, sendEvent) { /** * @param {import('vite').ViteDevServer} viteDevServer - * @return {Promise} + * @returns {Promise} */ function setupMainPackageWatcher(viteDevServer) { // Write a value to an environment variable to pass it to the main process. @@ -190,31 +199,47 @@ async function setupDevEnvironment() { /** @type {import('vite').ViteDevServer | undefined} */ let viteDevServer; - /** @type {(event: import('vite').HMRPayload) => void} */ - const sendEvent = (event) => { + + /** + * @param {import('vite').HMRPayload} event + * @returns {void} + */ + function sendEvent(event) { if (viteDevServer !== undefined) { viteDevServer.ws.send(event); } - }; - - const sharedWatcher = setupEsbuildWatcher('shared'); - const serviceSharedWatcher = setupEsbuildWatcher('service-shared'); - await Promise.all([ - sharedWatcher.then(() => - Promise.all([ - setupPreloadPackageWatcher(sendEvent), - setupDevServer('renderer').then((devServer) => { - viteDevServer = devServer; - }), - ]), - ), - serviceSharedWatcher.then(() => - Promise.all([ - setupServicePackageWatcher('service-inject', sendEvent), - setupServicePackageWatcher('service-preload', sendEvent), - ]), - ), - ]); + } + + /** + * @returns {Promise} + */ + async function startDevServer() { + viteDevServer = await setupDevServer('renderer'); + } + + /** + * @returns {Promise} + */ + async function watchRendererPackages() { + await setupEsbuildWatcher('shared'); + await Promise.all([ + setupPreloadPackageWatcher(sendEvent), + startDevServer(), + ]); + } + + /** + * @returns {Promise} + */ + async function watchServicePackages() { + await setupEsbuildWatcher('service-shared'); + await Promise.all([ + setupServicePackageWatcher('service-inject', sendEvent), + setupServicePackageWatcher('service-preload', sendEvent), + ]); + } + + await Promise.all([watchRendererPackages(), watchServicePackages()]); if (viteDevServer === undefined) { console.error('Failed to create vite dev server'); diff --git a/yarn.lock b/yarn.lock index 4a391c8..6417171 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4157,6 +4157,15 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-promise@npm:^6.0.0": + version: 6.0.0 + resolution: "eslint-plugin-promise@npm:6.0.0" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 7e761507c51267b77e4ad710e7c8938aa4f8f69b975886034e57497a1816e9527eda364e25aac03d1b4e0df2e738ba98e49ad075d028824fcfea533a1419751c + languageName: node + linkType: hard + "eslint-plugin-react-hooks@npm:^4.3.0": version: 4.3.0 resolution: "eslint-plugin-react-hooks@npm:4.3.0" @@ -8177,6 +8186,7 @@ __metadata: eslint-plugin-jest: ^25.3.4 eslint-plugin-jsx-a11y: ^6.5.1 eslint-plugin-prettier: ^4.0.0 + eslint-plugin-promise: ^6.0.0 eslint-plugin-react: ^7.28.0 eslint-plugin-react-hooks: ^4.3.0 eslint-plugin-unicorn: ^40.0.0 -- cgit v1.2.3