jerkjs 2.0.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 (177) hide show
  1. package/LICENSE +200 -0
  2. package/README.md +171 -0
  3. package/doc/EXTENSION_MANUAL.md +958 -0
  4. package/doc/FIREWALL_MANUAL.md +419 -0
  5. package/doc/HOOKS_REFERENCE_IMPROVED.md +599 -0
  6. package/doc/MANUAL_API_SDK.md +539 -0
  7. package/doc/MANUAL_MVC.md +397 -0
  8. package/doc/MARIADB_TOKENS_IMPLEMENTATION.md +113 -0
  9. package/doc/MIDDLEWARE_MANUAL.md +521 -0
  10. package/doc/OAUTH2_GOOGLE_MANUAL.md +408 -0
  11. package/doc/frontend-and-sessions.md +356 -0
  12. package/examples/advanced/controllers/productController.js +64 -0
  13. package/examples/advanced/controllers/userController.js +85 -0
  14. package/examples/advanced/routes.json +51 -0
  15. package/examples/advanced_example.js +93 -0
  16. package/examples/basic/controllers/userController.js +85 -0
  17. package/examples/basic_example.js +72 -0
  18. package/examples/frontend/README.md +71 -0
  19. package/examples/frontend/app.js +71 -0
  20. package/examples/frontend/controllers/apiController.js +39 -0
  21. package/examples/frontend/controllers/authController.js +220 -0
  22. package/examples/frontend/controllers/formController.js +47 -0
  23. package/examples/frontend/controllers/messageController.js +96 -0
  24. package/examples/frontend/controllers/pageController.js +178 -0
  25. package/examples/frontend/controllers/staticController.js +167 -0
  26. package/examples/frontend/routes.json +90 -0
  27. package/examples/mvc_example/app.js +138 -0
  28. package/examples/mvc_example/views/home/index.html +26 -0
  29. package/examples/mvc_example/views/home/simple.html +3 -0
  30. package/examples/mvc_example/views/layout.html +23 -0
  31. package/examples/mvc_example/views/test.html +3 -0
  32. package/examples/mvc_example/views/user/invalid.html +6 -0
  33. package/examples/mvc_example/views/user/list.html +36 -0
  34. package/examples/mvc_example/views/user/notfound.html +6 -0
  35. package/examples/mvc_example/views/user/profile.html +11 -0
  36. package/examples/mvc_routes_example/app.js +34 -0
  37. package/examples/mvc_routes_example/controllers/mainController.js +27 -0
  38. package/examples/mvc_routes_example/controllers/productController.js +47 -0
  39. package/examples/mvc_routes_example/controllers/userController.js +76 -0
  40. package/examples/mvc_routes_example/routes.json +30 -0
  41. package/examples/mvc_routes_example/views/layout.html +31 -0
  42. package/examples/mvc_routes_example/views/main/index.html +11 -0
  43. package/examples/mvc_routes_example/views/product/catalog.html +24 -0
  44. package/examples/mvc_routes_example/views/user/invalid.html +6 -0
  45. package/examples/mvc_routes_example/views/user/list.html +40 -0
  46. package/examples/mvc_routes_example/views/user/notfound.html +6 -0
  47. package/examples/mvc_routes_example/views/user/profile.html +18 -0
  48. package/examples/public/README.md +92 -0
  49. package/examples/public/app.js +72 -0
  50. package/examples/public/controllers/healthController.js +20 -0
  51. package/examples/public/controllers/mainController.js +22 -0
  52. package/examples/public/controllers/userController.js +139 -0
  53. package/examples/public/routes.json +51 -0
  54. package/examples/v2/README.md +72 -0
  55. package/examples/v2/app.js +74 -0
  56. package/examples/v2/app_fixed.js +74 -0
  57. package/examples/v2/controllers/authController.js +64 -0
  58. package/examples/v2/controllers/mainController.js +24 -0
  59. package/examples/v2/controllers/protectedController.js +12 -0
  60. package/examples/v2/controllers/userController.js +16 -0
  61. package/examples/v2/package.json +27 -0
  62. package/examples/v2/routes.json +30 -0
  63. package/examples/v2/test_api.sh +47 -0
  64. package/examples/v2/tokens_example.sqlite +0 -0
  65. package/examples/v2.1_firewall_demo/README.md +113 -0
  66. package/examples/v2.1_firewall_demo/app.js +182 -0
  67. package/examples/v2.1_firewall_demo/package.json +27 -0
  68. package/examples/v2.1_hooks_demo/README.md +85 -0
  69. package/examples/v2.1_hooks_demo/app.js +101 -0
  70. package/examples/v2.1_hooks_demo/controllers/hooksController.js +29 -0
  71. package/examples/v2.1_hooks_demo/controllers/mainController.js +18 -0
  72. package/examples/v2.1_hooks_demo/package.json +27 -0
  73. package/examples/v2.1_hooks_demo/routes.json +16 -0
  74. package/examples/v2.1_openapi_demo/README.md +82 -0
  75. package/examples/v2.1_openapi_demo/app.js +296 -0
  76. package/examples/v2.1_openapi_demo/package.json +26 -0
  77. package/examples/v2_cors/README.md +82 -0
  78. package/examples/v2_cors/app.js +108 -0
  79. package/examples/v2_cors/package.json +23 -0
  80. package/examples/v2_json_auth/README.md +83 -0
  81. package/examples/v2_json_auth/app.js +72 -0
  82. package/examples/v2_json_auth/controllers/authController.js +67 -0
  83. package/examples/v2_json_auth/controllers/mainController.js +16 -0
  84. package/examples/v2_json_auth/controllers/protectedController.js +12 -0
  85. package/examples/v2_json_auth/controllers/tokenController.js +28 -0
  86. package/examples/v2_json_auth/controllers/userController.js +15 -0
  87. package/examples/v2_json_auth/package.json +26 -0
  88. package/examples/v2_json_auth/routes.json +37 -0
  89. package/examples/v2_json_auth/tokens.json +20 -0
  90. package/examples/v2_mariadb_auth/README.md +94 -0
  91. package/examples/v2_mariadb_auth/app.js +81 -0
  92. package/examples/v2_mariadb_auth/controllers/authController.js +95 -0
  93. package/examples/v2_mariadb_auth/controllers/mainController.js +31 -0
  94. package/examples/v2_mariadb_auth/controllers/protectedController.js +12 -0
  95. package/examples/v2_mariadb_auth/controllers/userController.js +17 -0
  96. package/examples/v2_mariadb_auth/package.json +27 -0
  97. package/examples/v2_mariadb_auth/routes.json +37 -0
  98. package/examples/v2_no_auth/README.md +75 -0
  99. package/examples/v2_no_auth/app.js +72 -0
  100. package/examples/v2_no_auth/controllers/healthController.js +14 -0
  101. package/examples/v2_no_auth/controllers/mainController.js +19 -0
  102. package/examples/v2_no_auth/controllers/productController.js +31 -0
  103. package/examples/v2_no_auth/controllers/publicController.js +16 -0
  104. package/examples/v2_no_auth/package.json +22 -0
  105. package/examples/v2_no_auth/routes.json +37 -0
  106. package/examples/v2_oauth/README.md +70 -0
  107. package/examples/v2_oauth/app.js +90 -0
  108. package/examples/v2_oauth/controllers/mainController.js +45 -0
  109. package/examples/v2_oauth/controllers/oauthController.js +247 -0
  110. package/examples/v2_oauth/controllers/protectedController.js +13 -0
  111. package/examples/v2_oauth/controllers/userController.js +17 -0
  112. package/examples/v2_oauth/package.json +26 -0
  113. package/examples/v2_oauth/routes.json +44 -0
  114. package/examples/v2_openapi/README.md +77 -0
  115. package/examples/v2_openapi/app.js +222 -0
  116. package/examples/v2_openapi/controllers/authController.js +52 -0
  117. package/examples/v2_openapi/controllers/mainController.js +26 -0
  118. package/examples/v2_openapi/controllers/productController.js +17 -0
  119. package/examples/v2_openapi/controllers/userController.js +27 -0
  120. package/examples/v2_openapi/package.json +26 -0
  121. package/examples/v2_openapi/routes.json +37 -0
  122. package/generate_token.js +10 -0
  123. package/index.js +85 -0
  124. package/jerk.jpg +0 -0
  125. package/lib/core/handler.js +86 -0
  126. package/lib/core/hooks.js +224 -0
  127. package/lib/core/router.js +204 -0
  128. package/lib/core/securityEnhancedServer.js +752 -0
  129. package/lib/core/server.js +369 -0
  130. package/lib/loader/controllerLoader.js +175 -0
  131. package/lib/loader/routeLoader.js +341 -0
  132. package/lib/middleware/auditLogger.js +208 -0
  133. package/lib/middleware/authenticator.js +565 -0
  134. package/lib/middleware/compressor.js +218 -0
  135. package/lib/middleware/cors.js +135 -0
  136. package/lib/middleware/firewall.js +443 -0
  137. package/lib/middleware/rateLimiter.js +210 -0
  138. package/lib/middleware/session.js +301 -0
  139. package/lib/middleware/validator.js +193 -0
  140. package/lib/mvc/controllerBase.js +207 -0
  141. package/lib/mvc/viewEngine.js +752 -0
  142. package/lib/utils/configParser.js +223 -0
  143. package/lib/utils/logger.js +145 -0
  144. package/lib/utils/mariadbTokenAdapter.js +226 -0
  145. package/lib/utils/openapiGenerator.js +140 -0
  146. package/lib/utils/sqliteTokenAdapter.js +224 -0
  147. package/lib/utils/tokenManager.js +254 -0
  148. package/package.json +47 -0
  149. package/v2examplle/v2_json_auth/README.md +83 -0
  150. package/v2examplle/v2_json_auth/app.js +72 -0
  151. package/v2examplle/v2_json_auth/controllers/authController.js +67 -0
  152. package/v2examplle/v2_json_auth/controllers/mainController.js +16 -0
  153. package/v2examplle/v2_json_auth/controllers/protectedController.js +12 -0
  154. package/v2examplle/v2_json_auth/controllers/tokenController.js +28 -0
  155. package/v2examplle/v2_json_auth/controllers/userController.js +15 -0
  156. package/v2examplle/v2_json_auth/package.json +26 -0
  157. package/v2examplle/v2_json_auth/routes.json +37 -0
  158. package/v2examplle/v2_json_auth/tokens.json +20 -0
  159. package/v2examplle/v2_mariadb_auth/README.md +94 -0
  160. package/v2examplle/v2_mariadb_auth/app.js +81 -0
  161. package/v2examplle/v2_mariadb_auth/controllers/authController.js +95 -0
  162. package/v2examplle/v2_mariadb_auth/controllers/mainController.js +31 -0
  163. package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +12 -0
  164. package/v2examplle/v2_mariadb_auth/controllers/userController.js +17 -0
  165. package/v2examplle/v2_mariadb_auth/package.json +27 -0
  166. package/v2examplle/v2_mariadb_auth/routes.json +37 -0
  167. package/v2examplle/v2_sqlite_auth/README.md +72 -0
  168. package/v2examplle/v2_sqlite_auth/app.js +74 -0
  169. package/v2examplle/v2_sqlite_auth/app_fixed.js +74 -0
  170. package/v2examplle/v2_sqlite_auth/controllers/authController.js +64 -0
  171. package/v2examplle/v2_sqlite_auth/controllers/mainController.js +24 -0
  172. package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +12 -0
  173. package/v2examplle/v2_sqlite_auth/controllers/userController.js +16 -0
  174. package/v2examplle/v2_sqlite_auth/package.json +27 -0
  175. package/v2examplle/v2_sqlite_auth/routes.json +30 -0
  176. package/v2examplle/v2_sqlite_auth/test_api.sh +47 -0
  177. package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Sistema de enrutamiento avanzado para el framework API SDK
