jerkjs 2.5.4 → 2.5.6
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/BENCHMARK_RESULTS.md +60 -0
- package/CHANGELOG.md +18 -0
- package/README.md +108 -454
- package/README_LEGACY.md +513 -0
- package/doc-2.5/SESSION_SECURITY_FLAGS.md +174 -0
- package/doc-2.5/an/303/241lisis-completo-jerk-framework.md +213 -0
- package/docs/SERVER_OPTIMIZATION_NOTES.md +87 -0
- package/jerk2.5.webp +0 -0
- package/lib/core/server.js +46 -36
- package/lib/middleware/session.js +11 -3
- package/package.json +2 -2
- package/@qaLoadModel/controllers/ProductController.js +0 -143
- package/@qaLoadModel/controllers/UserController.js +0 -143
- package/@qaLoadModel/models/ProductModel.js +0 -41
- package/@qaLoadModel/models/UserModel.js +0 -41
- package/@qaLoadModel/package.json +0 -22
- package/@qaLoadModel/qa_report.md +0 -71
- package/@qaLoadModel/results.md +0 -97
- package/@qaLoadModel/routes.json +0 -58
- package/@qaLoadModel/server.js +0 -43
- package/@qaLoadModel/simple-test.js +0 -96
- package/@qaLoadModel/test-models.js +0 -144
- package/@qaLoadModel/test_endpoints.sh +0 -35
- package/@qaLoadModel/test_final.js +0 -89
- package/@qaLoadModel/views/products/index.html +0 -45
- package/@qaLoadModel/views/products/show.html +0 -27
- package/@qaLoadModel/views/users/index.html +0 -44
- package/@qaLoadModel/views/users/show.html +0 -26
- package/qa/INFORME_QA_JERKJS_ROUTING.md +0 -108
- package/qa/informe_qa_fix_enrutamiento.md +0 -93
- package/qa-app/controllers/homeController.js +0 -9
- package/qa-app/controllers/userController.js +0 -76
- package/qa-app/hooks-config.js +0 -65
- package/qa-app/models/UserModel.js +0 -36
- package/qa-app/package-lock.json +0 -1683
- package/qa-app/package.json +0 -25
- package/qa-app/public/css/style.css +0 -15
- package/qa-app/public/images/logo.png +0 -3
- package/qa-app/public/index.html +0 -15
- package/qa-app/public/js/main.js +0 -7
- package/qa-app/routes/api-routes.json +0 -23
- package/qa-app/routes/page-routes.json +0 -16
- package/qa-app/routes/static-routes.json +0 -20
- package/qa-app/server.js +0 -68
- package/qa-app/views/footer.html +0 -3
- package/qa-app/views/index.html +0 -20
- package/qa-app/views/users.html +0 -20
- package/utils/find_file_path.sh +0 -36
- /package/{doc2.5.3 → doc-2.5}/manual-mvc-completo.md +0 -0
package/README.md
CHANGED
|
@@ -1,217 +1,38 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
- Carga de
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"contentType": "application/json"
|
|
37
|
-
}
|
|
38
|
-
]
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
2. Crea tus controladores según las rutas definidas
|
|
42
|
-
|
|
43
|
-
Por ejemplo, para la ruta principal "/", crea un archivo `HomeController.js`:
|
|
44
|
-
```javascript
|
|
45
|
-
class HomeController {
|
|
46
|
-
index(req, res) {
|
|
47
|
-
res.render('index.html', { data: 'Hola' });
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
module.exports = new HomeController();
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
3. ¡Tu aplicación estará listo para usar!
|
|
55
|
-
|
|
56
|
-
El Starter Kit incluye controladores de ejemplo para que puedas ver cómo funciona el sistema.
|
|
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
|
-
|
|
109
|
-
## Novedades en v2.5.1
|
|
110
|
-
|
|
111
|
-
### Corrección de rutas estáticas
|
|
112
|
-
- **Solución de error crítico con directorios**: Se corrigió un error donde el sistema de rutas estáticas intentaba leer directorios como si fueran archivos, causando el error `EISDIR: illegal operation on a directory, read`. Ahora el sistema verifica explícitamente si una ruta es un directorio y en tal caso busca el archivo índice correspondiente.
|
|
113
|
-
|
|
114
|
-
## Carga de Rutas desde Múltiples Archivos (v2.5.0)
|
|
115
|
-
|
|
116
|
-
Desde la versión 2.5.0, JERK Framework incluye el componente `RouteDirectoryLoader` que permite cargar rutas desde múltiples archivos JSON ubicados en un directorio específico. Esta funcionalidad mejora la organización y mantenibilidad de aplicaciones grandes al permitir dividir las rutas en varios archivos en lugar de tener un único archivo `routes.json`.
|
|
117
|
-
|
|
118
|
-
### Ventajas del RouteDirectoryLoader:
|
|
119
|
-
- Organización por funcionalidad (usuarios, autenticación, API, etc.)
|
|
120
|
-
- Mayor mantenibilidad en proyectos grandes
|
|
121
|
-
- Detección automática de rutas duplicadas
|
|
122
|
-
- Mensajes de advertencia coloreados para rutas sobreescritas
|
|
123
|
-
- Recarga automática de rutas en desarrollo
|
|
124
|
-
|
|
125
|
-
### Uso del RouteDirectoryLoader:
|
|
126
|
-
|
|
127
|
-
```javascript
|
|
128
|
-
const { APIServer, RouteDirectoryLoader } = require('jerkjs');
|
|
129
|
-
|
|
130
|
-
const server = new APIServer({ port: 3000 });
|
|
131
|
-
const routeDirectoryLoader = new RouteDirectoryLoader();
|
|
132
|
-
|
|
133
|
-
// Cargar rutas desde un directorio que contiene múltiples archivos JSON
|
|
134
|
-
routeDirectoryLoader.loadRoutesFromDirectory(server, './routes')
|
|
135
|
-
.then(routes => {
|
|
136
|
-
console.log(`${routes.length} rutas cargadas exitosamente`);
|
|
137
|
-
server.start();
|
|
138
|
-
})
|
|
139
|
-
.catch(error => {
|
|
140
|
-
console.error('Error cargando rutas desde directorio:', error.message);
|
|
141
|
-
});
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### Estructura de directorio recomendada:
|
|
145
|
-
```
|
|
146
|
-
routes/
|
|
147
|
-
├── api-routes.json
|
|
148
|
-
├── auth-routes.json
|
|
149
|
-
├── static-routes.json
|
|
150
|
-
└── user-routes.json
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### Ejemplo de archivo api-routes.json:
|
|
154
|
-
```json
|
|
155
|
-
[
|
|
156
|
-
{
|
|
157
|
-
"path": "/api/users",
|
|
158
|
-
"method": "GET",
|
|
159
|
-
"controller": "./controllers/userController.js",
|
|
160
|
-
"handler": "getAllUsers",
|
|
161
|
-
"contentType": "application/json"
|
|
162
|
-
},
|
|
163
|
-
{
|
|
164
|
-
"path": "/api/users/:id",
|
|
165
|
-
"method": "GET",
|
|
166
|
-
"controller": "./controllers/userController.js",
|
|
167
|
-
"handler": "getUserById",
|
|
168
|
-
"contentType": "application/json"
|
|
169
|
-
}
|
|
170
|
-
]
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### Detección de rutas duplicadas:
|
|
174
|
-
Cuando el sistema detecta que una ruta ya ha sido definida previamente, muestra mensajes de advertencia:
|
|
175
|
-
|
|
176
|
-
```
|
|
177
|
-
[RUTA SOBREESCRITA] Archivo: ./routes/api-routes.json, Ruta: GET /users
|
|
178
|
-
[RUTA ACTUAL] Archivo: ./routes/other-routes.json, Ruta: GET /users
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
- El mensaje en **rojo** indica la ruta que será sobreescrita
|
|
182
|
-
- El mensaje en **amarillo** indica la ruta que prevalece
|
|
183
|
-
|
|
184
|
-
### Recarga automática de rutas:
|
|
185
|
-
Durante el desarrollo, puedes habilitar la recarga automática cuando se modifican los archivos de rutas:
|
|
186
|
-
|
|
187
|
-
```javascript
|
|
188
|
-
// Observar cambios en el directorio de rutas
|
|
189
|
-
routeDirectoryLoader.watchRoutesDirectory(server, './routes', 1000); // 1000ms debounce
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
Visita nuestra página web: https://jerk.page.gd/
|
|
193
|
-
Repositorio oficial: https://gitlab.com/bytedogssyndicate1/jerk/
|
|
194
|
-
|
|
195
|
-
## Características
|
|
196
|
-
|
|
197
|
-
- **Arquitectura Modular**: Componentes independientes para mayor flexibilidad
|
|
198
|
-
- **Seguridad Avanzada**: Firewall integrado (WAF) con detección de ataques
|
|
199
|
-
- **Sistema de Hooks**: Similar al sistema de WordPress para extensibility
|
|
200
|
-
- **Autenticación Flexible**: Soporte para JWT, API Keys, Basic Auth, OAuth2, OpenID Connect
|
|
201
|
-
- **Almacenamiento de Tokens**: Soporte para memoria, JSON, SQLite y MariaDB
|
|
202
|
-
- **Enrutamiento Avanzado**: Soporte para rutas parametrizadas, anidadas y estáticas
|
|
203
|
-
- **Soporte para Frontend**: Capacidad de servir contenido HTML y otros tipos de contenido
|
|
204
|
-
- **Configuración de Content-Type**: Especificación de headers Content-Type en routes.json
|
|
205
|
-
- **Middlewares Integrados**: CORS, rate limiting, compresión, firewall, etc.
|
|
206
|
-
- **Gestión de Controladores**: Carga dinámica de controladores desde archivos
|
|
207
|
-
- **Carga de Rutas**: Definición de rutas desde archivos JSON
|
|
208
|
-
- **Sistema de Sesiones**: Gestión completa de sesiones con soporte para autenticación
|
|
209
|
-
- **Motor de Plantillas MVC**: Sistema profesional de vistas con soporte para filtros, helpers y hooks
|
|
210
|
-
- **Arquitectura de Modelos Completa (MVC)**: Capa de modelos para la lógica de negocio y acceso a datos
|
|
211
|
-
- **Sistema de Adaptadores de Base de Datos**: Soporte para múltiples motores de base de datos (MariaDB, MySQL, etc.)
|
|
212
|
-
- **Compatible con qbuilderjs**: Soporte para integrar el QueryBuilder externo qbuilderjs para construir consultas SQL complejas de manera segura y eficiente
|
|
213
|
-
- **Servicio de Archivos Estáticos**: Soporte para servir archivos desde directorios locales con configuración flexible
|
|
214
|
-
- **Extensibilidad**: Sistema de hooks y filters para personalización
|
|
1
|
+

