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.
Files changed (51) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +204 -4
  3. package/README_EN.md +1 -1
  4. package/README_PT.md +1 -1
  5. package/docs/ARQUITECTURA_ROUTES.md +84 -38
  6. package/{JERK_FRAMEWORK_DOCUMENTATION.md → docs/JERK_FRAMEWORK_DOCUMENTATION.md} +28 -2
  7. package/docs/JERK_MODELOS_HOWTO.md +566 -0
  8. package/index.js +41 -5
  9. package/jerk-qbuilder/CHANGELOG.md +71 -0
  10. package/jerk-qbuilder/HOWTO.md +325 -0
  11. package/jerk-qbuilder/README.md +52 -0
  12. package/lib/core/server.js +328 -27
  13. package/lib/loader/routeLoader.js +148 -117
  14. package/lib/mvc/GenericAdapter.js +136 -0
  15. package/lib/mvc/MariaDBAdapter.js +315 -0
  16. package/lib/mvc/MemoryAdapter.js +269 -0
  17. package/lib/mvc/ModelControllerExample.js +285 -0
  18. package/lib/mvc/controllerBase.js +77 -0
  19. package/lib/mvc/modelBase.js +383 -0
  20. package/lib/mvc/modelManager.js +284 -0
  21. package/lib/mvc/userModel.js +265 -0
  22. package/lib/mvc/viewEngine.js +32 -1
  23. package/lib/query/MariaDBAdapter.js +78 -0
  24. package/lib/query/consoleAdapter.js +184 -0
  25. package/lib/query/queryBuilder.js +953 -0
  26. package/lib/query/queryBuilderHooks.js +455 -0
  27. package/lib/query/queryBuilderMiddleware.js +332 -0
  28. package/lib/utils/mimeType.js +62 -0
  29. package/package.json +5 -3
  30. package/utils/find_file_path.sh +36 -0
  31. package/BUG_REPORTE_COMPRESION.txt +0 -72
  32. package/standard/CompressionTestController.js +0 -56
  33. package/standard/HealthController.js +0 -16
  34. package/standard/HomeController.js +0 -12
  35. package/standard/ProductController.js +0 -18
  36. package/standard/README.md +0 -47
  37. package/standard/UserController.js +0 -23
  38. package/standard/package.json +0 -22
  39. package/standard/routes.json +0 -65
  40. package/standard/server.js +0 -140
  41. package/standardA/controllers/AuthController.js +0 -82
  42. package/standardA/controllers/HomeController.js +0 -19
  43. package/standardA/controllers/UserController.js +0 -41
  44. package/standardA/server.js +0 -311
  45. package/standardA/views/auth/dashboard.html +0 -51
  46. package/standardA/views/auth/login.html +0 -47
  47. package/standardA/views/index.html +0 -32
  48. package/standardA/views/users/detail.html +0 -28
  49. package/standardA/views/users/list.html +0 -36
  50. /package/{JERK_FRAMEWORK_DIAGRAM.txt → docs/JERK_FRAMEWORK_DIAGRAM.txt} +0 -0
  51. /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.7
1
+ # JERK Framework v2.3.0
2
2
 
3
3
  ![JERK Framework Logo](jerk.jpg)
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á lista para usar!
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 extensibilidad
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 anidadas
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
@@ -1,4 +1,4 @@
1
- # JERK Framework v2.1.4
1
+ # JERK Framework v2.3.0
2
2
 
3
3
  ![JERK Framework Logo](jerk.jpg)
4
4
 
package/README_PT.md CHANGED
@@ -1,4 +1,4 @@
1
- # JERK Framework v2.1.4
1
+ # JERK Framework v2.3.0
2
2
 
3
3
  ![JERK Framework Logo](jerk.jpg)
4
4
 
@@ -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
- - No soporta autenticación por ruta
26
- - No soporta content-type por ruta
27
- - No carga controladores desde archivos externos
28
- - Simplemente registra la ruta en el array
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
- "path": "/ruta/ejemplo",
56
- "method": "GET",
57
- "controller": "./controllers/EjemploController.js",
58
- "handler": "metodoHandler"
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 | No soportada |
95
- | Content-Type por ruta | ✅ Soportado | No soportado |
96
- | Opciones de autenticación | ✅ Soportadas | No 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
- | Integración con hooks | ✅ Soportada | No soportada |
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
- - Carga el módulo del controlador
107
- - Obtiene el handler
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. El servidor procesa las solicitudes normalmente
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
- ## Soluciones Potenciales
144
+ ## Rutas Estáticas
129
145
 
130
- ### 1. Extender el método addRoute()
131
- Modificar `addRoute()` para que acepte un objeto de opciones similar al usado en `routes.json`, permitiendo:
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
- ### 2. Crear un método interno común
137
- Crear un método interno que procese las rutas con todas las funcionalidades y que sea utilizado tanto por `RouteLoader` como por `addRoute()`.
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
- ### 3. Mantener compatibilidad
140
- Cualquier cambio debe mantener la compatibilidad con el sistema existente de `routes.json`.
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. Sistema de Hooks
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
- ## 14. Resumen de Arquitectura
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
  ---