aboutsummaryrefslogtreecommitdiffstats
path: root/packages
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 /packages
parentfeat: Add mui (diff)
downloadsophie-cf23e60c17763123caa77f1194e6efd913692ea1.tar.gz
sophie-cf23e60c17763123caa77f1194e6efd913692ea1.tar.zst
sophie-cf23e60c17763123caa77f1194e6efd913692ea1.zip
feat: Add shared package for electron ipc
Diffstat (limited to 'packages')
-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
16 files changed, 144 insertions, 9 deletions
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;