Desarrollo
Guía para contribuir al proyecto Hytale Server.
Requisitos
- Node.js 25+
- pnpm
- Docker y Docker Compose
- Git
Estructura del Proyecto
hytale-server/
├── Dockerfile # Contenedor del servidor (Java)
├── entrypoint.sh # Script de inicio
├── docker-compose.yml # Producción
├── docker-compose.dev.yml # Desarrollo
└── panel/
├── Dockerfile # Panel producción
├── Dockerfile.dev # Panel desarrollo
├── backend/ # Express + Socket.IO
│ ├── src/
│ │ ├── config/ # Configuración
│ │ ├── middleware/ # Autenticación JWT
│ │ ├── routes/ # API REST
│ │ ├── services/ # Docker, archivos, mods
│ │ └── socket/ # Handlers WebSocket
│ └── __tests__/ # Tests Jest
└── frontend/ # Svelte 5 + Vite
└── src/
└── lib/
├── components/ # Componentes UI
├── stores/ # Stores Svelte
├── services/ # Cliente API
└── i18n/ # TraduccionesConfiguración de Desarrollo
Con Docker (Recomendado)
bash
git clone https://github.com/ketbome/hytale-server.git
cd hytale-server
docker compose -f docker-compose.dev.yml up --buildSin Docker
bash
cd panel
# Instalar dependencias
cd backend && pnpm install && cd ..
cd frontend && pnpm install && cd ..
# Iniciar servidores de desarrollo
pnpm devStack Tecnológico
Backend
- Node.js 25 (Alpine)
- Express 5 + Socket.IO 4
- TypeScript 5.9 (modo estricto)
- pnpm como gestor de paquetes
- Jest + ts-jest para testing
- Biome para linting
Frontend
- Svelte 5 con runes
- Vite 6 bundler
- TypeScript modo estricto
- svelte-i18n para traducciones
- Biome + Knip para calidad de código
Patrones de Código
Servicios Backend
typescript
// Los servicios retornan objetos de resultado consistentes
async function hacerAlgo(): Promise<OperationResult> {
try {
// lógica
return { success: true, data };
} catch (e) {
return { success: false, error: (e as Error).message };
}
}
// Imports ESM con extensión .js
import config from './config/index.js';
import * as docker from './services/docker.js';Frontend (Svelte 5 Runes)
svelte
<script lang="ts">
// Props
let { title, onClick }: { title: string; onClick: () => void } = $props();
// Estado reactivo
let count = $state(0);
// Valores derivados
let doubled = $derived(count * 2);
// Efectos secundarios
$effect(() => {
console.log('Count cambió:', count);
});
</script>Patrones Prohibidos
Nunca uses sintaxis de Svelte deprecada:
svelte
<!-- NO USES -->
export let prop; // Usa $props()
$: derived = value * 2; // Usa $derived()
$: { sideEffect(); } // Usa $effect()
onMount(() => {}); // Usa $effect()Testing
bash
cd panel/backend
pnpm test # Ejecutar todos los tests
pnpm test:watch # Modo watch
pnpm test:coverage # Con coberturaCalidad de Código
bash
# Verificación de tipos
cd panel/backend && pnpm check
cd panel/frontend && pnpm check
# Linting
cd panel/backend && pnpm lint
cd panel/frontend && pnpm lint
# Detección de código muerto
cd panel/frontend && pnpm knipAgregar Funcionalidades
Nuevo Evento Socket
- Añade handler en
panel/backend/src/socket/handlers.ts - Añade tipos si es necesario
- Añade listener en
panel/frontend/src/lib/services/socketClient.ts
Nueva Traducción
- Añade clave a todos los archivos en
panel/frontend/src/lib/i18n/locales/ - Usa
$_('nombreClave')en componentes
Nuevo Store
- Crea archivo en
panel/frontend/src/lib/stores/ - Usa
writable<Type>()con TypeScript - Exporta desde
panel/frontend/src/lib/stores/index.ts
Checklist para Pull Request
- [ ] TypeScript compila sin errores
- [ ] Tests pasan
- [ ] Linter pasa
- [ ] Traducciones añadidas para nuevo texto UI
- [ ] Documentación actualizada si es necesario
