jerkjs 2.1.7 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/README.md +204 -4
- package/README_EN.md +1 -1
- package/README_PT.md +1 -1
- package/docs/ARQUITECTURA_ROUTES.md +84 -38
- package/{JERK_FRAMEWORK_DOCUMENTATION.md → docs/JERK_FRAMEWORK_DOCUMENTATION.md} +28 -2
- package/docs/JERK_MODELOS_HOWTO.md +566 -0
- package/index.js +41 -5
- package/jerk-qbuilder/CHANGELOG.md +71 -0
- package/jerk-qbuilder/HOWTO.md +325 -0
- package/jerk-qbuilder/README.md +52 -0
- package/lib/core/server.js +328 -27
- package/lib/loader/routeLoader.js +148 -117
- package/lib/mvc/GenericAdapter.js +136 -0
- package/lib/mvc/MariaDBAdapter.js +315 -0
- package/lib/mvc/MemoryAdapter.js +269 -0
- package/lib/mvc/ModelControllerExample.js +285 -0
- package/lib/mvc/controllerBase.js +77 -0
- package/lib/mvc/modelBase.js +383 -0
- package/lib/mvc/modelManager.js +284 -0
- package/lib/mvc/userModel.js +265 -0
- package/lib/mvc/viewEngine.js +32 -1
- package/lib/query/MariaDBAdapter.js +78 -0
- package/lib/query/consoleAdapter.js +184 -0
- package/lib/query/queryBuilder.js +953 -0
- package/lib/query/queryBuilderHooks.js +455 -0
- package/lib/query/queryBuilderMiddleware.js +332 -0
- package/lib/utils/mimeType.js +62 -0
- package/package.json +5 -3
- package/utils/find_file_path.sh +36 -0
- package/BUG_REPORTE_COMPRESION.txt +0 -72
- package/standard/CompressionTestController.js +0 -56
- package/standard/HealthController.js +0 -16
- package/standard/HomeController.js +0 -12
- package/standard/ProductController.js +0 -18
- package/standard/README.md +0 -47
- package/standard/UserController.js +0 -23
- package/standard/package.json +0 -22
- package/standard/routes.json +0 -65
- package/standard/server.js +0 -140
- package/standardA/controllers/AuthController.js +0 -82
- package/standardA/controllers/HomeController.js +0 -19
- package/standardA/controllers/UserController.js +0 -41
- package/standardA/server.js +0 -311
- package/standardA/views/auth/dashboard.html +0 -51
- package/standardA/views/auth/login.html +0 -47
- package/standardA/views/index.html +0 -32
- package/standardA/views/users/detail.html +0 -28
- package/standardA/views/users/list.html +0 -36
- /package/{JERK_FRAMEWORK_DIAGRAM.txt → docs/JERK_FRAMEWORK_DIAGRAM.txt} +0 -0
- /package/{JERK_FRAMEWORK_DIAGRAM_MERMAID.mmd → docs/JERK_FRAMEWORK_DIAGRAM_MERMAID.mmd} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,61 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## v2.3.0 - 21 de enero de 2026
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **QueryBuilder principal**: Implementación completa del QueryBuilder con API fluida para construir consultas SQL complejas de manera segura
|
|
7
|
+
- **Método setAdapter()**: Implementación del método `setAdapter(adapter)` para configurar dinámicamente cualquier adaptador de base de datos
|
|
8
|
+
- **Adaptador MariaDB**: Implementación del adaptador para MariaDB/MySQL con conexión mediante pool de conexiones
|
|
9
|
+
- **Adaptador de Consola**: Adaptador de ejemplo para mostrar consultas SQL por consola, útil para pruebas y desarrollo
|
|
10
|
+
- **Middleware de Integración**: Sistema completo para inyectar QueryBuilder en solicitudes HTTP con soporte para configuración de adaptadores, registro de consultas y reglas de seguridad
|
|
11
|
+
- **Sistema de Hooks**: Integración completa con el sistema de hooks de JERK para eventos del QueryBuilder, auditoría de consultas y aplicación de reglas de seguridad
|
|
12
|
+
- **Arquitectura modular**: Estructura de archivos separados para cada componente del QueryBuilder, con dependencias claras entre módulos
|
|
13
|
+
- **Seguridad mejorada**: Prevención de inyección SQL mediante el uso de parámetros y sistema de validación de consultas
|
|
14
|
+
- **Soporte para múltiples operaciones**: Métodos para SELECT, INSERT, UPDATE, DELETE con condiciones WHERE, JOINs, GROUP BY, ORDER BY, LIMIT, OFFSET y funciones de agregación
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
- **Actualización de la versión a 2.3.0**: Debido a la implementación significativa del componente QueryBuilder
|
|
18
|
+
- **Exportaciones del framework actualizadas**: Se han añadido las nuevas exportaciones del QueryBuilder en el archivo principal index.js
|
|
19
|
+
- **Documentación actualizada**: Se ha añadido una nueva sección en la documentación principal sobre el uso del QueryBuilder
|
|
20
|
+
|
|
21
|
+
## v2.2.1 - 20 de enero de 2026
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- **Mejora en el método loadModel()**: Se ha actualizado la lógica de búsqueda de modelos para probar múltiples rutas posibles donde podrían estar ubicados los modelos, incluyendo './models/', '../models/', '../../models/', '../../../models/' y rutas sin subdirectorios
|
|
25
|
+
- **Manejo de errores mejorado**: Se ha implementado un sistema que captura los errores de cada intento de carga y solo lanza un error final si no se encuentra el modelo en ninguna ubicación
|
|
26
|
+
- **Soporte para carga perezosa de modelos**: Se ha implementado un sistema de carga perezosa para que los modelos se carguen solo cuando se necesiten, evitando problemas de inicialización temprana
|
|
27
|
+
|
|
28
|
+
## v2.2.0 - 20 de enero de 2026
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
- **Arquitectura completa de modelos (MVC)**: Se ha implementado la capa de modelos para completar el patrón MVC, incluyendo ModelBase, ModelManager y modelos específicos
|
|
32
|
+
- **Sistema de adaptadores de base de datos**: Se ha creado un sistema flexible de adaptadores que permite conectar con diferentes tipos de bases de datos (MariaDB, MySQL, memoria, etc.)
|
|
33
|
+
- **Nuevo adaptador MariaDB**: Se ha implementado un adaptador específico para conexión a bases de datos MariaDB/MySQL
|
|
34
|
+
- **Modelos específicos**: Se han creado modelos específicos para diferentes entidades con métodos especializados para consultas complejas
|
|
35
|
+
- **Integración con sistema de hooks**: Los modelos participan en el sistema de hooks del framework para extensibilidad
|
|
36
|
+
- **Comunicación bidireccional entre modelos y controladores**: Se ha implementado un sistema para que modelos y controladores se comuniquen entre sí
|
|
37
|
+
- **Soporte para consultas avanzadas**: Los modelos incluyen soporte para paginación, filtros, búsqueda global y operaciones CRUD completas
|
|
38
|
+
- **Validación de datos en modelos**: Se ha implementado un sistema de validación de datos específico para cada modelo
|
|
39
|
+
- **Helper loadModel en ControllerBase**: Se ha añadido el método loadModel() para facilitar la carga de modelos en los controladores
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
- **Actualización de la versión a 2.2.0**: Debido a la implementación significativa de la arquitectura de modelos
|
|
43
|
+
- **Refactorización de componentes existentes**: Se han actualizado controladores y otros componentes para integrarse con la nueva arquitectura de modelos
|
|
44
|
+
- **Mejora en la estructura interna**: La arquitectura ahora sigue completamente el patrón MVC
|
|
45
|
+
|
|
46
|
+
## v2.1.8 - 20 de enero de 2026
|
|
47
|
+
|
|
48
|
+
### Added
|
|
49
|
+
- **Soporte completo para rutas estáticas**: Se ha implementado soporte completo para servir archivos estáticos desde rutas definidas en `routes.json` o mediante el método `addRoute()`
|
|
50
|
+
- **Sistema de hooks para rutas estáticas**: Se han añadido múltiples hooks para rastrear el flujo completo de archivos estáticos
|
|
51
|
+
- **Sistema de logging para hooks**: Se ha implementado un sistema de logging que registra todos los eventos de hooks en un archivo
|
|
52
|
+
- **Soporte para layouts en ViewEngine**: Se ha añadido soporte para layouts con placeholder `{{content}}` en el sistema de vistas
|
|
53
|
+
- **Mejoras en el sistema de enrutamiento**: Se han añadido mejoras para reconocer correctamente rutas estáticas como prefijos
|
|
54
|
+
|
|
55
|
+
### Changed
|
|
56
|
+
- **Actualización de documentación**: Se ha actualizado la documentación para reflejar las nuevas funcionalidades de rutas estáticas
|
|
57
|
+
- **Optimización del sistema de rutas**: Mejora en la lógica de coincidencia de rutas para soportar rutas estáticas como prefijos
|
|
58
|
+
|
|
3
59
|
## v2.1.7 - 19 de enero de 2026
|
|
4
60
|
|
|
5
61
|
### Correcciones
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# JERK Framework v2.
|
|
1
|
+
# JERK Framework v2.3.0
|
|
2
2
|
|
|
3
3
|

