diff options
author | 2021-12-22 19:17:07 +0100 | |
---|---|---|
committer | 2021-12-22 19:37:20 +0100 | |
commit | 929171dcba75b51be464e12906801c875ab7647a (patch) | |
tree | ae59d77dd1a8dda3ec8118f8f810a783c9103655 /packages | |
download | sophie-929171dcba75b51be464e12906801c875ab7647a.tar.gz sophie-929171dcba75b51be464e12906801c875ab7647a.tar.zst sophie-929171dcba75b51be464e12906801c875ab7647a.zip |
Initial commit
Project skeleton based on
https://github.com/cawa-93/vite-electron-builder
but we use react instead of vue and yarn instead of npm.
Diffstat (limited to 'packages')
-rw-r--r-- | packages/main/package.json | 12 | ||||
-rw-r--r-- | packages/main/src/index.ts | 95 | ||||
-rw-r--r-- | packages/main/tsconfig.json | 19 | ||||
-rw-r--r-- | packages/main/vite.config.js | 51 | ||||
-rw-r--r-- | packages/preload/package.json | 10 | ||||
-rw-r--r-- | packages/preload/src/index.ts | 4 | ||||
-rw-r--r-- | packages/preload/tsconfig.json | 15 | ||||
-rw-r--r-- | packages/preload/vite.config.js | 50 | ||||
-rw-r--r-- | packages/renderer/index.html | 13 | ||||
-rw-r--r-- | packages/renderer/package.json | 14 | ||||
-rw-r--r-- | packages/renderer/src/index.tsx | 10 | ||||
-rw-r--r-- | packages/renderer/tsconfig.json | 21 | ||||
-rw-r--r-- | packages/renderer/vite.config.js | 52 |
13 files changed, 366 insertions, 0 deletions
diff --git a/packages/main/package.json b/packages/main/package.json new file mode 100644 index 0000000..1eba6c1 --- /dev/null +++ b/packages/main/package.json | |||
@@ -0,0 +1,12 @@ | |||
1 | { | ||
2 | "name": "@sophie/main", | ||
3 | "version": "0.1.0", | ||
4 | "dependencies": { | ||
5 | "electron": "^16.0.5" | ||
6 | }, | ||
7 | "devDependencies": { | ||
8 | "@types/electron-devtools-installer": "^2.2.0", | ||
9 | "electron-devtools-installer": "^3.2.0", | ||
10 | "vite": "^2.7.6" | ||
11 | } | ||
12 | } | ||
diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts new file mode 100644 index 0000000..ef954e1 --- /dev/null +++ b/packages/main/src/index.ts | |||
@@ -0,0 +1,95 @@ | |||
1 | import { app, BrowserWindow } from 'electron'; | ||
2 | import { join } from 'path'; | ||
3 | import { URL } from 'url'; | ||
4 | |||
5 | const isSingleInstance = app.requestSingleInstanceLock(); | ||
6 | const isDevelopment = import.meta.env.MODE === 'development'; | ||
7 | |||
8 | if (!isSingleInstance) { | ||
9 | app.quit(); | ||
10 | process.exit(0); | ||
11 | } | ||
12 | |||
13 | app.enableSandbox(); | ||
14 | |||
15 | if (isDevelopment) { | ||
16 | app.whenReady().then(async () => { | ||
17 | const { | ||
18 | default: installExtension, | ||
19 | MOBX_DEVTOOLS, | ||
20 | REACT_DEVELOPER_TOOLS, | ||
21 | } = await import('electron-devtools-installer'); | ||
22 | installExtension( | ||
23 | [ | ||
24 | MOBX_DEVTOOLS, | ||
25 | REACT_DEVELOPER_TOOLS, | ||
26 | ], | ||
27 | { | ||
28 | forceDownload: false, | ||
29 | loadExtensionOptions: { | ||
30 | allowFileAccess: true, | ||
31 | }, | ||
32 | }, | ||
33 | ); | ||
34 | }).catch((err) => { | ||
35 | console.error('Failed to install devtools extension', err); | ||
36 | }); | ||
37 | } | ||
38 | |||
39 | let mainWindow: BrowserWindow | null = null; | ||
40 | |||
41 | function createWindow(): Promise<void> { | ||
42 | mainWindow = new BrowserWindow({ | ||
43 | show: false, | ||
44 | webPreferences: { | ||
45 | nativeWindowOpen: true, | ||
46 | webviewTag: false, | ||
47 | sandbox: true, | ||
48 | preload: join(__dirname, '../../preload/dist/index.cjs'), | ||
49 | } | ||
50 | }); | ||
51 | |||
52 | // See https://github.com/MarshallOfSound/electron-devtools-installer/issues/195#issuecomment-998872878 | ||
53 | if (isDevelopment) { | ||
54 | const { webContents } = mainWindow; | ||
55 | webContents.once('dom-ready', () => { | ||
56 | webContents.once('devtools-opened', () => { | ||
57 | mainWindow?.focus(); | ||
58 | }); | ||
59 | webContents.openDevTools(); | ||
60 | }); | ||
61 | } | ||
62 | |||
63 | mainWindow.on('ready-to-show', () => { | ||
64 | mainWindow?.show(); | ||
65 | }); | ||
66 | |||
67 | const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined) | ||
68 | ? import.meta.env.VITE_DEV_SERVER_URL | ||
69 | : new URL('../renderer/dist/index.html', `file://${__dirname}`).toString(); | ||
70 | |||
71 | return mainWindow.loadURL(pageUrl); | ||
72 | } | ||
73 | |||
74 | app.on('second-instance', () => { | ||
75 | if (mainWindow !== null) { | ||
76 | if (!mainWindow.isVisible()) { | ||
77 | mainWindow.show(); | ||
78 | } | ||
79 | if (mainWindow.isMinimized()) { | ||
80 | mainWindow.restore(); | ||
81 | } | ||
82 | mainWindow.focus(); | ||
83 | } | ||
84 | }); | ||
85 | |||
86 | app.on('window-all-closed', () => { | ||
87 | if (process.platform !== 'darwin') { | ||
88 | app.quit(); | ||
89 | } | ||
90 | }); | ||
91 | |||
92 | app.whenReady().then(createWindow).catch((err) => { | ||
93 | console.error('Failed to create window', err); | ||
94 | process.exit(1); | ||
95 | }); | ||
diff --git a/packages/main/tsconfig.json b/packages/main/tsconfig.json new file mode 100644 index 0000000..7181228 --- /dev/null +++ b/packages/main/tsconfig.json | |||
@@ -0,0 +1,19 @@ | |||
1 | { | ||
2 | "extends": "../../tsconfig.json", | ||
3 | "compilerOptions": { | ||
4 | "baseUrl": ".", | ||
5 | "paths": { | ||
6 | "/@/*": [ | ||
7 | "src/*" | ||
8 | ] | ||
9 | }, | ||
10 | "types": [ | ||
11 | "node", | ||
12 | "vite/client" | ||
13 | ] | ||
14 | }, | ||
15 | "include": [ | ||
16 | "src/**/*", | ||
17 | "../../types/**/*.d.ts" | ||
18 | ] | ||
19 | } | ||
diff --git a/packages/main/vite.config.js b/packages/main/vite.config.js new file mode 100644 index 0000000..45c2c8c --- /dev/null +++ b/packages/main/vite.config.js | |||
@@ -0,0 +1,51 @@ | |||
1 | // @ts-check | ||
2 | |||
3 | import { builtinModules } from 'module'; | ||
4 | import { join } from 'path'; | ||
5 | |||
6 | // `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless. | ||
7 | // @ts-expect-error | ||
8 | import { node } from '../../.electron-vendors.cache.json'; | ||
9 | |||
10 | /** @type string */ | ||
11 | const PACKAGE_ROOT = __dirname; | ||
12 | |||
13 | /** | ||
14 | * @type {import('vite').UserConfig} | ||
15 | * @see https://vitejs.dev/config/ | ||
16 | */ | ||
17 | const config = { | ||
18 | mode: process.env.MODE, | ||
19 | root: PACKAGE_ROOT, | ||
20 | envDir: process.cwd(), | ||
21 | resolve: { | ||
22 | alias: { | ||
23 | '/@/': join(PACKAGE_ROOT, 'src') + '/', | ||
24 | }, | ||
25 | }, | ||
26 | build: { | ||
27 | sourcemap: 'inline', | ||
28 | target: `node${node}`, | ||
29 | outDir: 'dist', | ||
30 | assetsDir: '.', | ||
31 | minify: process.env.MODE !== 'development', | ||
32 | lib: { | ||
33 | entry: 'src/index.ts', | ||
34 | formats: ['cjs'], | ||
35 | }, | ||
36 | rollupOptions: { | ||
37 | external: [ | ||
38 | 'electron', | ||
39 | 'electron-devtools-installer', | ||
40 | ...builtinModules, | ||
41 | ], | ||
42 | output: { | ||
43 | entryFileNames: '[name].cjs', | ||
44 | }, | ||
45 | }, | ||
46 | emptyOutDir: true, | ||
47 | brotliSize: false, | ||
48 | }, | ||
49 | }; | ||
50 | |||
51 | export default config; | ||
diff --git a/packages/preload/package.json b/packages/preload/package.json new file mode 100644 index 0000000..538c583 --- /dev/null +++ b/packages/preload/package.json | |||
@@ -0,0 +1,10 @@ | |||
1 | { | ||
2 | "name": "@sophie/preload", | ||
3 | "version": "0.1.0", | ||
4 | "dependencies": { | ||
5 | "electron": "^16.0.5" | ||
6 | }, | ||
7 | "devDependencies": { | ||
8 | "vite": "^2.7.6" | ||
9 | } | ||
10 | } | ||
diff --git a/packages/preload/src/index.ts b/packages/preload/src/index.ts new file mode 100644 index 0000000..7d5eff5 --- /dev/null +++ b/packages/preload/src/index.ts | |||
@@ -0,0 +1,4 @@ | |||
1 | import { contextBridge } from 'electron'; | ||
2 | |||
3 | contextBridge.exposeInMainWorld('sophieRenderer', { | ||
4 | }); | ||
diff --git a/packages/preload/tsconfig.json b/packages/preload/tsconfig.json new file mode 100644 index 0000000..580d63a --- /dev/null +++ b/packages/preload/tsconfig.json | |||
@@ -0,0 +1,15 @@ | |||
1 | { | ||
2 | "extends": "../../tsconfig.json", | ||
3 | "compilerOptions": { | ||
4 | "baseUrl": ".", | ||
5 | "paths": { | ||
6 | "/@/*": [ | ||
7 | "src/*" | ||
8 | ] | ||
9 | } | ||
10 | }, | ||
11 | "include": [ | ||
12 | "src/**/*", | ||
13 | "../../types/**/*.d.ts" | ||
14 | ] | ||
15 | } | ||
diff --git a/packages/preload/vite.config.js b/packages/preload/vite.config.js new file mode 100644 index 0000000..8f11028 --- /dev/null +++ b/packages/preload/vite.config.js | |||
@@ -0,0 +1,50 @@ | |||
1 | // @ts-check | ||
2 | |||
3 | import { builtinModules } from 'module'; | ||
4 | import { join } from 'path'; | ||
5 | |||
6 | // `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless. | ||
7 | // @ts-expect-error | ||
8 | import { chrome } from '../../.electron-vendors.cache.json'; | ||
9 | |||
10 | /** @type string */ | ||
11 | const PACKAGE_ROOT = __dirname; | ||
12 | |||
13 | /** | ||
14 | * @type {import('vite').UserConfig} | ||
15 | * @see https://vitejs.dev/config/ | ||
16 | */ | ||
17 | const config = { | ||
18 | mode: process.env.MODE, | ||
19 | root: PACKAGE_ROOT, | ||
20 | envDir: process.cwd(), | ||
21 | resolve: { | ||
22 | alias: { | ||
23 | '/@/': join(PACKAGE_ROOT, 'src') + '/', | ||
24 | }, | ||
25 | }, | ||
26 | build: { | ||
27 | sourcemap: 'inline', | ||
28 | target: `chrome${chrome}`, | ||
29 | outDir: 'dist', | ||
30 | assetsDir: '.', | ||
31 | minify: process.env.MODE !== 'development', | ||
32 | lib: { | ||
33 | entry: 'src/index.ts', | ||
34 | formats: ['cjs'], | ||
35 | }, | ||
36 | rollupOptions: { | ||
37 | external: [ | ||
38 | 'electron', | ||
39 | ...builtinModules, | ||
40 | ], | ||
41 | output: { | ||
42 | entryFileNames: '[name].cjs', | ||
43 | }, | ||
44 | }, | ||
45 | emptyOutDir: true, | ||
46 | brotliSize: false, | ||
47 | }, | ||
48 | }; | ||
49 | |||
50 | export default config; | ||
diff --git a/packages/renderer/index.html b/packages/renderer/index.html new file mode 100644 index 0000000..7c6771f --- /dev/null +++ b/packages/renderer/index.html | |||
@@ -0,0 +1,13 @@ | |||
1 | <!DOCTYPE html> | ||
2 | <html lang="en"> | ||
3 | <head> | ||
4 | <meta charset="UTF-8"> | ||
5 | <meta http-equiv="Content-Security-Policy" content="script-src 'self' blob:"> | ||
6 | <meta content="width=device-width, initial-scale=1.0" name="viewport"> | ||
7 | <title>Sophie</title> | ||
8 | </head> | ||
9 | <body> | ||
10 | <div id="app"></div> | ||
11 | <script src="./src/index.tsx" type="module"></script> | ||
12 | </body> | ||
13 | </html> | ||
diff --git a/packages/renderer/package.json b/packages/renderer/package.json new file mode 100644 index 0000000..89a87b2 --- /dev/null +++ b/packages/renderer/package.json | |||
@@ -0,0 +1,14 @@ | |||
1 | { | ||
2 | "name": "@sophie/renderer", | ||
3 | "version": "0.1.0", | ||
4 | "dependencies": { | ||
5 | "react": "^17.0.2", | ||
6 | "react-dom": "^17.0.2" | ||
7 | }, | ||
8 | "devDependencies": { | ||
9 | "@types/react": "^17.0.37", | ||
10 | "@types/react-dom": "^17.0.11", | ||
11 | "@vitejs/plugin-react": "^1.1.3", | ||
12 | "vite": "^2.7.6" | ||
13 | } | ||
14 | } | ||
diff --git a/packages/renderer/src/index.tsx b/packages/renderer/src/index.tsx new file mode 100644 index 0000000..21ad152 --- /dev/null +++ b/packages/renderer/src/index.tsx | |||
@@ -0,0 +1,10 @@ | |||
1 | import React from 'react'; | ||
2 | import { render } from 'react-dom'; | ||
3 | |||
4 | const app = ( | ||
5 | <React.StrictMode> | ||
6 | <h1>Hello Sophie!</h1> | ||
7 | </React.StrictMode> | ||
8 | ); | ||
9 | |||
10 | render(app, document.getElementById('app')); | ||
diff --git a/packages/renderer/tsconfig.json b/packages/renderer/tsconfig.json new file mode 100644 index 0000000..ff4fe7c --- /dev/null +++ b/packages/renderer/tsconfig.json | |||
@@ -0,0 +1,21 @@ | |||
1 | { | ||
2 | "extends": "../../tsconfig.json", | ||
3 | "compilerOptions": { | ||
4 | "baseUrl": ".", | ||
5 | "jsx": "react", | ||
6 | "paths": { | ||
7 | "/@/*": [ | ||
8 | "src/*" | ||
9 | ] | ||
10 | }, | ||
11 | "types": [ | ||
12 | "dom", | ||
13 | "dom.iterable" | ||
14 | ] | ||
15 | }, | ||
16 | "include": [ | ||
17 | "src/**/*.ts", | ||
18 | "src/**/*.tsx", | ||
19 | "../../types/**/*.d.ts" | ||
20 | ] | ||
21 | } | ||
diff --git a/packages/renderer/vite.config.js b/packages/renderer/vite.config.js new file mode 100644 index 0000000..c10b81f --- /dev/null +++ b/packages/renderer/vite.config.js | |||
@@ -0,0 +1,52 @@ | |||
1 | // @ts-check | ||
2 | |||
3 | /* eslint-env node */ | ||
4 | |||
5 | import { builtinModules } from 'module'; | ||
6 | import { join } from 'path'; | ||
7 | import react from '@vitejs/plugin-react'; | ||
8 | |||
9 | // `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless. | ||
10 | // @ts-expect-error | ||
11 | import { chrome } from '../../.electron-vendors.cache.json'; | ||
12 | |||
13 | /** @type string */ | ||
14 | const PACKAGE_ROOT = __dirname; | ||
15 | |||
16 | /** | ||
17 | * @type {import('vite').UserConfig} | ||
18 | * @see https://vitejs.dev/config/ | ||
19 | */ | ||
20 | const config = { | ||
21 | mode: process.env.MODE, | ||
22 | root: PACKAGE_ROOT, | ||
23 | resolve: { | ||
24 | alias: { | ||
25 | '/@/': join(PACKAGE_ROOT, 'src') + '/', | ||
26 | }, | ||
27 | }, | ||
28 | plugins: [ | ||
29 | react(), | ||
30 | ], | ||
31 | base: '', | ||
32 | server: { | ||
33 | fs: { | ||
34 | strict: true, | ||
35 | }, | ||
36 | }, | ||
37 | build: { | ||
38 | sourcemap: true, | ||
39 | target: `chrome${chrome}`, | ||
40 | outDir: 'dist', | ||
41 | assetsDir: '.', | ||
42 | rollupOptions: { | ||
43 | external: [ | ||
44 | ...builtinModules, | ||
45 | ], | ||
46 | }, | ||
47 | emptyOutDir: true, | ||
48 | brotliSize: false, | ||
49 | }, | ||
50 | }; | ||
51 | |||
52 | export default config; | ||