diff options
author | Kristóf Marussy <kristof@marussy.com> | 2022-01-09 23:34:24 +0100 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2022-01-09 23:38:28 +0100 |
commit | 528aacfe86682df3fcb375277a5de83feaeb8e08 (patch) | |
tree | 2f361b0cf8306f7a019e5b5d959ed4aced527118 | |
parent | build: Add eslint-plugin-unicorn (diff) | |
download | sophie-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.cjs | 1 | ||||
-rw-r--r-- | package.json | 1 | ||||
-rw-r--r-- | packages/main/src/index.ts | 27 | ||||
-rw-r--r-- | scripts/watch.js | 141 | ||||
-rw-r--r-- | 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 = { | |||
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 = { | |||
123 | let mainWindow: BrowserWindow | undefined; | 123 | let mainWindow: BrowserWindow | undefined; |
124 | 124 | ||
125 | const store = createMainStore(); | 125 | const store = createMainStore(); |
126 | |||
126 | init(store) | 127 | init(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 | */ |
40 | async function setupEsbuildWatcher(packageName, extraPaths, callback) { | 40 | async 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 | */ |
101 | async function setupDevServer(packageName) { | 110 | async 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 | */ |
119 | function setupPreloadPackageWatcher(sendEvent) { | 128 | function 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 | */ |
132 | function setupServicePackageWatcher(packageName, sendEvent) { | 141 | function 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 | */ |
145 | function setupMainPackageWatcher(viteDevServer) { | 154 | function 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'); |
@@ -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 |