|
|
4
4
|
|
|
@@ -12,6 +12,8 @@ Nuestro Starter Kit en `@standard/server.js` es la forma más rápida de comenza
|
|
|
12
12
|
- Sistema de controladores preconfigurado
|
|
13
13
|
- Middlewares esenciales ya integrados (autenticación, CORS, compresión, firewall, etc.)
|
|
14
14
|
- Sistema de logging y manejo de errores implementado
|
|
15
|
+
- **NUEVO: Arquitectura completa MVC con modelos y soporte para bases de datos**
|
|
16
|
+
- **NUEVO: QueryBuilder con API fluida para consultas SQL seguras y eficientes**
|
|
15
17
|
|
|
16
18
|
**Cómo comenzar:**
|
|
17
19
|
1. Edita el archivo `routes.json` para definir tus rutas y asociarlas a tus controladores
|
|
@@ -49,10 +51,61 @@ class HomeController {
|
|
|
49
51
|
module.exports = new HomeController();
|
|
50
52
|
```
|
|
51
53
|
|
|
52
|
-
3. ¡Tu aplicación estará
|
|
54
|
+
3. ¡Tu aplicación estará listo para usar!
|
|
53
55
|
|
|
54
56
|
El Starter Kit incluye controladores de ejemplo para que puedas ver cómo funciona el sistema.
|
|
55
57
|
|
|
58
|
+
## Ejemplo de Rutas Estáticas
|
|
59
|
+
|
|
60
|
+
Desde la versión 2.1.8, JERK Framework soporta rutas estáticas para servir archivos desde directorios locales:
|
|
61
|
+
|
|
62
|
+
### En routes.json:
|
|
63
|
+
```json
|
|
64
|
+
[
|
|
65
|
+
{
|
|
66
|
+
"path": "/static",
|
|
67
|
+
"method": "GET",
|
|
68
|
+
"static": {
|
|
69
|
+
"dir": "./public",
|
|
70
|
+
"index": ["index.html", "index.htm"],
|
|
71
|
+
"cacheControl": "public, max-age=3600"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"path": "/assets",
|
|
76
|
+
"method": "GET",
|
|
77
|
+
"static": {
|
|
78
|
+
"dir": "./public",
|
|
79
|
+
"index": [],
|
|
80
|
+
"cacheControl": "public, max-age=86400"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Usando addRoute():
|
|
87
|
+
```javascript
|
|
88
|
+
// Ruta estática para servir archivos desde ./public
|
|
89
|
+
server.addRoute({
|
|
90
|
+
method: 'GET',
|
|
91
|
+
path: '/static',
|
|
92
|
+
static: {
|
|
93
|
+
dir: './public',
|
|
94
|
+
index: ['index.html'],
|
|
95
|
+
cacheControl: 'public, max-age=3600'
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Ruta estática para servir archivos JS, CSS e imágenes
|
|
100
|
+
server.addRoute('GET', '/assets', {
|
|
101
|
+
static: {
|
|
102
|
+
dir: './public/assets',
|
|
103
|
+
index: [],
|
|
104
|
+
cacheControl: 'public, max-age=86400'
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
56
109
|
Visita nuestra página web: https://jerk.page.gd/
|
|
57
110
|
Repositorio oficial: https://gitlab.com/bytedogssyndicate1/jerk/
|
|
58
111
|
|
|
@@ -60,10 +113,10 @@ Repositorio oficial: https://gitlab.com/bytedogssyndicate1/jerk/
|
|
|
60
113
|
|
|
61
114
|
- **Arquitectura Modular**: Componentes independientes para mayor flexibilidad
|
|
62
115
|
- **Seguridad Avanzada**: Firewall integrado (WAF) con detección de ataques
|
|
63
|
-
- **Sistema de Hooks**: Similar al sistema de WordPress para
|
|
116
|
+
- **Sistema de Hooks**: Similar al sistema de WordPress para extensibility
|
|
64
117
|
- **Autenticación Flexible**: Soporte para JWT, API Keys, Basic Auth, OAuth2, OpenID Connect
|
|
65
118
|
- **Almacenamiento de Tokens**: Soporte para memoria, JSON, SQLite y MariaDB
|
|
66
|
-
- **Enrutamiento Avanzado**: Soporte para rutas parametrizadas y
|
|
119
|
+
- **Enrutamiento Avanzado**: Soporte para rutas parametrizadas, anidadas y estáticas
|
|
67
120
|
- **Soporte para Frontend**: Capacidad de servir contenido HTML y otros tipos de contenido
|
|
68
121
|
- **Configuración de Content-Type**: Especificación de headers Content-Type en routes.json
|
|
69
122
|
- **Middlewares Integrados**: CORS, rate limiting, compresión, firewall, etc.
|
|
@@ -71,6 +124,11 @@ Repositorio oficial: https://gitlab.com/bytedogssyndicate1/jerk/
|
|
|
71
124
|
- **Carga de Rutas**: Definición de rutas desde archivos JSON
|
|
72
125
|
- **Sistema de Sesiones**: Gestión completa de sesiones con soporte para autenticación
|
|
73
126
|
- **Motor de Plantillas MVC**: Sistema profesional de vistas con soporte para filtros, helpers y hooks
|
|
127
|
+
- **Arquitectura de Modelos Completa (MVC)**: Capa de modelos para la lógica de negocio y acceso a datos
|
|
128
|
+
- **Sistema de Adaptadores de Base de Datos**: Soporte para múltiples motores de base de datos (MariaDB, MySQL, etc.)
|
|
129
|
+
- **QueryBuilder con API Fluida**: Interfaz para construir consultas SQL complejas de manera segura y eficiente
|
|
130
|
+
- **Middleware de QueryBuilder**: Sistema para inyectar QueryBuilder en solicitudes HTTP con soporte para hooks
|
|
131
|
+
- **Servicio de Archivos Estáticos**: Soporte para servir archivos desde directorios locales con configuración flexible
|
|
74
132
|
- **Extensibilidad**: Sistema de hooks y filters para personalización
|
|
75
133
|
|
|
76
134
|
## Instalación
|
|
@@ -226,6 +284,148 @@ Las contribuciones son bienvenidas. Por favor, abre un issue o envía un pull re
|
|
|
226
284
|
|
|
227
285
|
Apache 2.0
|
|
228
286
|
|
|
287
|
+
## Arquitectura de Modelos (MVC)
|
|
288
|
+
|
|
289
|
+
JERK Framework v2.2.0 introduce una arquitectura completa de modelos que completa el patrón MVC. Los modelos permiten encapsular la lógica de negocio y el acceso a datos en componentes reutilizables.
|
|
290
|
+
|
|
291
|
+
### Ejemplo de Modelo Simple con MariaDB
|
|
292
|
+
|
|
293
|
+
```javascript
|
|
294
|
+
const { ModelBase, MariaDBAdapter } = require('jerkjs');
|
|
295
|
+
|
|
296
|
+
// Definir un modelo para usuarios
|
|
297
|
+
class UserModel extends ModelBase {
|
|
298
|
+
constructor(options = {}) {
|
|
299
|
+
super({
|
|
300
|
+
...options,
|
|
301
|
+
tableName: options.tableName || 'users'
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
// Definir campos del modelo
|
|
305
|
+
this.fields = {
|
|
306
|
+
id: { type: 'integer', primaryKey: true, autoIncrement: true },
|
|
307
|
+
username: { type: 'string', required: true },
|
|
308
|
+
email: { type: 'string', required: true },
|
|
309
|
+
password: { type: 'string', required: true },
|
|
310
|
+
createdAt: { type: 'datetime', default: 'CURRENT_TIMESTAMP' }
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Método personalizado para encontrar usuario por email
|
|
315
|
+
async findByEmail(email) {
|
|
316
|
+
return await this.findOne({ email });
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Método personalizado para crear usuario con validación
|
|
320
|
+
async createUser(userData) {
|
|
321
|
+
// Validar datos antes de crear
|
|
322
|
+
const validation = this.validate('create', userData);
|
|
323
|
+
if (!validation.isValid) {
|
|
324
|
+
throw new Error(`Validación fallida: ${validation.errors.join(', ')}`);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return await this.create(userData);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Configurar el adaptador de MariaDB
|
|
332
|
+
const dbConfig = {
|
|
333
|
+
host: 'localhost',
|
|
334
|
+
user: 'tu_usuario',
|
|
335
|
+
password: 'tu_contraseña',
|
|
336
|
+
database: 'tu_base_de_datos'
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
const mariaDBAdapter = new MariaDBAdapter(dbConfig);
|
|
340
|
+
|
|
341
|
+
// Crear instancia del modelo con el adaptador
|
|
342
|
+
const userModel = new UserModel({
|
|
343
|
+
adapter: mariaDBAdapter,
|
|
344
|
+
tableName: 'users'
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
// Uso del modelo
|
|
348
|
+
async function ejemploUsoModelo() {
|
|
349
|
+
try {
|
|
350
|
+
// Crear un nuevo usuario
|
|
351
|
+
const nuevoUsuario = await userModel.createUser({
|
|
352
|
+
username: 'juan.perez',
|
|
353
|
+
email: 'juan@example.com',
|
|
354
|
+
password: 'contraseña_segura'
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
console.log('Usuario creado:', nuevoUsuario);
|
|
358
|
+
|
|
359
|
+
// Buscar usuario por email
|
|
360
|
+
const usuario = await userModel.findByEmail('juan@example.com');
|
|
361
|
+
console.log('Usuario encontrado:', usuario);
|
|
362
|
+
} catch (error) {
|
|
363
|
+
console.error('Error:', error.message);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Uso de Modelos en Controladores con loadModel
|
|
369
|
+
|
|
370
|
+
JERK Framework proporciona un helper `loadModel` en el ControllerBase para facilitar la carga y uso de modelos en los controladores:
|
|
371
|
+
|
|
372
|
+
```javascript
|
|
373
|
+
const ControllerBase = require('jerkjs').ControllerBase;
|
|
374
|
+
|
|
375
|
+
class UserController extends ControllerBase {
|
|
376
|
+
constructor() {
|
|
377
|
+
super();
|
|
378
|
+
|
|
379
|
+
// Cargar el modelo de usuario
|
|
380
|
+
this.userModel = this.loadModel('UserModel', {
|
|
381
|
+
// Opciones del modelo
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
async getAllUsers(req, res) {
|
|
386
|
+
try {
|
|
387
|
+
// Usar el modelo para obtener usuarios
|
|
388
|
+
const users = await this.userModel.find({});
|
|
389
|
+
|
|
390
|
+
this.json(res, { success: true, data: users });
|
|
391
|
+
} catch (error) {
|
|
392
|
+
this.json(res, { success: false, error: error.message }, 500);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
async getUserById(req, res) {
|
|
397
|
+
try {
|
|
398
|
+
const userId = req.params.id;
|
|
399
|
+
|
|
400
|
+
// Usar el modelo para encontrar un usuario específico
|
|
401
|
+
const user = await this.userModel.findOne({ id: userId });
|
|
402
|
+
|
|
403
|
+
if (!user) {
|
|
404
|
+
this.json(res, { success: false, error: 'Usuario no encontrado' }, 404);
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
this.json(res, { success: true, data: user });
|
|
409
|
+
} catch (error) {
|
|
410
|
+
this.json(res, { success: false, error: error.message }, 500);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
async createUser(req, res) {
|
|
415
|
+
try {
|
|
416
|
+
// Usar el modelo para crear un nuevo usuario
|
|
417
|
+
const newUser = await this.userModel.createUser(req.body);
|
|
418
|
+
|
|
419
|
+
this.json(res, { success: true, data: newUser }, 201);
|
|
420
|
+
} catch (error) {
|
|
421
|
+
this.json(res, { success: false, error: error.message }, 400);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
module.exports = new UserController();
|
|
427
|
+
```
|
|
428
|
+
|
|
229
429
|
## Documentación del Framework
|
|
230
430
|
|
|
231
431
|
Para una descripción detallada de la arquitectura y componentes del framework, consulta el archivo [JERK_FRAMEWORK_DOCUMENTATION.md](JERK_FRAMEWORK_DOCUMENTATION.md).
|
package/README_EN.md
CHANGED
package/README_PT.md
CHANGED
|
@@ -19,13 +19,15 @@ Componente principal que gestiona las rutas y el ciclo de vida de la solicitud H
|
|
|
19
19
|
- Soporta rutas parametrizadas con conversión a expresiones regulares
|
|
20
20
|
- Mantiene un cache de expresiones regulares para rutas parametrizadas
|
|
21
21
|
- Ejecuta middlewares antes de los handlers de rutas
|
|
22
|
+
- Soporta rutas estáticas para servir archivos desde directorios locales
|
|
22
23
|
|
|
23
24
|
**Método `addRoute`:**
|
|
24
25
|
- Recibe: método HTTP, path y handler
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
26
|
+
- Soporta autenticación por ruta
|
|
27
|
+
- Soporta content-type por ruta
|
|
28
|
+
- Soporta rutas estáticas con propiedad `static`
|
|
29
|
+
- Carga controladores desde archivos externos
|
|
30
|
+
- Registra la ruta en el array
|
|
29
31
|
|
|
30
32
|
### 2. RouteLoader (lib/loader/routeLoader.js)
|
|
31
33
|
|
|
@@ -37,6 +39,7 @@ Componente encargado de cargar rutas desde archivos JSON.
|
|
|
37
39
|
- Carga controladores desde archivos externos
|
|
38
40
|
- Aplica autenticación por ruta
|
|
39
41
|
- Aplica content-type por ruta
|
|
42
|
+
- Soporta rutas estáticas
|
|
40
43
|
- Dispara hooks antes y después de cargar rutas
|
|
41
44
|
- Soporta recarga automática de rutas
|
|
42
45
|
|
|
@@ -45,18 +48,21 @@ Componente encargado de cargar rutas desde archivos JSON.
|
|
|
45
48
|
- Obtiene el handler del controlador
|
|
46
49
|
- Aplica content-type si está especificado
|
|
47
50
|
- Aplica autenticación si está especificada
|
|
51
|
+
- Procesa rutas estáticas si están definidas
|
|
48
52
|
- Integra el handler procesado con el servidor usando `server.addRoute`
|
|
49
53
|
|
|
50
54
|
## Funcionalidades Soportadas por routes.json
|
|
51
55
|
|
|
52
56
|
### 1. Estructura Básica
|
|
53
57
|
```json
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
[
|
|
59
|
+
{
|
|
60
|
+
"path": "/ruta/ejemplo",
|
|
61
|
+
"method": "GET",
|
|
62
|
+
"controller": "./controllers/EjemploController.js",
|
|
63
|
+
"handler": "metodoHandler"
|
|
64
|
+
}
|
|
65
|
+
]
|
|
60
66
|
```
|
|
61
67
|
|
|
62
68
|
### 2. Content-Type por Ruta
|
|
@@ -85,17 +91,35 @@ Tipos de autenticación soportados:
|
|
|
85
91
|
### 4. Rutas Parametrizadas
|
|
86
92
|
Soporta rutas con parámetros como `/usuarios/:id` que se convierten a expresiones regulares.
|
|
87
93
|
|
|
94
|
+
### 5. Rutas Estáticas
|
|
95
|
+
Soporta rutas para servir archivos estáticos desde directorios locales:
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
[
|
|
99
|
+
{
|
|
100
|
+
"path": "/static",
|
|
101
|
+
"method": "GET",
|
|
102
|
+
"static": {
|
|
103
|
+
"dir": "./public",
|
|
104
|
+
"index": ["index.html", "index.htm"],
|
|
105
|
+
"cacheControl": "public, max-age=3600"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
```
|
|
110
|
+
|
|
88
111
|
## Comparativa: routes.json vs addRoute()
|
|
89
112
|
|
|
90
113
|
| Característica | routes.json | addRoute() |
|
|
91
114
|
|---|---|---|
|
|
92
115
|
| Definición de rutas | Masiva (archivo JSON) | Individual |
|
|
93
116
|
| Carga de controladores | Automática desde archivos | Manual (función handler) |
|
|
94
|
-
| Autenticación por ruta | ✅ Soportada |
|
|
95
|
-
| Content-Type por ruta | ✅ Soportado |
|
|
96
|
-
| Opciones de autenticación | ✅ Soportadas |
|
|
117
|
+
| Autenticación por ruta | ✅ Soportada | ✅ Soportada |
|
|
118
|
+
| Content-Type por ruta | ✅ Soportado | ✅ Soportado |
|
|
119
|
+
| Opciones de autenticación | ✅ Soportadas | ✅ Soportadas |
|
|
97
120
|
| Rutas parametrizadas | ✅ Soportadas | ✅ Soportadas |
|
|
98
|
-
|
|
|
121
|
+
| Rutas estáticas | ✅ Soportadas | ✅ Soportadas |
|
|
122
|
+
| Integración con hooks | ✅ Soportada | ✅ Soportada |
|
|
99
123
|
|
|
100
124
|
## Flujo de Procesamiento de Rutas
|
|
101
125
|
|
|
@@ -103,38 +127,60 @@ Soporta rutas con parámetros como `/usuarios/:id` que se convierten a expresion
|
|
|
103
127
|
1. `RouteLoader.loadRoutes()` lee el archivo JSON
|
|
104
128
|
2. Valida la estructura del archivo
|
|
105
129
|
3. Para cada ruta, `loadSingleRoute()`:
|
|
106
|
-
-
|
|
107
|
-
-
|
|
130
|
+
- Si es ruta estática, llama directamente a `server.addRoute()` con configuración estática
|
|
131
|
+
- Si es ruta dinámica, carga el módulo del controlador
|
|
132
|
+
- Obtiene el handler del controlador
|
|
108
133
|
- Aplica content-type si existe
|
|
109
134
|
- Aplica autenticación si existe
|
|
110
135
|
- Llama a `server.addRoute()` con el handler procesado
|
|
111
136
|
4. El servidor procesa las solicitudes normalmente
|
|
112
137
|
|
|
113
138
|
### Para addRoute():
|
|
114
|
-
1. Cliente llama directamente `server.addRoute(method, path, handler)`
|
|
139
|
+
1. Cliente llama directamente `server.addRoute(method, path, handler)` o `server.addRoute(configObject)`
|
|
115
140
|
2. La ruta se registra directamente en `this.routes`
|
|
116
|
-
3.
|
|
117
|
-
|
|
118
|
-
## Problemas Identificados
|
|
119
|
-
|
|
120
|
-
### 1. Incompatibilidad entre ambos sistemas
|
|
121
|
-
- No hay coordinación entre rutas definidas vía `routes.json` y `addRoute()`
|
|
122
|
-
- Ambos sistemas operan de forma independiente
|
|
123
|
-
|
|
124
|
-
### 2. Diferencia de funcionalidades
|
|
125
|
-
- `routes.json` soporta muchas más características que `addRoute()`
|
|
126
|
-
- `addRoute()` es mucho más básico
|
|
141
|
+
3. Si es una ruta estática (tiene propiedad `static`), se crea un handler especial para servir archivos
|
|
142
|
+
4. El servidor procesa las solicitudes normalmente
|
|
127
143
|
|
|
128
|
-
##
|
|
144
|
+
## Rutas Estáticas
|
|
129
145
|
|
|
130
|
-
###
|
|
131
|
-
|
|
132
|
-
- Especificar content-type
|
|
133
|
-
- Configurar autenticación
|
|
134
|
-
- Definir opciones de autenticación
|
|
146
|
+
### Definición
|
|
147
|
+
Las rutas estáticas permiten servir archivos desde directorios locales. Se definen con la propiedad `static`:
|
|
135
148
|
|
|
136
|
-
|
|
137
|
-
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"path": "/assets",
|
|
152
|
+
"method": "GET",
|
|
153
|
+
"static": {
|
|
154
|
+
"dir": "./public/assets",
|
|
155
|
+
"index": ["index.html"],
|
|
156
|
+
"cacheControl": "public, max-age=3600"
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
```
|
|
138
160
|
|
|
139
|
-
###
|
|
140
|
-
|
|
161
|
+
### Características
|
|
162
|
+
- Sirve cualquier archivo dentro del directorio especificado
|
|
163
|
+
- Detecta automáticamente el tipo MIME
|
|
164
|
+
- Soporta archivos índice para carpetas
|
|
165
|
+
- Permite configurar headers de caché
|
|
166
|
+
- Previene ataques de path traversal
|
|
167
|
+
- Compatible con el sistema de hooks del framework
|
|
168
|
+
|
|
169
|
+
### Integración con Hooks
|
|
170
|
+
El sistema de rutas estáticas incluye integración con el sistema de hooks:
|
|
171
|
+
|
|
172
|
+
- `pre_static_file_serve`: Antes de procesar un archivo estático
|
|
173
|
+
- `static_file_served`: Después de servir un archivo estático
|
|
174
|
+
- `static_file_not_found`: Cuando no se encuentra un archivo estático
|
|
175
|
+
- `static_file_access_denied`: Cuando se niega el acceso a un archivo estático
|
|
176
|
+
- `serving_index_file`: Cuando se sirve un archivo índice
|
|
177
|
+
- `static_directory_no_index`: Cuando un directorio no tiene archivo índice
|
|
178
|
+
- `before_reading_static_file`: Antes de leer un archivo estático
|
|
179
|
+
- `static_file_error`: Cuando ocurre un error al servir un archivo estático
|
|
180
|
+
|
|
181
|
+
## Problemas Resueltos
|
|
182
|
+
|
|
183
|
+
### 1. Soporte para archivos estáticos
|
|
184
|
+
- Se ha añadido soporte nativo para servir archivos estáticos
|
|
185
|
+
- Ambos sistemas (routes.json y addRoute) soportan rutas estáticas
|
|
186
|
+
- Se mantiene la seguridad y funcionalidad existente
|
|
@@ -463,7 +463,32 @@ Finalmente, se agrega el objeto de sesión al objeto de solicitud (`req.session`
|
|
|
463
463
|
|
|
464
464
|
---
|
|
465
465
|
|
|
466
|
-
## 13.
|
|
466
|
+
## 13. Componente QueryBuilder
|
|
467
|
+
|
|
468
|
+
El componente QueryBuilder de JERK Framework v2.3.0 proporciona una interfaz fluida para construir consultas SQL complejas de manera segura y eficiente. Este componente permite a los desarrolladores construir consultas SELECT, INSERT, UPDATE y DELETE sin escribir código SQL directamente, reduciendo el riesgo de inyección SQL y mejorando la legibilidad del código.
|
|
469
|
+
|
|
470
|
+
```mermaid
|
|
471
|
+
flowchart TD
|
|
472
|
+
START9([INICIO QueryBuilder])
|
|
473
|
+
START9 --> A9[Instancia QueryBuilder]
|
|
474
|
+
A9 --> B9[Definir tabla .table()]
|
|
475
|
+
B9 --> C9[Seleccionar campos .select()]
|
|
476
|
+
C9 --> D9[Aplicar condiciones .where()]
|
|
477
|
+
D9 --> E9[Otras operaciones .orderBy(), .limit(), etc.]
|
|
478
|
+
E9 --> F9[Definir adaptador .setAdapter()]
|
|
479
|
+
F9 --> G9[Ejecutar consulta .get(), .insert(), .update(), .delete()]
|
|
480
|
+
G9 --> END9([FIN])
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
El QueryBuilder comienza con la creación de una instancia del componente, opcionalmente asociada a una tabla específica. Luego se pueden encadenar métodos para construir la consulta paso a paso: seleccionar campos con `.select()`, aplicar condiciones con `.where()`, ordenar resultados con `.orderBy()`, limitar resultados con `.limit()`, entre otros.
|
|
484
|
+
|
|
485
|
+
Una vez construida la consulta, se debe asociar un adaptador de base de datos usando el método `.setAdapter()` o pasándolo al constructor. Finalmente, se ejecuta la consulta usando métodos como `.get()` para selecciones, `.insert()` para inserciones, `.update()` para actualizaciones o `.delete()` para eliminaciones.
|
|
486
|
+
|
|
487
|
+
El componente incluye soporte para múltiples adaptadores de base de datos, incluyendo MariaDB/MySQL y un adaptador de consola para fines de desarrollo y pruebas. Además, está completamente integrado con el sistema de hooks del framework, permitiendo interceptar y modificar consultas en diferentes etapas del proceso.
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
## 14. Sistema de Hooks
|
|
467
492
|
|
|
468
493
|
El sistema de hooks de JERK Framework v2.0 implementa un patrón de extensibilidad que permite a los desarrolladores modificar o extender el comportamiento del framework en puntos específicos de la ejecución. El sistema soporta dos tipos de hooks: acciones y filtros.
|
|
469
494
|
|
|
@@ -499,7 +524,7 @@ El sistema de hooks mantiene un registro de todos los listeners registrados para
|
|
|
499
524
|
|
|
500
525
|
---
|
|
501
526
|
|
|
502
|
-
##
|
|
527
|
+
## 15. Resumen de Arquitectura
|
|
503
528
|
|
|
504
529
|
La arquitectura de JERK Framework v2.0 está diseñada para proporcionar un equilibrio entre simplicidad y funcionalidad. El framework sigue principios de diseño que facilitan tanto el desarrollo rápido de aplicaciones como la escalabilidad a medida que los requisitos de la aplicación crecen.
|
|
505
530
|
|
|
@@ -520,6 +545,7 @@ El motor de plantillas y el sistema de sesiones proporcionan funcionalidades ese
|
|
|
520
545
|
- **Middlewares de seguridad**: `lib/middleware/authenticator.js`, `lib/middleware/firewall.js`
|
|
521
546
|
- **Cargador de rutas**: `lib/loader/routeLoader.js`
|
|
522
547
|
- **Componentes MVC**: `lib/mvc/viewEngine.js`, `lib/mvc/controllerBase.js`
|
|
548
|
+
- **Componentes QueryBuilder**: `lib/query/queryBuilder.js`, `lib/query/queryBuilderMiddleware.js`, `lib/query/queryBuilderHooks.js`, `lib/query/MariaDBAdapter.js`, `lib/query/consoleAdapter.js`
|
|
523
549
|
- **Utilidades**: `lib/utils/tokenManager.js`, `lib/utils/logger.js`
|
|
524
550
|
|
|
525
551
|
---
|