|
|
2
|
+
##### JERK Framework v2.5.6
|
|
3
|
+
|
|
4
|
+
**JERK Framework** es un framework de desarrollo web completo para Node.js que implementa una arquitectura MVC (Modelo-Vista-Controlador) con soporte para APIs REST, seguridad avanzada, y sistemas de plantillas.
|
|
5
|
+
|
|
6
|
+
## Características Principales
|
|
7
|
+
|
|
8
|
+
### 🚀 Rendimiento Optimizado
|
|
9
|
+
- Servidor HTTP/HTTPS de alto rendimiento
|
|
10
|
+
- Optimizaciones de rendimiento en el manejo de solicitudes
|
|
11
|
+
- Carga anticipada de módulos comunes para evitar operaciones redundantes
|
|
12
|
+
- Manejo eficiente de rutas estáticas y dinámicas
|
|
13
|
+
|
|
14
|
+
### 🔐 Seguridad Avanzada
|
|
15
|
+
- Sistema de sesiones con cookies seguras personalizables
|
|
16
|
+
- Filtros para personalizar flags de seguridad de cookies (`Secure`, `SameSite`, etc.)
|
|
17
|
+
- Web Application Firewall (WAF) con detección de patrones de ataque
|
|
18
|
+
- Sistema de autenticación con múltiples estrategias (JWT, API Keys, Basic Auth, OAuth2, OpenID Connect)
|
|
19
|
+
- Protección contra SQL Injection, XSS y otros ataques comunes
|
|
20
|
+
|
|
21
|
+
### 🏗️ Arquitectura Modular
|
|
22
|
+
- Componentes independientes para mayor flexibilidad
|
|
23
|
+
- Sistema de hooks y filtros similar al de WordPress
|
|
24
|
+
- Soporte para middlewares personalizados
|
|
25
|
+
- Arquitectura MVC completa con modelos, vistas y controladores
|
|
26
|
+
|
|
27
|
+
### 📊 Soporte para Bases de Datos
|
|
28
|
+
- Adaptadores para diferentes motores de base de datos (Memory, MariaDB/MySQL, SQLite)
|
|
29
|
+
- Integración con QueryBuilder externo (qbuilderjs) para construir consultas SQL seguras
|
|
30
|
+
- Sistema de modelos con operaciones CRUD completas
|
|
31
|
+
|
|
32
|
+
### 🎨 Motores de Plantillas
|
|
33
|
+
- Motor de plantillas con soporte para variables, condiciones, bucles e inclusiones
|
|
34
|
+
- Filtros y helpers personalizables
|
|
35
|
+
- Soporte para layouts y vistas dinámicas
|
|
215
36
|
|
|
216
37
|
## Instalación
|
|
217
38
|
|
|
@@ -222,80 +43,94 @@ npm install jerkjs
|
|
|
222
43
|
## Uso Básico
|
|
223
44
|
|
|
224
45
|
```javascript
|
|
225
|
-
const { APIServer,
|
|
46
|
+
const { APIServer, RouteDirectoryLoader, ViewEngine, ModelManager, MemoryAdapter } = require('jerkjs');
|
|
226
47
|
|
|
227
48
|
// Crear instancia del servidor
|
|
228
49
|
const server = new APIServer({
|
|
229
|
-
|
|
230
|
-
|
|
50
|
+
port: 3000,
|
|
51
|
+
host: 'localhost'
|
|
231
52
|
});
|
|
232
53
|
|
|
233
|
-
//
|
|
234
|
-
const
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
server.addRoute('GET', '/', (req, res) => {
|
|
238
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
239
|
-
res.end(JSON.stringify({ message: '¡Hola Mundo!' }));
|
|
54
|
+
// Configurar motor de vistas
|
|
55
|
+
const viewEngine = new ViewEngine({
|
|
56
|
+
viewsDir: './views',
|
|
57
|
+
defaultLayout: 'layout.html'
|
|
240
58
|
});
|
|
241
59
|
|
|
242
|
-
//
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
## Componentes Principales
|
|
247
|
-
|
|
248
|
-
### APIServer
|
|
249
|
-
Servidor HTTP/HTTPS básico con soporte para rutas parametrizadas, middlewares y configuración avanzada.
|
|
250
|
-
|
|
251
|
-
### Router
|
|
252
|
-
Sistema de enrutamiento avanzado con soporte para rutas anidadas y prefijos.
|
|
60
|
+
// Configurar sistema de modelos
|
|
61
|
+
const modelManager = new ModelManager();
|
|
62
|
+
const memoryAdapter = new MemoryAdapter();
|
|
63
|
+
modelManager.registerAdapter('memory', memoryAdapter);
|
|
253
64
|
|
|
254
|
-
|
|
255
|
-
|
|
65
|
+
// Asociar componentes al servidor
|
|
66
|
+
server.viewEngine = viewEngine;
|
|
67
|
+
server.modelManager = modelManager;
|
|
256
68
|
|
|
257
|
-
|
|
258
|
-
|
|
69
|
+
// Cargar rutas desde directorio
|
|
70
|
+
const routeDirectoryLoader = new RouteDirectoryLoader();
|
|
71
|
+
routeDirectoryLoader.loadRoutesFromDirectory(server, './routes');
|
|
259
72
|
|
|
260
|
-
|
|
261
|
-
|
|
73
|
+
// Iniciar el servidor
|
|
74
|
+
server.start();
|
|
75
|
+
```
|
|
262
76
|
|
|
263
|
-
|
|
264
|
-
Gestión de tokens JWT con diferentes tipos de almacenamiento (memoria, JSON, SQLite, MariaDB).
|
|
77
|
+
## Seguridad de Sesiones
|
|
265
78
|
|
|
266
|
-
|
|
267
|
-
Middleware de firewall con detección de patrones de ataque y listas blancas/negras.
|
|
79
|
+
JERK Framework incluye un sistema de sesiones con soporte para personalización de flags de seguridad a través de filtros:
|
|
268
80
|
|
|
269
|
-
|
|
270
|
-
|
|
81
|
+
```javascript
|
|
82
|
+
const { hooks } = require('jerkjs');
|
|
271
83
|
|
|
272
|
-
|
|
273
|
-
|
|
84
|
+
// Personalizar flags de cookies de sesión
|
|
85
|
+
hooks.addFilter('session_cookie_flags', (defaultFlags, req, res, sessionId) => {
|
|
86
|
+
// Detectar si la solicitud es HTTPS
|
|
87
|
+
const isHttps = (req && req.connection && req.connection.encrypted) ||
|
|
88
|
+
(req && req.headers && req.headers['x-forwarded-proto'] === 'https');
|
|
89
|
+
|
|
90
|
+
let flags = defaultFlags;
|
|
91
|
+
|
|
92
|
+
// Agregar la flag Secure si es HTTPS
|
|
93
|
+
if (isHttps) {
|
|
94
|
+
flags += '; Secure';
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Agregar SameSite según el contexto
|
|
98
|
+
flags += '; SameSite=Lax';
|
|
99
|
+
|
|
100
|
+
return flags;
|
|
101
|
+
});
|
|
102
|
+
```
|
|
274
103
|
|
|
275
|
-
|
|
276
|
-
Motor de plantillas profesional con soporte para filtros, helpers, condiciones, bucles y hooks.
|
|
104
|
+
## Componentes Principales
|
|
277
105
|
|
|
278
|
-
###
|
|
279
|
-
|
|
106
|
+
### Servidor (APIServer)
|
|
107
|
+
- Servidor HTTP/HTTPS básico con soporte para rutas parametrizadas
|
|
108
|
+
- Manejo de archivos estáticos con soporte para índices y control de caché
|
|
109
|
+
- Sistema de hooks para extensibilidad
|
|
110
|
+
- Soporte para middlewares y manejo de cuerpos de solicitud con límites de tamaño
|
|
280
111
|
|
|
281
|
-
|
|
112
|
+
### Sistema de Enrutamiento
|
|
113
|
+
- Router con soporte para rutas anidadas
|
|
114
|
+
- RouteMatcher para coincidencia de rutas parametrizadas con cacheo de expresiones regulares
|
|
115
|
+
- Soporte para rutas estáticas y dinámicas con prioridad adecuada
|
|
282
116
|
|
|
283
|
-
|
|
117
|
+
### Middleware
|
|
118
|
+
- CORS, Autenticación, Sesiones, Validación, Rate Limiting
|
|
119
|
+
- Compresión (gzip/deflate) con sistema de hooks
|
|
120
|
+
- Firewall (WAF) con detección de patrones de ataque
|
|
121
|
+
- Audit Logger para eventos de seguridad
|
|
284
122
|
|
|
285
|
-
|
|
286
|
-
-
|
|
287
|
-
-
|
|
288
|
-
-
|
|
289
|
-
-
|
|
290
|
-
- **Autenticación Robusta**: Soporte para múltiples métodos de autenticación
|
|
123
|
+
### Componentes MVC
|
|
124
|
+
- ControllerBase con soporte para vistas, layouts y variables
|
|
125
|
+
- ModelBase con operaciones CRUD
|
|
126
|
+
- ViewEngine con soporte para filtros, helpers, condiciones, bucles e inclusiones
|
|
127
|
+
- ModelManager con soporte para múltiples adaptadores
|
|
291
128
|
|
|
292
|
-
## Sistema de Hooks
|
|
129
|
+
## Sistema de Hooks y Filtros
|
|
293
130
|
|
|
294
|
-
El framework incluye un sistema de hooks y
|
|
131
|
+
El framework incluye un sistema completo de hooks y filtros similar al de WordPress:
|
|
295
132
|
|
|
296
133
|
```javascript
|
|
297
|
-
const { hooks } = require('jerkjs');
|
|
298
|
-
|
|
299
134
|
// Registrar una acción
|
|
300
135
|
hooks.addAction('firewall_request_blocked', (rule, clientIP, req, res) => {
|
|
301
136
|
console.log(`Solicitud bloqueada: ${rule.name} para IP: ${clientIP}`);
|
|
@@ -311,203 +146,22 @@ hooks.addFilter('session_create_data', (userData, req) => {
|
|
|
311
146
|
});
|
|
312
147
|
```
|
|
313
148
|
|
|
314
|
-
## Motor de Plantillas MVC
|
|
315
|
-
|
|
316
|
-
El framework incluye un motor de plantillas profesional con soporte para:
|
|
317
|
-
|
|
318
|
-
- Variables: `{{variable}}`
|
|
319
|
-
- Condiciones: `{{if variable}}contenido{{endif}}`
|
|
320
|
-
- Bucles: `{{foreach:array}}contenido{{endforeach}}`
|
|
321
|
-
- Inclusiones: `{{include:header}}`
|
|
322
|
-
- Filtros: `{{variable|upper}}`
|
|
323
|
-
- Helpers personalizados
|
|
324
|
-
|
|
325
|
-
## Gestión de Sesiones
|
|
326
|
-
|
|
327
|
-
El framework incluye un sistema completo de gestión de sesiones:
|
|
328
|
-
|
|
329
|
-
```javascript
|
|
330
|
-
const { SessionManager } = require('jerkjs');
|
|
331
|
-
|
|
332
|
-
const sessionManager = new SessionManager({
|
|
333
|
-
secret: 'your-session-secret',
|
|
334
|
-
timeout: 3600000 // 1 hora
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
// Usar como middleware
|
|
338
|
-
server.use(sessionManager.middleware());
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
## Ejemplos
|
|
342
|
-
|
|
343
|
-
El proyecto incluye varios ejemplos completos:
|
|
344
|
-
|
|
345
|
-
- **v2_json_auth**: Autenticación JWT con tokens almacenados en JSON
|
|
346
|
-
- **v2_mariadb_auth**: Autenticación JWT con tokens almacenados en MariaDB
|
|
347
|
-
- **v2_sqlite_auth**: Autenticación JWT con tokens almacenados en SQLite
|
|
348
|
-
- **public**: API pública de ejemplo con CORS y rate limiting
|
|
349
|
-
- **frontend**: Ejemplo de servidor que combina API y frontend con diferentes content-types
|
|
350
|
-
- **hooks**: Ejemplo avanzado de uso del sistema de hooks con logging y seguimiento de solicitudes
|
|
351
|
-
|
|
352
|
-
Para ver los ejemplos completos, visita los directorios `v2examplle/` y `examples/`.
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
## Documentación
|
|
356
|
-
|
|
357
|
-
Además de la documentación en el README, el proyecto incluye documentación adicional:
|
|
358
|
-
|
|
359
|
-
- **Guía de inicio rápido**: `docs/guia_inicio_rapido_jerkjs.md` - Una guía completa para empezar rápidamente con JERKJS, incluyendo formatos de archivos, estructura de controladores, motor de plantillas y sistema de hooks.
|
|
360
|
-
|
|
361
149
|
## Contribuciones
|
|
362
150
|
|
|
363
|
-
Las contribuciones son bienvenidas. Por favor, abre un issue o envía un pull request
|
|
151
|
+
Las contribuciones son bienvenidas. Por favor, abre un issue o envía un pull request para sugerir cambios o mejoras.
|
|
364
152
|
|
|
365
153
|
## Licencia
|
|
366
154
|
|
|
367
|
-
Apache 2.0
|
|
368
|
-
|
|
369
|
-
## Arquitectura de Modelos (MVC)
|
|
370
|
-
|
|
371
|
-
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.
|
|
372
|
-
|
|
373
|
-
### Ejemplo de Modelo Simple con MariaDB
|
|
374
|
-
|
|
375
|
-
```javascript
|
|
376
|
-
const { ModelBase, MariaDBAdapter } = require('jerkjs');
|
|
377
|
-
|
|
378
|
-
// Definir un modelo para usuarios
|
|
379
|
-
class UserModel extends ModelBase {
|
|
380
|
-
constructor(options = {}) {
|
|
381
|
-
super({
|
|
382
|
-
...options,
|
|
383
|
-
tableName: options.tableName || 'users'
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
// Definir campos del modelo
|
|
387
|
-
this.fields = {
|
|
388
|
-
id: { type: 'integer', primaryKey: true, autoIncrement: true },
|
|
389
|
-
username: { type: 'string', required: true },
|
|
390
|
-
email: { type: 'string', required: true },
|
|
391
|
-
password: { type: 'string', required: true },
|
|
392
|
-
createdAt: { type: 'datetime', default: 'CURRENT_TIMESTAMP' }
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// Método personalizado para encontrar usuario por email
|
|
397
|
-
async findByEmail(email) {
|
|
398
|
-
return await this.findOne({ email });
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// Método personalizado para crear usuario con validación
|
|
402
|
-
async createUser(userData) {
|
|
403
|
-
// Validar datos antes de crear
|
|
404
|
-
const validation = this.validate('create', userData);
|
|
405
|
-
if (!validation.isValid) {
|
|
406
|
-
throw new Error(`Validación fallida: ${validation.errors.join(', ')}`);
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
return await this.create(userData);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
// Configurar el adaptador de MariaDB
|
|
414
|
-
const dbConfig = {
|
|
415
|
-
host: 'localhost',
|
|
416
|
-
user: 'tu_usuario',
|
|
417
|
-
password: 'tu_contraseña',
|
|
418
|
-
database: 'tu_base_de_datos'
|
|
419
|
-
};
|
|
155
|
+
Este proyecto está licenciado bajo la Apache License 2.0 - ver el archivo LICENSE para más detalles.
|
|
420
156
|
|
|
421
|
-
|
|
157
|
+
## Autor
|
|
422
158
|
|
|
423
|
-
|
|
424
|
-
const userModel = new UserModel({
|
|
425
|
-
adapter: mariaDBAdapter,
|
|
426
|
-
tableName: 'users'
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
// Uso del modelo
|
|
430
|
-
async function ejemploUsoModelo() {
|
|
431
|
-
try {
|
|
432
|
-
// Crear un nuevo usuario
|
|
433
|
-
const nuevoUsuario = await userModel.createUser({
|
|
434
|
-
username: 'juan.perez',
|
|
435
|
-
email: 'juan@example.com',
|
|
436
|
-
password: 'contraseña_segura'
|
|
437
|
-
});
|
|
438
|
-
|
|
439
|
-
console.log('Usuario creado:', nuevoUsuario);
|
|
440
|
-
|
|
441
|
-
// Buscar usuario por email
|
|
442
|
-
const usuario = await userModel.findByEmail('juan@example.com');
|
|
443
|
-
console.log('Usuario encontrado:', usuario);
|
|
444
|
-
} catch (error) {
|
|
445
|
-
console.error('Error:', error.message);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
```
|
|
159
|
+
JERK Framework Team / Benjamin Sanhez Cardenas
|
|
449
160
|
|
|
450
|
-
|
|
161
|
+
## Repositorio
|
|
451
162
|
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
```javascript
|
|
455
|
-
const ControllerBase = require('jerkjs').ControllerBase;
|
|
456
|
-
|
|
457
|
-
class UserController extends ControllerBase {
|
|
458
|
-
constructor() {
|
|
459
|
-
super();
|
|
460
|
-
|
|
461
|
-
// Cargar el modelo de usuario
|
|
462
|
-
this.userModel = this.loadModel('UserModel', {
|
|
463
|
-
// Opciones del modelo
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
async getAllUsers(req, res) {
|
|
468
|
-
try {
|
|
469
|
-
// Usar el modelo para obtener usuarios
|
|
470
|
-
const users = await this.userModel.find({});
|
|
471
|
-
|
|
472
|
-
this.json(res, { success: true, data: users });
|
|
473
|
-
} catch (error) {
|
|
474
|
-
this.json(res, { success: false, error: error.message }, 500);
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
async getUserById(req, res) {
|
|
479
|
-
try {
|
|
480
|
-
const userId = req.params.id;
|
|
481
|
-
|
|
482
|
-
// Usar el modelo para encontrar un usuario específico
|
|
483
|
-
const user = await this.userModel.findOne({ id: userId });
|
|
484
|
-
|
|
485
|
-
if (!user) {
|
|
486
|
-
this.json(res, { success: false, error: 'Usuario no encontrado' }, 404);
|
|
487
|
-
return;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
this.json(res, { success: true, data: user });
|
|
491
|
-
} catch (error) {
|
|
492
|
-
this.json(res, { success: false, error: error.message }, 500);
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
async createUser(req, res) {
|
|
497
|
-
try {
|
|
498
|
-
// Usar el modelo para crear un nuevo usuario
|
|
499
|
-
const newUser = await this.userModel.createUser(req.body);
|
|
500
|
-
|
|
501
|
-
this.json(res, { success: true, data: newUser }, 201);
|
|
502
|
-
} catch (error) {
|
|
503
|
-
this.json(res, { success: false, error: error.message }, 400);
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
module.exports = new UserController();
|
|
509
|
-
```
|
|
163
|
+
GitLab: https://gitlab.com/bytedogssyndicate1/jerk
|
|
510
164
|
|
|
511
|
-
##
|
|
165
|
+
## Soporte
|
|
512
166
|
|
|
513
|
-
Para
|
|
167
|
+
Para soporte, por favor abre un issue en el repositorio o visita nuestra página web: https://jerk.page.gd/
|