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.
Files changed (131) hide show
  1. package/README.md +4 -6
  2. package/docs/EXTENSION_MANUAL.md +955 -0
  3. package/docs/FIREWALL_MANUAL.md +416 -0
  4. package/docs/HOOKS_REFERENCE_IMPROVED.md +596 -0
  5. package/docs/MANUAL_API_SDK.md +536 -0
  6. package/docs/MARIADB_TOKENS_IMPLEMENTATION.md +110 -0
  7. package/docs/MIDDLEWARE_MANUAL.md +518 -0
  8. package/docs/OAUTH2_GOOGLE_MANUAL.md +405 -0
  9. package/docs/frontend-and-sessions.md +6 -6
  10. package/examples/advanced/controllers/productController.js +64 -0
  11. package/examples/advanced/controllers/userController.js +85 -0
  12. package/examples/advanced/routes.json +51 -0
  13. package/examples/advanced_example.js +93 -0
  14. package/examples/basic/controllers/userController.js +85 -0
  15. package/examples/basic_example.js +72 -0
  16. package/examples/mvc_example/app.js +138 -0
  17. package/examples/mvc_example/views/home/index.html +26 -0
  18. package/examples/mvc_example/views/home/simple.html +3 -0
  19. package/examples/mvc_example/views/layout.html +23 -0
  20. package/examples/mvc_example/views/test.html +3 -0
  21. package/examples/mvc_example/views/user/invalid.html +6 -0
  22. package/examples/mvc_example/views/user/list.html +36 -0
  23. package/examples/mvc_example/views/user/notfound.html +6 -0
  24. package/examples/mvc_example/views/user/profile.html +11 -0
  25. package/examples/mvc_routes_example/app.js +34 -0
  26. package/examples/mvc_routes_example/controllers/mainController.js +27 -0
  27. package/examples/mvc_routes_example/controllers/productController.js +47 -0
  28. package/examples/mvc_routes_example/controllers/userController.js +76 -0
  29. package/examples/mvc_routes_example/routes.json +30 -0
  30. package/examples/mvc_routes_example/views/layout.html +31 -0
  31. package/examples/mvc_routes_example/views/main/index.html +11 -0
  32. package/examples/mvc_routes_example/views/product/catalog.html +24 -0
  33. package/examples/mvc_routes_example/views/user/invalid.html +6 -0
  34. package/examples/mvc_routes_example/views/user/list.html +40 -0
  35. package/examples/mvc_routes_example/views/user/notfound.html +6 -0
  36. package/examples/mvc_routes_example/views/user/profile.html +18 -0
  37. package/examples/mvc_welcome/README.md +34 -0
  38. package/examples/mvc_welcome/app.js +50 -0
  39. package/examples/mvc_welcome/controllers/welcomeController.js +41 -0
  40. package/examples/mvc_welcome/package.json +26 -0
  41. package/examples/mvc_welcome/views/home/welcome.html +82 -0
  42. package/examples/v2/README.md +72 -0
  43. package/examples/v2/app.js +74 -0
  44. package/examples/v2/app_fixed.js +74 -0
  45. package/examples/v2/controllers/authController.js +64 -0
  46. package/examples/v2/controllers/mainController.js +24 -0
  47. package/examples/v2/controllers/protectedController.js +12 -0
  48. package/examples/v2/controllers/userController.js +16 -0
  49. package/examples/v2/package.json +27 -0
  50. package/examples/v2/routes.json +30 -0
  51. package/examples/v2/test_api.sh +47 -0
  52. package/examples/v2/tokens_example.sqlite +0 -0
  53. package/examples/v2.1_firewall_demo/README.md +113 -0
  54. package/examples/v2.1_firewall_demo/app.js +182 -0
  55. package/examples/v2.1_firewall_demo/package.json +27 -0
  56. package/examples/v2.1_hooks_demo/README.md +85 -0
  57. package/examples/v2.1_hooks_demo/app.js +101 -0
  58. package/examples/v2.1_hooks_demo/controllers/hooksController.js +29 -0
  59. package/examples/v2.1_hooks_demo/controllers/mainController.js +18 -0
  60. package/examples/v2.1_hooks_demo/package.json +27 -0
  61. package/examples/v2.1_hooks_demo/routes.json +16 -0
  62. package/examples/v2.1_openapi_demo/README.md +82 -0
  63. package/examples/v2.1_openapi_demo/app.js +296 -0
  64. package/examples/v2.1_openapi_demo/package.json +26 -0
  65. package/examples/v2_cors/README.md +82 -0
  66. package/examples/v2_cors/app.js +108 -0
  67. package/examples/v2_cors/package.json +23 -0
  68. package/examples/v2_json_auth/README.md +83 -0
  69. package/examples/v2_json_auth/app.js +72 -0
  70. package/examples/v2_json_auth/controllers/authController.js +67 -0
  71. package/examples/v2_json_auth/controllers/mainController.js +16 -0
  72. package/examples/v2_json_auth/controllers/protectedController.js +12 -0
  73. package/examples/v2_json_auth/controllers/tokenController.js +28 -0
  74. package/examples/v2_json_auth/controllers/userController.js +15 -0
  75. package/examples/v2_json_auth/package.json +26 -0
  76. package/examples/v2_json_auth/routes.json +37 -0
  77. package/examples/v2_json_auth/tokens.json +20 -0
  78. package/examples/v2_mariadb_auth/README.md +94 -0
  79. package/examples/v2_mariadb_auth/app.js +81 -0
  80. package/examples/v2_mariadb_auth/controllers/authController.js +95 -0
  81. package/examples/v2_mariadb_auth/controllers/mainController.js +31 -0
  82. package/examples/v2_mariadb_auth/controllers/protectedController.js +12 -0
  83. package/examples/v2_mariadb_auth/controllers/userController.js +17 -0
  84. package/examples/v2_mariadb_auth/package.json +27 -0
  85. package/examples/v2_mariadb_auth/routes.json +37 -0
  86. package/examples/v2_no_auth/README.md +75 -0
  87. package/examples/v2_no_auth/app.js +72 -0
  88. package/examples/v2_no_auth/controllers/healthController.js +14 -0
  89. package/examples/v2_no_auth/controllers/mainController.js +19 -0
  90. package/examples/v2_no_auth/controllers/productController.js +31 -0
  91. package/examples/v2_no_auth/controllers/publicController.js +16 -0
  92. package/examples/v2_no_auth/package.json +22 -0
  93. package/examples/v2_no_auth/routes.json +37 -0
  94. package/examples/v2_oauth/README.md +70 -0
  95. package/examples/v2_oauth/app.js +90 -0
  96. package/examples/v2_oauth/controllers/mainController.js +45 -0
  97. package/examples/v2_oauth/controllers/oauthController.js +247 -0
  98. package/examples/v2_oauth/controllers/protectedController.js +13 -0
  99. package/examples/v2_oauth/controllers/userController.js +17 -0
  100. package/examples/v2_oauth/package.json +26 -0
  101. package/examples/v2_oauth/routes.json +44 -0
  102. package/examples/v2_openapi/README.md +77 -0
  103. package/examples/v2_openapi/app.js +222 -0
  104. package/examples/v2_openapi/controllers/authController.js +52 -0
  105. package/examples/v2_openapi/controllers/mainController.js +26 -0
  106. package/examples/v2_openapi/controllers/productController.js +17 -0
  107. package/examples/v2_openapi/controllers/userController.js +27 -0
  108. package/examples/v2_openapi/package.json +26 -0
  109. package/examples/v2_openapi/routes.json +37 -0
  110. package/index.js +11 -3
  111. package/lib/core/handler.js +1 -1
  112. package/lib/core/hooks.js +1 -1
  113. package/lib/core/router.js +1 -1
  114. package/lib/core/server.js +1 -1
  115. package/lib/loader/controllerLoader.js +1 -1
  116. package/lib/loader/routeLoader.js +1 -1
  117. package/lib/middleware/auditLogger.js +1 -1
  118. package/lib/middleware/authenticator.js +1 -1
  119. package/lib/middleware/compressor.js +1 -1
  120. package/lib/middleware/cors.js +1 -1
  121. package/lib/middleware/firewall.js +1 -1
  122. package/lib/middleware/rateLimiter.js +1 -1
  123. package/lib/middleware/session.js +1 -1
  124. package/lib/middleware/validator.js +1 -1
  125. package/lib/mvc/controllerBase.js +207 -0
  126. package/lib/mvc/viewEngine.js +752 -0
  127. package/lib/utils/configParser.js +1 -1
  128. package/lib/utils/logger.js +1 -1
  129. package/lib/utils/openapiGenerator.js +1 -1
  130. package/lib/utils/tokenManager.js +1 -1
  131. 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;