jerkjs 2.0.1 → 2.0.2
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/README.md +4 -6
- package/docs/EXTENSION_MANUAL.md +955 -0
- package/docs/FIREWALL_MANUAL.md +416 -0
- package/docs/HOOKS_REFERENCE_IMPROVED.md +596 -0
- package/docs/MANUAL_API_SDK.md +536 -0
- package/docs/MARIADB_TOKENS_IMPLEMENTATION.md +110 -0
- package/docs/MIDDLEWARE_MANUAL.md +518 -0
- package/docs/OAUTH2_GOOGLE_MANUAL.md +405 -0
- package/docs/frontend-and-sessions.md +6 -6
- package/examples/advanced/controllers/productController.js +64 -0
- package/examples/advanced/controllers/userController.js +85 -0
- package/examples/advanced/routes.json +51 -0
- package/examples/advanced_example.js +93 -0
- package/examples/basic/controllers/userController.js +85 -0
- package/examples/basic_example.js +72 -0
- package/examples/mvc_example/app.js +138 -0
- package/examples/mvc_example/views/home/index.html +26 -0
- package/examples/mvc_example/views/home/simple.html +3 -0
- package/examples/mvc_example/views/layout.html +23 -0
- package/examples/mvc_example/views/test.html +3 -0
- package/examples/mvc_example/views/user/invalid.html +6 -0
- package/examples/mvc_example/views/user/list.html +36 -0
- package/examples/mvc_example/views/user/notfound.html +6 -0
- package/examples/mvc_example/views/user/profile.html +11 -0
- package/examples/mvc_routes_example/app.js +34 -0
- package/examples/mvc_routes_example/controllers/mainController.js +27 -0
- package/examples/mvc_routes_example/controllers/productController.js +47 -0
- package/examples/mvc_routes_example/controllers/userController.js +76 -0
- package/examples/mvc_routes_example/routes.json +30 -0
- package/examples/mvc_routes_example/views/layout.html +31 -0
- package/examples/mvc_routes_example/views/main/index.html +11 -0
- package/examples/mvc_routes_example/views/product/catalog.html +24 -0
- package/examples/mvc_routes_example/views/user/invalid.html +6 -0
- package/examples/mvc_routes_example/views/user/list.html +40 -0
- package/examples/mvc_routes_example/views/user/notfound.html +6 -0
- package/examples/mvc_routes_example/views/user/profile.html +18 -0
- package/examples/mvc_welcome/README.md +34 -0
- package/examples/mvc_welcome/app.js +50 -0
- package/examples/mvc_welcome/controllers/welcomeController.js +41 -0
- package/examples/mvc_welcome/package.json +26 -0
- package/examples/mvc_welcome/views/home/welcome.html +82 -0
- package/examples/v2/README.md +72 -0
- package/examples/v2/app.js +74 -0
- package/examples/v2/app_fixed.js +74 -0
- package/examples/v2/controllers/authController.js +64 -0
- package/examples/v2/controllers/mainController.js +24 -0
- package/examples/v2/controllers/protectedController.js +12 -0
- package/examples/v2/controllers/userController.js +16 -0
- package/examples/v2/package.json +27 -0
- package/examples/v2/routes.json +30 -0
- package/examples/v2/test_api.sh +47 -0
- package/examples/v2/tokens_example.sqlite +0 -0
- package/examples/v2.1_firewall_demo/README.md +113 -0
- package/examples/v2.1_firewall_demo/app.js +182 -0
- package/examples/v2.1_firewall_demo/package.json +27 -0
- package/examples/v2.1_hooks_demo/README.md +85 -0
- package/examples/v2.1_hooks_demo/app.js +101 -0
- package/examples/v2.1_hooks_demo/controllers/hooksController.js +29 -0
- package/examples/v2.1_hooks_demo/controllers/mainController.js +18 -0
- package/examples/v2.1_hooks_demo/package.json +27 -0
- package/examples/v2.1_hooks_demo/routes.json +16 -0
- package/examples/v2.1_openapi_demo/README.md +82 -0
- package/examples/v2.1_openapi_demo/app.js +296 -0
- package/examples/v2.1_openapi_demo/package.json +26 -0
- package/examples/v2_cors/README.md +82 -0
- package/examples/v2_cors/app.js +108 -0
- package/examples/v2_cors/package.json +23 -0
- package/examples/v2_json_auth/README.md +83 -0
- package/examples/v2_json_auth/app.js +72 -0
- package/examples/v2_json_auth/controllers/authController.js +67 -0
- package/examples/v2_json_auth/controllers/mainController.js +16 -0
- package/examples/v2_json_auth/controllers/protectedController.js +12 -0
- package/examples/v2_json_auth/controllers/tokenController.js +28 -0
- package/examples/v2_json_auth/controllers/userController.js +15 -0
- package/examples/v2_json_auth/package.json +26 -0
- package/examples/v2_json_auth/routes.json +37 -0
- package/examples/v2_json_auth/tokens.json +20 -0
- package/examples/v2_mariadb_auth/README.md +94 -0
- package/examples/v2_mariadb_auth/app.js +81 -0
- package/examples/v2_mariadb_auth/controllers/authController.js +95 -0
- package/examples/v2_mariadb_auth/controllers/mainController.js +31 -0
- package/examples/v2_mariadb_auth/controllers/protectedController.js +12 -0
- package/examples/v2_mariadb_auth/controllers/userController.js +17 -0
- package/examples/v2_mariadb_auth/package.json +27 -0
- package/examples/v2_mariadb_auth/routes.json +37 -0
- package/examples/v2_no_auth/README.md +75 -0
- package/examples/v2_no_auth/app.js +72 -0
- package/examples/v2_no_auth/controllers/healthController.js +14 -0
- package/examples/v2_no_auth/controllers/mainController.js +19 -0
- package/examples/v2_no_auth/controllers/productController.js +31 -0
- package/examples/v2_no_auth/controllers/publicController.js +16 -0
- package/examples/v2_no_auth/package.json +22 -0
- package/examples/v2_no_auth/routes.json +37 -0
- package/examples/v2_oauth/README.md +70 -0
- package/examples/v2_oauth/app.js +90 -0
- package/examples/v2_oauth/controllers/mainController.js +45 -0
- package/examples/v2_oauth/controllers/oauthController.js +247 -0
- package/examples/v2_oauth/controllers/protectedController.js +13 -0
- package/examples/v2_oauth/controllers/userController.js +17 -0
- package/examples/v2_oauth/package.json +26 -0
- package/examples/v2_oauth/routes.json +44 -0
- package/examples/v2_openapi/README.md +77 -0
- package/examples/v2_openapi/app.js +222 -0
- package/examples/v2_openapi/controllers/authController.js +52 -0
- package/examples/v2_openapi/controllers/mainController.js +26 -0
- package/examples/v2_openapi/controllers/productController.js +17 -0
- package/examples/v2_openapi/controllers/userController.js +27 -0
- package/examples/v2_openapi/package.json +26 -0
- package/examples/v2_openapi/routes.json +37 -0
- package/index.js +11 -3
- package/lib/core/handler.js +1 -1
- package/lib/core/hooks.js +1 -1
- package/lib/core/router.js +1 -1
- package/lib/core/server.js +1 -1
- package/lib/loader/controllerLoader.js +1 -1
- package/lib/loader/routeLoader.js +1 -1
- package/lib/middleware/auditLogger.js +1 -1
- package/lib/middleware/authenticator.js +1 -1
- package/lib/middleware/compressor.js +1 -1
- package/lib/middleware/cors.js +1 -1
- package/lib/middleware/firewall.js +1 -1
- package/lib/middleware/rateLimiter.js +1 -1
- package/lib/middleware/session.js +1 -1
- package/lib/middleware/validator.js +1 -1
- package/lib/mvc/controllerBase.js +207 -0
- package/lib/mvc/viewEngine.js +752 -0
- package/lib/utils/configParser.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/openapiGenerator.js +1 -1
- package/lib/utils/tokenManager.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Controlador base para el framework JERK
|
|
3
|
+
* Implementación del componente MVC controllerBase.js
|
|
4
|
+
* Similar al sistema de controladores de CodeIgniter
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const ViewEngine = require('./viewEngine');
|
|
8
|
+
|
|
9
|
+
class ControllerBase {
|
|
10
|
+
constructor(options = {}) {
|
|
11
|
+
// Inicializar el motor de vistas
|
|
12
|
+
this.viewEngine = new ViewEngine({
|
|
13
|
+
viewsPath: options.viewsPath || './views',
|
|
14
|
+
defaultExtension: options.defaultExtension || '.html',
|
|
15
|
+
cacheEnabled: options.cacheEnabled
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
// Inicializar variables de datos para la vista
|
|
19
|
+
this.viewData = {};
|
|
20
|
+
|
|
21
|
+
// Referencia al objeto de solicitud y respuesta (cuando esté disponible)
|
|
22
|
+
this.req = null;
|
|
23
|
+
this.res = null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Establece variables para pasar a la vista
|
|
28
|
+
* @param {string|Object} key - Nombre de la variable o objeto con múltiples variables
|
|
29
|
+
* @param {*} value - Valor de la variable (si key es string)
|
|
30
|
+
*/
|
|
31
|
+
set(key, value) {
|
|
32
|
+
if (typeof key === 'object') {
|
|
33
|
+
// Si se pasa un objeto, fusionar con viewData
|
|
34
|
+
this.viewData = { ...this.viewData, ...key };
|
|
35
|
+
} else {
|
|
36
|
+
// Si se pasa una clave y valor, asignar individualmente
|
|
37
|
+
this.viewData[key] = value;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Renderiza una vista con las variables actuales
|
|
43
|
+
* @param {string} viewName - Nombre de la vista a renderizar
|
|
44
|
+
* @param {Object} additionalData - Datos adicionales para pasar a la vista
|
|
45
|
+
* @param {Object} options - Opciones adicionales
|
|
46
|
+
*/
|
|
47
|
+
view(viewName, additionalData = {}, options = {}) {
|
|
48
|
+
// Fusionar datos de la vista con datos adicionales
|
|
49
|
+
const data = { ...this.viewData, ...additionalData };
|
|
50
|
+
|
|
51
|
+
// Renderizar la vista
|
|
52
|
+
const renderedView = this.viewEngine.render(viewName, data, options);
|
|
53
|
+
|
|
54
|
+
return renderedView;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Renderiza una vista y la envía como respuesta HTTP
|
|
59
|
+
* @param {Object} res - Objeto de respuesta HTTP
|
|
60
|
+
* @param {string} viewName - Nombre de la vista a renderizar
|
|
61
|
+
* @param {Object} additionalData - Datos adicionales para pasar a la vista
|
|
62
|
+
* @param {Object} options - Opciones adicionales
|
|
63
|
+
*/
|
|
64
|
+
render(res, viewName, additionalData = {}, options = {}) {
|
|
65
|
+
try {
|
|
66
|
+
// Renderizar la vista
|
|
67
|
+
const renderedView = this.view(viewName, additionalData, options);
|
|
68
|
+
|
|
69
|
+
// Enviar la vista renderizada como respuesta
|
|
70
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
71
|
+
res.end(renderedView);
|
|
72
|
+
} catch (error) {
|
|
73
|
+
console.error('Error renderizando vista:', error);
|
|
74
|
+
res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
75
|
+
res.end('Error interno del servidor');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Renderiza una vista parcial (sin layout)
|
|
81
|
+
* @param {string} viewName - Nombre de la vista parcial
|
|
82
|
+
* @param {Object} additionalData - Datos adicionales para pasar a la vista
|
|
83
|
+
* @returns {string} - Vista parcial renderizada
|
|
84
|
+
*/
|
|
85
|
+
partial(viewName, additionalData = {}) {
|
|
86
|
+
// Fusionar datos de la vista con datos adicionales
|
|
87
|
+
const data = { ...this.viewData, ...additionalData };
|
|
88
|
+
|
|
89
|
+
// Renderizar la vista parcial
|
|
90
|
+
return this.viewEngine.render(viewName, data);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Redirecciona a otra URL
|
|
95
|
+
* @param {Object} res - Objeto de respuesta HTTP
|
|
96
|
+
* @param {string} url - URL a la que redireccionar
|
|
97
|
+
*/
|
|
98
|
+
redirect(res, url) {
|
|
99
|
+
res.writeHead(302, { 'Location': url });
|
|
100
|
+
res.end();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Devuelve una respuesta JSON
|
|
105
|
+
* @param {Object} res - Objeto de respuesta HTTP
|
|
106
|
+
* @param {Object} data - Datos a enviar como JSON
|
|
107
|
+
* @param {number} statusCode - Código de estado HTTP
|
|
108
|
+
*/
|
|
109
|
+
json(res, data, statusCode = 200) {
|
|
110
|
+
res.writeHead(statusCode, { 'Content-Type': 'application/json; charset=utf-8' });
|
|
111
|
+
res.end(JSON.stringify(data));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Obtiene un valor de la solicitud (query, body o params)
|
|
116
|
+
* @param {string} key - Clave del valor a obtener
|
|
117
|
+
* @param {*} defaultValue - Valor por defecto si no se encuentra
|
|
118
|
+
* @returns {*} - Valor obtenido o valor por defecto
|
|
119
|
+
*/
|
|
120
|
+
input(key, defaultValue = null) {
|
|
121
|
+
if (!this.req) {
|
|
122
|
+
return defaultValue;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Buscar en body, query y params
|
|
126
|
+
if (this.req.body && typeof this.req.body === 'object' && key in this.req.body) {
|
|
127
|
+
return this.req.body[key];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (this.req.query && typeof this.req.query === 'object' && key in this.req.query) {
|
|
131
|
+
return this.req.query[key];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (this.req.params && typeof this.req.params === 'object' && key in this.req.params) {
|
|
135
|
+
return this.req.params[key];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return defaultValue;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Obtiene todos los valores de entrada
|
|
143
|
+
* @returns {Object} - Todos los valores de entrada combinados
|
|
144
|
+
*/
|
|
145
|
+
allInput() {
|
|
146
|
+
if (!this.req) {
|
|
147
|
+
return {};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return {
|
|
151
|
+
...this.getBody(),
|
|
152
|
+
...this.getQuery(),
|
|
153
|
+
...this.getParams()
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Obtiene los parámetros de consulta (query)
|
|
159
|
+
* @returns {Object} - Parámetros de consulta
|
|
160
|
+
*/
|
|
161
|
+
getQuery() {
|
|
162
|
+
return this.req?.query || {};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Obtiene el cuerpo de la solicitud (body)
|
|
167
|
+
* @returns {Object} - Cuerpo de la solicitud
|
|
168
|
+
*/
|
|
169
|
+
getBody() {
|
|
170
|
+
return this.req?.body || {};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Obtiene los parámetros de ruta (params)
|
|
175
|
+
* @returns {Object} - Parámetros de ruta
|
|
176
|
+
*/
|
|
177
|
+
getParams() {
|
|
178
|
+
return this.req?.params || {};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Establece la solicitud y respuesta actuales
|
|
183
|
+
* @param {Object} req - Objeto de solicitud HTTP
|
|
184
|
+
* @param {Object} res - Objeto de respuesta HTTP
|
|
185
|
+
*/
|
|
186
|
+
setRequestResponse(req, res) {
|
|
187
|
+
this.req = req;
|
|
188
|
+
this.res = res;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Obtiene la instancia del motor de vistas
|
|
193
|
+
* @returns {ViewEngine} - Instancia del motor de vistas
|
|
194
|
+
*/
|
|
195
|
+
getViewEngine() {
|
|
196
|
+
return this.viewEngine;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Limpia las variables de vista
|
|
201
|
+
*/
|
|
202
|
+
clearViewData() {
|
|
203
|
+
this.viewData = {};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
module.exports = ControllerBase;
|