baraqex
Version:
A powerful full-stack framework for modern web development
596 lines (456 loc) โข 13.8 kB
Markdown
# Baraqex ๐
A powerful, modern JavaScript/TypeScript framework for building universal web applications with seamless WebAssembly integration, server-side rendering, and full-stack capabilities.
## โจ Features
### ๐ฏ Core Features
- **Universal JSX Support** - Modern React-like components without dependencies
- **WebAssembly Integration** - Seamless Go WASM support for both browser and Node.js
- **Server-Side Rendering** - Built-in SSR with hydration support
- **Full-Stack Framework** - Complete backend server with API routes
- **TypeScript First** - Full TypeScript support with excellent IntelliSense
- **Zero Dependencies** - Lightweight core with optional features
### ๐ WebAssembly Features
- **Browser WASM** - Load and execute Go WASM modules in the browser
- **Server WASM** - Run Go WASM functions in Node.js environment
- **Unified API** - Identical interface for browser and server environments
- **Hot Reloading** - Development support with fast refresh
### ๐ง Backend Features
- **Express Integration** - Built on Express.js for reliability
- **API Routes** - File-based API routing system
- **Authentication** - JWT-based auth with middleware support
- **Database Support** - MongoDB, MySQL, PostgreSQL adapters
- **Static Serving** - Efficient static file serving
## ๐ฆ Installation
```bash
npm install baraqex
```
## ๐ Quick Start
### Frontend Usage
```javascript
import { jsx, useState } from 'baraqex';
import { loadGoWasm, callWasmFunction } from 'baraqex';
function App() {
const [count, setCount] = useState(0);
const [wasmReady, setWasmReady] = useState(false);
// Load WebAssembly module
useEffect(() => {
async function initWasm() {
await loadGoWasm('/app.wasm');
setWasmReady(true);
}
initWasm();
}, []);
const handleCalculate = () => {
if (wasmReady) {
// Call Go WASM function
const result = callWasmFunction('calculate', count);
console.log('WASM result:', result);
}
};
return (
<div>
<h1>Baraqex App</h1>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
<button onClick={handleCalculate} disabled={!wasmReady}>
Calculate with WASM
</button>
</div>
);
}
export default App;
```
### Server Usage
```javascript
import { createServer } from 'baraqex/server';
import { loadGoWasmFromFile, callWasmFunction } from 'baraqex/server';
// Create server
const server = createServer({
port: 3000,
apiDir: './api',
pagesDir: './pages',
staticDir: './public'
});
// Load WASM for server-side processing
async function initServerWasm() {
await loadGoWasmFromFile('./compute.wasm');
console.log('Server WASM ready!');
}
// Start server
server.start().then(() => {
console.log('Server running on http://localhost:3000');
initServerWasm();
});
```
## ๐ Documentation
### WebAssembly Integration
#### Browser WASM
```javascript
import { loadGoWasm, callWasmFunction, isWasmReady, getWasmFunctions } from 'baraqex';
// Load WASM module
await loadGoWasm('/example.wasm', {
debug: true,
onLoad: (instance) => {
console.log('WASM loaded!', instance);
}
});
// Check if ready
if (isWasmReady()) {
// Get available functions
const functions = getWasmFunctions();
console.log('Available functions:', functions);
// Call functions
const greeting = callWasmFunction('goHello', 'World');
const sum = callWasmFunction('goAdd', 10, 20);
const fibonacci = callWasmFunction('goFibonacci', 10);
}
```
#### Server WASM
```javascript
import { loadGoWasmFromFile, callWasmFunction } from 'baraqex/server';
// Load WASM from file
await loadGoWasmFromFile('./example.wasm', {
debug: true,
goWasmPath: './wasm_exec.cjs'
});
// Use identical API as browser
const result = callWasmFunction('goCalculate', 42);
```
#### Go WASM Example
```go
// main.go
package main
import (
"fmt"
"syscall/js"
)
func goHello(this js.Value, args []js.Value) interface{} {
name := args[0].String()
return fmt.Sprintf("Hello, %s from Go WASM!", name)
}
func goAdd(this js.Value, args []js.Value) interface{} {
a := args[0].Float()
b := args[1].Float()
return a + b
}
func main() {
// Register functions
js.Global().Set("goHello", js.FuncOf(goHello))
js.Global().Set("goAdd", js.FuncOf(goAdd))
fmt.Println("Go WASM ready!")
// Keep running
select {}
}
```
Build with:
```bash
GOOS=js GOARCH=wasm go build -o example.wasm main.go
```
### Server-Side Rendering
#### Page Components
```javascript
// pages/index.js
import { jsx } from 'baraqex';
export default function HomePage(props) {
return (
<html>
<head>
<title>My App</title>
</head>
<body>
<h1>Welcome to Baraqex!</h1>
<p>Server time: {props.api.serverTime}</p>
</body>
</html>
);
}
// Optional: Add metadata
HomePage.getTitle = (props) => 'Home - My App';
HomePage.getDescription = (props) => 'Welcome to my application';
```
#### API Routes
```javascript
// api/users.js
export async function get(req, res) {
// GET /api/users
const users = await getUsersFromDatabase();
res.json({ users });
}
export async function post(req, res) {
// POST /api/users
const newUser = await createUser(req.body);
res.json({ user: newUser });
}
// api/users/[id].js
export async function get(req, res) {
// GET /api/users/:id
const user = await getUserById(req.params.id);
res.json({ user });
}
```
### Database Integration
```javascript
import { Database } from 'baraqex/server';
// MongoDB
const db = new Database({
type: 'mongodb',
url: 'mongodb://localhost:27017/myapp'
});
await db.connect();
const collection = db.getMongoDb().collection('users');
// MySQL
const db = new Database({
type: 'mysql',
url: 'mysql://user:pass@localhost:3306/myapp'
});
await db.connect();
const users = await db.query('SELECT * FROM users WHERE active = ?', [true]);
// PostgreSQL
const db = new Database({
type: 'postgres',
url: 'postgresql://user:pass@localhost:5432/myapp'
});
await db.connect();
const result = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
```
### Authentication
```javascript
import { AuthService } from 'baraqex/server';
const auth = new AuthService({
secret: 'your-secret-key',
expiresIn: '24h'
});
// In your API routes
export async function post(req, res) {
const { username, password } = req.body;
// Validate user
const user = await validateUser(username, password);
if (!user) {
return res.status(401).json({ error: 'Invalid credentials' });
}
// Generate token
const token = auth.generateToken(user);
res.json({ token, user });
}
// Protected route
export const middleware = [auth.requireAuth()];
export async function get(req, res) {
// req.user is available
res.json({ user: req.user });
}
```
## ๐ ๏ธ Development
### Project Structure
```
my-app/
โโโ src/
โ โโโ pages/ # SSR pages
โ โ โโโ index.js # Home page
โ โ โโโ about.js # About page
โ โโโ api/ # API routes
โ โ โโโ users.js # /api/users
โ โ โโโ auth/ # /api/auth/*
โ โโโ components/ # Reusable components
โโโ public/ # Static files
โ โโโ app.wasm # WebAssembly modules
โ โโโ styles.css # Stylesheets
โโโ wasm/ # Go WASM source
โ โโโ main.go # Go functions
โโโ package.json
```
### Build Scripts
```json
{
"scripts": {
"dev": "baraqex dev",
"build": "baraqex build",
"start": "baraqex start",
"build:wasm": "GOOS=js GOARCH=wasm go build -o public/app.wasm wasm/main.go"
}
}
```
### Development Server
```javascript
import { createDevServer } from 'baraqex/server';
const server = createDevServer({
port: 3000,
enableCors: true
});
// Enable SSR with hot reloading
server.enableSSR({ hydratable: true });
await server.start();
```
## ๐ง Configuration
### Server Configuration
```javascript
import { createServer } from 'baraqex/server';
const server = createServer({
port: process.env.PORT || 3000,
apiDir: './src/api',
pagesDir: './src/pages',
staticDir: './public',
enableCors: true,
corsOptions: {
origin: ['http://localhost:3000'],
credentials: true
},
db: {
type: 'mongodb',
url: process.env.DATABASE_URL
},
auth: {
secret: process.env.JWT_SECRET,
expiresIn: '7d'
}
});
```
### WASM Configuration
```javascript
// Browser
await loadGoWasm('/app.wasm', {
debug: process.env.NODE_ENV === 'development',
importObject: {
// Custom WASM imports
},
onLoad: (instance) => {
console.log('WASM loaded with exports:', instance.exports);
}
});
// Server
await loadGoWasmFromFile('./app.wasm', {
debug: true,
goWasmPath: './wasm_exec.cjs'
});
```
## ๐ Performance
### WebAssembly Benefits
- **Near-native performance** for compute-intensive tasks
- **Memory efficiency** with direct memory access
- **Parallel processing** capabilities
- **Type safety** with compiled languages
### Server Optimizations
- **Built-in caching** for static assets
- **Compression** support (gzip, brotli)
- **HTTP/2** ready
- **Cluster mode** for production
## ๐งช Testing
### Complete Test Suite
```bash
# Run all tests (builds project first)
npm test
# Run server function tests only
npm run test:server
# Run WASM integration tests only
npm run test:wasm
```
### WASM Testing
```javascript
// test-wasm.js
import { loadGoWasmFromFile, callWasmFunction } from 'baraqex/server';
async function testWasm() {
await loadGoWasmFromFile('./example.wasm');
// Test functions
const greeting = callWasmFunction('goHello', 'Test');
console.assert(greeting.includes('Test'), 'Hello function works');
const sum = callWasmFunction('goAdd', 5, 3);
console.assert(sum === 8, 'Add function works');
console.log('All WASM tests passed!');
}
testWasm();
```
### Server Testing
```javascript
import request from 'supertest';
import { createServer } from 'baraqex/server';
const server = createServer();
const app = server.getExpressApp();
describe('API Routes', () => {
test('GET /api/users', async () => {
const response = await request(app)
.get('/api/users')
.expect(200);
expect(response.body).toHaveProperty('users');
});
});
```
### Test Results
The test suite covers:
- โ
**Server Creation** - Basic server setup and configuration
- โ
**Database Connections** - MongoDB, MySQL, PostgreSQL adapters
- โ
**Authentication** - JWT token generation and validation
- โ
**WebAssembly Integration** - Go WASM loading and function calls
- โ
**API Routes** - Dynamic route registration and handling
- โ
**Server Utilities** - Helper functions and middleware
- โ
**Template Generation** - HTML document and error page creation
## ๐ Deployment
### Production Build
```bash
# Build WASM modules
npm run build:wasm
# Build application
npm run build
# Start production server
npm start
```
### Docker Deployment
```dockerfile
FROM node:18-alpine
WORKDIR /app
# Install Go for WASM building
RUN apk add --no-cache go
# Copy package files
COPY package*.json ./
RUN npm ci --only=production
# Copy source
COPY . .
# Build WASM
RUN npm run build:wasm
# Build app
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
```
### Environment Variables
```bash
# Server
PORT=3000
NODE_ENV=production
# Database
DATABASE_URL=mongodb://localhost:27017/myapp
# Authentication
JWT_SECRET=your-super-secret-key
# WASM
WASM_DEBUG=false
```
## ๐ค Contributing
1. Fork the repository
2. Create a feature branch: `git checkout -b feature/amazing-feature`
3. Make changes and add tests
4. Commit: `git commit -m 'Add amazing feature'`
5. Push: `git push origin feature/amazing-feature`
6. Submit a Pull Request
## ๐ License
MIT License - see the [LICENSE](LICENSE) file for details.
## ๐ Support
- **Documentation**: [www.baraqex.tech](https://www.baraqex.tech)
- **Website**: [www.baraqex.tech](https://www.baraqex.tech)
- **Issues**: [GitHub Issues](https://github.com/hamroun/baraqex/issues)
- **Discussions**: [GitHub Discussions](https://github.com/hamroun/baraqex/discussions)
- **Discord**: [Join our community](https://discord.gg/baraqex)
## ๐ฏ Examples
Check out the [examples directory](./examples) for complete sample applications:
- **Basic WASM App** - Simple calculator with Go WASM
- **Full-Stack Todo** - Complete CRUD app with auth
- **Real-time Chat** - WebSocket integration
- **E-commerce Site** - Complex SSR application
- **Data Visualization** - WASM-powered charts
## ๐ Related Projects
- **Go WASM Runtime**: Standard Go WebAssembly support
- **Express.js**: The underlying server framework
- **TypeScript**: Type safety and developer experience
- **Official Website**: [www.baraqex.tech](https://www.baraqex.tech)
---
**Made with โค๏ธ by the Baraqex team**
*Build universal, high-performance web applications with the power of WebAssembly and modern JavaScript.*
**Learn more at [www.baraqex.tech](https://www.baraqex.tech)**