mirror of
				https://github.com/open-webui/desktop
				synced 2025-06-26 18:15:59 +00:00 
			
		
		
		
	feat: assets
This commit is contained in:
		
							parent
							
								
									5dbfd7087b
								
							
						
					
					
						commit
						ad85a212f9
					
				
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -90,3 +90,6 @@ typings/ | |||||||
| 
 | 
 | ||||||
| # Electron-Forge | # Electron-Forge | ||||||
| out/ | out/ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | resources/* | ||||||
| @ -1,18 +1,24 @@ | |||||||
| import type { ForgeConfig } from '@electron-forge/shared-types'; | import type { ForgeConfig } from "@electron-forge/shared-types"; | ||||||
| import { MakerSquirrel } from '@electron-forge/maker-squirrel'; | import { MakerSquirrel } from "@electron-forge/maker-squirrel"; | ||||||
| import { MakerZIP } from '@electron-forge/maker-zip'; | import { MakerZIP } from "@electron-forge/maker-zip"; | ||||||
| import { MakerDeb } from '@electron-forge/maker-deb'; | import { MakerDeb } from "@electron-forge/maker-deb"; | ||||||
| import { MakerRpm } from '@electron-forge/maker-rpm'; | import { MakerRpm } from "@electron-forge/maker-rpm"; | ||||||
| import { VitePlugin } from '@electron-forge/plugin-vite'; | import { VitePlugin } from "@electron-forge/plugin-vite"; | ||||||
| import { FusesPlugin } from '@electron-forge/plugin-fuses'; | import { FusesPlugin } from "@electron-forge/plugin-fuses"; | ||||||
| import { FuseV1Options, FuseVersion } from '@electron/fuses'; | import { FuseV1Options, FuseVersion } from "@electron/fuses"; | ||||||
| 
 | 
 | ||||||
| const config: ForgeConfig = { | const config: ForgeConfig = { | ||||||
|   packagerConfig: { |   packagerConfig: { | ||||||
|     asar: true, |     asar: true, | ||||||
|  |     icon: "src/assets/icon.png", | ||||||
|   }, |   }, | ||||||
|   rebuildConfig: {}, |   rebuildConfig: {}, | ||||||
|   makers: [new MakerSquirrel({}), new MakerZIP({}, ['darwin']), new MakerRpm({}), new MakerDeb({})], |   makers: [ | ||||||
|  |     new MakerSquirrel({}), | ||||||
|  |     new MakerZIP({}, ["darwin"]), | ||||||
|  |     new MakerRpm({}), | ||||||
|  |     new MakerDeb({}), | ||||||
|  |   ], | ||||||
|   plugins: [ |   plugins: [ | ||||||
|     new VitePlugin({ |     new VitePlugin({ | ||||||
|       // `build` can specify multiple entry builds, which can be Main process, Preload scripts, Worker process, etc.
 |       // `build` can specify multiple entry builds, which can be Main process, Preload scripts, Worker process, etc.
 | ||||||
| @ -20,20 +26,20 @@ const config: ForgeConfig = { | |||||||
|       build: [ |       build: [ | ||||||
|         { |         { | ||||||
|           // `entry` is just an alias for `build.lib.entry` in the corresponding file of `config`.
 |           // `entry` is just an alias for `build.lib.entry` in the corresponding file of `config`.
 | ||||||
|           entry: 'src/main.ts', |           entry: "src/main.ts", | ||||||
|           config: 'vite.main.config.ts', |           config: "vite.main.config.ts", | ||||||
|           target: 'main', |           target: "main", | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|           entry: 'src/preload.ts', |           entry: "src/preload.ts", | ||||||
|           config: 'vite.preload.config.ts', |           config: "vite.preload.config.ts", | ||||||
|           target: 'preload', |           target: "preload", | ||||||
|         }, |         }, | ||||||
|       ], |       ], | ||||||
|       renderer: [ |       renderer: [ | ||||||
|         { |         { | ||||||
|           name: 'main_window', |           name: "main_window", | ||||||
|           config: 'vite.renderer.config.mts', |           config: "vite.renderer.config.mts", | ||||||
|         }, |         }, | ||||||
|       ], |       ], | ||||||
|     }), |     }), | ||||||
|  | |||||||
							
								
								
									
										14
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										14
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -1,14 +1,15 @@ | |||||||
| { | { | ||||||
|   "name": "app", |   "name": "open-webui", | ||||||
|   "version": "1.0.0", |   "version": "1.0.0", | ||||||
|   "lockfileVersion": 3, |   "lockfileVersion": 3, | ||||||
|   "requires": true, |   "requires": true, | ||||||
|   "packages": { |   "packages": { | ||||||
|     "": { |     "": { | ||||||
|       "name": "app", |       "name": "open-webui", | ||||||
|       "version": "1.0.0", |       "version": "1.0.0", | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|  |         "electron-log": "^5.2.4", | ||||||
|         "electron-squirrel-startup": "^1.0.1", |         "electron-squirrel-startup": "^1.0.1", | ||||||
|         "tar": "^7.4.3", |         "tar": "^7.4.3", | ||||||
|         "update-electron-app": "^3.1.0" |         "update-electron-app": "^3.1.0" | ||||||
| @ -4463,6 +4464,15 @@ | |||||||
|         "node": ">=10" |         "node": ">=10" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/electron-log": { | ||||||
|  |       "version": "5.2.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.2.4.tgz", | ||||||
|  |       "integrity": "sha512-iX12WXc5XAaKeHg2QpiFjVwL+S1NVHPFd3V5RXtCmKhpAzXsVQnR3UEc0LovM6p6NkUQxDWnkdkaam9FNUVmCA==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 14" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/electron-squirrel-startup": { |     "node_modules/electron-squirrel-startup": { | ||||||
|       "version": "1.0.1", |       "version": "1.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.1.tgz", |       "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.1.tgz", | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								package.json
									
									
									
									
									
								
							| @ -1,8 +1,8 @@ | |||||||
| { | { | ||||||
|   "name": "app", |   "name": "open-webui", | ||||||
|   "productName": "app", |   "productName": "Open WebUI", | ||||||
|   "version": "1.0.0", |   "version": "1.0.0", | ||||||
|   "description": "My Electron application description", |   "description": "Open WebUI", | ||||||
|   "main": ".vite/build/main.js", |   "main": ".vite/build/main.js", | ||||||
|   "scripts": { |   "scripts": { | ||||||
|     "start": "electron-forge start", |     "start": "electron-forge start", | ||||||
| @ -43,8 +43,12 @@ | |||||||
|   }, |   }, | ||||||
|   "license": "MIT", |   "license": "MIT", | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|  |     "electron-log": "^5.2.4", | ||||||
|     "electron-squirrel-startup": "^1.0.1", |     "electron-squirrel-startup": "^1.0.1", | ||||||
|     "tar": "^7.4.3", |     "tar": "^7.4.3", | ||||||
|     "update-electron-app": "^3.1.0" |     "update-electron-app": "^3.1.0" | ||||||
|   } |   }, | ||||||
|  |   "extraResources": [ | ||||||
|  |     "resources/py311.tar.gz" | ||||||
|  |   ] | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										
											BIN
										
									
								
								src/assets/icon.icns
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/icon.icns
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/assets/icon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/icon.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 14 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/icon.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 21 KiB | 
							
								
								
									
										21
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								src/main.ts
									
									
									
									
									
								
							| @ -1,6 +1,6 @@ | |||||||
| import { app, BrowserWindow } from 'electron'; | import { app, BrowserWindow } from "electron"; | ||||||
| import path from 'path'; | import path from "path"; | ||||||
| import started from 'electron-squirrel-startup'; | import started from "electron-squirrel-startup"; | ||||||
| 
 | 
 | ||||||
| // Handle creating/removing shortcuts on Windows when installing/uninstalling.
 | // Handle creating/removing shortcuts on Windows when installing/uninstalling.
 | ||||||
| if (started) { | if (started) { | ||||||
| @ -12,8 +12,9 @@ const createWindow = () => { | |||||||
|   const mainWindow = new BrowserWindow({ |   const mainWindow = new BrowserWindow({ | ||||||
|     width: 800, |     width: 800, | ||||||
|     height: 600, |     height: 600, | ||||||
|  |     icon: "src/assets/icon.png", | ||||||
|     webPreferences: { |     webPreferences: { | ||||||
|       preload: path.join(__dirname, 'preload.js'), |       preload: path.join(__dirname, "preload.js"), | ||||||
|     }, |     }, | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
| @ -21,7 +22,9 @@ const createWindow = () => { | |||||||
|   if (MAIN_WINDOW_VITE_DEV_SERVER_URL) { |   if (MAIN_WINDOW_VITE_DEV_SERVER_URL) { | ||||||
|     mainWindow.loadURL(MAIN_WINDOW_VITE_DEV_SERVER_URL); |     mainWindow.loadURL(MAIN_WINDOW_VITE_DEV_SERVER_URL); | ||||||
|   } else { |   } else { | ||||||
|     mainWindow.loadFile(path.join(__dirname, `../renderer/${MAIN_WINDOW_VITE_NAME}/index.html`)); |     mainWindow.loadFile( | ||||||
|  |       path.join(__dirname, `../renderer/${MAIN_WINDOW_VITE_NAME}/index.html`) | ||||||
|  |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // Open the DevTools.
 |   // Open the DevTools.
 | ||||||
| @ -31,18 +34,18 @@ const createWindow = () => { | |||||||
| // This method will be called when Electron has finished
 | // This method will be called when Electron has finished
 | ||||||
| // initialization and is ready to create browser windows.
 | // initialization and is ready to create browser windows.
 | ||||||
| // Some APIs can only be used after this event occurs.
 | // Some APIs can only be used after this event occurs.
 | ||||||
| app.on('ready', createWindow); | app.on("ready", createWindow); | ||||||
| 
 | 
 | ||||||
| // Quit when all windows are closed, except on macOS. There, it's common
 | // Quit when all windows are closed, except on macOS. There, it's common
 | ||||||
| // for applications and their menu bar to stay active until the user quits
 | // for applications and their menu bar to stay active until the user quits
 | ||||||
| // explicitly with Cmd + Q.
 | // explicitly with Cmd + Q.
 | ||||||
| app.on('window-all-closed', () => { | app.on("window-all-closed", () => { | ||||||
|   if (process.platform !== 'darwin') { |   if (process.platform !== "darwin") { | ||||||
|     app.quit(); |     app.quit(); | ||||||
|   } |   } | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| app.on('activate', () => { | app.on("activate", () => { | ||||||
|   // On OS X it's common to re-create a window in the app when the
 |   // On OS X it's common to re-create a window in the app when the
 | ||||||
|   // dock icon is clicked and there are no other windows open.
 |   // dock icon is clicked and there are no other windows open.
 | ||||||
|   if (BrowserWindow.getAllWindows().length === 0) { |   if (BrowserWindow.getAllWindows().length === 0) { | ||||||
|  | |||||||
							
								
								
									
										
											BIN
										
									
								
								src/render/assets/images/favicon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/render/assets/images/favicon.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/render/assets/images/splash-dark.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/render/assets/images/splash-dark.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 5.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/render/assets/images/splash.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/render/assets/images/splash.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 5.1 KiB | 
							
								
								
									
										94
									
								
								src/utils/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								src/utils/index.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,94 @@ | |||||||
|  | import * as fs from "fs"; | ||||||
|  | import * as os from "os"; | ||||||
|  | import * as path from "path"; | ||||||
|  | import { | ||||||
|  |   exec, | ||||||
|  |   execFile, | ||||||
|  |   ExecFileOptions, | ||||||
|  |   execFileSync, | ||||||
|  |   execSync, | ||||||
|  | } from "child_process"; | ||||||
|  | 
 | ||||||
|  | import * as tar from "tar"; | ||||||
|  | import log from "electron-log"; | ||||||
|  | 
 | ||||||
|  | import { app } from "electron"; | ||||||
|  | 
 | ||||||
|  | ////////////////////////////////////////////////
 | ||||||
|  | //
 | ||||||
|  | // General Utils
 | ||||||
|  | //
 | ||||||
|  | ////////////////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  | export function getAppDir(): string { | ||||||
|  |   let appDir = app.getAppPath(); | ||||||
|  |   if (!app.isPackaged) { | ||||||
|  |     appDir = path.dirname(appDir); | ||||||
|  |   } | ||||||
|  |   return appDir; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function getUserHomeDir(): string { | ||||||
|  |   return app.getPath("home"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function getUserDataDir(): string { | ||||||
|  |   const userDataDir = app.getPath("userData"); | ||||||
|  | 
 | ||||||
|  |   if (!fs.existsSync(userDataDir)) { | ||||||
|  |     try { | ||||||
|  |       fs.mkdirSync(userDataDir, { recursive: true }); | ||||||
|  |     } catch (error) { | ||||||
|  |       log.error(error); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return userDataDir; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ////////////////////////////////////////////////
 | ||||||
|  | //
 | ||||||
|  | // Python Utils
 | ||||||
|  | //
 | ||||||
|  | ////////////////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  | export function getPackagedPythonTarPath(): string { | ||||||
|  |   const appDir = getAppDir(); | ||||||
|  |   return path.join(appDir, "resources", "python.tar.gz"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function getBundledPythonEnvDir(): string { | ||||||
|  |   const installDir = | ||||||
|  |     process.platform === "darwin" | ||||||
|  |       ? path.normalize(path.join(app.getPath("home"), "Library", app.getName())) | ||||||
|  |       : app.getPath("userData"); | ||||||
|  | 
 | ||||||
|  |   if (!fs.existsSync(installDir)) { | ||||||
|  |     try { | ||||||
|  |       fs.mkdirSync(installDir, { recursive: true }); | ||||||
|  |     } catch (error) { | ||||||
|  |       log.error(error); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   return installDir; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function getBundledPythonEnvPath(): string { | ||||||
|  |   const userDataDir = getBundledPythonEnvDir(); | ||||||
|  | 
 | ||||||
|  |   return path.join(userDataDir, "python"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function isCondaEnv(envPath: string): boolean { | ||||||
|  |   return fs.existsSync(path.join(envPath, "conda-meta")); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function getPythonPath(envPath: string, isConda?: boolean) { | ||||||
|  |   if (process.platform === "win32") { | ||||||
|  |     return isConda ?? isCondaEnv(envPath) | ||||||
|  |       ? path.join(envPath, "python.exe") | ||||||
|  |       : path.join(envPath, "Scripts", "python.exe"); | ||||||
|  |   } else { | ||||||
|  |     return path.join(envPath, "bin", "python"); | ||||||
|  |   } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user