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
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Controlador de usuarios
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
class UserController {
|
|
6
|
-
getAllUsers(req, res) {
|
|
7
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
8
|
-
res.end(JSON.stringify({ users: [] }));
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
getUserById(req, res) {
|
|
12
|
-
const userId = req.params.id;
|
|
13
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
14
|
-
res.end(JSON.stringify({ id: userId, name: `Usuario ${userId}` }));
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
createUser(req, res) {
|
|
18
|
-
res.writeHead(201, { 'Content-Type': 'application/json' });
|
|
19
|
-
res.end(JSON.stringify({ message: 'Usuario creado', data: req.body }));
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
module.exports = new UserController();
|
package/standard/package.json
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "jerk-standard-server",
|
|
3
|
-
"version": "2.1.0",
|
|
4
|
-
"description": "Servidor estándar para JERK Framework v2.1",
|
|
5
|
-
"main": "server.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"start": "node server.js",
|
|
8
|
-
"dev": "PORT=3001 node server.js"
|
|
9
|
-
},
|
|
10
|
-
"keywords": [
|
|
11
|
-
"jerk",
|
|
12
|
-
"framework",
|
|
13
|
-
"api",
|
|
14
|
-
"server",
|
|
15
|
-
"standard"
|
|
16
|
-
],
|
|
17
|
-
"author": "JERK Framework Team",
|
|
18
|
-
"license": "Apache-2.0",
|
|
19
|
-
"dependencies": {
|
|
20
|
-
"jerkjs": "file:.."
|
|
21
|
-
}
|
|
22
|
-
}
|
package/standard/routes.json
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"path": "/",
|
|
4
|
-
"method": "GET",
|
|
5
|
-
"controller": "HomeController",
|
|
6
|
-
"handler": "index",
|
|
7
|
-
"contentType": "text/html"
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"path": "/api/users",
|
|
11
|
-
"method": "GET",
|
|
12
|
-
"controller": "UserController",
|
|
13
|
-
"handler": "getAllUsers",
|
|
14
|
-
"contentType": "application/json"
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"path": "/api/users/:id",
|
|
18
|
-
"method": "GET",
|
|
19
|
-
"controller": "UserController",
|
|
20
|
-
"handler": "getUserById",
|
|
21
|
-
"contentType": "application/json"
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"path": "/api/users",
|
|
25
|
-
"method": "POST",
|
|
26
|
-
"controller": "UserController",
|
|
27
|
-
"handler": "createUser",
|
|
28
|
-
"contentType": "application/json"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"path": "/api/products",
|
|
32
|
-
"method": "GET",
|
|
33
|
-
"controller": "ProductController",
|
|
34
|
-
"handler": "getAllProducts",
|
|
35
|
-
"contentType": "application/json"
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"path": "/api/products/:id",
|
|
39
|
-
"method": "GET",
|
|
40
|
-
"controller": "ProductController",
|
|
41
|
-
"handler": "getProductById",
|
|
42
|
-
"contentType": "application/json"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"path": "/health",
|
|
46
|
-
"method": "GET",
|
|
47
|
-
"controller": "HealthController",
|
|
48
|
-
"handler": "checkHealth",
|
|
49
|
-
"contentType": "application/json"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"path": "/test-compression",
|
|
53
|
-
"method": "GET",
|
|
54
|
-
"controller": "CompressionTestController",
|
|
55
|
-
"handler": "getLargeData",
|
|
56
|
-
"contentType": "application/json"
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"path": "/test-compression-hooks",
|
|
60
|
-
"method": "GET",
|
|
61
|
-
"controller": "CompressionTestController",
|
|
62
|
-
"handler": "testCompressionHooks",
|
|
63
|
-
"contentType": "application/json"
|
|
64
|
-
}
|
|
65
|
-
]
|
package/standard/server.js
DELETED
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Servidor estándar para JERK Framework v2.1
|
|
3
|
-
* Este servidor implementa todas las características del framework
|
|
4
|
-
* y carga rutas desde routes.json
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const {
|
|
8
|
-
APIServer,
|
|
9
|
-
ControllerLoader,
|
|
10
|
-
Logger,
|
|
11
|
-
Authenticator,
|
|
12
|
-
Cors,
|
|
13
|
-
RateLimiter,
|
|
14
|
-
Compressor,
|
|
15
|
-
Firewall,
|
|
16
|
-
SessionManager,
|
|
17
|
-
hooks
|
|
18
|
-
} = require('../index.js');
|
|
19
|
-
|
|
20
|
-
const RouteLoader = require('../lib/loader/routeLoader');
|
|
21
|
-
|
|
22
|
-
class StandardServer {
|
|
23
|
-
constructor() {
|
|
24
|
-
// Obtener puerto de variable de entorno, obligatorio
|
|
25
|
-
this.port = parseInt(process.env.PORT);
|
|
26
|
-
if (isNaN(this.port)) {
|
|
27
|
-
throw new Error('La variable de entorno PORT es obligatoria');
|
|
28
|
-
}
|
|
29
|
-
this.host = process.env.HOST || 'localhost';
|
|
30
|
-
|
|
31
|
-
// Inicializar componentes
|
|
32
|
-
this.server = new APIServer({
|
|
33
|
-
port: this.port,
|
|
34
|
-
host: this.host,
|
|
35
|
-
https: process.env.USE_HTTPS === 'true',
|
|
36
|
-
key: process.env.HTTPS_KEY_PATH,
|
|
37
|
-
cert: process.env.HTTPS_CERT_PATH,
|
|
38
|
-
requestTimeout: parseInt(process.env.REQUEST_TIMEOUT) || 120000,
|
|
39
|
-
connectionTimeout: parseInt(process.env.CONNECTION_TIMEOUT) || 120000,
|
|
40
|
-
maxBodySize: parseInt(process.env.MAX_BODY_SIZE) || 10 * 1024 * 1024
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
this.logger = new Logger();
|
|
44
|
-
this.authenticator = new Authenticator({ logger: this.logger });
|
|
45
|
-
this.cors = new Cors();
|
|
46
|
-
this.rateLimiter = new RateLimiter();
|
|
47
|
-
this.compressor = new Compressor({ hooks: hooks });
|
|
48
|
-
this.firewall = new Firewall({ logger: this.logger });
|
|
49
|
-
this.sessionManager = new SessionManager();
|
|
50
|
-
|
|
51
|
-
// Registrar hooks para mostrar información al iniciar
|
|
52
|
-
this.setupHooks();
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
setupHooks() {
|
|
56
|
-
// Hook para mostrar información antes de iniciar el servidor
|
|
57
|
-
hooks.addAction('pre_server_start', (server) => {
|
|
58
|
-
this.logger.info('=== INICIANDO SERVIDOR ESTÁNDAR JERK ===');
|
|
59
|
-
this.logger.info(`Puerto: ${this.port}`);
|
|
60
|
-
this.logger.info('Características habilitadas:');
|
|
61
|
-
this.logger.info('- Autenticación (JWT, API Key, Basic, OAuth2, OIDC)');
|
|
62
|
-
this.logger.info('- CORS');
|
|
63
|
-
this.logger.info('- Rate Limiting');
|
|
64
|
-
this.logger.info('- Compresión');
|
|
65
|
-
this.logger.info('- Firewall');
|
|
66
|
-
this.logger.info('- Sesiones');
|
|
67
|
-
this.logger.info('- Sistema de Hooks/Filters');
|
|
68
|
-
this.logger.info('- MVC (Modelo-Vista-Controlador)');
|
|
69
|
-
this.logger.info('- Motor de plantillas');
|
|
70
|
-
this.logger.info('- Manejo de errores');
|
|
71
|
-
|
|
72
|
-
// Cargar rutas antes de iniciar el servidor
|
|
73
|
-
this.loadRoutes();
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// Hook para mostrar información después de iniciar el servidor
|
|
77
|
-
hooks.addAction('post_server_start', (server) => {
|
|
78
|
-
this.logger.info(`Servidor estándar JERK escuchando en http://${this.host}:${this.port}`);
|
|
79
|
-
this.displayLoadedRoutes();
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
loadRoutes() {
|
|
84
|
-
try {
|
|
85
|
-
// Instanciar RouteLoader y cargar rutas desde routes.json
|
|
86
|
-
const routeLoader = new RouteLoader();
|
|
87
|
-
routeLoader.loadRoutes(this.server, './routes.json');
|
|
88
|
-
this.logger.info('Rutas cargadas desde routes.json');
|
|
89
|
-
} catch (error) {
|
|
90
|
-
this.logger.error('Error al cargar rutas:', error.message);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
displayLoadedRoutes() {
|
|
95
|
-
if (this.server.routes && this.server.routes.length > 0) {
|
|
96
|
-
this.logger.info('=== RUTAS CARGADAS ===');
|
|
97
|
-
this.server.routes.forEach((route, index) => {
|
|
98
|
-
this.logger.info(`${index + 1}. ${route.method} ${route.path}`);
|
|
99
|
-
});
|
|
100
|
-
} else {
|
|
101
|
-
this.logger.warn('No se encontraron rutas para mostrar');
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Método para configurar middlewares estándar
|
|
106
|
-
configureStandardMiddlewares() {
|
|
107
|
-
// Middleware de firewall (debe ir primero)
|
|
108
|
-
this.server.use(this.firewall.middleware());
|
|
109
|
-
|
|
110
|
-
// Middleware de compresión
|
|
111
|
-
this.server.use(this.compressor.middleware());
|
|
112
|
-
|
|
113
|
-
// Middleware de CORS
|
|
114
|
-
this.server.use(this.cors.middleware());
|
|
115
|
-
|
|
116
|
-
// Middleware de limitación de tasa
|
|
117
|
-
this.server.use(this.rateLimiter.middleware());
|
|
118
|
-
|
|
119
|
-
// Middleware de sesión
|
|
120
|
-
this.server.use(this.sessionManager.middleware());
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
start() {
|
|
124
|
-
// Configurar middlewares estándar
|
|
125
|
-
this.configureStandardMiddlewares();
|
|
126
|
-
|
|
127
|
-
// Iniciar el servidor
|
|
128
|
-
this.server.start();
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
stop() {
|
|
132
|
-
this.server.stop();
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Crear e iniciar el servidor estándar
|
|
137
|
-
const standardServer = new StandardServer();
|
|
138
|
-
standardServer.start();
|
|
139
|
-
|
|
140
|
-
module.exports = StandardServer;
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
const ControllerBase = require('../../lib/mvc/controllerBase');
|
|
2
|
-
|
|
3
|
-
class AuthController extends ControllerBase {
|
|
4
|
-
constructor(options = {}) {
|
|
5
|
-
super(options);
|
|
6
|
-
this.viewsPath = './standardA/views'; // Ruta a las vistas
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// Mostrar formulario de login
|
|
10
|
-
showLogin(req, res) {
|
|
11
|
-
this.set('title', 'Iniciar Sesión');
|
|
12
|
-
this.render(res, 'auth/login');
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// Manejar el proceso de login con sesiones
|
|
16
|
-
async handleLogin(req, res) {
|
|
17
|
-
const { username, password } = req.body;
|
|
18
|
-
|
|
19
|
-
// Validación básica
|
|
20
|
-
if (!username || !password) {
|
|
21
|
-
this.set('title', 'Error de Login');
|
|
22
|
-
this.set('error', 'Por favor, proporciona usuario y contraseña');
|
|
23
|
-
this.render(res, 'auth/login');
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Lógica de autenticación simulada (en una aplicación real, esto sería contra una base de datos)
|
|
28
|
-
if (username === 'admin' && password === 'password123') {
|
|
29
|
-
// Crear sesión para el usuario
|
|
30
|
-
if (req.session) {
|
|
31
|
-
req.session.create({
|
|
32
|
-
authenticated: true,
|
|
33
|
-
userId: 1,
|
|
34
|
-
username: 'admin',
|
|
35
|
-
role: 'admin',
|
|
36
|
-
loginTime: new Date().toISOString()
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Redirigir al dashboard
|
|
41
|
-
res.writeHead(302, { 'Location': '/dashboard' });
|
|
42
|
-
res.end();
|
|
43
|
-
} else {
|
|
44
|
-
this.set('title', 'Error de Login');
|
|
45
|
-
this.set('error', 'Credenciales inválidas');
|
|
46
|
-
this.render(res, 'auth/login');
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Manejar logout con sesiones
|
|
51
|
-
handleLogout(req, res) {
|
|
52
|
-
// Destruir la sesión
|
|
53
|
-
if (req.session) {
|
|
54
|
-
req.session.destroy();
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
res.writeHead(302, { 'Location': '/' });
|
|
58
|
-
res.end();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Mostrar el dashboard (requiere autenticación por sesión)
|
|
62
|
-
showDashboard(req, res) {
|
|
63
|
-
// Esta ruta está protegida por el middleware de sesión
|
|
64
|
-
this.set('title', 'Panel de Control');
|
|
65
|
-
this.set('user', req.session?.data || { username: 'Invitado' });
|
|
66
|
-
this.render(res, 'auth/dashboard');
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Endpoint protegido con JWT (este endpoint se protege con el middleware de autenticación JWT)
|
|
70
|
-
protectedApiEndpoint(req, res) {
|
|
71
|
-
// Esta ruta está protegida por el middleware de autenticación JWT
|
|
72
|
-
// La información del usuario autenticado está disponible en req.user
|
|
73
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
74
|
-
res.end(JSON.stringify({
|
|
75
|
-
message: 'Acceso concedido a recurso protegido',
|
|
76
|
-
user: req.user,
|
|
77
|
-
timestamp: new Date().toISOString()
|
|
78
|
-
}));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
module.exports = new AuthController();
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
const ControllerBase = require('../../lib/mvc/controllerBase');
|
|
2
|
-
|
|
3
|
-
class HomeController extends ControllerBase {
|
|
4
|
-
constructor(options = {}) {
|
|
5
|
-
super(options);
|
|
6
|
-
this.viewsPath = './standardA/views'; // Ruta a las vistas
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
index(req, res) {
|
|
10
|
-
// Establecer variables para la vista
|
|
11
|
-
this.set('title', 'Página de Inicio');
|
|
12
|
-
this.set('message', 'Bienvenido al ejemplo sin routes.json');
|
|
13
|
-
|
|
14
|
-
// Renderizar la vista
|
|
15
|
-
this.render(res, 'index');
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
module.exports = new HomeController();
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
const ControllerBase = require('../../lib/mvc/controllerBase');
|
|
2
|
-
|
|
3
|
-
class UserController extends ControllerBase {
|
|
4
|
-
constructor(options = {}) {
|
|
5
|
-
super(options);
|
|
6
|
-
this.viewsPath = './standardA/views'; // Ruta a las vistas
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
getAll(req, res) {
|
|
10
|
-
const users = [
|
|
11
|
-
{ id: 1, name: 'Juan Pérez', email: 'juan@example.com' },
|
|
12
|
-
{ id: 2, name: 'Ana García', email: 'ana@example.com' },
|
|
13
|
-
{ id: 3, name: 'Luis Rodríguez', email: 'luis@example.com' }
|
|
14
|
-
];
|
|
15
|
-
|
|
16
|
-
// Establecer variables para la vista
|
|
17
|
-
this.set('title', 'Lista de Usuarios');
|
|
18
|
-
this.set('users', users);
|
|
19
|
-
|
|
20
|
-
// Renderizar la vista
|
|
21
|
-
this.render(res, 'users/list');
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
getById(req, res) {
|
|
25
|
-
const userId = req.params.id;
|
|
26
|
-
const user = {
|
|
27
|
-
id: userId,
|
|
28
|
-
name: `Usuario ${userId}`,
|
|
29
|
-
email: `usuario${userId}@example.com`,
|
|
30
|
-
registered: new Date().toISOString()
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// Establecer variables para la vista
|
|
34
|
-
this.set('user', user);
|
|
35
|
-
|
|
36
|
-
// Renderizar la vista
|
|
37
|
-
this.render(res, 'users/detail');
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
module.exports = new UserController();
|