Initialisation du projet : Electron + Vite + React + TypeScript, Vitest, CI Windows
Some checks are pending
CI / windows (push) Waiting to run

This commit is contained in:
yasder5 2026-09-27 15:12:08 +02:00
commit afb305b3e8
15 changed files with 6166 additions and 0 deletions

29
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,29 @@
name: CI
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
jobs:
windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run typecheck
- run: npm test
- run: npm run dist
env:
CSC_IDENTITY_AUTO_DISCOVERY: false
- uses: actions/upload-artifact@v4
with:
name: orbe-launcher-windows
path: |
dist/*.exe
if-no-files-found: error

5
.gitignore vendored Normal file
View file

@ -0,0 +1,5 @@
node_modules/
out/
dist/
*.log
.DS_Store

BIN
build/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

26
electron-builder.yml Normal file
View file

@ -0,0 +1,26 @@
appId: fr.yasder5.orbelauncher
productName: Orbe Launcher
directories:
output: dist
buildResources: build
files:
- out/**
- package.json
# les thèmes livrés restent des fichiers lisibles (copiés à côté de l'appli, modifiables)
extraResources:
- from: themes
to: themes
asarUnpack:
- node_modules/koffi/**
win:
icon: build/icon.png
target: [nsis, portable]
artifactName: ${productName}-${version}-${arch}.${ext}
nsis:
oneClick: false
allowToChangeInstallationDirectory: true
createDesktopShortcut: true
shortcutName: Orbe Launcher
artifactName: ${productName}-Setup-${version}.${ext}
portable:
artifactName: ${productName}-Portable-${version}.${ext}

15
electron.vite.config.ts Normal file
View file

@ -0,0 +1,15 @@
import { resolve } from 'node:path'
import { defineConfig } from 'electron-vite'
import react from '@vitejs/plugin-react'
const shared = { '@shared': resolve(__dirname, 'src/shared') }
export default defineConfig({
main: { resolve: { alias: shared } },
preload: { resolve: { alias: shared } },
renderer: {
root: 'src/renderer',
resolve: { alias: { ...shared, '@': resolve(__dirname, 'src/renderer/src') } },
plugins: [react()]
}
})

5973
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

35
package.json Normal file
View file

@ -0,0 +1,35 @@
{
"name": "orbe-launcher",
"productName": "Orbe Launcher",
"version": "0.1.0",
"description": "Launcher de jeux PC plein écran, pensé pour la manette, avec thèmes.",
"author": "Yasser Boulayoune",
"license": "MIT",
"main": "./out/main/index.js",
"scripts": {
"dev": "electron-vite dev",
"build": "electron-vite build",
"preview": "electron-vite preview",
"typecheck": "tsc --noEmit -p tsconfig.json",
"test": "vitest run",
"dist": "electron-vite build && electron-builder --win nsis portable",
"dist:dir": "electron-vite build && electron-builder --dir"
},
"devDependencies": {
"@types/node": "^22.20.5",
"@types/react": "^19.3.0",
"@types/react-dom": "^19.3.0",
"@vitejs/plugin-react": "^6.1.2",
"electron": "^44.9.0",
"electron-builder": "^26.15.3",
"electron-vite": "^6.0.0",
"typescript": "^7.0.2",
"vite": "^8.3.4",
"vitest": "^5.0.5"
},
"dependencies": {
"koffi": "^3.3.3",
"react": "^19.3.1",
"react-dom": "^19.3.1"
}
}

26
src/main/index.ts Normal file
View file

@ -0,0 +1,26 @@
import { join } from 'node:path'
import { app, BrowserWindow } from 'electron'
function createWindow(): BrowserWindow {
const win = new BrowserWindow({
width: 1600,
height: 900,
fullscreen: !process.env.ELECTRON_RENDERER_URL,
backgroundColor: '#0a0a0a',
autoHideMenuBar: true,
show: false,
webPreferences: {
preload: join(__dirname, '../preload/index.js'),
contextIsolation: true,
nodeIntegration: false,
sandbox: true
}
})
win.once('ready-to-show', () => win.show())
if (process.env.ELECTRON_RENDERER_URL) win.loadURL(process.env.ELECTRON_RENDERER_URL)
else win.loadFile(join(__dirname, '../renderer/index.html'))
return win
}
app.whenReady().then(createWindow)
app.on('window-all-closed', () => app.quit())

3
src/preload/index.ts Normal file
View file

@ -0,0 +1,3 @@
import { contextBridge } from 'electron'
contextBridge.exposeInMainWorld('orbe', { version: process.versions.electron })

12
src/renderer/index.html Normal file
View file

@ -0,0 +1,12 @@
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' data: orbe-media: orbe-theme:; media-src 'self' orbe-theme:; font-src 'self' orbe-theme:; style-src 'self' 'unsafe-inline' orbe-theme:; script-src 'self'; connect-src 'self' orbe-theme:">
<title>Orbe Launcher</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="./src/main.tsx"></script>
</body>
</html>

3
src/renderer/src/App.tsx Normal file
View file

@ -0,0 +1,3 @@
export function App() {
return <main>Orbe Launcher</main>
}

View file

@ -0,0 +1,4 @@
import { createRoot } from 'react-dom/client'
import { App } from './App'
createRoot(document.getElementById('root')!).render(<App />)

5
tests/smoke.test.ts Normal file
View file

@ -0,0 +1,5 @@
import { describe, expect, it } from 'vitest'
describe('projet', () => {
it('lance les tests', () => expect(1 + 1).toBe(2))
})

23
tsconfig.json Normal file
View file

@ -0,0 +1,23 @@
{
"compilerOptions": {
"target": "ES2023",
"module": "ESNext",
"moduleResolution": "bundler",
"lib": ["ES2023", "DOM", "DOM.Iterable"],
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"skipLibCheck": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"isolatedModules": true,
"types": ["node", "vite/client"],
"paths": {
"@shared/*": ["./src/shared/*"],
"@/*": ["./src/renderer/src/*"]
}
},
"include": ["src", "tests", "tools", "electron.vite.config.ts", "vitest.config.ts"]
}

7
vitest.config.ts Normal file
View file

@ -0,0 +1,7 @@
import { resolve } from 'node:path'
import { defineConfig } from 'vitest/config'
export default defineConfig({
resolve: { alias: { '@shared': resolve(__dirname, 'src/shared'), '@': resolve(__dirname, 'src/renderer/src') } },
test: { include: ['tests/**/*.test.ts'], environment: 'node' }
})