aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2022-01-09 23:34:24 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2022-01-09 23:38:28 +0100
commit528aacfe86682df3fcb375277a5de83feaeb8e08 (patch)
tree2f361b0cf8306f7a019e5b5d959ed4aced527118
parentbuild: Add eslint-plugin-unicorn (diff)
downloadsophie-528aacfe86682df3fcb375277a5de83feaeb8e08.tar.gz
sophie-528aacfe86682df3fcb375277a5de83feaeb8e08.tar.zst
sophie-528aacfe86682df3fcb375277a5de83feaeb8e08.zip
build: Add eslint-plugin-promise
Signed-off-by: Kristóf Marussy <kristof@marussy.com>
-rw-r--r--.eslintrc.cjs1
-rw-r--r--package.json1
-rw-r--r--packages/main/src/index.ts27
-rw-r--r--scripts/watch.js141
-rw-r--r--yarn.lock10
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 = {
12 'plugin:jest/recommended', 12 'plugin:jest/recommended',
13 'plugin:jest/style', 13 'plugin:jest/style',
14 'plugin:prettier/recommended', 14 'plugin:prettier/recommended',
15 'plugin:promise/recommended',
15 'plugin:unicorn/recommended', 16 'plugin:unicorn/recommended',
16 ], 17 ],
17 env: { 18 env: {
diff --git a/package.json b/package.json
index 9944155..819f26a 100644
--- a/package.json
+++ b/package.json
@@ -71,6 +71,7 @@
71 "eslint-plugin-jest": "^25.3.4", 71 "eslint-plugin-jest": "^25.3.4",
72 "eslint-plugin-jsx-a11y": "^6.5.1", 72 "eslint-plugin-jsx-a11y": "^6.5.1",
73 "eslint-plugin-prettier": "^4.0.0", 73 "eslint-plugin-prettier": "^4.0.0",
74 "eslint-plugin-promise": "^6.0.0",
74 "eslint-plugin-react": "^7.28.0", 75 "eslint-plugin-react": "^7.28.0",
75 "eslint-plugin-react-hooks": "^4.3.0", 76 "eslint-plugin-react-hooks": "^4.3.0",
76 "eslint-plugin-unicorn": "^40.0.0", 77 "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 = {
123let mainWindow: BrowserWindow | undefined; 123let mainWindow: BrowserWindow | undefined;
124 124
125const store = createMainStore(); 125const store = createMainStore();
126
126init(store) 127init(store)
128 // eslint-disable-next-line promise/always-return -- `then` instead of top-level await.
127 .then((disposeCompositionRoot) => { 129 .then((disposeCompositionRoot) => {
128 app.on('will-quit', disposeCompositionRoot); 130 app.on('will-quit', disposeCompositionRoot);
129 }) 131 })
@@ -241,6 +243,15 @@ async function createWindow(): Promise<unknown> {
241 return getSnapshot(store.shared); 243 return getSnapshot(store.shared);
242 }); 244 });
243 245
246 async function reloadServiceInject() {
247 try {
248 serviceInject.code = await readFile(serviceInjectPath, 'utf8');
249 } catch (error) {
250 log.error('Error while reloading', serviceInjectPath, error);
251 }
252 browserView.webContents.reload();
253 }
254
244 ipcMain.on(RendererToMainIpcMessage.DispatchAction, (event, rawAction) => { 255 ipcMain.on(RendererToMainIpcMessage.DispatchAction, (event, rawAction) => {
245 if (event.sender.id !== webContents.id) { 256 if (event.sender.id !== webContents.id) {
246 log.warn( 257 log.warn(
@@ -261,19 +272,9 @@ async function createWindow(): Promise<unknown> {
261 store.config.setThemeSource(actionToDispatch.themeSource); 272 store.config.setThemeSource(actionToDispatch.themeSource);
262 break; 273 break;
263 case 'reload-all-services': 274 case 'reload-all-services':
264 readFile(serviceInjectPath, 'utf8') 275 reloadServiceInject().catch((error) => {
265 .then((data) => { 276 log.error('Failed to reload browserView', error);
266 serviceInject.code = data; 277 });
267 })
268 .catch((error) => {
269 log.error('Error while reloading', serviceInjectPath, error);
270 })
271 .then(() => {
272 browserView.webContents.reload();
273 })
274 .catch((error) => {
275 log.error('Failed to reload browserView', error);
276 });
277 break; 278 break;
278 default: 279 default:
279 log.error('Unexpected action from UI renderer:', actionToDispatch); 280 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 = [
35 * @param {string} packageName 35 * @param {string} packageName
36 * @param {string[]} [extraPaths] 36 * @param {string[]} [extraPaths]
37 * @param {() => void} [callback] 37 * @param {() => void} [callback]
38 * @return {Promise<void>} 38 * @returns {Promise<void>}
39 */ 39 */
40async function setupEsbuildWatcher(packageName, extraPaths, callback) { 40async function setupEsbuildWatcher(packageName, extraPaths, callback) {
41 /** @type {{ default: import('esbuild').BuildOptions }} */ 41 /** @type {{ default: import('esbuild').BuildOptions }} */
@@ -56,47 +56,56 @@ async function setupEsbuildWatcher(packageName, extraPaths, callback) {
56 ignoreInitial: true, 56 ignoreInitial: true,
57 persistent: true, 57 persistent: true,
58 }); 58 });
59
59 if (callback) { 60 if (callback) {
60 callback(); 61 callback();
61 } 62 }
62 watcher.on('change', () => { 63
63 incrementalBuild 64 /**
64 .rebuild?.() 65 * @returns {Promise<void>}
65 .then(() => { 66 */
66 if (callback) { 67 async function rebuild() {
67 console.log(`\u26A1 Reloading package ${packageName}`); 68 try {
68 callback(); 69 await incrementalBuild.rebuild?.();
69 } 70 } catch (error) {
70 }) 71 if (typeof error === 'object' && error !== null && 'errors' in error) {
71 .catch((error) => { 72 const { errors } = /** @type {{ errors: unknown }} */ (error);
72 if (typeof error === 'object' && 'errors' in error) { 73 if (Array.isArray(errors)) {
73 // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- We just checked. 74 const errCount = errors.length;
74 const { errors } = error; 75 console.error(
75 if (Array.isArray(errors)) { 76 '\uD83D\uDD25',
76 const errCount = errors.length; 77 errCount,
77 console.error( 78 errCount > 1 ? 'errors' : 'error',
78 '\uD83D\uDD25', 79 'while rebuilding package',
79 errCount, 80 packageName,
80 errCount > 1 ? 'errors' : 'error', 81 );
81 'while rebuilding package', 82 return;
82 packageName,
83 );
84 return;
85 }
86 } 83 }
87 console.error( 84 }
88 '\uD83D\uDD25', 85 console.error(
89 'error while rebuilding package', 86 '\uD83D\uDD25',
90 packageName, 87 'error while rebuilding package',
91 error, 88 packageName,
92 ); 89 error,
93 }); 90 );
91 return;
92 }
93 if (callback) {
94 console.log(`\u26A1 Reloading package ${packageName}`);
95 callback();
96 }
97 }
98
99 watcher.on('change', () => {
100 rebuild().catch((error) => {
101 console.error('Unexpected error while rebuilding', error);
102 });
94 }); 103 });
95} 104}
96 105
97/** 106/**
98 * @param {string} packageName 107 * @param {string} packageName
99 * @return {Promise<import('vite').ViteDevServer>} 108 * @returns {Promise<import('vite').ViteDevServer>}
100 */ 109 */
101async function setupDevServer(packageName) { 110async function setupDevServer(packageName) {
102 const viteDevServer = await createServer({ 111 const viteDevServer = await createServer({
@@ -114,7 +123,7 @@ async function setupDevServer(packageName) {
114 123
115/** 124/**
116 * @param {(event: import('vite').HMRPayload) => void} sendEvent 125 * @param {(event: import('vite').HMRPayload) => void} sendEvent
117 * @return {Promise<void>} 126 * @returns {Promise<void>}
118 */ 127 */
119function setupPreloadPackageWatcher(sendEvent) { 128function setupPreloadPackageWatcher(sendEvent) {
120 return setupEsbuildWatcher('preload', [sharedModule], () => { 129 return setupEsbuildWatcher('preload', [sharedModule], () => {
@@ -127,7 +136,7 @@ function setupPreloadPackageWatcher(sendEvent) {
127/** 136/**
128 * @param {string} packageName 137 * @param {string} packageName
129 * @param {(event: import('vite').HMRPayload) => void} sendEvent 138 * @param {(event: import('vite').HMRPayload) => void} sendEvent
130 * @return {Promise<void>} 139 * @returns {Promise<void>}
131 */ 140 */
132function setupServicePackageWatcher(packageName, sendEvent) { 141function setupServicePackageWatcher(packageName, sendEvent) {
133 return setupEsbuildWatcher(packageName, [serviceSharedModule], () => { 142 return setupEsbuildWatcher(packageName, [serviceSharedModule], () => {
@@ -140,7 +149,7 @@ function setupServicePackageWatcher(packageName, sendEvent) {
140 149
141/** 150/**
142 * @param {import('vite').ViteDevServer} viteDevServer 151 * @param {import('vite').ViteDevServer} viteDevServer
143 * @return {Promise<void>} 152 * @returns {Promise<void>}
144 */ 153 */
145function setupMainPackageWatcher(viteDevServer) { 154function setupMainPackageWatcher(viteDevServer) {
146 // Write a value to an environment variable to pass it to the main process. 155 // Write a value to an environment variable to pass it to the main process.
@@ -190,31 +199,47 @@ async function setupDevEnvironment() {
190 199
191 /** @type {import('vite').ViteDevServer | undefined} */ 200 /** @type {import('vite').ViteDevServer | undefined} */
192 let viteDevServer; 201 let viteDevServer;
193 /** @type {(event: import('vite').HMRPayload) => void} */ 202
194 const sendEvent = (event) => { 203 /**
204 * @param {import('vite').HMRPayload} event
205 * @returns {void}
206 */
207 function sendEvent(event) {
195 if (viteDevServer !== undefined) { 208 if (viteDevServer !== undefined) {
196 viteDevServer.ws.send(event); 209 viteDevServer.ws.send(event);
197 } 210 }
198 }; 211 }
199 212
200 const sharedWatcher = setupEsbuildWatcher('shared'); 213 /**
201 const serviceSharedWatcher = setupEsbuildWatcher('service-shared'); 214 * @returns {Promise<void>}
202 await Promise.all([ 215 */
203 sharedWatcher.then(() => 216 async function startDevServer() {
204 Promise.all([ 217 viteDevServer = await setupDevServer('renderer');
205 setupPreloadPackageWatcher(sendEvent), 218 }
206 setupDevServer('renderer').then((devServer) => { 219
207 viteDevServer = devServer; 220 /**
208 }), 221 * @returns {Promise<void>}
209 ]), 222 */
210 ), 223 async function watchRendererPackages() {
211 serviceSharedWatcher.then(() => 224 await setupEsbuildWatcher('shared');
212 Promise.all([ 225 await Promise.all([
213 setupServicePackageWatcher('service-inject', sendEvent), 226 setupPreloadPackageWatcher(sendEvent),
214 setupServicePackageWatcher('service-preload', sendEvent), 227 startDevServer(),
215 ]), 228 ]);
216 ), 229 }
217 ]); 230
231 /**
232 * @returns {Promise<void>}
233 */
234 async function watchServicePackages() {
235 await setupEsbuildWatcher('service-shared');
236 await Promise.all([
237 setupServicePackageWatcher('service-inject', sendEvent),
238 setupServicePackageWatcher('service-preload', sendEvent),
239 ]);
240 }
241
242 await Promise.all([watchRendererPackages(), watchServicePackages()]);
218 243
219 if (viteDevServer === undefined) { 244 if (viteDevServer === undefined) {
220 console.error('Failed to create vite dev server'); 245 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:
4157 languageName: node 4157 languageName: node
4158 linkType: hard 4158 linkType: hard
4159 4159
4160"eslint-plugin-promise@npm:^6.0.0":
4161 version: 6.0.0
4162 resolution: "eslint-plugin-promise@npm:6.0.0"
4163 peerDependencies:
4164 eslint: ^7.0.0 || ^8.0.0
4165 checksum: 7e761507c51267b77e4ad710e7c8938aa4f8f69b975886034e57497a1816e9527eda364e25aac03d1b4e0df2e738ba98e49ad075d028824fcfea533a1419751c
4166 languageName: node
4167 linkType: hard
4168
4160"eslint-plugin-react-hooks@npm:^4.3.0": 4169"eslint-plugin-react-hooks@npm:^4.3.0":
4161 version: 4.3.0 4170 version: 4.3.0
4162 resolution: "eslint-plugin-react-hooks@npm:4.3.0" 4171 resolution: "eslint-plugin-react-hooks@npm:4.3.0"
@@ -8177,6 +8186,7 @@ __metadata:
8177 eslint-plugin-jest: ^25.3.4 8186 eslint-plugin-jest: ^25.3.4
8178 eslint-plugin-jsx-a11y: ^6.5.1 8187 eslint-plugin-jsx-a11y: ^6.5.1
8179 eslint-plugin-prettier: ^4.0.0 8188 eslint-plugin-prettier: ^4.0.0
8189 eslint-plugin-promise: ^6.0.0
8180 eslint-plugin-react: ^7.28.0 8190 eslint-plugin-react: ^7.28.0
8181 eslint-plugin-react-hooks: ^4.3.0 8191 eslint-plugin-react-hooks: ^4.3.0
8182 eslint-plugin-unicorn: ^40.0.0 8192 eslint-plugin-unicorn: ^40.0.0