mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-26 09:52:11 +03:00
feat: OmniRoute v1.0.0 — Intelligent AI Gateway & Universal LLM Proxy
OmniRoute is an intelligent API gateway that unifies 20+ AI providers behind a single OpenAI-compatible endpoint. Features include intelligent routing with 6 strategies, multi-format translation (OpenAI/Claude/Gemini/Responses API), circuit breakers, semantic caching, combo fallback chains, real-time health monitoring, and a full dashboard with provider management, analytics, and CLI tool integration. Key highlights: - 20+ providers (Claude Code, Codex, Gemini CLI, GitHub Copilot, iFlow, Qwen, Kiro, etc.) - 6 routing strategies (Fill First, Round Robin, P2C, Random, Least Used, Cost Optimized) - Export/Import database backup with full archive support - Translator Playground with 4 modes (Playground, Chat Tester, Test Bench, Live Monitor) - 100% TypeScript across src/ and open-sse/ - Docker support with multi-stage builds - Comprehensive documentation and 9 dashboard screenshots
This commit is contained in:
104
scripts/prepublish.mjs
Normal file
104
scripts/prepublish.mjs
Normal file
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* OmniRoute — Prepublish Build Script
|
||||
*
|
||||
* Builds the Next.js app in standalone mode and copies output
|
||||
* into the `app/` directory that gets published to npm.
|
||||
*
|
||||
* Run with: node scripts/prepublish.mjs
|
||||
*/
|
||||
|
||||
import { execSync } from "node:child_process";
|
||||
import { existsSync, mkdirSync, cpSync, rmSync, writeFileSync, readFileSync } from "node:fs";
|
||||
import { join, dirname } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
const ROOT = join(__dirname, "..");
|
||||
|
||||
const APP_DIR = join(ROOT, "app");
|
||||
|
||||
console.log("🔨 OmniRoute — Building for npm publish...\n");
|
||||
|
||||
// ── Step 1: Clean previous app/ directory ──────────────────
|
||||
if (existsSync(APP_DIR)) {
|
||||
console.log(" 🧹 Cleaning previous app/ directory...");
|
||||
rmSync(APP_DIR, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
// ── Step 2: Install dependencies ───────────────────────────
|
||||
console.log(" 📦 Installing dependencies...");
|
||||
execSync("npm install", { cwd: ROOT, stdio: "inherit" });
|
||||
|
||||
// ── Step 3: Build Next.js ──────────────────────────────────
|
||||
console.log(" 🏗️ Building Next.js (standalone)...");
|
||||
execSync("npx next build --webpack", { cwd: ROOT, stdio: "inherit" });
|
||||
|
||||
// ── Step 4: Verify standalone output ───────────────────────
|
||||
const standaloneDir = join(ROOT, ".next", "standalone");
|
||||
const serverJs = join(standaloneDir, "server.js");
|
||||
|
||||
if (!existsSync(serverJs)) {
|
||||
console.error("\n ❌ Standalone build not found at:", standaloneDir);
|
||||
console.error(" Make sure next.config.mjs has: output: 'standalone'");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// ── Step 5: Copy standalone output to app/ ─────────────────
|
||||
console.log(" 📋 Copying standalone build to app/...");
|
||||
mkdirSync(APP_DIR, { recursive: true });
|
||||
cpSync(standaloneDir, APP_DIR, { recursive: true });
|
||||
|
||||
// ── Step 6: Copy static assets ─────────────────────────────
|
||||
const staticSrc = join(ROOT, ".next", "static");
|
||||
const staticDest = join(APP_DIR, ".next", "static");
|
||||
if (existsSync(staticSrc)) {
|
||||
console.log(" 📋 Copying static assets...");
|
||||
mkdirSync(staticDest, { recursive: true });
|
||||
cpSync(staticSrc, staticDest, { recursive: true });
|
||||
}
|
||||
|
||||
// ── Step 7: Copy public/ assets ────────────────────────────
|
||||
const publicSrc = join(ROOT, "public");
|
||||
const publicDest = join(APP_DIR, "public");
|
||||
if (existsSync(publicSrc)) {
|
||||
console.log(" 📋 Copying public/ assets...");
|
||||
mkdirSync(publicDest, { recursive: true });
|
||||
cpSync(publicSrc, publicDest, { recursive: true });
|
||||
}
|
||||
|
||||
// ── Step 8: Copy MITM cert utilities (if needed) ───────────
|
||||
const mitmSrc = join(ROOT, "src", "mitm");
|
||||
const mitmDest = join(APP_DIR, "src", "mitm");
|
||||
if (existsSync(mitmSrc)) {
|
||||
console.log(" 📋 Copying MITM utilities...");
|
||||
mkdirSync(mitmDest, { recursive: true });
|
||||
cpSync(mitmSrc, mitmDest, { recursive: true });
|
||||
}
|
||||
|
||||
// ── Step 9: Copy shared utilities needed at runtime ────────
|
||||
const sharedApiKey = join(ROOT, "src", "shared", "utils", "apiKey.js");
|
||||
const sharedApiKeyDest = join(APP_DIR, "src", "shared", "utils");
|
||||
if (existsSync(sharedApiKey)) {
|
||||
console.log(" 📋 Copying shared utilities...");
|
||||
mkdirSync(sharedApiKeyDest, { recursive: true });
|
||||
cpSync(sharedApiKey, join(sharedApiKeyDest, "apiKey.js"));
|
||||
}
|
||||
|
||||
// ── Step 10: Ensure data/ directory exists ──────────────────
|
||||
mkdirSync(join(APP_DIR, "data"), { recursive: true });
|
||||
|
||||
// ── Done ───────────────────────────────────────────────────
|
||||
const appPkg = join(APP_DIR, "package.json");
|
||||
if (existsSync(appPkg)) {
|
||||
const pkg = JSON.parse(readFileSync(appPkg, "utf8"));
|
||||
console.log(`\n ✅ Build complete!`);
|
||||
console.log(` App directory: app/`);
|
||||
console.log(` Server entry: app/server.js`);
|
||||
} else {
|
||||
console.log(`\n ✅ Build complete! (app/ ready for publish)`);
|
||||
}
|
||||
|
||||
console.log("");
|
||||
Reference in New Issue
Block a user