diff options
Diffstat (limited to 'packages')
-rw-r--r-- | packages/main/package.json | 3 | ||||
-rw-r--r-- | packages/main/src/index.ts | 15 | ||||
-rw-r--r-- | packages/main/tsconfig.json | 6 | ||||
-rw-r--r-- | packages/preload/package.json | 4 | ||||
-rw-r--r-- | packages/preload/src/index.ts | 12 | ||||
-rw-r--r-- | packages/preload/tsconfig.json | 8 | ||||
-rw-r--r-- | packages/renderer/package.json | 3 | ||||
-rw-r--r-- | packages/renderer/src/index.tsx | 5 | ||||
-rw-r--r-- | packages/renderer/tsconfig.json | 9 | ||||
-rw-r--r-- | packages/renderer/types/sophieRenderer.d.ts | 7 | ||||
-rw-r--r-- | packages/shared/package.json | 15 | ||||
-rw-r--r-- | packages/shared/src/contextBridge/SophieRenderer.ts | 3 | ||||
-rw-r--r-- | packages/shared/src/index.ts | 3 | ||||
-rw-r--r-- | packages/shared/src/ipc/RendererIpcMessage.ts | 3 | ||||
-rw-r--r-- | packages/shared/tsconfig.json | 13 | ||||
-rw-r--r-- | packages/shared/vite.config.js | 44 |
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 @@ | |||
1 | import { app, BrowserWindow } from 'electron'; | 1 | import { app, BrowserWindow } from 'electron'; |
2 | import { join } from 'path'; | 2 | import { join } from 'path'; |
3 | import { RendererIpcMessage } from '@sophie/shared'; | ||
3 | import { URL } from 'url'; | 4 | import { URL } from 'url'; |
4 | 5 | ||
5 | const isSingleInstance = app.requestSingleInstanceLock(); | 6 | const 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 @@ | |||
1 | import { contextBridge } from 'electron'; | 1 | import { contextBridge, ipcRenderer } from 'electron'; |
2 | import { RendererIpcMessage, SophieRenderer } from '@sophie/shared'; | ||
2 | 3 | ||
3 | contextBridge.exposeInMainWorld('sophieRenderer', { | 4 | const sophieRenderer: SophieRenderer = { |
4 | }); | 5 | buttonClicked() { |
6 | ipcRenderer.send(RendererIpcMessage.ButtonClicked); | ||
7 | } | ||
8 | }; | ||
9 | |||
10 | contextBridge.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 @@ | |||
1 | import type { SophieRenderer } from '@sophie/shared'; | ||
2 | |||
3 | declare 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 @@ | |||
1 | export 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 @@ | |||
1 | export type { SophieRenderer } from './contextBridge/SophieRenderer'; | ||
2 | |||
3 | export { 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 @@ | |||
1 | export 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 | |||
3 | import { builtinModules } from 'module'; | ||
4 | |||
5 | // `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless. | ||
6 | // @ts-expect-error | ||
7 | import { chrome, node } from '../../.electron-vendors.cache.json'; | ||
8 | |||
9 | /** @type string */ | ||
10 | const PACKAGE_ROOT = __dirname; | ||
11 | |||
12 | /** | ||
13 | * @type {import('vite').UserConfig} | ||
14 | * @see https://vitejs.dev/config/ | ||
15 | */ | ||
16 | const 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 | |||
44 | export default config; | ||