aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-30 00:26:01 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-30 02:24:28 +0100
commit61fd13c55f5e69a9d8b32dd0d74b08870783bcce (patch)
tree4f3f97b1629f3c262bea076b596bc7245ccbc0bd
parentRevert "refactor: Switch back to consola for prettyness" (diff)
downloadsophie-61fd13c55f5e69a9d8b32dd0d74b08870783bcce.tar.gz
sophie-61fd13c55f5e69a9d8b32dd0d74b08870783bcce.tar.zst
sophie-61fd13c55f5e69a9d8b32dd0d74b08870783bcce.zip
build: Switch to esbuild
We will build all packages except the frontend (where vite remains in use) with esbuild. For some reason, the @yarnpkg/esbuild-plugin-pnp doesn't allow esbuild to load esm modules and we fall back to commonjs for dependencies. Hence we had to switch back to node_modules (but still rely on yarn hardlinking for a more efficient install).
-rw-r--r--.electron-builder.config.js2
-rw-r--r--.gitignore1
-rw-r--r--.yarnrc.yml9
-rw-r--r--config/build-common.js33
-rw-r--r--config/esbuild-config.js50
-rw-r--r--config/vite-common.js67
-rw-r--r--package.json7
-rw-r--r--packages/main/esbuild.config.js24
-rw-r--r--packages/main/package.json10
-rw-r--r--packages/main/src/controllers/config.ts2
-rw-r--r--packages/main/src/devTools.ts41
-rw-r--r--packages/main/src/index.ts38
-rw-r--r--packages/main/src/services/ConfigPersistenceService.ts2
-rw-r--r--packages/main/src/utils/logging.ts4
-rw-r--r--packages/main/vite.config.js39
-rw-r--r--packages/preload/esbuild.config.js19
-rw-r--r--packages/preload/package.json4
-rw-r--r--packages/preload/vite.config.js31
-rw-r--r--packages/renderer/package.json7
-rw-r--r--packages/renderer/src/devTools.ts13
-rw-r--r--packages/renderer/vite.config.js48
-rw-r--r--packages/service-inject/esbuild.config.js16
-rw-r--r--packages/service-inject/package.json4
-rw-r--r--packages/service-inject/vite.config.js28
-rw-r--r--packages/service-preload/esbuild.config.js19
-rw-r--r--packages/service-preload/package.json6
-rw-r--r--packages/service-preload/vite.config.js31
-rw-r--r--packages/service-shared/package.json6
-rw-r--r--packages/service-shared/vite.config.js35
-rw-r--r--packages/shared/esbuild.config.js23
-rw-r--r--packages/shared/package.json8
-rw-r--r--packages/shared/vite.config.js40
-rw-r--r--scripts/build.js37
-rw-r--r--scripts/watch.js259
-rw-r--r--yarn.lock311
35 files changed, 753 insertions, 521 deletions
diff --git a/.electron-builder.config.js b/.electron-builder.config.js
index 128ae18..5238c69 100644
--- a/.electron-builder.config.js
+++ b/.electron-builder.config.js
@@ -19,6 +19,8 @@ const config = {
19 'packages/renderer/dist/**', 19 'packages/renderer/dist/**',
20 'packages/service-inject/dist/**', 20 'packages/service-inject/dist/**',
21 'packages/service-preload/dist/**', 21 'packages/service-preload/dist/**',
22 // Do not ship with source maps.
23 '!**/*.map',
22 ], 24 ],
23 afterPack(context) { 25 afterPack(context) {
24 return burnFuses(context); 26 return burnFuses(context);
diff --git a/.gitignore b/.gitignore
index 0b6997b..22394d6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,4 +7,5 @@
7!.yarn/releases 7!.yarn/releases
8!.yarn/versions 8!.yarn/versions
9dist/ 9dist/
10node_modules/
10*.tsbuildinfo 11*.tsbuildinfo
diff --git a/.yarnrc.yml b/.yarnrc.yml
index 9c13019..f83ee48 100644
--- a/.yarnrc.yml
+++ b/.yarnrc.yml
@@ -6,4 +6,13 @@ plugins:
6 - path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs 6 - path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs
7 spec: "@yarnpkg/plugin-typescript" 7 spec: "@yarnpkg/plugin-typescript"
8 8
9logFilters:
10 # Discard incompatible package architecture warnings.
11 - code: YN0076
12 level: discard
13
14nmMode: hardlinks-local
15
16nodeLinker: node-modules
17
9yarnPath: .yarn/releases/yarn-3.1.1.cjs 18yarnPath: .yarn/releases/yarn-3.1.1.cjs
diff --git a/config/build-common.js b/config/build-common.js
new file mode 100644
index 0000000..aea2335
--- /dev/null
+++ b/config/build-common.js
@@ -0,0 +1,33 @@
1// @ts-check
2
3// `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless.
4// @ts-ignore
5const { chrome: chromeVersion, node: nodeVersion } = require('../.electron-vendors.cache.json');
6
7/** @type {string} */
8module.exports.banner = `/*!
9 * Copyright (C) 2021-2022 Sophie contributors
10 *
11 * This file is part of Sophie.
12 *
13 * Sophie is free software: you can redistribute it and/or modify
14 * it under the terms of the GNU Affero General Public License as
15 * published by the Free Software Foundation, version 3.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Affero General Public License for more details.
21 *
22 * You should have received a copy of the GNU Affero General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 *
25 * SPDX-License-Identifier: AGPL-3.0-only
26 */
27`;
28
29/** @type {string} */
30module.exports.chrome = `chrome${chromeVersion}`;
31
32/** @type {string} */
33module.exports.node = `node${nodeVersion}`;
diff --git a/config/esbuild-config.js b/config/esbuild-config.js
new file mode 100644
index 0000000..9140b89
--- /dev/null
+++ b/config/esbuild-config.js
@@ -0,0 +1,50 @@
1// @ts-check
2
3const { banner } = require('./build-common');
4
5/** @type {string} */
6const mode = process.env.MODE || 'development';
7
8/** @type {boolean} */
9const isDevelopment = mode === 'development';
10
11const modeString = JSON.stringify(mode);
12
13const defineEnv = {
14 'import.meta.env.DEV': JSON.stringify(isDevelopment),
15 'import.meta.env.MODE': modeString,
16 'import.meta.env.PROD': JSON.stringify(!isDevelopment),
17 'process.env.NODE_ENV': modeString,
18 'process.env.MODE': modeString,
19};
20
21/**
22 * @param {import('esbuild').BuildOptions} config
23 * @param {object | unknown} metaEnvVars
24 * @returns {import('esbuild').BuildOptions}
25 */
26module.exports.getConfig = function(config, metaEnvVars) {
27 const defineMeta = {};
28 for (const varName in metaEnvVars) {
29 defineMeta[`import.meta.env.${varName}`] = JSON.stringify(metaEnvVars[varName]);
30 }
31 return {
32 logLevel: 'info',
33 bundle: true,
34 treeShaking: !isDevelopment,
35 minify: !isDevelopment,
36 banner: {
37 js: banner,
38 },
39 ...config,
40 sourcemap: isDevelopment ? (config.sourcemap || true) : false,
41 define: {
42 ...defineEnv,
43 ...defineMeta,
44 ...config.define,
45 },
46 plugins: [
47 ...(config.plugins || []),
48 ],
49 };
50}
diff --git a/config/vite-common.js b/config/vite-common.js
deleted file mode 100644
index 6b1d7c7..0000000
--- a/config/vite-common.js
+++ /dev/null
@@ -1,67 +0,0 @@
1// @ts-check
2
3// `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless.
4// @ts-expect-error
5import { chrome as chromeVersion, node as nodeVersion } from '../.electron-vendors.cache.json';
6
7/** @type {string} */
8const banner = `/*!
9 * Copyright (C) 2021-2022 Sophie contributors
10 *
11 * This file is part of Sophie.
12 *
13 * Sophie is free software: you can redistribute it and/or modify
14 * it under the terms of the GNU Affero General Public License as
15 * published by the Free Software Foundation, version 3.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Affero General Public License for more details.
21 *
22 * You should have received a copy of the GNU Affero General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 *
25 * SPDX-License-Identifier: AGPL-3.0-only
26 */
27`;
28
29/** @type {string} */
30export const chrome = `chrome${chromeVersion}`;
31
32/** @type {string} */
33export const node = `node${nodeVersion}`;
34
35/**
36 * Extends a vite configuration with common options.
37 *
38 * @param {import('vite').UserConfig} config The configuration to extend.
39 * @return {import('vite').UserConfig} The configuration extended with common options.
40 */
41export function makeConfig(config) {
42 return {
43 mode: process.env.NODE,
44 envDir: process.cwd(),
45 ...config,
46 build: {
47 assetsDir: '.',
48 outDir: 'dist',
49 emptyOutDir: true,
50 sourcemap: true,
51 minify: process.env.MODE !== 'development',
52 brotliSize: false,
53 ...config.build,
54 lib: (typeof config.build.lib === 'object') ? {
55 fileName: (format) => format === 'cjs' ? 'index.cjs' : `index.${format}.js`,
56 ...config.build.lib,
57 } : undefined,
58 rollupOptions: {
59 ...config.build?.rollupOptions,
60 output: {
61 banner,
62 ...config.build?.rollupOptions?.output,
63 },
64 },
65 },
66 };
67}
diff --git a/package.json b/package.json
index 90d0a92..03c1696 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
17 "scripts": { 17 "scripts": {
18 "clean": "rimraf dist .log && yarn workspaces foreach run clean", 18 "clean": "rimraf dist .log && yarn workspaces foreach run clean",
19 "test": "yarn workspaces foreach -vpt run test", 19 "test": "yarn workspaces foreach -vpt run test",
20 "build": "yarn workspaces foreach -vpt run build", 20 "build": "node scripts/build.js",
21 "precompile": "cross-env MODE=production yarn run build", 21 "precompile": "cross-env MODE=production yarn run build",
22 "compile": "yarn precompile && yarn compile:electron-builder", 22 "compile": "yarn precompile && yarn compile:electron-builder",
23 "compile:electron-builder": "electron-builder build --config .electron-builder.config.js --dir", 23 "compile:electron-builder": "electron-builder build --config .electron-builder.config.js --dir",
@@ -38,16 +38,19 @@
38 "devDependencies": { 38 "devDependencies": {
39 "@electron/fuses": "^1.5.0", 39 "@electron/fuses": "^1.5.0",
40 "@types/jest": "^27.0.3", 40 "@types/jest": "^27.0.3",
41 "@vitejs/plugin-react": "^1.1.3",
42 "chokidar": "^3.5.2",
41 "cross-env": "^7.0.3", 43 "cross-env": "^7.0.3",
42 "electron": "16.0.5", 44 "electron": "16.0.5",
43 "electron-builder": "^22.14.11", 45 "electron-builder": "^22.14.11",
46 "esbuild": "^0.14.9",
44 "eslint": "^8.5.0", 47 "eslint": "^8.5.0",
45 "jest": "^27.4.5", 48 "jest": "^27.4.5",
46 "rimraf": "^3.0.2", 49 "rimraf": "^3.0.2",
47 "rollup": "^2.62.0", 50 "rollup": "^2.62.0",
48 "ts-jest": "^27.1.2", 51 "ts-jest": "^27.1.2",
49 "typescript": "^4.5.4", 52 "typescript": "^4.5.4",
50 "vite": "^2.7.7" 53 "vite": "^2.7.9"
51 }, 54 },
52 "packageManager": "yarn@3.1.1" 55 "packageManager": "yarn@3.1.1"
53} 56}
diff --git a/packages/main/esbuild.config.js b/packages/main/esbuild.config.js
new file mode 100644
index 0000000..7653078
--- /dev/null
+++ b/packages/main/esbuild.config.js
@@ -0,0 +1,24 @@
1// @ts-check
2
3const { node } = require('../../config/build-common');
4const { getConfig } = require('../../config/esbuild-config');
5
6const externalPackages = ['electron'];
7
8if (process.env.MODE !== 'development') {
9 externalPackages.push('electron-devtools-installer');
10}
11
12module.exports = getConfig({
13 absWorkingDir: __dirname,
14 entryPoints: [
15 'src/index.ts',
16 ],
17 outfile: 'dist/index.cjs',
18 format: 'cjs',
19 platform: 'node',
20 target: node,
21 external: externalPackages,
22}, {
23 VITE_DEV_SERVER_URL: process.env.VITE_DEV_SERVER_URL || null,
24});
diff --git a/packages/main/package.json b/packages/main/package.json
index c4670a8..76eff8e 100644
--- a/packages/main/package.json
+++ b/packages/main/package.json
@@ -6,7 +6,6 @@
6 "types": "dist-types/index.d.ts", 6 "types": "dist-types/index.d.ts",
7 "scripts": { 7 "scripts": {
8 "clean": "rimraf dist", 8 "clean": "rimraf dist",
9 "build": "vite build",
10 "typecheck": "tsc" 9 "typecheck": "tsc"
11 }, 10 },
12 "dependencies": { 11 "dependencies": {
@@ -14,7 +13,7 @@
14 "@sophie/shared": "workspace:*", 13 "@sophie/shared": "workspace:*",
15 "electron": "16.0.5", 14 "electron": "16.0.5",
16 "json5": "^2.2.0", 15 "json5": "^2.2.0",
17 "lodash": "^4.17.21", 16 "lodash-es": "^4.17.21",
18 "loglevel": "^1.8.0", 17 "loglevel": "^1.8.0",
19 "loglevel-plugin-prefix": "^0.8.4", 18 "loglevel-plugin-prefix": "^0.8.4",
20 "mobx": "^6.3.10", 19 "mobx": "^6.3.10",
@@ -22,14 +21,13 @@
22 "ms": "^2.1.3" 21 "ms": "^2.1.3"
23 }, 22 },
24 "devDependencies": { 23 "devDependencies": {
25 "@types/debug": "^4",
26 "@types/electron-devtools-installer": "^2.2.1", 24 "@types/electron-devtools-installer": "^2.2.1",
27 "@types/lodash": "^4.14.178", 25 "@types/lodash-es": "^4.17.5",
28 "@types/ms": "^0.7.31", 26 "@types/ms": "^0.7.31",
29 "@types/node": "^17.0.5", 27 "@types/node": "^17.0.5",
30 "electron-devtools-installer": "^3.2.0", 28 "electron-devtools-installer": "^3.2.0",
29 "esbuild": "^0.14.9",
31 "rimraf": "^3.0.2", 30 "rimraf": "^3.0.2",
32 "typescript": "^4.5.4", 31 "typescript": "^4.5.4"
33 "vite": "^2.7.7"
34 } 32 }
35} 33}
diff --git a/packages/main/src/controllers/config.ts b/packages/main/src/controllers/config.ts
index 7187ab4..f2467c7 100644
--- a/packages/main/src/controllers/config.ts
+++ b/packages/main/src/controllers/config.ts
@@ -18,7 +18,7 @@
18 * SPDX-License-Identifier: AGPL-3.0-only 18 * SPDX-License-Identifier: AGPL-3.0-only
19 */ 19 */
20 20
21import { debounce } from 'lodash'; 21import debounce from 'lodash-es/debounce';
22import ms from 'ms'; 22import ms from 'ms';
23import { applySnapshot, getSnapshot, onSnapshot } from 'mobx-state-tree'; 23import { applySnapshot, getSnapshot, onSnapshot } from 'mobx-state-tree';
24 24
diff --git a/packages/main/src/devTools.ts b/packages/main/src/devTools.ts
index b98974a..6c25b3e 100644
--- a/packages/main/src/devTools.ts
+++ b/packages/main/src/devTools.ts
@@ -18,38 +18,35 @@
18 * SPDX-License-Identifier: AGPL-3.0-only 18 * SPDX-License-Identifier: AGPL-3.0-only
19 */ 19 */
20 20
21import type { App, BrowserWindow } from 'electron'; 21import type { BrowserWindow } from 'electron';
22 22
23/** 23/**
24 * Installs the react and redux developer tools extensions. 24 * Installs the react and redux developer tools extensions.
25 * 25 *
26 * We use the redux devtools and connect the mobx store to it with `mst-middlewares`, 26 * We use the redux devtools and connect the mobx store to it with `mst-middlewares`,
27 * because the mobx-state-tree devtools are currently unmaintained. 27 * because the mobx-state-tree devtools are currently unmaintained.
28 *
29 * @param app The electron application instance.
30 */ 28 */
31export function installDevToolsExtensions(app: App): void { 29export async function installDevToolsExtensions(): Promise<void> {
32 app.whenReady().then(async () => { 30 const installerPackage = await import('electron-devtools-installer');
33 const { 31 const {
34 default: installExtension, 32 default: installExtension,
33 REACT_DEVELOPER_TOOLS,
34 REDUX_DEVTOOLS,
35 } = installerPackage.default instanceof Function
36 ? installerPackage
37 : installerPackage.default as unknown as typeof import('electron-devtools-installer');
38 await installExtension(
39 [
35 REACT_DEVELOPER_TOOLS, 40 REACT_DEVELOPER_TOOLS,
36 REDUX_DEVTOOLS, 41 REDUX_DEVTOOLS,
37 } = await import('electron-devtools-installer'); 42 ],
38 installExtension( 43 {
39 [ 44 forceDownload: false,
40 REACT_DEVELOPER_TOOLS, 45 loadExtensionOptions: {
41 REDUX_DEVTOOLS, 46 allowFileAccess: true,
42 ],
43 {
44 forceDownload: false,
45 loadExtensionOptions: {
46 allowFileAccess: true,
47 },
48 }, 47 },
49 ); 48 },
50 }).catch((err) => { 49 );
51 console.error('Failed to install devtools extension', err);
52 });
53} 50}
54 51
55/** 52/**
diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts
index 7c7be35..f8b6787 100644
--- a/packages/main/src/index.ts
+++ b/packages/main/src/index.ts
@@ -50,6 +50,9 @@ import { createMainStore } from './stores/MainStore';
50 50
51const isDevelopment = import.meta.env.MODE === 'development'; 51const isDevelopment = import.meta.env.MODE === 'development';
52 52
53// Alwayse enable sandboxing.
54app.enableSandbox();
55
53// Use alternative directory when debugging to avoid clobbering the main installation. 56// Use alternative directory when debugging to avoid clobbering the main installation.
54if (isDevelopment) { 57if (isDevelopment) {
55 app.setPath('userData', `${app.getPath('userData')}-dev`); 58 app.setPath('userData', `${app.getPath('userData')}-dev`);
@@ -62,9 +65,6 @@ if (!isSingleInstance) {
62 process.exit(0); 65 process.exit(0);
63} 66}
64 67
65// Alwayse enable sandboxing.
66app.enableSandbox();
67
68// Disable chromium's MPRIS integration, which is usually more annoying 68// Disable chromium's MPRIS integration, which is usually more annoying
69// (triggered by random sounds played by websites) than useful. 69// (triggered by random sounds played by websites) than useful.
70app.commandLine.appendSwitch( 70app.commandLine.appendSwitch(
@@ -90,17 +90,13 @@ function getResourceUrl(relativePath: string): string {
90 return new URL(relativePath, baseUrl).toString(); 90 return new URL(relativePath, baseUrl).toString();
91} 91}
92 92
93let serviceInjectRelativePath = '../../service-inject/dist/index.cjs'; 93let serviceInjectRelativePath = '../../service-inject/dist/index.js';
94let serviceInjectPath = getResourcePath(serviceInjectRelativePath); 94let serviceInjectPath = getResourcePath(serviceInjectRelativePath);
95let serviceInject: WebSource = { 95let serviceInject: WebSource = {
96 code: readFileSync(serviceInjectPath, 'utf8'), 96 code: readFileSync(serviceInjectPath, 'utf8'),
97 url: getResourceUrl(serviceInjectRelativePath), 97 url: getResourceUrl(serviceInjectRelativePath),
98}; 98};
99 99
100if (isDevelopment) {
101 installDevToolsExtensions(app);
102}
103
104let mainWindow: BrowserWindow | null = null; 100let mainWindow: BrowserWindow | null = null;
105 101
106const store = createMainStore(); 102const store = createMainStore();
@@ -134,13 +130,13 @@ function shouldCancelMainWindowRequest(url: string, method: string): boolean {
134 return !normalizedUrl.startsWith(getResourceUrl(rendererBaseUrl)); 130 return !normalizedUrl.startsWith(getResourceUrl(rendererBaseUrl));
135} 131}
136 132
137function createWindow(): Promise<unknown> { 133async function createWindow(): Promise<unknown> {
138 mainWindow = new BrowserWindow({ 134 mainWindow = new BrowserWindow({
139 show: false, 135 show: false,
140 autoHideMenuBar: true, 136 autoHideMenuBar: true,
141 webPreferences: { 137 webPreferences: {
142 devTools: isDevelopment,
143 sandbox: true, 138 sandbox: true,
139 devTools: isDevelopment,
144 preload: getResourcePath('../../preload/dist/index.cjs'), 140 preload: getResourcePath('../../preload/dist/index.cjs'),
145 }, 141 },
146 }); 142 });
@@ -159,8 +155,14 @@ function createWindow(): Promise<unknown> {
159 }) 155 })
160 }); 156 });
161 157
162 webContents.on('will-navigate', (event) => { 158 const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined)
163 event.preventDefault(); 159 ? import.meta.env.VITE_DEV_SERVER_URL
160 : getResourceUrl('../renderer/dist/index.html');
161
162 webContents.on('will-navigate', (event, url) => {
163 if (url !== pageUrl) {
164 event.preventDefault();
165 }
164 }); 166 });
165 167
166 webContents.setWindowOpenHandler(() => ({ action: 'deny' })); 168 webContents.setWindowOpenHandler(() => ({ action: 'deny' }));
@@ -279,10 +281,6 @@ function createWindow(): Promise<unknown> {
279 callback({ requestHeaders }); 281 callback({ requestHeaders });
280 }); 282 });
281 283
282 const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined)
283 ? import.meta.env.VITE_DEV_SERVER_URL
284 : getResourceUrl('../renderer/dist/index.html');
285
286 return Promise.all([ 284 return Promise.all([
287 mainWindow.loadURL(pageUrl), 285 mainWindow.loadURL(pageUrl),
288 browserView.webContents.loadURL('https://git.marussy.com/sophie/about'), 286 browserView.webContents.loadURL('https://git.marussy.com/sophie/about'),
@@ -307,7 +305,13 @@ app.on('window-all-closed', () => {
307 } 305 }
308}); 306});
309 307
310app.whenReady().then(createWindow).catch((err) => { 308app.whenReady().then(async () => {
309 if (isDevelopment) {
310 await installDevToolsExtensions();
311 }
312
313 return createWindow();
314}).catch((err) => {
311 console.error('Failed to create window', err); 315 console.error('Failed to create window', err);
312 process.exit(1); 316 process.exit(1);
313}); 317});
diff --git a/packages/main/src/services/ConfigPersistenceService.ts b/packages/main/src/services/ConfigPersistenceService.ts
index 1c0315f..ee5eb9f 100644
--- a/packages/main/src/services/ConfigPersistenceService.ts
+++ b/packages/main/src/services/ConfigPersistenceService.ts
@@ -20,7 +20,7 @@
20import { watch } from 'fs'; 20import { watch } from 'fs';
21import { readFile, stat, writeFile } from 'fs/promises'; 21import { readFile, stat, writeFile } from 'fs/promises';
22import JSON5 from 'json5'; 22import JSON5 from 'json5';
23import { throttle } from 'lodash'; 23import throttle from 'lodash-es/throttle';
24import { join } from 'path'; 24import { join } from 'path';
25 25
26import type { ConfigSnapshotOut } from '../stores/Config'; 26import type { ConfigSnapshotOut } from '../stores/Config';
diff --git a/packages/main/src/utils/logging.ts b/packages/main/src/utils/logging.ts
index 9f1133f..5cb5d21 100644
--- a/packages/main/src/utils/logging.ts
+++ b/packages/main/src/utils/logging.ts
@@ -36,10 +36,6 @@ prefix.apply(loglevel, {
36 const lastSegment = nameSegments.pop(); 36 const lastSegment = nameSegments.pop();
37 shortName = [...nameSegments.map((segment) => segment[0]), lastSegment].join(':'); 37 shortName = [...nameSegments.map((segment) => segment[0]), lastSegment].join(':');
38 } 38 }
39 if (isDevelopment) {
40 // `watch.js` already appends timestamps.
41 return `${level} (${shortName})`;
42 }
43 return `[${timestamp}] ${level} (${shortName})`; 39 return `[${timestamp}] ${level} (${shortName})`;
44 }, 40 },
45}); 41});
diff --git a/packages/main/vite.config.js b/packages/main/vite.config.js
deleted file mode 100644
index bdb0ca1..0000000
--- a/packages/main/vite.config.js
+++ /dev/null
@@ -1,39 +0,0 @@
1// @ts-check
2
3import { builtinModules } from 'module';
4
5import { makeConfig, node } from '../../config/vite-common';
6
7/** @type {string} */
8const PACKAGE_ROOT = __dirname;
9
10/**
11 * @type {import('vite').UserConfig}
12 * @see https://vitejs.dev/config/
13 */
14const config = makeConfig({
15 root: PACKAGE_ROOT,
16 define: {
17 // Allow access to process.env in imported packages.
18 // https://github.com/vitejs/vite/issues/3176#issuecomment-876610206
19 'process.env': 'process["env"]',
20 'global.process.env': 'global.process["env"]',
21 'globalThis.process.env': 'globalThis.process["env"]',
22 },
23 build: {
24 target: node,
25 lib: {
26 entry: 'src/index.ts',
27 formats: ['cjs'],
28 },
29 rollupOptions: {
30 external: [
31 'electron',
32 'electron-devtools-installer',
33 ...builtinModules,
34 ],
35 },
36 },
37});
38
39export default config;
diff --git a/packages/preload/esbuild.config.js b/packages/preload/esbuild.config.js
new file mode 100644
index 0000000..76ac33f
--- /dev/null
+++ b/packages/preload/esbuild.config.js
@@ -0,0 +1,19 @@
1// @ts-check
2
3const { chrome } = require('../../config/build-common');
4const { getConfig } = require('../../config/esbuild-config');
5
6module.exports = getConfig({
7 absWorkingDir: __dirname,
8 entryPoints: [
9 'src/index.ts',
10 ],
11 outfile: 'dist/index.cjs',
12 format: 'cjs',
13 platform: 'node',
14 target: chrome,
15 sourcemap: 'inline',
16 external: [
17 'electron',
18 ],
19});
diff --git a/packages/preload/package.json b/packages/preload/package.json
index caa23b6..5eb6055 100644
--- a/packages/preload/package.json
+++ b/packages/preload/package.json
@@ -8,7 +8,6 @@
8 "scripts": { 8 "scripts": {
9 "clean": "rimraf dist", 9 "clean": "rimraf dist",
10 "test": "jest", 10 "test": "jest",
11 "build": "vite build",
12 "typecheck": "tsc" 11 "typecheck": "tsc"
13 }, 12 },
14 "dependencies": { 13 "dependencies": {
@@ -24,7 +23,6 @@
24 "jsdom": "^19.0.0", 23 "jsdom": "^19.0.0",
25 "rimraf": "^3.0.2", 24 "rimraf": "^3.0.2",
26 "ts-jest": "^27.1.2", 25 "ts-jest": "^27.1.2",
27 "typescript": "^4.5.4", 26 "typescript": "^4.5.4"
28 "vite": "^2.7.7"
29 } 27 }
30} 28}
diff --git a/packages/preload/vite.config.js b/packages/preload/vite.config.js
deleted file mode 100644
index 409d912..0000000
--- a/packages/preload/vite.config.js
+++ /dev/null
@@ -1,31 +0,0 @@
1// @ts-check
2
3import { builtinModules } from 'module';
4
5import { chrome, makeConfig } from '../../config/vite-common';
6
7/** @type {string} */
8const PACKAGE_ROOT = __dirname;
9
10/**
11 * @type {import('vite').UserConfig}
12 * @see https://vitejs.dev/config/
13 */
14const config = makeConfig({
15 root: PACKAGE_ROOT,
16 build: {
17 target: chrome,
18 lib: {
19 entry: 'src/index.ts',
20 formats: ['cjs'],
21 },
22 rollupOptions: {
23 external: [
24 'electron',
25 ...builtinModules,
26 ],
27 },
28 },
29});
30
31export default config;
diff --git a/packages/renderer/package.json b/packages/renderer/package.json
index ff8955a..1d34cdb 100644
--- a/packages/renderer/package.json
+++ b/packages/renderer/package.json
@@ -5,8 +5,7 @@
5 "main": "dist/index.html", 5 "main": "dist/index.html",
6 "types": "dist-types/index.d.ts", 6 "types": "dist-types/index.d.ts",
7 "scripts": { 7 "scripts": {
8 "clean": "rimraf dist node_modules", 8 "clean": "rimraf dist",
9 "build": "vite build",
10 "typecheck": "tsc" 9 "typecheck": "tsc"
11 }, 10 },
12 "dependencies": { 11 "dependencies": {
@@ -18,7 +17,7 @@
18 "@sophie/shared": "workspace:*", 17 "@sophie/shared": "workspace:*",
19 "lodash": "^4.17.21", 18 "lodash": "^4.17.21",
20 "mobx": "^6.3.10", 19 "mobx": "^6.3.10",
21 "mobx-react-lite": "^3.2.2", 20 "mobx-react-lite": "^3.2.3",
22 "mobx-state-tree": "^5.1.0", 21 "mobx-state-tree": "^5.1.0",
23 "react": "^17.0.2", 22 "react": "^17.0.2",
24 "react-dom": "^17.0.2" 23 "react-dom": "^17.0.2"
@@ -32,6 +31,6 @@
32 "remotedev": "^0.2.9", 31 "remotedev": "^0.2.9",
33 "rimraf": "^3.0.2", 32 "rimraf": "^3.0.2",
34 "typescript": "^4.5.4", 33 "typescript": "^4.5.4",
35 "vite": "^2.7.7" 34 "vite": "^2.7.9"
36 } 35 }
37} 36}
diff --git a/packages/renderer/src/devTools.ts b/packages/renderer/src/devTools.ts
index 7c44559..3ec66aa 100644
--- a/packages/renderer/src/devTools.ts
+++ b/packages/renderer/src/devTools.ts
@@ -61,12 +61,9 @@ export function exposeToReduxDevtools(model: IAnyStateTreeNode): void {
61 * `build/watch.js` sends a reload event on bundle write. 61 * `build/watch.js` sends a reload event on bundle write.
62 */ 62 */
63export function hotReloadServices(): void { 63export function hotReloadServices(): void {
64 import.meta.hot?.on( 64 import.meta.hot?.on('sophie:reload-services', () => {
65 'sophie:reload-services', 65 window.sophieRenderer.dispatchAction({
66 () => { 66 action: 'reload-all-services',
67 window.sophieRenderer.dispatchAction({ 67 });
68 action: 'reload-all-services', 68 });
69 });
70 },
71 );
72} 69}
diff --git a/packages/renderer/vite.config.js b/packages/renderer/vite.config.js
index 94f0b76..30729c0 100644
--- a/packages/renderer/vite.config.js
+++ b/packages/renderer/vite.config.js
@@ -3,21 +3,35 @@
3/* eslint-env node */ 3/* eslint-env node */
4 4
5import { builtinModules } from 'module'; 5import { builtinModules } from 'module';
6import { join } from 'path';
6import react from '@vitejs/plugin-react'; 7import react from '@vitejs/plugin-react';
7 8
8import { chrome, makeConfig } from '../../config/vite-common'; 9import { banner, chrome } from '../../config/build-common';
9 10
10/** @type {string} */ 11const mode = process.env.MODE || 'development';
11const PACKAGE_ROOT = __dirname; 12
13const isDevelopment = mode === 'development';
12 14
13/** 15/**
14 * @type {import('vite').UserConfig} 16 * @type {import('vite').UserConfig}
15 * @see https://vitejs.dev/config/ 17 * @see https://vitejs.dev/config/
16 */ 18 */
17const config = makeConfig({ 19export default {
18 root: PACKAGE_ROOT, 20 /** @type {import('vite').LogLevel} */
21 logLevel: 'info',
22 mode,
23 root: __dirname,
24 cacheDir: join(__dirname, '../../.vite'),
19 plugins: [ 25 plugins: [
20 react(), 26 react({
27 babel: {
28 // Gets rid of deoptimization warnings for large chunks.
29 // We don't need to minify here, because the output of babel
30 // will get passed to esbuild anyways.
31 compact: false,
32 minified: false,
33 },
34 }),
21 ], 35 ],
22 base: '', 36 base: '',
23 server: { 37 server: {
@@ -25,16 +39,32 @@ const config = makeConfig({
25 strict: true, 39 strict: true,
26 }, 40 },
27 }, 41 },
42 resolve: {
43 preserveSymlinks: true,
44 },
45 optimizeDeps: {
46 exclude: [
47 // Already bundled by esbuild.
48 '@sophie/shared',
49 ],
50 },
28 build: { 51 build: {
29 target: chrome, 52 target: chrome,
53 assetsDir: '.',
54 outDir: 'dist',
55 emptyOutDir: true,
56 sourcemap: isDevelopment,
57 minify: !isDevelopment,
58 brotliSize: false,
30 rollupOptions: { 59 rollupOptions: {
31 external: [ 60 external: [
32 'mst-middlewares', 61 'mst-middlewares',
33 'remotedev', 62 'remotedev',
34 ...builtinModules, 63 ...builtinModules,
35 ], 64 ],
65 output: {
66 banner,
67 }
36 }, 68 },
37 }, 69 },
38}); 70};
39
40export default config;
diff --git a/packages/service-inject/esbuild.config.js b/packages/service-inject/esbuild.config.js
new file mode 100644
index 0000000..38e5b7d
--- /dev/null
+++ b/packages/service-inject/esbuild.config.js
@@ -0,0 +1,16 @@
1// @ts-check
2
3const { chrome } = require('../../config/build-common');
4const { getConfig } = require('../../config/esbuild-config');
5
6module.exports = getConfig({
7 absWorkingDir: __dirname,
8 entryPoints: [
9 'src/index.ts',
10 ],
11 outfile: 'dist/index.js',
12 format: 'iife',
13 platform: 'browser',
14 target: chrome,
15 sourcemap: 'inline',
16});
diff --git a/packages/service-inject/package.json b/packages/service-inject/package.json
index 573fc82..94cd825 100644
--- a/packages/service-inject/package.json
+++ b/packages/service-inject/package.json
@@ -7,7 +7,6 @@
7 "types": "dist-types/index.d.ts", 7 "types": "dist-types/index.d.ts",
8 "scripts": { 8 "scripts": {
9 "clean": "rimraf dist", 9 "clean": "rimraf dist",
10 "build": "vite build",
11 "typecheck": "tsc" 10 "typecheck": "tsc"
12 }, 11 },
13 "dependencies": { 12 "dependencies": {
@@ -15,7 +14,6 @@
15 }, 14 },
16 "devDependencies": { 15 "devDependencies": {
17 "rimraf": "^3.0.2", 16 "rimraf": "^3.0.2",
18 "typescript": "^4.5.4", 17 "typescript": "^4.5.4"
19 "vite": "^2.7.7"
20 } 18 }
21} 19}
diff --git a/packages/service-inject/vite.config.js b/packages/service-inject/vite.config.js
deleted file mode 100644
index 9c65c15..0000000
--- a/packages/service-inject/vite.config.js
+++ /dev/null
@@ -1,28 +0,0 @@
1// @ts-check
2
3import { builtinModules } from 'module';
4
5import { chrome, makeConfig } from '../../config/vite-common';
6
7/** @type {string} */
8const PACKAGE_ROOT = __dirname;
9
10/**
11 * @type {import('vite').UserConfig}
12 * @see https://vitejs.dev/config/
13 */
14const config = makeConfig({
15 root: PACKAGE_ROOT,
16 build: {
17 target: chrome,
18 lib: {
19 entry: 'src/index.ts',
20 formats: ['cjs'],
21 },
22 rollupOptions: {
23 external: builtinModules,
24 },
25 },
26});
27
28export default config;
diff --git a/packages/service-preload/esbuild.config.js b/packages/service-preload/esbuild.config.js
new file mode 100644
index 0000000..76ac33f
--- /dev/null
+++ b/packages/service-preload/esbuild.config.js
@@ -0,0 +1,19 @@
1// @ts-check
2
3const { chrome } = require('../../config/build-common');
4const { getConfig } = require('../../config/esbuild-config');
5
6module.exports = getConfig({
7 absWorkingDir: __dirname,
8 entryPoints: [
9 'src/index.ts',
10 ],
11 outfile: 'dist/index.cjs',
12 format: 'cjs',
13 platform: 'node',
14 target: chrome,
15 sourcemap: 'inline',
16 external: [
17 'electron',
18 ],
19});
diff --git a/packages/service-preload/package.json b/packages/service-preload/package.json
index 6f3faf9..fb67a8e 100644
--- a/packages/service-preload/package.json
+++ b/packages/service-preload/package.json
@@ -2,11 +2,10 @@
2 "name": "@sophie/service-preload", 2 "name": "@sophie/service-preload",
3 "version": "0.1.0", 3 "version": "0.1.0",
4 "private": true, 4 "private": true,
5 "main": "dist/index.cjs", 5 "main": "dist/index.js",
6 "types": "dist-types/index.d.ts", 6 "types": "dist-types/index.d.ts",
7 "scripts": { 7 "scripts": {
8 "clean": "rimraf dist", 8 "clean": "rimraf dist",
9 "build": "vite build",
10 "typecheck": "tsc" 9 "typecheck": "tsc"
11 }, 10 },
12 "dependencies": { 11 "dependencies": {
@@ -15,7 +14,6 @@
15 }, 14 },
16 "devDependencies": { 15 "devDependencies": {
17 "rimraf": "^3.0.2", 16 "rimraf": "^3.0.2",
18 "typescript": "^4.5.4", 17 "typescript": "^4.5.4"
19 "vite": "^2.7.7"
20 } 18 }
21} 19}
diff --git a/packages/service-preload/vite.config.js b/packages/service-preload/vite.config.js
deleted file mode 100644
index 409d912..0000000
--- a/packages/service-preload/vite.config.js
+++ /dev/null
@@ -1,31 +0,0 @@
1// @ts-check
2
3import { builtinModules } from 'module';
4
5import { chrome, makeConfig } from '../../config/vite-common';
6
7/** @type {string} */
8const PACKAGE_ROOT = __dirname;
9
10/**
11 * @type {import('vite').UserConfig}
12 * @see https://vitejs.dev/config/
13 */
14const config = makeConfig({
15 root: PACKAGE_ROOT,
16 build: {
17 target: chrome,
18 lib: {
19 entry: 'src/index.ts',
20 formats: ['cjs'],
21 },
22 rollupOptions: {
23 external: [
24 'electron',
25 ...builtinModules,
26 ],
27 },
28 },
29});
30
31export default config;
diff --git a/packages/service-shared/package.json b/packages/service-shared/package.json
index 980d0c0..b9128c6 100644
--- a/packages/service-shared/package.json
+++ b/packages/service-shared/package.json
@@ -3,11 +3,10 @@
3 "version": "0.1.0", 3 "version": "0.1.0",
4 "private": true, 4 "private": true,
5 "sideEffects": false, 5 "sideEffects": false,
6 "main": "dist/index.cjs", 6 "main": "src/index.ts",
7 "types": "dist/index.d.ts", 7 "types": "dist/index.d.ts",
8 "scripts": { 8 "scripts": {
9 "clean": "rimraf dist tsconfig.tsbuildinfo", 9 "clean": "rimraf dist tsconfig.tsbuildinfo",
10 "build": "vite build",
11 "typecheck": "tsc" 10 "typecheck": "tsc"
12 }, 11 },
13 "dependencies": { 12 "dependencies": {
@@ -15,7 +14,6 @@
15 }, 14 },
16 "devDependencies": { 15 "devDependencies": {
17 "rimraf": "^3.0.2", 16 "rimraf": "^3.0.2",
18 "typescript": "^4.5.4", 17 "typescript": "^4.5.4"
19 "vite": "^2.7.7"
20 } 18 }
21} 19}
diff --git a/packages/service-shared/vite.config.js b/packages/service-shared/vite.config.js
deleted file mode 100644
index 2391810..0000000
--- a/packages/service-shared/vite.config.js
+++ /dev/null
@@ -1,35 +0,0 @@
1// @ts-check
2
3import { builtinModules } from 'module';
4
5import { chrome, makeConfig, node } from '../../config/vite-common';
6
7/** @type string */
8const PACKAGE_ROOT = __dirname;
9
10/**
11 * @type {import('vite').UserConfig}
12 * @see https://vitejs.dev/config/
13 */
14const config = makeConfig({
15 root: PACKAGE_ROOT,
16 build: {
17 target: [
18 chrome,
19 node,
20 ],
21 lib: {
22 entry: 'src/index.ts',
23 formats: ['cjs'],
24 },
25 rollupOptions: {
26 external: [
27 'zod',
28 ...builtinModules,
29 ],
30 },
31 emptyOutDir: false, // Do not remove .d.ts files.
32 },
33});
34
35export default config;
diff --git a/packages/shared/esbuild.config.js b/packages/shared/esbuild.config.js
new file mode 100644
index 0000000..f58d776
--- /dev/null
+++ b/packages/shared/esbuild.config.js
@@ -0,0 +1,23 @@
1// @ts-check
2
3const { chrome } = require('../../config/build-common');
4const { getConfig } = require('../../config/esbuild-config');
5
6module.exports = getConfig({
7 absWorkingDir: __dirname,
8 entryPoints: [
9 'src/index.ts',
10 ],
11 outfile: 'dist/index.mjs',
12 format: 'esm',
13 // The package that includes this one will have a header comment,
14 // no need to have an additional one here.
15 banner: {},
16 platform: 'node',
17 target: chrome,
18 external: [
19 'mobx',
20 'mobx-state-tree',
21 'zod',
22 ],
23});
diff --git a/packages/shared/package.json b/packages/shared/package.json
index a2e4232..3db4cb1 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -3,12 +3,11 @@
3 "version": "0.1.0", 3 "version": "0.1.0",
4 "private": true, 4 "private": true,
5 "sideEffects": false, 5 "sideEffects": false,
6 "main": "dist/index.cjs", 6 "main": "src/index.ts",
7 "module": "dist/index.es.js", 7 "module": "dist/index.mjs",
8 "types": "dist/index.d.ts", 8 "types": "dist/index.d.ts",
9 "scripts": { 9 "scripts": {
10 "clean": "rimraf dist tsconfig.tsbuildinfo", 10 "clean": "rimraf dist tsconfig.tsbuildinfo",
11 "build": "vite build",
12 "typecheck": "tsc" 11 "typecheck": "tsc"
13 }, 12 },
14 "dependencies": { 13 "dependencies": {
@@ -18,7 +17,6 @@
18 }, 17 },
19 "devDependencies": { 18 "devDependencies": {
20 "rimraf": "^3.0.2", 19 "rimraf": "^3.0.2",
21 "typescript": "^4.5.4", 20 "typescript": "^4.5.4"
22 "vite": "^2.7.7"
23 } 21 }
24} 22}
diff --git a/packages/shared/vite.config.js b/packages/shared/vite.config.js
deleted file mode 100644
index 5fb1ceb..0000000
--- a/packages/shared/vite.config.js
+++ /dev/null
@@ -1,40 +0,0 @@
1// @ts-check
2
3import { builtinModules } from 'module';
4
5import { chrome, makeConfig, node } from '../../config/vite-common';
6
7/** @type {string} */
8const PACKAGE_ROOT = __dirname;
9
10/**
11 * @type {import('vite').UserConfig}
12 * @see https://vitejs.dev/config/
13 */
14const config = makeConfig({
15 root: PACKAGE_ROOT,
16 build: {
17 target: [
18 chrome,
19 node,
20 ],
21 lib: {
22 entry: 'src/index.ts',
23 formats: [
24 'cjs',
25 'es',
26 ],
27 },
28 rollupOptions: {
29 external: [
30 'mobx',
31 'mobx-state-tree',
32 'zod',
33 ...builtinModules,
34 ],
35 },
36 emptyOutDir: false, // Do not remove .d.ts files.
37 },
38});
39
40export default config;
diff --git a/scripts/build.js b/scripts/build.js
new file mode 100644
index 0000000..416530d
--- /dev/null
+++ b/scripts/build.js
@@ -0,0 +1,37 @@
1const esbuild = require('esbuild');
2const { join } = require('path');
3const vite = require('vite');
4
5/**
6 * @param {string} packageName
7 * @returns {Promise<import('esbuild').BuildResult>}
8 */
9function buildPackageEsbuild(packageName) {
10 const config = require(`../packages/${packageName}/esbuild.config.js`);
11 return esbuild.build(config);
12}
13
14function buildPackageVite(packageName) {
15 return vite.build({
16 configFile: join(__dirname, `../packages/${packageName}/vite.config.js`),
17 });
18}
19
20function buildAll() {
21 // Esbuild can natively load a typescript main file,
22 // so we don't need to bundle `service-shared`.
23 // We onyl bundle `shared` for vite.
24 const buildShared = buildPackageEsbuild('shared');
25 return Promise.all([
26 buildShared.then(() => buildPackageEsbuild('main')),
27 buildPackageEsbuild('service-inject'),
28 buildPackageEsbuild('service-preload'),
29 buildPackageEsbuild('preload'),
30 buildPackageVite('renderer'),
31 ]);
32}
33
34buildAll().catch((err) => {
35 console.error(err);
36 process.exit(1);
37});
diff --git a/scripts/watch.js b/scripts/watch.js
index 82dc01e..367ab88 100644
--- a/scripts/watch.js
+++ b/scripts/watch.js
@@ -1,32 +1,23 @@
1#!/usr/bin/env node
2
3// @ts-check 1// @ts-check
4 2
3const esbuild = require('esbuild');
5const { spawn } = require('child_process'); 4const { spawn } = require('child_process');
5const chokidar = require('chokidar');
6const electronPath = require('electron'); 6const electronPath = require('electron');
7const { build, createLogger, createServer } = require('vite'); 7const { join } = require('path');
8const { createServer } = require('vite');
8 9
9/** @type {string} */ 10process.env.MODE = 'development';
10const mode = process.env.MODE = process.env.MODE || 'development'; 11process.env.NODE_ENV = 'development';
11 12
12/** @type {import('vite').LogLevel} */ 13/** @type {string} */
13const LOG_LEVEL = 'info'; 14const sharedPackageSource = packageSource('shared');
14 15
15/** @type {import('vite').InlineConfig} */ 16/** @type {string} */
16const sharedConfig = { 17const serviceSharedPackageSource = packageSource('service-shared');
17 mode,
18 build: {
19 watch: {},
20 },
21 logLevel: LOG_LEVEL,
22};
23 18
24/** 19/** @type {RegExp[]} */
25 * Messages on stderr that match any of the contained patterns will be stripped from output 20const stderrIgnorePatterns = [
26 *
27 * @type {RegExp[]}
28 */
29const stderrFilterPatterns = [
30 // warning about devtools extension 21 // warning about devtools extension
31 // https://github.com/cawa-93/vite-electron-builder/issues/492 22 // https://github.com/cawa-93/vite-electron-builder/issues/492
32 // https://github.com/MarshallOfSound/electron-devtools-installer/issues/143 23 // https://github.com/MarshallOfSound/electron-devtools-installer/issues/143
@@ -37,27 +28,102 @@ const stderrFilterPatterns = [
37]; 28];
38 29
39/** 30/**
40 * @param {{name: string; configFile: string; writeBundle?: import('rollup').OutputPlugin['writeBundle'] }} config 31 * @param {string} packageName
41 * @returns {Promise<unknown>} 32 * @returns {string}
33 */
34function packageSource(packageName) {
35 return join(__dirname, `../packages/${packageName}/src`);
36}
37
38/**
39 * @param {string} packageName
40 * @param {string[]} [extraPaths]
41 * @param {() => void} [callback]
42 * @return {Promise<void>}
43 */
44async function setupEsbuildWatcher(packageName, extraPaths, callback) {
45 const config = require(`../packages/${packageName}/esbuild.config.js`);
46 config.logLevel = 'info';
47 config.incremental = true;
48 const incrementalBuild = await esbuild.build(config);
49 const paths = [
50 packageSource(packageName),
51 ...(extraPaths || []),
52 ];
53 const watcher = chokidar.watch(paths, {
54 ignored: /(^|[\/\\])\.|__(tests|mocks)__|\.(spec|test)\.[jt]sx?$/,
55 ignoreInitial: true,
56 persistent: true,
57 });
58 if (callback) {
59 callback();
60 }
61 watcher.on('change', () => {
62 incrementalBuild.rebuild().then(() => {
63 console.log(`\u26a1 Reloading package ${packageName}`);
64 if (callback) {
65 callback();
66 }
67 }).catch((err) => {
68 const errCount = err.errors.length;
69 console.error(
70 '\ud83d\udd25',
71 errCount,
72 errCount > 1 ? 'errors' : 'error',
73 'while rebuilding package',
74 packageName
75 );
76 });
77 });
78}
79
80/**
81 * @param {string} packageName
82 * @return {Promise<import('vite').ViteDevServer>}
42 */ 83 */
43function getWatcher({ name, configFile, writeBundle }) { 84async function setupDevServer(packageName) {
44 return build({ 85 const viteDevServer = await createServer({
45 ...sharedConfig, 86 build: {
46 configFile, 87 watch: {
47 plugins: [ 88 skipWrite: true,
48 { 89 clearScreen: false,
49 name,
50 writeBundle,
51 }, 90 },
52 ], 91 },
92 configFile: join(__dirname, `../packages/${packageName}/vite.config.js`),
93 });
94 await viteDevServer.listen();
95 return viteDevServer;
96}
97
98/**
99 * @param {(event: import('vite').HMRPayload) => void} sendEvent
100 * @return {Promise<void>}
101 */
102function setupPreloadPackageWatcher(sendEvent) {
103 return setupEsbuildWatcher('preload', [sharedPackageSource], () => {
104 sendEvent({
105 type: 'full-reload',
106 });
107 });
108}
109
110/**
111 * @param {string} packageName
112 * @param {(event: import('vite').HMRPayload) => void} sendEvent
113 * @return {Promise<void>}
114 */
115function setupServicePackageWatcher(packageName, sendEvent) {
116 return setupEsbuildWatcher(packageName, [serviceSharedPackageSource], () => {
117 sendEvent({
118 type: 'custom',
119 event: 'sophie:reload-services',
120 });
53 }); 121 });
54} 122}
55 123
56/** 124/**
57 * Start or restart App when source files are changed.
58 *
59 * @param {import('vite').ViteDevServer} viteDevServer 125 * @param {import('vite').ViteDevServer} viteDevServer
60 * @returns {Promise<unknown>} 126 * @return {Promise<void>}
61 */ 127 */
62function setupMainPackageWatcher(viteDevServer) { 128function setupMainPackageWatcher(viteDevServer) {
63 // Write a value to an environment variable to pass it to the main process. 129 // Write a value to an environment variable to pass it to the main process.
@@ -67,122 +133,55 @@ function setupMainPackageWatcher(viteDevServer) {
67 const path = '/'; 133 const path = '/';
68 process.env.VITE_DEV_SERVER_URL = `${protocol}//${host}:${port}${path}`; 134 process.env.VITE_DEV_SERVER_URL = `${protocol}//${host}:${port}${path}`;
69 135
70 const logger = createLogger(
71 LOG_LEVEL,
72 {
73 prefix: '[main]',
74 },
75 );
76
77 /** @type {import('child_process').ChildProcessWithoutNullStreams | null} */ 136 /** @type {import('child_process').ChildProcessWithoutNullStreams | null} */
78 let spawnProcess = null; 137 let spawnProcess = null;
79 138
80 return getWatcher({ 139 return setupEsbuildWatcher(
81 name: 'reload-app-on-main-package-change', 140 'main',
82 configFile: 'packages/main/vite.config.js', 141 [
83 writeBundle() { 142 serviceSharedPackageSource,
143 sharedPackageSource
144 ],
145 () => {
84 if (spawnProcess !== null) { 146 if (spawnProcess !== null) {
85 spawnProcess.kill('SIGINT'); 147 spawnProcess.kill('SIGINT');
86 spawnProcess = null; 148 spawnProcess = null;
87 } 149 }
88 150
89 spawnProcess = spawn(String(electronPath), ['.']); 151 spawnProcess = spawn(String(electronPath), ['.'], {
90 152 stdio: ['inherit', 'inherit', 'pipe'],
91 spawnProcess.stdout.on('data', (data) => {
92 if (data.toString().trim() !== '') {
93 logger.warn(data.toString(), {timestamp: true})
94 }
95 }); 153 });
96 154
97 spawnProcess.stderr.on('data', (data) => { 155 spawnProcess.stderr.on('data', (data) => {
98 const trimmedData = data.toString().trim(); 156 const stderrString = data.toString('utf-8').trimRight();
99 if (trimmedData === '') { 157 if (!stderrIgnorePatterns.some((r) => r.test(stderrString))) {
100 return; 158 console.error(stderrString);
101 } 159 }
102 const mayIgnore = stderrFilterPatterns.some((r) => r.test(data));
103 if (mayIgnore) {
104 return;
105 }
106 logger.error(data, { timestamp: true });
107 });
108 },
109 });
110}
111
112/**
113 * Reload App when source files are changed.
114 *
115 * @param {import('vite').ViteDevServer} viteDevServer
116 * @returns {Promise<unknown>}
117 */
118function setupPreloadPackageWatcher(viteDevServer) {
119 return getWatcher({
120 name: 'reload-page-on-preload-package-change',
121 configFile: 'packages/preload/vite.config.js',
122 writeBundle() {
123 viteDevServer.ws.send({
124 type: 'full-reload',
125 });
126 },
127 });
128}
129
130/**
131 * Reload services when source files are changed.
132 *
133 * @param {import('vite').ViteDevServer} viteDevServer
134 * @param {string} packageName The name of the package to watch.
135 * @returns {Promise<unknown>}
136 */
137function setupServicePreloadPackageWatcher(viteDevServer, packageName) {
138 return getWatcher({
139 name: `reload-services-on-${packageName}-package-change`,
140 configFile: `packages/${packageName}/vite.config.js`,
141 writeBundle() {
142 console.log('wrote');
143 viteDevServer.ws.send({
144 type: 'custom',
145 event: 'sophie:reload-services',
146 }); 160 });
147 }, 161 },
148 }); 162 );
149}
150
151/**
152 * Rebuild package when source files are changed.
153 *
154 * @param {string} packageName The name of the package to watch.
155 * @returns {Promise<unknown>}
156 */
157function setupSharedPackageWatcher(packageName) {
158 return getWatcher({
159 name: `rebuild-package-on-${packageName}-package-change`,
160 configFile: `packages/${packageName}/vite.config.js`,
161 });
162} 163}
163 164
164/** 165/**
165 * @returns {Promise<unknown>} 166 * @returns {Promise<void>}
166 */ 167 */
167async function setupDevEnvironment() { 168async function setupDevEnvironment() {
168 const serviceSharedWatcher = setupSharedPackageWatcher('service-shared'); 169 /** @type {import('vite').ViteDevServer | null} */
169 170 let viteDevServer = null;
170 await setupSharedPackageWatcher('shared'); 171 /** @type {(event: import('vite').HMRPayload) => void} */
171 172 const sendEvent = (event) => {
172 const viteDevServer = await createServer({ 173 if (viteDevServer !== null) {
173 ...sharedConfig, 174 viteDevServer.ws.send(event);
174 configFile: 'packages/renderer/vite.config.js', 175 }
175 }); 176 };
176 await viteDevServer.listen();
177
178 await Promise.all([ 177 await Promise.all([
179 setupPreloadPackageWatcher(viteDevServer), 178 setupEsbuildWatcher('shared'),
180 serviceSharedWatcher.then(() => Promise.all([ 179 setupPreloadPackageWatcher(sendEvent),
181 setupServicePreloadPackageWatcher(viteDevServer, 'service-inject'), 180 setupServicePackageWatcher('service-inject', sendEvent),
182 setupServicePreloadPackageWatcher(viteDevServer, 'service-preload'), 181 setupServicePackageWatcher('service-preload', sendEvent),
183 ])),
184 ]); 182 ]);
185 183 viteDevServer = await setupDevServer('renderer');
184 console.log('\ud83c\udf80 Sophie is starting up')
186 return setupMainPackageWatcher(viteDevServer); 185 return setupMainPackageWatcher(viteDevServer);
187} 186}
188 187
diff --git a/yarn.lock b/yarn.lock
index d50d999..8d6a6dd 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1199,15 +1199,15 @@ __metadata:
1199 dependencies: 1199 dependencies:
1200 "@sophie/service-shared": "workspace:*" 1200 "@sophie/service-shared": "workspace:*"
1201 "@sophie/shared": "workspace:*" 1201 "@sophie/shared": "workspace:*"
1202 "@types/debug": ^4
1203 "@types/electron-devtools-installer": ^2.2.1 1202 "@types/electron-devtools-installer": ^2.2.1
1204 "@types/lodash": ^4.14.178 1203 "@types/lodash-es": ^4.17.5
1205 "@types/ms": ^0.7.31 1204 "@types/ms": ^0.7.31
1206 "@types/node": ^17.0.5 1205 "@types/node": ^17.0.5
1207 electron: 16.0.5 1206 electron: 16.0.5
1208 electron-devtools-installer: ^3.2.0 1207 electron-devtools-installer: ^3.2.0
1208 esbuild: ^0.14.9
1209 json5: ^2.2.0 1209 json5: ^2.2.0
1210 lodash: ^4.17.21 1210 lodash-es: ^4.17.21
1211 loglevel: ^1.8.0 1211 loglevel: ^1.8.0
1212 loglevel-plugin-prefix: ^0.8.4 1212 loglevel-plugin-prefix: ^0.8.4
1213 mobx: ^6.3.10 1213 mobx: ^6.3.10
@@ -1215,7 +1215,6 @@ __metadata:
1215 ms: ^2.1.3 1215 ms: ^2.1.3
1216 rimraf: ^3.0.2 1216 rimraf: ^3.0.2
1217 typescript: ^4.5.4 1217 typescript: ^4.5.4
1218 vite: ^2.7.7
1219 languageName: unknown 1218 languageName: unknown
1220 linkType: soft 1219 linkType: soft
1221 1220
@@ -1234,7 +1233,6 @@ __metadata:
1234 rimraf: ^3.0.2 1233 rimraf: ^3.0.2
1235 ts-jest: ^27.1.2 1234 ts-jest: ^27.1.2
1236 typescript: ^4.5.4 1235 typescript: ^4.5.4
1237 vite: ^2.7.7
1238 languageName: unknown 1236 languageName: unknown
1239 linkType: soft 1237 linkType: soft
1240 1238
@@ -1254,7 +1252,7 @@ __metadata:
1254 "@vitejs/plugin-react": ^1.1.3 1252 "@vitejs/plugin-react": ^1.1.3
1255 lodash: ^4.17.21 1253 lodash: ^4.17.21
1256 mobx: ^6.3.10 1254 mobx: ^6.3.10
1257 mobx-react-lite: ^3.2.2 1255 mobx-react-lite: ^3.2.3
1258 mobx-state-tree: ^5.1.0 1256 mobx-state-tree: ^5.1.0
1259 mst-middlewares: ^5.1.0 1257 mst-middlewares: ^5.1.0
1260 react: ^17.0.2 1258 react: ^17.0.2
@@ -1262,7 +1260,7 @@ __metadata:
1262 remotedev: ^0.2.9 1260 remotedev: ^0.2.9
1263 rimraf: ^3.0.2 1261 rimraf: ^3.0.2
1264 typescript: ^4.5.4 1262 typescript: ^4.5.4
1265 vite: ^2.7.7 1263 vite: ^2.7.9
1266 languageName: unknown 1264 languageName: unknown
1267 linkType: soft 1265 linkType: soft
1268 1266
@@ -1273,7 +1271,6 @@ __metadata:
1273 "@sophie/service-shared": "workspace:*" 1271 "@sophie/service-shared": "workspace:*"
1274 rimraf: ^3.0.2 1272 rimraf: ^3.0.2
1275 typescript: ^4.5.4 1273 typescript: ^4.5.4
1276 vite: ^2.7.7
1277 languageName: unknown 1274 languageName: unknown
1278 linkType: soft 1275 linkType: soft
1279 1276
@@ -1285,7 +1282,6 @@ __metadata:
1285 electron: 16.0.5 1282 electron: 16.0.5
1286 rimraf: ^3.0.2 1283 rimraf: ^3.0.2
1287 typescript: ^4.5.4 1284 typescript: ^4.5.4
1288 vite: ^2.7.7
1289 languageName: unknown 1285 languageName: unknown
1290 linkType: soft 1286 linkType: soft
1291 1287
@@ -1295,7 +1291,6 @@ __metadata:
1295 dependencies: 1291 dependencies:
1296 rimraf: ^3.0.2 1292 rimraf: ^3.0.2
1297 typescript: ^4.5.4 1293 typescript: ^4.5.4
1298 vite: ^2.7.7
1299 zod: ^3.11.6 1294 zod: ^3.11.6
1300 languageName: unknown 1295 languageName: unknown
1301 linkType: soft 1296 linkType: soft
@@ -1308,7 +1303,6 @@ __metadata:
1308 mobx-state-tree: ^5.1.0 1303 mobx-state-tree: ^5.1.0
1309 rimraf: ^3.0.2 1304 rimraf: ^3.0.2
1310 typescript: ^4.5.4 1305 typescript: ^4.5.4
1311 vite: ^2.7.7
1312 zod: ^3.11.6 1306 zod: ^3.11.6
1313 languageName: unknown 1307 languageName: unknown
1314 linkType: soft 1308 linkType: soft
@@ -1377,7 +1371,7 @@ __metadata:
1377 languageName: node 1371 languageName: node
1378 linkType: hard 1372 linkType: hard
1379 1373
1380"@types/debug@npm:^4, @types/debug@npm:^4.1.6": 1374"@types/debug@npm:^4.1.6":
1381 version: 4.1.7 1375 version: 4.1.7
1382 resolution: "@types/debug@npm:4.1.7" 1376 resolution: "@types/debug@npm:4.1.7"
1383 dependencies: 1377 dependencies:
@@ -1465,7 +1459,16 @@ __metadata:
1465 languageName: node 1459 languageName: node
1466 linkType: hard 1460 linkType: hard
1467 1461
1468"@types/lodash@npm:^4.14.178": 1462"@types/lodash-es@npm:^4.17.5":
1463 version: 4.17.5
1464 resolution: "@types/lodash-es@npm:4.17.5"
1465 dependencies:
1466 "@types/lodash": "*"
1467 checksum: 8910f646310aa008bb45071619fe85abf917bbc2c7cc0af883a971de261723247695a58dd966bfa9defd946cef79811d8b075eb6f0af12343080ab0ae6614e12
1468 languageName: node
1469 linkType: hard
1470
1471"@types/lodash@npm:*, @types/lodash@npm:^4.14.178":
1469 version: 4.14.178 1472 version: 4.14.178
1470 resolution: "@types/lodash@npm:4.14.178" 1473 resolution: "@types/lodash@npm:4.14.178"
1471 checksum: a69a04a60bfc5257c3130a554b4efa0c383f0141b7b3db8ab7cf07ad2a46ea085fce66d0242da41da7e5647b133d5dfb2c15add9cbed8d7fef955e4a1e5b3128 1474 checksum: a69a04a60bfc5257c3130a554b4efa0c383f0141b7b3db8ab7cf07ad2a46ea085fce66d0242da41da7e5647b133d5dfb2c15add9cbed8d7fef955e4a1e5b3128
@@ -1806,7 +1809,7 @@ __metadata:
1806 languageName: node 1809 languageName: node
1807 linkType: hard 1810 linkType: hard
1808 1811
1809"anymatch@npm:^3.0.3": 1812"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2":
1810 version: 3.1.2 1813 version: 3.1.2
1811 resolution: "anymatch@npm:3.1.2" 1814 resolution: "anymatch@npm:3.1.2"
1812 dependencies: 1815 dependencies:
@@ -2065,6 +2068,13 @@ __metadata:
2065 languageName: node 2068 languageName: node
2066 linkType: hard 2069 linkType: hard
2067 2070
2071"binary-extensions@npm:^2.0.0":
2072 version: 2.2.0
2073 resolution: "binary-extensions@npm:2.2.0"
2074 checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8
2075 languageName: node
2076 linkType: hard
2077
2068"bluebird-lst@npm:^1.0.9": 2078"bluebird-lst@npm:^1.0.9":
2069 version: 1.0.9 2079 version: 1.0.9
2070 resolution: "bluebird-lst@npm:1.0.9" 2080 resolution: "bluebird-lst@npm:1.0.9"
@@ -2114,7 +2124,7 @@ __metadata:
2114 languageName: node 2124 languageName: node
2115 linkType: hard 2125 linkType: hard
2116 2126
2117"braces@npm:^3.0.1": 2127"braces@npm:^3.0.1, braces@npm:~3.0.2":
2118 version: 3.0.2 2128 version: 3.0.2
2119 resolution: "braces@npm:3.0.2" 2129 resolution: "braces@npm:3.0.2"
2120 dependencies: 2130 dependencies:
@@ -2350,6 +2360,25 @@ __metadata:
2350 languageName: node 2360 languageName: node
2351 linkType: hard 2361 linkType: hard
2352 2362
2363"chokidar@npm:^3.5.2":
2364 version: 3.5.2
2365 resolution: "chokidar@npm:3.5.2"
2366 dependencies:
2367 anymatch: ~3.1.2
2368 braces: ~3.0.2
2369 fsevents: ~2.3.2
2370 glob-parent: ~5.1.2
2371 is-binary-path: ~2.1.0
2372 is-glob: ~4.0.1
2373 normalize-path: ~3.0.0
2374 readdirp: ~3.6.0
2375 dependenciesMeta:
2376 fsevents:
2377 optional: true
2378 checksum: d1fda32fcd67d9f6170a8468ad2630a3c6194949c9db3f6a91b16478c328b2800f433fb5d2592511b6cb145a47c013ea1cce60b432b1a001ae3ee978a8bffc2d
2379 languageName: node
2380 linkType: hard
2381
2353"chownr@npm:^2.0.0": 2382"chownr@npm:^2.0.0":
2354 version: 2.0.0 2383 version: 2.0.0
2355 resolution: "chownr@npm:2.0.0" 2384 resolution: "chownr@npm:2.0.0"
@@ -3151,6 +3180,13 @@ __metadata:
3151 languageName: node 3180 languageName: node
3152 linkType: hard 3181 linkType: hard
3153 3182
3183"esbuild-android-arm64@npm:0.14.9":
3184 version: 0.14.9
3185 resolution: "esbuild-android-arm64@npm:0.14.9"
3186 conditions: os=android & cpu=arm64
3187 languageName: node
3188 linkType: hard
3189
3154"esbuild-darwin-64@npm:0.13.15": 3190"esbuild-darwin-64@npm:0.13.15":
3155 version: 0.13.15 3191 version: 0.13.15
3156 resolution: "esbuild-darwin-64@npm:0.13.15" 3192 resolution: "esbuild-darwin-64@npm:0.13.15"
@@ -3158,6 +3194,13 @@ __metadata:
3158 languageName: node 3194 languageName: node
3159 linkType: hard 3195 linkType: hard
3160 3196
3197"esbuild-darwin-64@npm:0.14.9":
3198 version: 0.14.9
3199 resolution: "esbuild-darwin-64@npm:0.14.9"
3200 conditions: os=darwin & cpu=x64
3201 languageName: node
3202 linkType: hard
3203
3161"esbuild-darwin-arm64@npm:0.13.15": 3204"esbuild-darwin-arm64@npm:0.13.15":
3162 version: 0.13.15 3205 version: 0.13.15
3163 resolution: "esbuild-darwin-arm64@npm:0.13.15" 3206 resolution: "esbuild-darwin-arm64@npm:0.13.15"
@@ -3165,6 +3208,13 @@ __metadata:
3165 languageName: node 3208 languageName: node
3166 linkType: hard 3209 linkType: hard
3167 3210
3211"esbuild-darwin-arm64@npm:0.14.9":
3212 version: 0.14.9
3213 resolution: "esbuild-darwin-arm64@npm:0.14.9"
3214 conditions: os=darwin & cpu=arm64
3215 languageName: node
3216 linkType: hard
3217
3168"esbuild-freebsd-64@npm:0.13.15": 3218"esbuild-freebsd-64@npm:0.13.15":
3169 version: 0.13.15 3219 version: 0.13.15
3170 resolution: "esbuild-freebsd-64@npm:0.13.15" 3220 resolution: "esbuild-freebsd-64@npm:0.13.15"
@@ -3172,6 +3222,13 @@ __metadata:
3172 languageName: node 3222 languageName: node
3173 linkType: hard 3223 linkType: hard
3174 3224
3225"esbuild-freebsd-64@npm:0.14.9":
3226 version: 0.14.9
3227 resolution: "esbuild-freebsd-64@npm:0.14.9"
3228 conditions: os=freebsd & cpu=x64
3229 languageName: node
3230 linkType: hard
3231
3175"esbuild-freebsd-arm64@npm:0.13.15": 3232"esbuild-freebsd-arm64@npm:0.13.15":
3176 version: 0.13.15 3233 version: 0.13.15
3177 resolution: "esbuild-freebsd-arm64@npm:0.13.15" 3234 resolution: "esbuild-freebsd-arm64@npm:0.13.15"
@@ -3179,6 +3236,13 @@ __metadata:
3179 languageName: node 3236 languageName: node
3180 linkType: hard 3237 linkType: hard
3181 3238
3239"esbuild-freebsd-arm64@npm:0.14.9":
3240 version: 0.14.9
3241 resolution: "esbuild-freebsd-arm64@npm:0.14.9"
3242 conditions: os=freebsd & cpu=arm64
3243 languageName: node
3244 linkType: hard
3245
3182"esbuild-linux-32@npm:0.13.15": 3246"esbuild-linux-32@npm:0.13.15":
3183 version: 0.13.15 3247 version: 0.13.15
3184 resolution: "esbuild-linux-32@npm:0.13.15" 3248 resolution: "esbuild-linux-32@npm:0.13.15"
@@ -3186,6 +3250,13 @@ __metadata:
3186 languageName: node 3250 languageName: node
3187 linkType: hard 3251 linkType: hard
3188 3252
3253"esbuild-linux-32@npm:0.14.9":
3254 version: 0.14.9
3255 resolution: "esbuild-linux-32@npm:0.14.9"
3256 conditions: os=linux & cpu=ia32
3257 languageName: node
3258 linkType: hard
3259
3189"esbuild-linux-64@npm:0.13.15": 3260"esbuild-linux-64@npm:0.13.15":
3190 version: 0.13.15 3261 version: 0.13.15
3191 resolution: "esbuild-linux-64@npm:0.13.15" 3262 resolution: "esbuild-linux-64@npm:0.13.15"
@@ -3193,6 +3264,13 @@ __metadata:
3193 languageName: node 3264 languageName: node
3194 linkType: hard 3265 linkType: hard
3195 3266
3267"esbuild-linux-64@npm:0.14.9":
3268 version: 0.14.9
3269 resolution: "esbuild-linux-64@npm:0.14.9"
3270 conditions: os=linux & cpu=x64
3271 languageName: node
3272 linkType: hard
3273
3196"esbuild-linux-arm64@npm:0.13.15": 3274"esbuild-linux-arm64@npm:0.13.15":
3197 version: 0.13.15 3275 version: 0.13.15
3198 resolution: "esbuild-linux-arm64@npm:0.13.15" 3276 resolution: "esbuild-linux-arm64@npm:0.13.15"
@@ -3200,6 +3278,13 @@ __metadata:
3200 languageName: node 3278 languageName: node
3201 linkType: hard 3279 linkType: hard
3202 3280
3281"esbuild-linux-arm64@npm:0.14.9":
3282 version: 0.14.9
3283 resolution: "esbuild-linux-arm64@npm:0.14.9"
3284 conditions: os=linux & cpu=arm64
3285 languageName: node
3286 linkType: hard
3287
3203"esbuild-linux-arm@npm:0.13.15": 3288"esbuild-linux-arm@npm:0.13.15":
3204 version: 0.13.15 3289 version: 0.13.15
3205 resolution: "esbuild-linux-arm@npm:0.13.15" 3290 resolution: "esbuild-linux-arm@npm:0.13.15"
@@ -3207,6 +3292,13 @@ __metadata:
3207 languageName: node 3292 languageName: node
3208 linkType: hard 3293 linkType: hard
3209 3294
3295"esbuild-linux-arm@npm:0.14.9":
3296 version: 0.14.9
3297 resolution: "esbuild-linux-arm@npm:0.14.9"
3298 conditions: os=linux & cpu=arm
3299 languageName: node
3300 linkType: hard
3301
3210"esbuild-linux-mips64le@npm:0.13.15": 3302"esbuild-linux-mips64le@npm:0.13.15":
3211 version: 0.13.15 3303 version: 0.13.15
3212 resolution: "esbuild-linux-mips64le@npm:0.13.15" 3304 resolution: "esbuild-linux-mips64le@npm:0.13.15"
@@ -3214,6 +3306,13 @@ __metadata:
3214 languageName: node 3306 languageName: node
3215 linkType: hard 3307 linkType: hard
3216 3308
3309"esbuild-linux-mips64le@npm:0.14.9":
3310 version: 0.14.9
3311 resolution: "esbuild-linux-mips64le@npm:0.14.9"
3312 conditions: os=linux & cpu=mips64el
3313 languageName: node
3314 linkType: hard
3315
3217"esbuild-linux-ppc64le@npm:0.13.15": 3316"esbuild-linux-ppc64le@npm:0.13.15":
3218 version: 0.13.15 3317 version: 0.13.15
3219 resolution: "esbuild-linux-ppc64le@npm:0.13.15" 3318 resolution: "esbuild-linux-ppc64le@npm:0.13.15"
@@ -3221,6 +3320,20 @@ __metadata:
3221 languageName: node 3320 languageName: node
3222 linkType: hard 3321 linkType: hard
3223 3322
3323"esbuild-linux-ppc64le@npm:0.14.9":
3324 version: 0.14.9
3325 resolution: "esbuild-linux-ppc64le@npm:0.14.9"
3326 conditions: os=linux & cpu=ppc64
3327 languageName: node
3328 linkType: hard
3329
3330"esbuild-linux-s390x@npm:0.14.9":
3331 version: 0.14.9
3332 resolution: "esbuild-linux-s390x@npm:0.14.9"
3333 conditions: os=linux & cpu=s390x
3334 languageName: node
3335 linkType: hard
3336
3224"esbuild-netbsd-64@npm:0.13.15": 3337"esbuild-netbsd-64@npm:0.13.15":
3225 version: 0.13.15 3338 version: 0.13.15
3226 resolution: "esbuild-netbsd-64@npm:0.13.15" 3339 resolution: "esbuild-netbsd-64@npm:0.13.15"
@@ -3228,6 +3341,13 @@ __metadata:
3228 languageName: node 3341 languageName: node
3229 linkType: hard 3342 linkType: hard
3230 3343
3344"esbuild-netbsd-64@npm:0.14.9":
3345 version: 0.14.9
3346 resolution: "esbuild-netbsd-64@npm:0.14.9"
3347 conditions: os=netbsd & cpu=x64
3348 languageName: node
3349 linkType: hard
3350
3231"esbuild-openbsd-64@npm:0.13.15": 3351"esbuild-openbsd-64@npm:0.13.15":
3232 version: 0.13.15 3352 version: 0.13.15
3233 resolution: "esbuild-openbsd-64@npm:0.13.15" 3353 resolution: "esbuild-openbsd-64@npm:0.13.15"
@@ -3235,6 +3355,13 @@ __metadata:
3235 languageName: node 3355 languageName: node
3236 linkType: hard 3356 linkType: hard
3237 3357
3358"esbuild-openbsd-64@npm:0.14.9":
3359 version: 0.14.9
3360 resolution: "esbuild-openbsd-64@npm:0.14.9"
3361 conditions: os=openbsd & cpu=x64
3362 languageName: node
3363 linkType: hard
3364
3238"esbuild-sunos-64@npm:0.13.15": 3365"esbuild-sunos-64@npm:0.13.15":
3239 version: 0.13.15 3366 version: 0.13.15
3240 resolution: "esbuild-sunos-64@npm:0.13.15" 3367 resolution: "esbuild-sunos-64@npm:0.13.15"
@@ -3242,6 +3369,13 @@ __metadata:
3242 languageName: node 3369 languageName: node
3243 linkType: hard 3370 linkType: hard
3244 3371
3372"esbuild-sunos-64@npm:0.14.9":
3373 version: 0.14.9
3374 resolution: "esbuild-sunos-64@npm:0.14.9"
3375 conditions: os=sunos & cpu=x64
3376 languageName: node
3377 linkType: hard
3378
3245"esbuild-windows-32@npm:0.13.15": 3379"esbuild-windows-32@npm:0.13.15":
3246 version: 0.13.15 3380 version: 0.13.15
3247 resolution: "esbuild-windows-32@npm:0.13.15" 3381 resolution: "esbuild-windows-32@npm:0.13.15"
@@ -3249,6 +3383,13 @@ __metadata:
3249 languageName: node 3383 languageName: node
3250 linkType: hard 3384 linkType: hard
3251 3385
3386"esbuild-windows-32@npm:0.14.9":
3387 version: 0.14.9
3388 resolution: "esbuild-windows-32@npm:0.14.9"
3389 conditions: os=win32 & cpu=ia32
3390 languageName: node
3391 linkType: hard
3392
3252"esbuild-windows-64@npm:0.13.15": 3393"esbuild-windows-64@npm:0.13.15":
3253 version: 0.13.15 3394 version: 0.13.15
3254 resolution: "esbuild-windows-64@npm:0.13.15" 3395 resolution: "esbuild-windows-64@npm:0.13.15"
@@ -3256,6 +3397,13 @@ __metadata:
3256 languageName: node 3397 languageName: node
3257 linkType: hard 3398 linkType: hard
3258 3399
3400"esbuild-windows-64@npm:0.14.9":
3401 version: 0.14.9
3402 resolution: "esbuild-windows-64@npm:0.14.9"
3403 conditions: os=win32 & cpu=x64
3404 languageName: node
3405 linkType: hard
3406
3259"esbuild-windows-arm64@npm:0.13.15": 3407"esbuild-windows-arm64@npm:0.13.15":
3260 version: 0.13.15 3408 version: 0.13.15
3261 resolution: "esbuild-windows-arm64@npm:0.13.15" 3409 resolution: "esbuild-windows-arm64@npm:0.13.15"
@@ -3263,6 +3411,13 @@ __metadata:
3263 languageName: node 3411 languageName: node
3264 linkType: hard 3412 linkType: hard
3265 3413
3414"esbuild-windows-arm64@npm:0.14.9":
3415 version: 0.14.9
3416 resolution: "esbuild-windows-arm64@npm:0.14.9"
3417 conditions: os=win32 & cpu=arm64
3418 languageName: node
3419 linkType: hard
3420
3266"esbuild@npm:^0.13.12": 3421"esbuild@npm:^0.13.12":
3267 version: 0.13.15 3422 version: 0.13.15
3268 resolution: "esbuild@npm:0.13.15" 3423 resolution: "esbuild@npm:0.13.15"
@@ -3325,6 +3480,71 @@ __metadata:
3325 languageName: node 3480 languageName: node
3326 linkType: hard 3481 linkType: hard
3327 3482
3483"esbuild@npm:^0.14.9":
3484 version: 0.14.9
3485 resolution: "esbuild@npm:0.14.9"
3486 dependencies:
3487 esbuild-android-arm64: 0.14.9
3488 esbuild-darwin-64: 0.14.9
3489 esbuild-darwin-arm64: 0.14.9
3490 esbuild-freebsd-64: 0.14.9
3491 esbuild-freebsd-arm64: 0.14.9
3492 esbuild-linux-32: 0.14.9
3493 esbuild-linux-64: 0.14.9
3494 esbuild-linux-arm: 0.14.9
3495 esbuild-linux-arm64: 0.14.9
3496 esbuild-linux-mips64le: 0.14.9
3497 esbuild-linux-ppc64le: 0.14.9
3498 esbuild-linux-s390x: 0.14.9
3499 esbuild-netbsd-64: 0.14.9
3500 esbuild-openbsd-64: 0.14.9
3501 esbuild-sunos-64: 0.14.9
3502 esbuild-windows-32: 0.14.9
3503 esbuild-windows-64: 0.14.9
3504 esbuild-windows-arm64: 0.14.9
3505 dependenciesMeta:
3506 esbuild-android-arm64:
3507 optional: true
3508 esbuild-darwin-64:
3509 optional: true
3510 esbuild-darwin-arm64:
3511 optional: true
3512 esbuild-freebsd-64:
3513 optional: true
3514 esbuild-freebsd-arm64:
3515 optional: true
3516 esbuild-linux-32:
3517 optional: true
3518 esbuild-linux-64:
3519 optional: true
3520 esbuild-linux-arm:
3521 optional: true
3522 esbuild-linux-arm64:
3523 optional: true
3524 esbuild-linux-mips64le:
3525 optional: true
3526 esbuild-linux-ppc64le:
3527 optional: true
3528 esbuild-linux-s390x:
3529 optional: true
3530 esbuild-netbsd-64:
3531 optional: true
3532 esbuild-openbsd-64:
3533 optional: true
3534 esbuild-sunos-64:
3535 optional: true
3536 esbuild-windows-32:
3537 optional: true
3538 esbuild-windows-64:
3539 optional: true
3540 esbuild-windows-arm64:
3541 optional: true
3542 bin:
3543 esbuild: bin/esbuild
3544 checksum: 43664678c2ce281ad0ab4896bca65f461cd617d7b807b0c737540d3c46928c305f6c91c211e2866aac4aade48e61bd19875e3571c0d3e2cf49b2cdbf4c241d97
3545 languageName: node
3546 linkType: hard
3547
3328"escalade@npm:^3.1.1": 3548"escalade@npm:^3.1.1":
3329 version: 3.1.1 3549 version: 3.1.1
3330 resolution: "escalade@npm:3.1.1" 3550 resolution: "escalade@npm:3.1.1"
@@ -3858,6 +4078,15 @@ __metadata:
3858 languageName: node 4078 languageName: node
3859 linkType: hard 4079 linkType: hard
3860 4080
4081"glob-parent@npm:~5.1.2":
4082 version: 5.1.2
4083 resolution: "glob-parent@npm:5.1.2"
4084 dependencies:
4085 is-glob: ^4.0.1
4086 checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e
4087 languageName: node
4088 linkType: hard
4089
3861"glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": 4090"glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6":
3862 version: 7.2.0 4091 version: 7.2.0
3863 resolution: "glob@npm:7.2.0" 4092 resolution: "glob@npm:7.2.0"
@@ -4244,6 +4473,15 @@ __metadata:
4244 languageName: node 4473 languageName: node
4245 linkType: hard 4474 linkType: hard
4246 4475
4476"is-binary-path@npm:~2.1.0":
4477 version: 2.1.0
4478 resolution: "is-binary-path@npm:2.1.0"
4479 dependencies:
4480 binary-extensions: ^2.0.0
4481 checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c
4482 languageName: node
4483 linkType: hard
4484
4247"is-ci@npm:^2.0.0": 4485"is-ci@npm:^2.0.0":
4248 version: 2.0.0 4486 version: 2.0.0
4249 resolution: "is-ci@npm:2.0.0" 4487 resolution: "is-ci@npm:2.0.0"
@@ -4296,7 +4534,7 @@ __metadata:
4296 languageName: node 4534 languageName: node
4297 linkType: hard 4535 linkType: hard
4298 4536
4299"is-glob@npm:^4.0.0, is-glob@npm:^4.0.3": 4537"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1":
4300 version: 4.0.3 4538 version: 4.0.3
4301 resolution: "is-glob@npm:4.0.3" 4539 resolution: "is-glob@npm:4.0.3"
4302 dependencies: 4540 dependencies:
@@ -5281,6 +5519,13 @@ __metadata:
5281 languageName: node 5519 languageName: node
5282 linkType: hard 5520 linkType: hard
5283 5521
5522"lodash-es@npm:^4.17.21":
5523 version: 4.17.21
5524 resolution: "lodash-es@npm:4.17.21"
5525 checksum: 05cbffad6e2adbb331a4e16fbd826e7faee403a1a04873b82b42c0f22090f280839f85b95393f487c1303c8a3d2a010048bf06151a6cbe03eee4d388fb0a12d2
5526 languageName: node
5527 linkType: hard
5528
5284"lodash.memoize@npm:4.x": 5529"lodash.memoize@npm:4.x":
5285 version: 4.1.2 5530 version: 4.1.2
5286 resolution: "lodash.memoize@npm:4.1.2" 5531 resolution: "lodash.memoize@npm:4.1.2"
@@ -5570,9 +5815,9 @@ __metadata:
5570 languageName: node 5815 languageName: node
5571 linkType: hard 5816 linkType: hard
5572 5817
5573"mobx-react-lite@npm:^3.2.2": 5818"mobx-react-lite@npm:^3.2.3":
5574 version: 3.2.2 5819 version: 3.2.3
5575 resolution: "mobx-react-lite@npm:3.2.2" 5820 resolution: "mobx-react-lite@npm:3.2.3"
5576 peerDependencies: 5821 peerDependencies:
5577 mobx: ^6.1.0 5822 mobx: ^6.1.0
5578 react: ^16.8.0 || ^17 5823 react: ^16.8.0 || ^17
@@ -5581,7 +5826,7 @@ __metadata:
5581 optional: true 5826 optional: true
5582 react-native: 5827 react-native:
5583 optional: true 5828 optional: true
5584 checksum: f64957cb71e45f8bbce0429b90f15fef6e0ad06a38e1522cf887900a2869e157beb3438bf6c2621cfc6907ad891428726686d7b544988995745e9a9c8255ff95 5829 checksum: d645e3c76f29ab22e4125f372531e00a776bd3833d3aab5cab2631e0eb1a90aa6cd36aa78ef1a27b53489eac89335bbdbb3b2c4f0c15248e8d306cd15b555931
5585 languageName: node 5830 languageName: node
5586 linkType: hard 5831 linkType: hard
5587 5832
@@ -5708,7 +5953,7 @@ __metadata:
5708 languageName: node 5953 languageName: node
5709 linkType: hard 5954 linkType: hard
5710 5955
5711"normalize-path@npm:^3.0.0": 5956"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0":
5712 version: 3.0.0 5957 version: 3.0.0
5713 resolution: "normalize-path@npm:3.0.0" 5958 resolution: "normalize-path@npm:3.0.0"
5714 checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 5959 checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20
@@ -5957,7 +6202,7 @@ __metadata:
5957 languageName: node 6202 languageName: node
5958 linkType: hard 6203 linkType: hard
5959 6204
5960"picomatch@npm:^2.0.4, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3": 6205"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3":
5961 version: 2.3.0 6206 version: 2.3.0
5962 resolution: "picomatch@npm:2.3.0" 6207 resolution: "picomatch@npm:2.3.0"
5963 checksum: 16818720ea7c5872b6af110760dee856c8e4cd79aed1c7a006d076b1cc09eff3ae41ca5019966694c33fbd2e1cc6ea617ab10e4adac6df06556168f13be3fca2 6208 checksum: 16818720ea7c5872b6af110760dee856c8e4cd79aed1c7a006d076b1cc09eff3ae41ca5019966694c33fbd2e1cc6ea617ab10e4adac6df06556168f13be3fca2
@@ -6259,6 +6504,15 @@ __metadata:
6259 languageName: node 6504 languageName: node
6260 linkType: hard 6505 linkType: hard
6261 6506
6507"readdirp@npm:~3.6.0":
6508 version: 3.6.0
6509 resolution: "readdirp@npm:3.6.0"
6510 dependencies:
6511 picomatch: ^2.2.1
6512 checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320
6513 languageName: node
6514 linkType: hard
6515
6262"regenerator-runtime@npm:^0.13.4": 6516"regenerator-runtime@npm:^0.13.4":
6263 version: 0.13.9 6517 version: 0.13.9
6264 resolution: "regenerator-runtime@npm:0.13.9" 6518 resolution: "regenerator-runtime@npm:0.13.9"
@@ -6660,16 +6914,19 @@ __metadata:
6660 dependencies: 6914 dependencies:
6661 "@electron/fuses": ^1.5.0 6915 "@electron/fuses": ^1.5.0
6662 "@types/jest": ^27.0.3 6916 "@types/jest": ^27.0.3
6917 "@vitejs/plugin-react": ^1.1.3
6918 chokidar: ^3.5.2
6663 cross-env: ^7.0.3 6919 cross-env: ^7.0.3
6664 electron: 16.0.5 6920 electron: 16.0.5
6665 electron-builder: ^22.14.11 6921 electron-builder: ^22.14.11
6922 esbuild: ^0.14.9
6666 eslint: ^8.5.0 6923 eslint: ^8.5.0
6667 jest: ^27.4.5 6924 jest: ^27.4.5
6668 rimraf: ^3.0.2 6925 rimraf: ^3.0.2
6669 rollup: ^2.62.0 6926 rollup: ^2.62.0
6670 ts-jest: ^27.1.2 6927 ts-jest: ^27.1.2
6671 typescript: ^4.5.4 6928 typescript: ^4.5.4
6672 vite: ^2.7.7 6929 vite: ^2.7.9
6673 languageName: unknown 6930 languageName: unknown
6674 linkType: soft 6931 linkType: soft
6675 6932
@@ -7305,9 +7562,9 @@ __metadata:
7305 languageName: node 7562 languageName: node
7306 linkType: hard 7563 linkType: hard
7307 7564
7308"vite@npm:^2.7.7": 7565"vite@npm:^2.7.9":
7309 version: 2.7.7 7566 version: 2.7.9
7310 resolution: "vite@npm:2.7.7" 7567 resolution: "vite@npm:2.7.9"
7311 dependencies: 7568 dependencies:
7312 esbuild: ^0.13.12 7569 esbuild: ^0.13.12
7313 fsevents: ~2.3.2 7570 fsevents: ~2.3.2
@@ -7330,7 +7587,7 @@ __metadata:
7330 optional: true 7587 optional: true
7331 bin: 7588 bin:
7332 vite: bin/vite.js 7589 vite: bin/vite.js
7333 checksum: ce7fd044b9bf29cad6a4ac0505b28d6f75cb461362d678898e78db8ff57763358c35914058c2c563548772fd714713dd8b61248d99759b64ef7576c12cd02401 7590 checksum: 6a13e0678fec4d5811d4e1bc796a98644856e4d7a56b5e56dbe513834c871d2313a065e4b82469de910568c0d6c762133517c6b7bccff4514f9acf5ed47f1f61
7334 languageName: node 7591 languageName: node
7335 linkType: hard 7592 linkType: hard
7336 7593