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 | ||||
| out/ | ||||
| 
 | ||||
| 
 | ||||
| resources/* | ||||
| @ -1,18 +1,24 @@ | ||||
| import type { ForgeConfig } from '@electron-forge/shared-types'; | ||||
| import { MakerSquirrel } from '@electron-forge/maker-squirrel'; | ||||
| import { MakerZIP } from '@electron-forge/maker-zip'; | ||||
| import { MakerDeb } from '@electron-forge/maker-deb'; | ||||
| import { MakerRpm } from '@electron-forge/maker-rpm'; | ||||
| import { VitePlugin } from '@electron-forge/plugin-vite'; | ||||
| import { FusesPlugin } from '@electron-forge/plugin-fuses'; | ||||
| import { FuseV1Options, FuseVersion } from '@electron/fuses'; | ||||
| import type { ForgeConfig } from "@electron-forge/shared-types"; | ||||
| import { MakerSquirrel } from "@electron-forge/maker-squirrel"; | ||||
| import { MakerZIP } from "@electron-forge/maker-zip"; | ||||
| import { MakerDeb } from "@electron-forge/maker-deb"; | ||||
| import { MakerRpm } from "@electron-forge/maker-rpm"; | ||||
| import { VitePlugin } from "@electron-forge/plugin-vite"; | ||||
| import { FusesPlugin } from "@electron-forge/plugin-fuses"; | ||||
| import { FuseV1Options, FuseVersion } from "@electron/fuses"; | ||||
| 
 | ||||
| const config: ForgeConfig = { | ||||
|   packagerConfig: { | ||||
|     asar: true, | ||||
|     icon: "src/assets/icon.png", | ||||
|   }, | ||||
|   rebuildConfig: {}, | ||||
|   makers: [new MakerSquirrel({}), new MakerZIP({}, ['darwin']), new MakerRpm({}), new MakerDeb({})], | ||||
|   makers: [ | ||||
|     new MakerSquirrel({}), | ||||
|     new MakerZIP({}, ["darwin"]), | ||||
|     new MakerRpm({}), | ||||
|     new MakerDeb({}), | ||||
|   ], | ||||
|   plugins: [ | ||||
|     new VitePlugin({ | ||||
|       // `build` can specify multiple entry builds, which can be Main process, Preload scripts, Worker process, etc.
 | ||||
| @ -20,20 +26,20 @@ const config: ForgeConfig = { | ||||
|       build: [ | ||||
|         { | ||||
|           // `entry` is just an alias for `build.lib.entry` in the corresponding file of `config`.
 | ||||
|           entry: 'src/main.ts', | ||||
|           config: 'vite.main.config.ts', | ||||
|           target: 'main', | ||||
|           entry: "src/main.ts", | ||||
|           config: "vite.main.config.ts", | ||||
|           target: "main", | ||||
|         }, | ||||
|         { | ||||
|           entry: 'src/preload.ts', | ||||
|           config: 'vite.preload.config.ts', | ||||
|           target: 'preload', | ||||
|           entry: "src/preload.ts", | ||||
|           config: "vite.preload.config.ts", | ||||
|           target: "preload", | ||||
|         }, | ||||
|       ], | ||||
|       renderer: [ | ||||
|         { | ||||
|           name: 'main_window', | ||||
|           config: 'vite.renderer.config.mts', | ||||
|           name: "main_window", | ||||
|           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", | ||||
|   "lockfileVersion": 3, | ||||
|   "requires": true, | ||||
|   "packages": { | ||||
|     "": { | ||||
|       "name": "app", | ||||
|       "name": "open-webui", | ||||
|       "version": "1.0.0", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "electron-log": "^5.2.4", | ||||
|         "electron-squirrel-startup": "^1.0.1", | ||||
|         "tar": "^7.4.3", | ||||
|         "update-electron-app": "^3.1.0" | ||||
| @ -4463,6 +4464,15 @@ | ||||
|         "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": { | ||||
|       "version": "1.0.1", | ||||
|       "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", | ||||
|   "productName": "app", | ||||
|   "name": "open-webui", | ||||
|   "productName": "Open WebUI", | ||||
|   "version": "1.0.0", | ||||
|   "description": "My Electron application description", | ||||
|   "description": "Open WebUI", | ||||
|   "main": ".vite/build/main.js", | ||||
|   "scripts": { | ||||
|     "start": "electron-forge start", | ||||
| @ -43,8 +43,12 @@ | ||||
|   }, | ||||
|   "license": "MIT", | ||||
|   "dependencies": { | ||||
|     "electron-log": "^5.2.4", | ||||
|     "electron-squirrel-startup": "^1.0.1", | ||||
|     "tar": "^7.4.3", | ||||
|     "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 path from 'path'; | ||||
| import started from 'electron-squirrel-startup'; | ||||
| import { app, BrowserWindow } from "electron"; | ||||
| import path from "path"; | ||||
| import started from "electron-squirrel-startup"; | ||||
| 
 | ||||
| // Handle creating/removing shortcuts on Windows when installing/uninstalling.
 | ||||
| if (started) { | ||||
| @ -12,8 +12,9 @@ const createWindow = () => { | ||||
|   const mainWindow = new BrowserWindow({ | ||||
|     width: 800, | ||||
|     height: 600, | ||||
|     icon: "src/assets/icon.png", | ||||
|     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) { | ||||
|     mainWindow.loadURL(MAIN_WINDOW_VITE_DEV_SERVER_URL); | ||||
|   } 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.
 | ||||
| @ -31,18 +34,18 @@ const createWindow = () => { | ||||
| // This method will be called when Electron has finished
 | ||||
| // initialization and is ready to create browser windows.
 | ||||
| // 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
 | ||||
| // for applications and their menu bar to stay active until the user quits
 | ||||
| // explicitly with Cmd + Q.
 | ||||
| app.on('window-all-closed', () => { | ||||
|   if (process.platform !== 'darwin') { | ||||
| app.on("window-all-closed", () => { | ||||
|   if (process.platform !== "darwin") { | ||||
|     app.quit(); | ||||
|   } | ||||
| }); | ||||
| 
 | ||||
| app.on('activate', () => { | ||||
| app.on("activate", () => { | ||||
|   // 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.
 | ||||
|   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