clean setup and ckeleton created at gitnexus-desktop

This commit is contained in:
Sparsh 2026-04-19 14:38:36 +05:30
parent cbebb2c31c
commit f5c6fd1b40
15 changed files with 6650 additions and 0 deletions

2
gitnexus-desktop/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
dist/
release/

View file

@ -0,0 +1,24 @@
appId: io.github.abhigyanpatwari.gitnexus.desktop
productName: GitNexus Desktop
directories:
output: release/artifacts
files:
- dist/**/*
- package.json
asar: false
npmRebuild: false
win:
signAndEditExecutable: false
target:
- nsis
mac:
category: public.app-category.developer-tools
target:
- dmg
linux:
category: Development
target:
- AppImage
nsis:
oneClick: false
allowToChangeInstallationDirectory: true

View file

@ -0,0 +1,39 @@
import { defineConfig } from 'electron-vite';
import react from '@vitejs/plugin-react';
import { resolve } from 'node:path';
export default defineConfig({
main: {
build: {
outDir: 'dist/main',
rollupOptions: {
input: {
main: resolve(__dirname, 'src/main/main.ts'),
},
},
},
},
preload: {
build: {
outDir: 'dist/preload',
rollupOptions: {
input: {
preload: resolve(__dirname, 'src/main/preload.ts'),
},
},
},
},
renderer: {
root: '.',
base: './',
plugins: [react()],
build: {
outDir: 'dist/renderer',
rollupOptions: {
input: {
index: resolve(__dirname, 'src/renderer/index.html'),
},
},
},
},
});

6356
gitnexus-desktop/package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,40 @@
{
"name": "gitnexus-desktop",
"version": "0.1.0",
"private": true,
"description": "Electron desktop shell for GitNexus",
"author": "Abhigyan Patwari",
"license": "PolyForm-Noncommercial-1.0.0",
"type": "module",
"main": "dist/main/main.js",
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"dev": "electron-vite dev --outDir=dist",
"start": "electron-vite preview --outDir=dist",
"bundle": "electron-vite build --outDir=dist",
"build": "node scripts/package.mjs --dir",
"build:dir": "node scripts/package.mjs --dir",
"build:win": "node scripts/package.mjs --win nsis",
"build:mac": "node scripts/package.mjs --mac dmg",
"build:linux": "node scripts/package.mjs --linux AppImage",
"build:all": "node scripts/package.mjs --win nsis --mac dmg --linux AppImage",
"typecheck": "tsc --noEmit -p tsconfig.node.json && tsc --noEmit -p tsconfig.renderer.json"
},
"dependencies": {
"react": "^19.2.5",
"react-dom": "^19.2.5"
},
"devDependencies": {
"@types/node": "^25.6.0",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.1.1",
"electron": "^41.2.1",
"electron-builder": "^26.8.1",
"electron-vite": "^5.0.0",
"typescript": "^6.0.3",
"vite": "^7.0.0"
}
}

View file

@ -0,0 +1,34 @@
import { execSync } from 'node:child_process';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const packageRoot = path.resolve(__dirname, '..');
const releaseRoot = path.join(packageRoot, 'release');
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
const outputDir = path.join(releaseRoot, stamp);
const builderArgs = process.argv.slice(2);
const builderCommand = [
'npx electron-builder',
'--config electron-builder.yml',
`--config.directories.output=release/${stamp}`,
'--publish never',
...builderArgs,
].join(' ');
fs.mkdirSync(outputDir, { recursive: true });
execSync('npm run bundle', {
cwd: packageRoot,
stdio: 'inherit',
});
execSync(builderCommand, {
cwd: packageRoot,
stdio: 'inherit',
});
console.log(`[build] artifacts written to release/${stamp}`);

View file

@ -0,0 +1,44 @@
import { app, BrowserWindow } from 'electron';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
async function createWindow(): Promise<void> {
const mainWindow = new BrowserWindow({
width: 1280,
height: 800,
title: 'GitNexus Desktop',
webPreferences: {
preload: path.join(__dirname, '../preload/preload.mjs'),
contextIsolation: true,
nodeIntegration: false,
},
});
const rendererUrl = process.env.ELECTRON_RENDERER_URL;
if (rendererUrl) {
await mainWindow.loadURL(rendererUrl);
return;
}
await mainWindow.loadFile(path.join(__dirname, '../renderer/src/renderer/index.html'));
}
app.whenReady().then(() => {
void createWindow();
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
void createWindow();
}
});
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});

View file

@ -0,0 +1,3 @@
import { contextBridge } from 'electron';
contextBridge.exposeInMainWorld('gitnexusDesktop', {});

View file

@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>GitNexus Desktop</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="./src/main.tsx"></script>
</body>
</html>

View file

@ -0,0 +1,3 @@
export default function App() {
return <div className="app-shell">GitNexus Desktop</div>;
}

View file

@ -0,0 +1,17 @@
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import App from './App';
import './styles.css';
const rootElement = document.getElementById('root');
if (!rootElement) {
throw new Error('Renderer root element was not found.');
}
createRoot(rootElement).render(
<StrictMode>
<App />
</StrictMode>,
);

View file

@ -0,0 +1,22 @@
html,
body,
#root {
margin: 0;
min-height: 100%;
}
body {
min-height: 100vh;
font-family: 'Segoe UI', sans-serif;
background: #101114;
color: #f5f7fb;
}
.app-shell {
min-height: 100vh;
display: grid;
place-items: center;
font-size: 2rem;
font-weight: 600;
letter-spacing: 0.04em;
}

View file

@ -0,0 +1,15 @@
{
"compilerOptions": {
"strict": true,
"forceConsistentCasingInFileNames": true
},
"files": [],
"references": [
{
"path": "./tsconfig.node.json"
},
{
"path": "./tsconfig.renderer.json"
}
]
}

View file

@ -0,0 +1,18 @@
{
"compilerOptions": {
"composite": true,
"target": "ES2022",
"lib": ["ES2022"],
"module": "NodeNext",
"moduleResolution": "NodeNext",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"types": ["node"],
"noEmit": true
},
"include": ["electron.vite.config.ts", "src/main/**/*.ts"]
}

View file

@ -0,0 +1,21 @@
{
"compilerOptions": {
"composite": true,
"target": "ES2022",
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"module": "ESNext",
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"strict": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"types": ["vite/client"]
},
"include": ["src/renderer/src"]
}