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
@@ -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();
@@ -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
- }
@@ -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
- ]
@@ -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();