aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/watch.js
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/watch.js')
-rw-r--r--scripts/watch.js141
1 files changed, 83 insertions, 58 deletions
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');