jerkjs 2.1.7 → 2.2.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 +30 -0
- package/README.md +201 -4
- package/index.js +29 -4
- 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 +60 -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/utils/mimeType.js +62 -0
- package/package.json +5 -3
- package/BUG_REPORTE_COMPRESION.txt +0 -72
- package/JERK_FRAMEWORK_DIAGRAM.txt +0 -492
- package/JERK_FRAMEWORK_DIAGRAM_MERMAID.mmd +0 -124
- package/JERK_FRAMEWORK_DOCUMENTATION.md +0 -527
- package/LICENSE +0 -201
- package/README_EN.md +0 -230
- package/README_PT.md +0 -230
- package/docs/ARQUITECTURA_ROUTES.md +0 -140
- package/docs/EXTENSION_MANUAL.md +0 -955
- package/docs/FIREWALL_MANUAL.md +0 -416
- package/docs/HOOK-2.0.md +0 -512
- package/docs/HOOKS_REFERENCE_IMPROVED.md +0 -596
- package/docs/MANUAL_API_SDK.md +0 -536
- package/docs/MARIADB_TOKENS_IMPLEMENTATION.md +0 -110
- package/docs/MIDDLEWARE_MANUAL.md +0 -518
- package/docs/OAUTH2_GOOGLE_MANUAL.md +0 -405
- package/docs/ROUTING_WITHOUT_JSON_GUIDE.md +0 -454
- package/docs/frontend-and-sessions.md +0 -353
- package/docs/guia_inicio_rapido_jerkjs.md +0 -113
- package/examples/examples.arj +0 -0
- 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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## v2.2.0 - 20 de enero de 2026
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **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
|
|
7
|
+
- **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.)
|
|
8
|
+
- **Nuevo adaptador MariaDB**: Se ha implementado un adaptador específico para conexión a bases de datos MariaDB/MySQL
|
|
9
|
+
- **Modelos específicos**: Se han creado modelos específicos para diferentes entidades con métodos especializados para consultas complejas
|
|
10
|
+
- **Integración con sistema de hooks**: Los modelos participan en el sistema de hooks del framework para extensibilidad
|
|
11
|
+
- **Comunicación bidireccional entre modelos y controladores**: Se ha implementado un sistema para que modelos y controladores se comuniquen entre sí
|
|
12
|
+
- **Soporte para consultas avanzadas**: Los modelos incluyen soporte para paginación, filtros, búsqueda global y operaciones CRUD completas
|
|
13
|
+
- **Validación de datos en modelos**: Se ha implementado un sistema de validación de datos específico para cada modelo
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- **Actualización de la versión a 2.2.0**: Debido a la implementación significativa de la arquitectura de modelos
|
|
17
|
+
- **Refactorización de componentes existentes**: Se han actualizado controladores y otros componentes para integrarse con la nueva arquitectura de modelos
|
|
18
|
+
- **Mejora en la estructura interna**: La arquitectura ahora sigue completamente el patrón MVC
|
|
19
|
+
|
|
20
|
+
## v2.1.8 - 20 de enero de 2026
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
- **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()`
|
|
24
|
+
- **Sistema de hooks para rutas estáticas**: Se han añadido múltiples hooks para rastrear el flujo completo de archivos estáticos
|
|
25
|
+
- **Sistema de logging para hooks**: Se ha implementado un sistema de logging que registra todos los eventos de hooks en un archivo
|
|
26
|
+
- **Soporte para layouts en ViewEngine**: Se ha añadido soporte para layouts con placeholder `{{content}}` en el sistema de vistas
|
|
27
|
+
- **Mejoras en el sistema de enrutamiento**: Se han añadido mejoras para reconocer correctamente rutas estáticas como prefijos
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
- **Actualización de documentación**: Se ha actualizado la documentación para reflejar las nuevas funcionalidades de rutas estáticas
|
|
31
|
+
- **Optimización del sistema de rutas**: Mejora en la lógica de coincidencia de rutas para soportar rutas estáticas como prefijos
|
|
32
|
+
|
|
3
33
|
## v2.1.7 - 19 de enero de 2026
|
|
4
34
|
|
|
5
35
|
### Correcciones
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# JERK Framework v2.
|
|
1
|
+
# JERK Framework v2.2.0
|
|
2
2
|
|
|
3
3
|

|
|
4
4
|
|
|
@@ -12,6 +12,7 @@ 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**
|
|
15
16
|
|
|
16
17
|
**Cómo comenzar:**
|
|
17
18
|
1. Edita el archivo `routes.json` para definir tus rutas y asociarlas a tus controladores
|
|
@@ -49,10 +50,61 @@ class HomeController {
|
|
|
49
50
|
module.exports = new HomeController();
|
|
50
51
|
```
|
|
51
52
|
|
|
52
|
-
3. ¡Tu aplicación estará
|
|
53
|
+
3. ¡Tu aplicación estará listo para usar!
|
|
53
54
|
|
|
54
55
|
El Starter Kit incluye controladores de ejemplo para que puedas ver cómo funciona el sistema.
|
|
55
56
|
|
|
57
|
+
## Ejemplo de Rutas Estáticas
|
|
58
|
+
|
|
59
|
+
Desde la versión 2.1.8, JERK Framework soporta rutas estáticas para servir archivos desde directorios locales:
|
|
60
|
+
|
|
61
|
+
### En routes.json:
|
|
62
|
+
```json
|
|
63
|
+
[
|
|
64
|
+
{
|
|
65
|
+
"path": "/static",
|
|
66
|
+
"method": "GET",
|
|
67
|
+
"static": {
|
|
68
|
+
"dir": "./public",
|
|
69
|
+
"index": ["index.html", "index.htm"],
|
|
70
|
+
"cacheControl": "public, max-age=3600"
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"path": "/assets",
|
|
75
|
+
"method": "GET",
|
|
76
|
+
"static": {
|
|
77
|
+
"dir": "./public",
|
|
78
|
+
"index": [],
|
|
79
|
+
"cacheControl": "public, max-age=86400"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Usando addRoute():
|
|
86
|
+
```javascript
|
|
87
|
+
// Ruta estática para servir archivos desde ./public
|
|
88
|
+
server.addRoute({
|
|
89
|
+
method: 'GET',
|
|
90
|
+
path: '/static',
|
|
91
|
+
static: {
|
|
92
|
+
dir: './public',
|
|
93
|
+
index: ['index.html'],
|
|
94
|
+
cacheControl: 'public, max-age=3600'
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// Ruta estática para servir archivos JS, CSS e imágenes
|
|
99
|
+
server.addRoute('GET', '/assets', {
|
|
100
|
+
static: {
|
|
101
|
+
dir: './public/assets',
|
|
102
|
+
index: [],
|
|
103
|
+
cacheControl: 'public, max-age=86400'
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
56
108
|
Visita nuestra página web: https://jerk.page.gd/
|
|
57
109
|
Repositorio oficial: https://gitlab.com/bytedogssyndicate1/jerk/
|
|
58
110
|
|
|
@@ -60,10 +112,10 @@ Repositorio oficial: https://gitlab.com/bytedogssyndicate1/jerk/
|
|
|
60
112
|
|
|
61
113
|
- **Arquitectura Modular**: Componentes independientes para mayor flexibilidad
|
|
62
114
|
- **Seguridad Avanzada**: Firewall integrado (WAF) con detección de ataques
|
|
63
|
-
- **Sistema de Hooks**: Similar al sistema de WordPress para
|
|
115
|
+
- **Sistema de Hooks**: Similar al sistema de WordPress para extensibility
|
|
64
116
|
- **Autenticación Flexible**: Soporte para JWT, API Keys, Basic Auth, OAuth2, OpenID Connect
|
|
65
117
|
- **Almacenamiento de Tokens**: Soporte para memoria, JSON, SQLite y MariaDB
|
|
66
|
-
- **Enrutamiento Avanzado**: Soporte para rutas parametrizadas y
|
|
118
|
+
- **Enrutamiento Avanzado**: Soporte para rutas parametrizadas, anidadas y estáticas
|
|
67
119
|
- **Soporte para Frontend**: Capacidad de servir contenido HTML y otros tipos de contenido
|
|
68
120
|
- **Configuración de Content-Type**: Especificación de headers Content-Type en routes.json
|
|
69
121
|
- **Middlewares Integrados**: CORS, rate limiting, compresión, firewall, etc.
|
|
@@ -71,6 +123,9 @@ Repositorio oficial: https://gitlab.com/bytedogssyndicate1/jerk/
|
|
|
71
123
|
- **Carga de Rutas**: Definición de rutas desde archivos JSON
|
|
72
124
|
- **Sistema de Sesiones**: Gestión completa de sesiones con soporte para autenticación
|
|
73
125
|
- **Motor de Plantillas MVC**: Sistema profesional de vistas con soporte para filtros, helpers y hooks
|
|
126
|
+
- **Arquitectura de Modelos Completa (MVC)**: Capa de modelos para la lógica de negocio y acceso a datos
|
|
127
|
+
- **Sistema de Adaptadores de Base de Datos**: Soporte para múltiples motores de base de datos (MariaDB, MySQL, etc.)
|
|
128
|
+
- **Servicio de Archivos Estáticos**: Soporte para servir archivos desde directorios locales con configuración flexible
|
|
74
129
|
- **Extensibilidad**: Sistema de hooks y filters para personalización
|
|
75
130
|
|
|
76
131
|
## Instalación
|
|
@@ -226,6 +281,148 @@ Las contribuciones son bienvenidas. Por favor, abre un issue o envía un pull re
|
|
|
226
281
|
|
|
227
282
|
Apache 2.0
|
|
228
283
|
|
|
284
|
+
## Arquitectura de Modelos (MVC)
|
|
285
|
+
|
|
286
|
+
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.
|
|
287
|
+
|
|
288
|
+
### Ejemplo de Modelo Simple con MariaDB
|
|
289
|
+
|
|
290
|
+
```javascript
|
|
291
|
+
const { ModelBase, MariaDBAdapter } = require('jerkjs');
|
|
292
|
+
|
|
293
|
+
// Definir un modelo para usuarios
|
|
294
|
+
class UserModel extends ModelBase {
|
|
295
|
+
constructor(options = {}) {
|
|
296
|
+
super({
|
|
297
|
+
...options,
|
|
298
|
+
tableName: options.tableName || 'users'
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// Definir campos del modelo
|
|
302
|
+
this.fields = {
|
|
303
|
+
id: { type: 'integer', primaryKey: true, autoIncrement: true },
|
|
304
|
+
username: { type: 'string', required: true },
|
|
305
|
+
email: { type: 'string', required: true },
|
|
306
|
+
password: { type: 'string', required: true },
|
|
307
|
+
createdAt: { type: 'datetime', default: 'CURRENT_TIMESTAMP' }
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Método personalizado para encontrar usuario por email
|
|
312
|
+
async findByEmail(email) {
|
|
313
|
+
return await this.findOne({ email });
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Método personalizado para crear usuario con validación
|
|
317
|
+
async createUser(userData) {
|
|
318
|
+
// Validar datos antes de crear
|
|
319
|
+
const validation = this.validate('create', userData);
|
|
320
|
+
if (!validation.isValid) {
|
|
321
|
+
throw new Error(`Validación fallida: ${validation.errors.join(', ')}`);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return await this.create(userData);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Configurar el adaptador de MariaDB
|
|
329
|
+
const dbConfig = {
|
|
330
|
+
host: 'localhost',
|
|
331
|
+
user: 'tu_usuario',
|
|
332
|
+
password: 'tu_contraseña',
|
|
333
|
+
database: 'tu_base_de_datos'
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
const mariaDBAdapter = new MariaDBAdapter(dbConfig);
|
|
337
|
+
|
|
338
|
+
// Crear instancia del modelo con el adaptador
|
|
339
|
+
const userModel = new UserModel({
|
|
340
|
+
adapter: mariaDBAdapter,
|
|
341
|
+
tableName: 'users'
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
// Uso del modelo
|
|
345
|
+
async function ejemploUsoModelo() {
|
|
346
|
+
try {
|
|
347
|
+
// Crear un nuevo usuario
|
|
348
|
+
const nuevoUsuario = await userModel.createUser({
|
|
349
|
+
username: 'juan.perez',
|
|
350
|
+
email: 'juan@example.com',
|
|
351
|
+
password: 'contraseña_segura'
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
console.log('Usuario creado:', nuevoUsuario);
|
|
355
|
+
|
|
356
|
+
// Buscar usuario por email
|
|
357
|
+
const usuario = await userModel.findByEmail('juan@example.com');
|
|
358
|
+
console.log('Usuario encontrado:', usuario);
|
|
359
|
+
} catch (error) {
|
|
360
|
+
console.error('Error:', error.message);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Uso de Modelos en Controladores con loadModel
|
|
366
|
+
|
|
367
|
+
JERK Framework proporciona un helper `loadModel` en el ControllerBase para facilitar la carga y uso de modelos en los controladores:
|
|
368
|
+
|
|
369
|
+
```javascript
|
|
370
|
+
const ControllerBase = require('jerkjs').ControllerBase;
|
|
371
|
+
|
|
372
|
+
class UserController extends ControllerBase {
|
|
373
|
+
constructor() {
|
|
374
|
+
super();
|
|
375
|
+
|
|
376
|
+
// Cargar el modelo de usuario
|
|
377
|
+
this.userModel = this.loadModel('UserModel', {
|
|
378
|
+
// Opciones del modelo
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
async getAllUsers(req, res) {
|
|
383
|
+
try {
|
|
384
|
+
// Usar el modelo para obtener usuarios
|
|
385
|
+
const users = await this.userModel.find({});
|
|
386
|
+
|
|
387
|
+
this.json(res, { success: true, data: users });
|
|
388
|
+
} catch (error) {
|
|
389
|
+
this.json(res, { success: false, error: error.message }, 500);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
async getUserById(req, res) {
|
|
394
|
+
try {
|
|
395
|
+
const userId = req.params.id;
|
|
396
|
+
|
|
397
|
+
// Usar el modelo para encontrar un usuario específico
|
|
398
|
+
const user = await this.userModel.findOne({ id: userId });
|
|
399
|
+
|
|
400
|
+
if (!user) {
|
|
401
|
+
this.json(res, { success: false, error: 'Usuario no encontrado' }, 404);
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
this.json(res, { success: true, data: user });
|
|
406
|
+
} catch (error) {
|
|
407
|
+
this.json(res, { success: false, error: error.message }, 500);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
async createUser(req, res) {
|
|
412
|
+
try {
|
|
413
|
+
// Usar el modelo para crear un nuevo usuario
|
|
414
|
+
const newUser = await this.userModel.createUser(req.body);
|
|
415
|
+
|
|
416
|
+
this.json(res, { success: true, data: newUser }, 201);
|
|
417
|
+
} catch (error) {
|
|
418
|
+
this.json(res, { success: false, error: error.message }, 400);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
module.exports = new UserController();
|
|
424
|
+
```
|
|
425
|
+
|
|
229
426
|
## Documentación del Framework
|
|
230
427
|
|
|
231
428
|
Para una descripción detallada de la arquitectura y componentes del framework, consulta el archivo [JERK_FRAMEWORK_DOCUMENTATION.md](JERK_FRAMEWORK_DOCUMENTATION.md).
|
package/index.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Punto de entrada del framework JERK
|
|
3
|
-
* JERK Framework
|
|
3
|
+
* JERK Framework 2.1.8
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
// Mostrar mensaje de versión al iniciar
|
|
7
|
+
const packageInfo = require('./package.json');
|
|
8
|
+
console.log(`JERK Framework v${packageInfo.version}`);
|
|
9
|
+
|
|
6
10
|
const APIServer = require('./lib/core/server');
|
|
7
11
|
const Router = require('./lib/core/router');
|
|
8
12
|
const HandlerManager = require('./lib/core/handler');
|
|
@@ -33,6 +37,13 @@ const { SessionManager, sessionAuth } = require('./lib/middleware/session');
|
|
|
33
37
|
// Componentes MVC
|
|
34
38
|
const ViewEngine = require('./lib/mvc/viewEngine');
|
|
35
39
|
const ControllerBase = require('./lib/mvc/controllerBase');
|
|
40
|
+
const ModelBase = require('./lib/mvc/modelBase');
|
|
41
|
+
const ModelManager = require('./lib/mvc/modelManager');
|
|
42
|
+
const UserModel = require('./lib/mvc/userModel');
|
|
43
|
+
const GenericAdapter = require('./lib/mvc/GenericAdapter');
|
|
44
|
+
const MemoryAdapter = require('./lib/mvc/MemoryAdapter');
|
|
45
|
+
const MariaDBAdapter = require('./lib/mvc/MariaDBAdapter');
|
|
46
|
+
const ModelControllerExample = require('./lib/mvc/ModelControllerExample');
|
|
36
47
|
|
|
37
48
|
// Componentes de manejo de errores
|
|
38
49
|
const { ErrorHandler, ValidationError, AuthenticationError, DatabaseError } = require('./lib/utils/errorHandler');
|
|
@@ -77,7 +88,20 @@ module.exports = {
|
|
|
77
88
|
ViewEngine,
|
|
78
89
|
ControllerBase,
|
|
79
90
|
|
|
80
|
-
// Componentes de
|
|
91
|
+
// Componentes de modelo (v2.4.0)
|
|
92
|
+
ModelBase,
|
|
93
|
+
ModelManager,
|
|
94
|
+
UserModel,
|
|
95
|
+
|
|
96
|
+
// Adaptadores de modelo (v2.5.0)
|
|
97
|
+
GenericAdapter,
|
|
98
|
+
MemoryAdapter,
|
|
99
|
+
MariaDBAdapter,
|
|
100
|
+
|
|
101
|
+
// Ejemplo de controlador con modelos (v2.6.0)
|
|
102
|
+
ModelControllerExample,
|
|
103
|
+
|
|
104
|
+
// Componentes de manejo de errores (v2.7.0)
|
|
81
105
|
ErrorHandler,
|
|
82
106
|
ValidationError,
|
|
83
107
|
AuthenticationError,
|
|
@@ -88,7 +112,8 @@ module.exports = {
|
|
|
88
112
|
module.exports.JERK = APIServer;
|
|
89
113
|
|
|
90
114
|
// Crear instancia global del sistema de hooks
|
|
91
|
-
|
|
115
|
+
const hooksInstance = new HookSystem();
|
|
116
|
+
module.exports.hooks = hooksInstance;
|
|
92
117
|
|
|
93
118
|
// Disparar hooks de inicio del framework
|
|
94
|
-
|
|
119
|
+
hooksInstance.doAction('framework_init');
|