aboutsummaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-22 19:17:07 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-22 19:37:20 +0100
commit929171dcba75b51be464e12906801c875ab7647a (patch)
treeae59d77dd1a8dda3ec8118f8f810a783c9103655 /packages
downloadsophie-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.json12
-rw-r--r--packages/main/src/index.ts95
-rw-r--r--packages/main/tsconfig.json19
-rw-r--r--packages/main/vite.config.js51
-rw-r--r--packages/preload/package.json10
-rw-r--r--packages/preload/src/index.ts4
-rw-r--r--packages/preload/tsconfig.json15
-rw-r--r--packages/preload/vite.config.js50
-rw-r--r--packages/renderer/index.html13
-rw-r--r--packages/renderer/package.json14
-rw-r--r--packages/renderer/src/index.tsx10
-rw-r--r--packages/renderer/tsconfig.json21
-rw-r--r--packages/renderer/vite.config.js52
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 @@
1import { app, BrowserWindow } from 'electron';
2import { join } from 'path';
3import { URL } from 'url';
4
5const isSingleInstance = app.requestSingleInstanceLock();
6const isDevelopment = import.meta.env.MODE === 'development';
7
8if (!isSingleInstance) {
9 app.quit();
10 process.exit(0);
11}
12
13app.enableSandbox();
14
15if (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
39let mainWindow: BrowserWindow | null = null;
40
41function 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
74app.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
86app.on('window-all-closed', () => {
87 if (process.platform !== 'darwin') {
88 app.quit();
89 }
90});
91
92app.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
3import { builtinModules } from 'module';
4import { join } from 'path';
5
6// `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless.
7// @ts-expect-error
8import { node } from '../../.electron-vendors.cache.json';
9
10/** @type string */
11const PACKAGE_ROOT = __dirname;
12
13/**
14 * @type {import('vite').UserConfig}
15 * @see https://vitejs.dev/config/
16 */
17const 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
51export 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 @@
1import { contextBridge } from 'electron';
2
3contextBridge.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
3import { builtinModules } from 'module';
4import { join } from 'path';
5
6// `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless.
7// @ts-expect-error
8import { chrome } from '../../.electron-vendors.cache.json';
9
10/** @type string */
11const PACKAGE_ROOT = __dirname;
12
13/**
14 * @type {import('vite').UserConfig}
15 * @see https://vitejs.dev/config/
16 */
17const 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
50export 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 @@
1import React from 'react';
2import { render } from 'react-dom';
3
4const app = (
5 <React.StrictMode>
6 <h1>Hello Sophie!</h1>
7 </React.StrictMode>
8);
9
10render(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
5import { builtinModules } from 'module';
6import { join } from 'path';
7import react from '@vitejs/plugin-react';
8
9// `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless.
10// @ts-expect-error
11import { chrome } from '../../.electron-vendors.cache.json';
12
13/** @type string */
14const PACKAGE_ROOT = __dirname;
15
16/**
17 * @type {import('vite').UserConfig}
18 * @see https://vitejs.dev/config/
19 */
20const 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
52export default config;