3
+ * Implementación extendida del componente core/router.js
4
+ * Incluye soporte para rutas anidadas y otras mejoras
5
+ */
6
+
7
+ class Router {
8
+ /**
9
+ * Constructor del router
10
+ * @param {Object} options - Opciones de configuración
11
+ * @param {string} options.prefix - Prefijo común para todas las rutas del router
12
+ */
13
+ constructor(options = {}) {
14
+ this.routes = [];
15
+ this.nestedRouters = [];
16
+ this.prefix = options.prefix || '';
17
+ }
18
+
19
+ /**
20
+ * Método para agregar una ruta GET
21
+ * @param {string} path - Ruta del endpoint
22
+ * @param {Function} handler - Función manejadora de la ruta
23
+ */
24
+ get(path, handler) {
25
+ this.addRoute('GET', path, handler);
26
+ return this;
27
+ }
28
+
29
+ /**
30
+ * Método para agregar una ruta POST
31
+ * @param {string} path - Ruta del endpoint
32
+ * @param {Function} handler - Función manejadora de la ruta
33
+ */
34
+ post(path, handler) {
35
+ this.addRoute('POST', path, handler);
36
+ return this;
37
+ }
38
+
39
+ /**
40
+ * Método para agregar una ruta PUT
41
+ * @param {string} path - Ruta del endpoint
42
+ * @param {Function} handler - Función manejadora de la ruta
43
+ */
44
+ put(path, handler) {
45
+ this.addRoute('PUT', path, handler);
46
+ return this;
47
+ }
48
+
49
+ /**
50
+ * Método para agregar una ruta DELETE
51
+ * @param {string} path - Ruta del endpoint
52
+ * @param {Function} handler - Función manejadora de la ruta
53
+ */
54
+ delete(path, handler) {
55
+ this.addRoute('DELETE', path, handler);
56
+ return this;
57
+ }
58
+
59
+ /**
60
+ * Método para agregar una ruta PATCH
61
+ * @param {string} path - Ruta del endpoint
62
+ * @param {Function} handler - Función manejadora de la ruta
63
+ */
64
+ patch(path, handler) {
65
+ this.addRoute('PATCH', path, handler);
66
+ return this;
67
+ }
68
+
69
+ /**
70
+ * Método para agregar una ruta genérica
71
+ * @param {string} method - Método HTTP
72
+ * @param {string} path - Ruta del endpoint
73
+ * @param {Function} handler - Función manejadora de la ruta
74
+ */
75
+ addRoute(method, path, handler) {
76
+ // Si hay un prefijo, combinarlo con la ruta
77
+ const fullPath = this.prefix ? `${this.prefix}${path}` : path;
78
+
79
+ this.routes.push({
80
+ method: method.toUpperCase(),
81
+ path: fullPath,
82
+ handler
83
+ });
84
+ }
85
+
86
+ /**
87
+ * Método para agregar un router anidado
88
+ * @param {string} prefix - Prefijo para las rutas anidadas
89
+ * @param {Router} router - Router a anidar
90
+ */
91
+ addNestedRouter(prefix, router) {
92
+ // Agregar prefijo al router anidado
93
+ const nestedRouterWithPrefix = {
94
+ prefix,
95
+ router
96
+ };
97
+
98
+ this.nestedRouters.push(nestedRouterWithPrefix);
99
+
100
+ // También agregar las rutas directamente para facilitar la búsqueda
101
+ const nestedRoutes = router.getRoutes();
102
+ for (const route of nestedRoutes) {
103
+ const prefixedPath = `${prefix}${route.path}`;
104
+ this.routes.push({
105
+ method: route.method,
106
+ path: prefixedPath,
107
+ handler: route.handler
108
+ });
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Método para obtener todas las rutas
114
+ * @returns {Array} - Array con todas las rutas registradas
115
+ */
116
+ getRoutes() {
117
+ return this.routes;
118
+ }
119
+
120
+ /**
121
+ * Método para combinar rutas de otro router
122
+ * @param {Router} router - Otro objeto Router
123
+ */
124
+ merge(router) {
125
+ if (router instanceof Router) {
126
+ this.routes = this.routes.concat(router.getRoutes());
127
+
128
+ // Copiar también los routers anidados
129
+ if (router.nestedRouters) {
130
+ this.nestedRouters = this.nestedRouters.concat(router.nestedRouters);
131
+ }
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Método para aplicar prefijo a todas las rutas
137
+ * @param {string} prefix - Prefijo a aplicar
138
+ */
139
+ setPrefix(prefix) {
140
+ this.prefix = prefix;
141
+
142
+ // Actualizar todas las rutas existentes con el nuevo prefijo
143
+ for (let i = 0; i < this.routes.length; i++) {
144
+ // Remover el prefijo anterior si existe
145
+ if (this.routes[i].originalPath) {
146
+ this.routes[i].path = `${prefix}${this.routes[i].originalPath}`;
147
+ } else {
148
+ // Guardar la ruta original antes de aplicar el prefijo
149
+ const originalPathWithoutCurrentPrefix = this.routes[i].path.replace(/^\/?[^\/]+\/?/, '');
150
+ this.routes[i].originalPath = originalPathWithoutCurrentPrefix;
151
+ this.routes[i].path = `${prefix}${originalPathWithoutCurrentPrefix}`;
152
+ }
153
+ }
154
+ }
155
+
156
+ /**
157
+ * Método para definir middleware específico para ciertas rutas
158
+ * @param {string|Array} path - Ruta(s) a las que aplicar el middleware
159
+ * @param {Function} middleware - Función de middleware
160
+ */
161
+ use(path, middleware) {
162
+ // Si el segundo parámetro es una función, es un middleware para todas las rutas
163
+ if (typeof path === 'function') {
164
+ middleware = path;
165
+ path = '/*'; // Aplicar a todas las rutas
166
+ }
167
+
168
+ // Crear un handler especial que ejecuta el middleware y luego el handler original
169
+ const middlewareHandler = (req, res, next) => {
170
+ return new Promise((resolve, reject) => {
171
+ const wrappedNext = (err) => {
172
+ if (err) {
173
+ reject(err);
174
+ } else {
175
+ if (next) next();
176
+ resolve();
177
+ }
178
+ };
179
+
180
+ // Ejecutar middleware
181
+ const result = middleware(req, res, wrappedNext);
182
+
183
+ // Si el middleware devuelve una promesa, esperarla
184
+ if (result && typeof result.then === 'function') {
185
+ result.then(() => {
186
+ if (next) next();
187
+ resolve();
188
+ }).catch(reject);
189
+ }
190
+ });
191
+ };
192
+
193
+ // Si path es un array, aplicar a todas las rutas del array
194
+ if (Array.isArray(path)) {
195
+ for (const singlePath of path) {
196
+ this.addRoute('USE', singlePath, middlewareHandler);
197
+ }
198
+ } else {
199
+ this.addRoute('USE', path, middlewareHandler);
200
+ }
201
+ }
202
+ }
203
+
204
+ module.exports = Router;