aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-23 00:43:55 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-23 01:17:18 +0100
commitcf23e60c17763123caa77f1194e6efd913692ea1 (patch)
tree42266377ac1a65a9b225737c8cbef02c6b1871cd
parentfeat: Add mui (diff)
downloadsophie-cf23e60c17763123caa77f1194e6efd913692ea1.tar.gz
sophie-cf23e60c17763123caa77f1194e6efd913692ea1.tar.zst
sophie-cf23e60c17763123caa77f1194e6efd913692ea1.zip
feat: Add shared package for electron ipc
-rw-r--r--.gitignore1
-rw-r--r--package.json5
-rw-r--r--packages/main/package.json3
-rw-r--r--packages/main/src/index.ts15
-rw-r--r--packages/main/tsconfig.json6
-rw-r--r--packages/preload/package.json4
-rw-r--r--packages/preload/src/index.ts12
-rw-r--r--packages/preload/tsconfig.json8
-rw-r--r--packages/renderer/package.json3
-rw-r--r--packages/renderer/src/index.tsx5
-rw-r--r--packages/renderer/tsconfig.json9
-rw-r--r--packages/renderer/types/sophieRenderer.d.ts7
-rw-r--r--packages/shared/package.json15
-rw-r--r--packages/shared/src/contextBridge/SophieRenderer.ts3
-rw-r--r--packages/shared/src/index.ts3
-rw-r--r--packages/shared/src/ipc/RendererIpcMessage.ts3
-rw-r--r--packages/shared/tsconfig.json13
-rw-r--r--packages/shared/vite.config.js44
-rw-r--r--scripts/watch.js20
-rw-r--r--yarn.lock12
20 files changed, 177 insertions, 14 deletions
diff --git a/.gitignore b/.gitignore
index e8336af..0b6997b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@
7!.yarn/releases 7!.yarn/releases
8!.yarn/versions 8!.yarn/versions
9dist/ 9dist/
10*.tsbuildinfo
diff --git a/package.json b/package.json
index 143ecca..cf271bd 100644
--- a/package.json
+++ b/package.json
@@ -17,13 +17,14 @@
17 "precompile": "cross-env MODE=production yarn run build", 17 "precompile": "cross-env MODE=production yarn run build",
18 "compile": "yarn precompile && electron-builder build --config .electron-builder.config.js --dir --config.asar=false", 18 "compile": "yarn precompile && electron-builder build --config .electron-builder.config.js --dir --config.asar=false",
19 "watch": "node scripts/watch.js", 19 "watch": "node scripts/watch.js",
20 "typecheck": "yarn workspaces foreach -vp run typecheck", 20 "typecheck": "yarn workspaces foreach -vpt run typecheck",
21 "update-electron-vendors": "node scripts/update-electron-vendors.js" 21 "update-electron-vendors": "node scripts/update-electron-vendors.js"
22 }, 22 },
23 "workspaces": [ 23 "workspaces": [
24 "packages/main", 24 "packages/main",
25 "packages/preload", 25 "packages/preload",
26 "packages/renderer" 26 "packages/renderer",
27 "packages/shared"
27 ], 28 ],
28 "devDependencies": { 29 "devDependencies": {
29 "@typescript-eslint/eslint-plugin": "5.8.0", 30 "@typescript-eslint/eslint-plugin": "5.8.0",
diff --git a/packages/main/package.json b/packages/main/package.json
index 11a6270..63da432 100644
--- a/packages/main/package.json
+++ b/packages/main/package.json
@@ -5,9 +5,10 @@
5 "main": "dist/index.cjs", 5 "main": "dist/index.cjs",
6 "scripts": { 6 "scripts": {
7 "build": "vite build", 7 "build": "vite build",
8 "typecheck": "tsc --noEmit" 8 "typecheck": "tsc"
9 }, 9 },
10 "dependencies": { 10 "dependencies": {
11 "@sophie/shared": "workspace:*",
11 "electron": "^16.0.5" 12 "electron": "^16.0.5"
12 }, 13 },
13 "devDependencies": { 14 "devDependencies": {
diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts
index ef954e1..cd04276 100644
--- a/packages/main/src/index.ts
+++ b/packages/main/src/index.ts
@@ -1,5 +1,6 @@
1import { app, BrowserWindow } from 'electron'; 1import { app, BrowserWindow } from 'electron';
2import { join } from 'path'; 2import { join } from 'path';
3import { RendererIpcMessage } from '@sophie/shared';
3import { URL } from 'url'; 4import { URL } from 'url';
4 5
5const isSingleInstance = app.requestSingleInstanceLock(); 6const isSingleInstance = app.requestSingleInstanceLock();
@@ -49,9 +50,10 @@ function createWindow(): Promise<void> {
49 } 50 }
50 }); 51 });
51 52
53 const { webContents } = mainWindow;
54
52 // See https://github.com/MarshallOfSound/electron-devtools-installer/issues/195#issuecomment-998872878 55 // See https://github.com/MarshallOfSound/electron-devtools-installer/issues/195#issuecomment-998872878
53 if (isDevelopment) { 56 if (isDevelopment) {
54 const { webContents } = mainWindow;
55 webContents.once('dom-ready', () => { 57 webContents.once('dom-ready', () => {
56 webContents.once('devtools-opened', () => { 58 webContents.once('devtools-opened', () => {
57 mainWindow?.focus(); 59 mainWindow?.focus();
@@ -64,6 +66,17 @@ function createWindow(): Promise<void> {
64 mainWindow?.show(); 66 mainWindow?.show();
65 }); 67 });
66 68
69 webContents.on('ipc-message', (_event, channel, ...args) => {
70 switch (channel) {
71 case RendererIpcMessage.ButtonClicked:
72 console.log('Button clicked');
73 break;
74 default:
75 console.warn('Unknown IPC message:', channel, args);
76 break;
77 }
78 });
79
67 const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined) 80 const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined)
68 ? import.meta.env.VITE_DEV_SERVER_URL 81 ? import.meta.env.VITE_DEV_SERVER_URL
69 : new URL('../renderer/dist/index.html', `file://${__dirname}`).toString(); 82 : new URL('../renderer/dist/index.html', `file://${__dirname}`).toString();
diff --git a/packages/main/tsconfig.json b/packages/main/tsconfig.json
index 1a569d2..970215c 100644
--- a/packages/main/tsconfig.json
+++ b/packages/main/tsconfig.json
@@ -1,11 +1,17 @@
1{ 1{
2 "extends": "../../tsconfig.json", 2 "extends": "../../tsconfig.json",
3 "compilerOptions": { 3 "compilerOptions": {
4 "noEmit": true,
4 "types": [ 5 "types": [
5 "node", 6 "node",
6 "vite/client" 7 "vite/client"
7 ] 8 ]
8 }, 9 },
10 "references": [
11 {
12 "path": "../shared"
13 }
14 ],
9 "include": [ 15 "include": [
10 "src/**/*.ts", 16 "src/**/*.ts",
11 "types/**/*.d.ts" 17 "types/**/*.d.ts"
diff --git a/packages/preload/package.json b/packages/preload/package.json
index 5417ec0..5556c10 100644
--- a/packages/preload/package.json
+++ b/packages/preload/package.json
@@ -2,12 +2,14 @@
2 "name": "@sophie/preload", 2 "name": "@sophie/preload",
3 "version": "0.1.0", 3 "version": "0.1.0",
4 "private": true, 4 "private": true,
5 "sideEffects": false,
5 "main": "dist/index.cjs", 6 "main": "dist/index.cjs",
6 "scripts": { 7 "scripts": {
7 "build": "vite build", 8 "build": "vite build",
8 "typecheck": "tsc --noEmit" 9 "typecheck": "tsc"
9 }, 10 },
10 "dependencies": { 11 "dependencies": {
12 "@sophie/shared": "workspace:*",
11 "electron": "^16.0.5" 13 "electron": "^16.0.5"
12 }, 14 },
13 "devDependencies": { 15 "devDependencies": {
diff --git a/packages/preload/src/index.ts b/packages/preload/src/index.ts
index 7d5eff5..830901a 100644
--- a/packages/preload/src/index.ts
+++ b/packages/preload/src/index.ts
@@ -1,4 +1,10 @@
1import { contextBridge } from 'electron'; 1import { contextBridge, ipcRenderer } from 'electron';
2import { RendererIpcMessage, SophieRenderer } from '@sophie/shared';
2 3
3contextBridge.exposeInMainWorld('sophieRenderer', { 4const sophieRenderer: SophieRenderer = {
4}); 5 buttonClicked() {
6 ipcRenderer.send(RendererIpcMessage.ButtonClicked);
7 }
8};
9
10contextBridge.exposeInMainWorld('sophieRenderer', sophieRenderer);
diff --git a/packages/preload/tsconfig.json b/packages/preload/tsconfig.json
index 6bb6145..8bfa0ec 100644
--- a/packages/preload/tsconfig.json
+++ b/packages/preload/tsconfig.json
@@ -1,5 +1,13 @@
1{ 1{
2 "extends": "../../tsconfig.json", 2 "extends": "../../tsconfig.json",
3 "compilerOptions": {
4 "noEmit": true
5 },
6 "references": [
7 {
8 "path": "../shared"
9 }
10 ],
3 "include": [ 11 "include": [
4 "src/**/*.ts" 12 "src/**/*.ts"
5 ] 13 ]
diff --git a/packages/renderer/package.json b/packages/renderer/package.json
index b18b2fe..559e668 100644
--- a/packages/renderer/package.json
+++ b/packages/renderer/package.json
@@ -5,7 +5,7 @@
5 "main": "dist/index.html", 5 "main": "dist/index.html",
6 "scripts": { 6 "scripts": {
7 "build": "vite build", 7 "build": "vite build",
8 "typecheck": "tsc --noEmit" 8 "typecheck": "tsc"
9 }, 9 },
10 "dependencies": { 10 "dependencies": {
11 "@emotion/react": "^11.7.1", 11 "@emotion/react": "^11.7.1",
@@ -13,6 +13,7 @@
13 "@fontsource/roboto": "^4.5.1", 13 "@fontsource/roboto": "^4.5.1",
14 "@mui/icons-material": "^5.2.5", 14 "@mui/icons-material": "^5.2.5",
15 "@mui/material": "^5.2.5", 15 "@mui/material": "^5.2.5",
16 "@sophie/shared": "workspace:*",
16 "react": "^17.0.2", 17 "react": "^17.0.2",
17 "react-dom": "^17.0.2" 18 "react-dom": "^17.0.2"
18 }, 19 },
diff --git a/packages/renderer/src/index.tsx b/packages/renderer/src/index.tsx
index 67bdf93..452448c 100644
--- a/packages/renderer/src/index.tsx
+++ b/packages/renderer/src/index.tsx
@@ -22,7 +22,10 @@ function App() {
22 <React.StrictMode> 22 <React.StrictMode>
23 <ThemeProvider theme={theme}> 23 <ThemeProvider theme={theme}>
24 <CssBaseline enableColorScheme /> 24 <CssBaseline enableColorScheme />
25 <Button variant="contained"> 25 <Button
26 variant="contained"
27 onClick={window.sophieRenderer.buttonClicked}
28 >
26 Hello Sophie! 29 Hello Sophie!
27 </Button> 30 </Button>
28 </ThemeProvider> 31 </ThemeProvider>
diff --git a/packages/renderer/tsconfig.json b/packages/renderer/tsconfig.json
index 4a80025..668356c 100644
--- a/packages/renderer/tsconfig.json
+++ b/packages/renderer/tsconfig.json
@@ -1,6 +1,7 @@
1{ 1{
2 "extends": "../../tsconfig.json", 2 "extends": "../../tsconfig.json",
3 "compilerOptions": { 3 "compilerOptions": {
4 "noEmit": true,
4 "jsx": "react", 5 "jsx": "react",
5 "lib": [ 6 "lib": [
6 "dom", 7 "dom",
@@ -8,8 +9,14 @@
8 "esnext" 9 "esnext"
9 ] 10 ]
10 }, 11 },
12 "references": [
13 {
14 "path": "../shared"
15 }
16 ],
11 "include": [ 17 "include": [
12 "src/**/*.ts", 18 "src/**/*.ts",
13 "src/**/*.tsx" 19 "src/**/*.tsx",
20 "types/**/*.d.ts"
14 ] 21 ]
15} 22}
diff --git a/packages/renderer/types/sophieRenderer.d.ts b/packages/renderer/types/sophieRenderer.d.ts
new file mode 100644
index 0000000..b5b5da1
--- /dev/null
+++ b/packages/renderer/types/sophieRenderer.d.ts
@@ -0,0 +1,7 @@
1import type { SophieRenderer } from '@sophie/shared';
2
3declare global {
4 interface Window {
5 readonly sophieRenderer: SophieRenderer;
6 }
7}
diff --git a/packages/shared/package.json b/packages/shared/package.json
new file mode 100644
index 0000000..ccde705
--- /dev/null
+++ b/packages/shared/package.json
@@ -0,0 +1,15 @@
1{
2 "name": "@sophie/shared",
3 "version": "0.1.0",
4 "private": true,
5 "main": "dist/index.cjs",
6 "types": "dist/index.d.ts",
7 "scripts": {
8 "build": "vite build",
9 "typecheck": "tsc"
10 },
11 "devDependencies": {
12 "typescript": "^4.5.4",
13 "vite": "^2.7.6"
14 }
15}
diff --git a/packages/shared/src/contextBridge/SophieRenderer.ts b/packages/shared/src/contextBridge/SophieRenderer.ts
new file mode 100644
index 0000000..91a0a3c
--- /dev/null
+++ b/packages/shared/src/contextBridge/SophieRenderer.ts
@@ -0,0 +1,3 @@
1export interface SophieRenderer {
2 buttonClicked(): void;
3}
diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts
new file mode 100644
index 0000000..f95675d
--- /dev/null
+++ b/packages/shared/src/index.ts
@@ -0,0 +1,3 @@
1export type { SophieRenderer } from './contextBridge/SophieRenderer';
2
3export { RendererIpcMessage } from './ipc/RendererIpcMessage';
diff --git a/packages/shared/src/ipc/RendererIpcMessage.ts b/packages/shared/src/ipc/RendererIpcMessage.ts
new file mode 100644
index 0000000..cfb87ae
--- /dev/null
+++ b/packages/shared/src/ipc/RendererIpcMessage.ts
@@ -0,0 +1,3 @@
1export enum RendererIpcMessage {
2 ButtonClicked = "button-clicked"
3}
diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json
new file mode 100644
index 0000000..d441cc8
--- /dev/null
+++ b/packages/shared/tsconfig.json
@@ -0,0 +1,13 @@
1{
2 "extends": "../../tsconfig.json",
3 "compilerOptions": {
4 "composite": true,
5 "declaration": true,
6 "declarationDir": "dist",
7 "emitDeclarationOnly": true,
8 "rootDir": "src"
9 },
10 "include": [
11 "src/**/*.ts"
12 ]
13}
diff --git a/packages/shared/vite.config.js b/packages/shared/vite.config.js
new file mode 100644
index 0000000..cbebb8a
--- /dev/null
+++ b/packages/shared/vite.config.js
@@ -0,0 +1,44 @@
1// @ts-check
2
3import { builtinModules } from 'module';
4
5// `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless.
6// @ts-expect-error
7import { chrome, node } from '../../.electron-vendors.cache.json';
8
9/** @type string */
10const PACKAGE_ROOT = __dirname;
11
12/**
13 * @type {import('vite').UserConfig}
14 * @see https://vitejs.dev/config/
15 */
16const config = {
17 mode: process.env.MODE,
18 root: PACKAGE_ROOT,
19 envDir: process.cwd(),
20 build: {
21 sourcemap: 'inline',
22 target: [
23 `chrome${chrome}`,
24 `node${node}`
25 ],
26 outDir: 'dist',
27 lib: {
28 entry: 'src/index.ts',
29 formats: ['cjs'],
30 },
31 rollupOptions: {
32 external: [
33 ...builtinModules,
34 ],
35 output: {
36 entryFileNames: '[name].cjs',
37 },
38 },
39 emptyOutDir: false, // Do not remove `.d.ts` files.
40 brotliSize: false,
41 },
42};
43
44export default config;
diff --git a/scripts/watch.js b/scripts/watch.js
index 7ec07ff..7f5f42c 100644
--- a/scripts/watch.js
+++ b/scripts/watch.js
@@ -37,10 +37,10 @@ const stderrFilterPatterns = [
37]; 37];
38 38
39/** 39/**
40 * @param {{name: string; configFile: string; writeBundle: import('rollup').OutputPlugin['writeBundle'] }} config 40 * @param {{name: string; configFile: string; writeBundle?: import('rollup').OutputPlugin['writeBundle'] }} config
41 * @returns {Promise<import('rollup').RollupOutput | Array<import('rollup').RollupOutput> | import('rollup').RollupWatcher>} 41 * @returns {Promise<import('rollup').RollupOutput | Array<import('rollup').RollupOutput> | import('rollup').RollupWatcher>}
42 */ 42 */
43function getWatcher({name, configFile, writeBundle}) { 43function getWatcher({ name, configFile, writeBundle }) {
44 return build({ 44 return build({
45 ...sharedConfig, 45 ...sharedConfig,
46 configFile, 46 configFile,
@@ -110,7 +110,7 @@ function setupMainPackageWatcher(viteDevServer) {
110} 110}
111 111
112/** 112/**
113 * Start or restart App when source files are changed. 113 * Reload App when source files are changed.
114 * 114 *
115 * @param {import('vite').ViteDevServer} viteDevServer 115 * @param {import('vite').ViteDevServer} viteDevServer
116 * @returns {Promise<import('rollup').RollupOutput | Array<import('rollup').RollupOutput> | import('rollup').RollupWatcher>} 116 * @returns {Promise<import('rollup').RollupOutput | Array<import('rollup').RollupOutput> | import('rollup').RollupWatcher>}
@@ -128,9 +128,23 @@ function setupPreloadPackageWatcher(viteDevServer) {
128} 128}
129 129
130/** 130/**
131 * Rebuild package when source files are changed.
132 *
133 * @returns {Promise<import('rollup').RollupOutput | Array<import('rollup').RollupOutput> | import('rollup').RollupWatcher>}
134 */
135function setupSharedPackageWatcher() {
136 return getWatcher({
137 name: 'rebuild-package-on-shared-package-change',
138 configFile: 'packages/shared/vite.config.js',
139 });
140}
141
142/**
131 * @returns Promise<void> 143 * @returns Promise<void>
132 */ 144 */
133async function setupDevEnvironment() { 145async function setupDevEnvironment() {
146 await setupSharedPackageWatcher();
147
134 const viteDevServer = await createServer({ 148 const viteDevServer = await createServer({
135 ...sharedConfig, 149 ...sharedConfig,
136 configFile: 'packages/renderer/vite.config.js', 150 configFile: 'packages/renderer/vite.config.js',
diff --git a/yarn.lock b/yarn.lock
index 9730c32..5a61262 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -822,6 +822,7 @@ __metadata:
822 version: 0.0.0-use.local 822 version: 0.0.0-use.local
823 resolution: "@sophie/main@workspace:packages/main" 823 resolution: "@sophie/main@workspace:packages/main"
824 dependencies: 824 dependencies:
825 "@sophie/shared": "workspace:*"
825 "@types/electron-devtools-installer": ^2.2.0 826 "@types/electron-devtools-installer": ^2.2.0
826 "@types/node": ^16.11.15 827 "@types/node": ^16.11.15
827 electron: ^16.0.5 828 electron: ^16.0.5
@@ -835,6 +836,7 @@ __metadata:
835 version: 0.0.0-use.local 836 version: 0.0.0-use.local
836 resolution: "@sophie/preload@workspace:packages/preload" 837 resolution: "@sophie/preload@workspace:packages/preload"
837 dependencies: 838 dependencies:
839 "@sophie/shared": "workspace:*"
838 electron: ^16.0.5 840 electron: ^16.0.5
839 typescript: ^4.5.4 841 typescript: ^4.5.4
840 vite: ^2.7.6 842 vite: ^2.7.6
@@ -850,6 +852,7 @@ __metadata:
850 "@fontsource/roboto": ^4.5.1 852 "@fontsource/roboto": ^4.5.1
851 "@mui/icons-material": ^5.2.5 853 "@mui/icons-material": ^5.2.5
852 "@mui/material": ^5.2.5 854 "@mui/material": ^5.2.5
855 "@sophie/shared": "workspace:*"
853 "@types/react": ^17.0.37 856 "@types/react": ^17.0.37
854 "@types/react-dom": ^17.0.11 857 "@types/react-dom": ^17.0.11
855 "@vitejs/plugin-react": ^1.1.3 858 "@vitejs/plugin-react": ^1.1.3
@@ -860,6 +863,15 @@ __metadata:
860 languageName: unknown 863 languageName: unknown
861 linkType: soft 864 linkType: soft
862 865
866"@sophie/shared@workspace:*, @sophie/shared@workspace:packages/shared":
867 version: 0.0.0-use.local
868 resolution: "@sophie/shared@workspace:packages/shared"
869 dependencies:
870 typescript: ^4.5.4
871 vite: ^2.7.6
872 languageName: unknown
873 linkType: soft
874
863"@szmarczak/http-timer@npm:^1.1.2": 875"@szmarczak/http-timer@npm:^1.1.2":
864 version: 1.1.2 876 version: 1.1.2
865 resolution: "@szmarczak/http-timer@npm:1.1.2" 877 resolution: "@szmarczak/http-timer@npm:1.1.2"