chore: switch to bun package manager

This commit is contained in:
ARUNAVO RAY
2025-05-20 15:16:51 +05:30
parent 38206e7d3d
commit d5b0102080
17 changed files with 130 additions and 150 deletions

View File

@@ -22,7 +22,7 @@ The application is built using:
- <span class="font-semibold text-foreground">React</span>: Component library for interactive UI elements
- <span class="font-semibold text-foreground">Shadcn UI</span>: UI component library built on Tailwind CSS
- <span class="font-semibold text-foreground">SQLite</span>: Database for storing configuration and state
- <span class="font-semibold text-foreground">Node.js</span>: Runtime environment for the backend
- <span class="font-semibold text-foreground">Bun</span>: Runtime environment for the backend
## Architecture Diagram
@@ -30,7 +30,7 @@ The application is built using:
graph TD
subgraph "Gitea Mirror"
Frontend["Frontend<br/>(Astro)"]
Backend["Backend<br/>(Node.js)"]
Backend["Backend<br/>(Bun)"]
Database["Database<br/>(SQLite)"]
Frontend <--> Backend
@@ -60,9 +60,9 @@ Key frontend components:
- **Configuration**: Settings for GitHub and Gitea connections
- **Activity Log**: Detailed log of mirroring operations
### Backend (Node.js)
### Backend (Bun)
The backend is built with Node.js and provides API endpoints for the frontend to interact with. It handles:
The backend is built with Bun and provides API endpoints for the frontend to interact with. It handles:
- Authentication and user management
- GitHub API integration

View File

@@ -23,7 +23,7 @@ The following environment variables can be used to configure Gitea Mirror:
| Variable | Description | Default Value | Example |
|----------|-------------|---------------|---------|
| `NODE_ENV` | Node environment (development, production, test) | `development` | `production` |
| `NODE_ENV` | Runtime environment (development, production, test) | `development` | `production` |
| `DATABASE_URL` | SQLite database URL | `sqlite://data/gitea-mirror.db` | `sqlite://path/to/your/database.db` |
| `JWT_SECRET` | Secret key for JWT authentication | `your-secret-key-change-this-in-production` | `your-secure-random-string` |
| `HOST` | Server host | `localhost` | `0.0.0.0` |

View File

@@ -16,7 +16,7 @@ Before you begin, make sure you have:
1. <span class="font-semibold text-foreground">A GitHub account with a personal access token</span>
2. <span class="font-semibold text-foreground">A Gitea instance with an access token</span>
3. <span class="font-semibold text-foreground">Docker and docker-compose (recommended) or Node.js 18+ installed</span>
3. <span class="font-semibold text-foreground">Docker and docker-compose (recommended) or Bun 1.2.9+ installed</span>
## Installation Options
@@ -51,7 +51,7 @@ If you prefer to run the application directly on your system:
2. Run the quick setup script:
```bash
pnpm setup
bun run setup
```
This installs dependencies and initializes the database.
@@ -59,13 +59,13 @@ If you prefer to run the application directly on your system:
**Development Mode:**
```bash
pnpm dev
bun run dev
```
**Production Mode:**
```bash
pnpm build
pnpm start
bun run build
bun run start
```
4. Access the application at [http://localhost:4321](http://localhost:4321)

View File

@@ -4,7 +4,7 @@
// Environment variables
export const ENV = {
// Node environment (development, production, test)
// Runtime environment (development, production, test)
NODE_ENV: process.env.NODE_ENV || "development",
// Database URL - use SQLite by default

View File

@@ -1,6 +1,6 @@
import { z } from "zod";
import { createClient } from "@libsql/client";
import { drizzle } from "drizzle-orm/libsql";
import { Database } from "bun:sqlite";
import { drizzle } from "drizzle-orm/bun-sqlite";
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
import path from "path";
@@ -11,11 +11,24 @@ const dataDir = path.join(process.cwd(), "data");
const dbUrl =
process.env.DATABASE_URL || `file:${path.join(dataDir, "gitea-mirror.db")}`;
// Create a client connection to the database
export const client = createClient({ url: dbUrl });
// Create a SQLite database instance using Bun's native driver
export const sqlite = new Database(dbUrl);
// Simple async wrapper around Bun's SQLite API for compatibility
export const client = {
async execute(sql: string, params?: any[]) {
const stmt = sqlite.query(sql);
if (/^\s*select/i.test(sql)) {
const rows = stmt.all(params ?? []);
return { rows } as { rows: any[] };
}
stmt.run(params ?? []);
return { rows: [] } as { rows: any[] };
},
};
// Create a drizzle instance
export const db = drizzle(client);
export const db = drizzle(sqlite);
// Define the tables
export const users = sqliteTable("users", {

View File

@@ -1,30 +1,23 @@
import Redis from "ioredis";
import { RedisClient } from "bun";
// Connect to Redis using REDIS_URL environment variable or default to redis://redis:6379
// This ensures we have a fallback URL when running with Docker Compose
const redisUrl = process.env.REDIS_URL ?? 'redis://redis:6379';
const redisUrl = process.env.REDIS_URL ?? "redis://redis:6379";
console.log(`Connecting to Redis at: ${redisUrl}`);
// Configure Redis client with connection options
const redisOptions = {
retryStrategy: (times: number) => {
// Retry with exponential backoff up to 30 seconds
const delay = Math.min(times * 100, 3000);
console.log(`Redis connection attempt ${times} failed. Retrying in ${delay}ms...`);
return delay;
},
maxRetriesPerRequest: 5,
enableReadyCheck: true,
connectTimeout: 10000,
function createClient() {
return new RedisClient(redisUrl, {
autoReconnect: true,
});
}
export const redis = createClient();
export const redisPublisher = createClient();
export const redisSubscriber = createClient();
redis.onconnect = () => console.log("Connected to Redis server");
redis.onclose = (err) => {
if (err) console.error("Disconnected from Redis server:", err);
};
export const redis = new Redis(redisUrl, redisOptions);
export const redisPublisher = new Redis(redisUrl, redisOptions); // For publishing
export const redisSubscriber = new Redis(redisUrl, redisOptions); // For subscribing
// Log connection events
redis.on('connect', () => console.log('Redis client connected'));
redis.on('error', (err) => console.error('Redis client error:', err));
redis.on('ready', () => console.log('Redis client ready'));
redis.on('reconnecting', () => console.log('Redis client reconnecting...'));