jerkjs 2.1.0 → 2.1.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 (167) hide show
  1. package/CHANGELOG.md +3 -2
  2. package/README.md +1 -1
  3. package/examples.arj +0 -0
  4. package/index.js +1 -1
  5. package/lib/middleware/compressor.js +34 -18
  6. package/package.json +1 -1
  7. package/standard/CompressionTestController.js +38 -0
  8. package/standard/HealthController.js +16 -0
  9. package/standard/HomeController.js +12 -0
  10. package/standard/ProductController.js +18 -0
  11. package/standard/README.md +47 -0
  12. package/standard/UserController.js +23 -0
  13. package/standard/package.json +22 -0
  14. package/standard/routes.json +58 -0
  15. package/standard/server.js +140 -0
  16. package/cookies.txt +0 -5
  17. package/examples/advanced/controllers/productController.js +0 -64
  18. package/examples/advanced/controllers/userController.js +0 -85
  19. package/examples/advanced/routes.json +0 -51
  20. package/examples/advanced_example.js +0 -93
  21. package/examples/basic/controllers/userController.js +0 -85
  22. package/examples/basic_example.js +0 -72
  23. package/examples/frontend/README.md +0 -71
  24. package/examples/frontend/app.js +0 -71
  25. package/examples/frontend/controllers/apiController.js +0 -39
  26. package/examples/frontend/controllers/authController.js +0 -220
  27. package/examples/frontend/controllers/formController.js +0 -47
  28. package/examples/frontend/controllers/messageController.js +0 -96
  29. package/examples/frontend/controllers/pageController.js +0 -178
  30. package/examples/frontend/controllers/staticController.js +0 -167
  31. package/examples/frontend/routes.json +0 -90
  32. package/examples/hooks/app.js +0 -136
  33. package/examples/hooks/controllers/authController.js +0 -54
  34. package/examples/hooks/controllers/mainController.js +0 -41
  35. package/examples/hooks/controllers/productController.js +0 -39
  36. package/examples/hooks/controllers/userController.js +0 -69
  37. package/examples/hooks/routes.json +0 -51
  38. package/examples/hooks/views/home.html +0 -50
  39. package/examples/mvc_example/app.js +0 -138
  40. package/examples/mvc_example/views/home/index.html +0 -26
  41. package/examples/mvc_example/views/home/simple.html +0 -3
  42. package/examples/mvc_example/views/layout.html +0 -23
  43. package/examples/mvc_example/views/test.html +0 -3
  44. package/examples/mvc_example/views/user/invalid.html +0 -6
  45. package/examples/mvc_example/views/user/list.html +0 -36
  46. package/examples/mvc_example/views/user/notfound.html +0 -6
  47. package/examples/mvc_example/views/user/profile.html +0 -11
  48. package/examples/mvc_routes_example/app.js +0 -34
  49. package/examples/mvc_routes_example/controllers/mainController.js +0 -27
  50. package/examples/mvc_routes_example/controllers/productController.js +0 -47
  51. package/examples/mvc_routes_example/controllers/userController.js +0 -76
  52. package/examples/mvc_routes_example/routes.json +0 -30
  53. package/examples/mvc_routes_example/views/layout.html +0 -31
  54. package/examples/mvc_routes_example/views/main/index.html +0 -11
  55. package/examples/mvc_routes_example/views/product/catalog.html +0 -24
  56. package/examples/mvc_routes_example/views/user/invalid.html +0 -6
  57. package/examples/mvc_routes_example/views/user/list.html +0 -40
  58. package/examples/mvc_routes_example/views/user/notfound.html +0 -6
  59. package/examples/mvc_routes_example/views/user/profile.html +0 -18
  60. package/examples/mvc_welcome/README.md +0 -34
  61. package/examples/mvc_welcome/app.js +0 -50
  62. package/examples/mvc_welcome/controllers/welcomeController.js +0 -41
  63. package/examples/mvc_welcome/package.json +0 -26
  64. package/examples/mvc_welcome/views/home/welcome.html +0 -82
  65. package/examples/public/README.md +0 -92
  66. package/examples/public/app.js +0 -72
  67. package/examples/public/controllers/healthController.js +0 -20
  68. package/examples/public/controllers/mainController.js +0 -22
  69. package/examples/public/controllers/userController.js +0 -139
  70. package/examples/public/routes.json +0 -51
  71. package/examples/v2/README.md +0 -72
  72. package/examples/v2/app.js +0 -74
  73. package/examples/v2/app_fixed.js +0 -74
  74. package/examples/v2/controllers/authController.js +0 -64
  75. package/examples/v2/controllers/mainController.js +0 -24
  76. package/examples/v2/controllers/protectedController.js +0 -12
  77. package/examples/v2/controllers/userController.js +0 -16
  78. package/examples/v2/package.json +0 -27
  79. package/examples/v2/routes.json +0 -30
  80. package/examples/v2/test_api.sh +0 -47
  81. package/examples/v2/tokens_example.sqlite +0 -0
  82. package/examples/v2.1_firewall_demo/README.md +0 -113
  83. package/examples/v2.1_firewall_demo/app.js +0 -182
  84. package/examples/v2.1_firewall_demo/package.json +0 -27
  85. package/examples/v2.1_hooks_demo/README.md +0 -85
  86. package/examples/v2.1_hooks_demo/app.js +0 -101
  87. package/examples/v2.1_hooks_demo/controllers/hooksController.js +0 -29
  88. package/examples/v2.1_hooks_demo/controllers/mainController.js +0 -18
  89. package/examples/v2.1_hooks_demo/package.json +0 -27
  90. package/examples/v2.1_hooks_demo/routes.json +0 -16
  91. package/examples/v2.1_openapi_demo/README.md +0 -82
  92. package/examples/v2.1_openapi_demo/app.js +0 -296
  93. package/examples/v2.1_openapi_demo/package.json +0 -26
  94. package/examples/v2_cors/README.md +0 -82
  95. package/examples/v2_cors/app.js +0 -108
  96. package/examples/v2_cors/package.json +0 -23
  97. package/examples/v2_json_auth/README.md +0 -83
  98. package/examples/v2_json_auth/app.js +0 -72
  99. package/examples/v2_json_auth/controllers/authController.js +0 -67
  100. package/examples/v2_json_auth/controllers/mainController.js +0 -16
  101. package/examples/v2_json_auth/controllers/protectedController.js +0 -12
  102. package/examples/v2_json_auth/controllers/tokenController.js +0 -28
  103. package/examples/v2_json_auth/controllers/userController.js +0 -15
  104. package/examples/v2_json_auth/package.json +0 -26
  105. package/examples/v2_json_auth/routes.json +0 -37
  106. package/examples/v2_json_auth/tokens.json +0 -20
  107. package/examples/v2_mariadb_auth/README.md +0 -94
  108. package/examples/v2_mariadb_auth/app.js +0 -81
  109. package/examples/v2_mariadb_auth/controllers/authController.js +0 -95
  110. package/examples/v2_mariadb_auth/controllers/mainController.js +0 -31
  111. package/examples/v2_mariadb_auth/controllers/protectedController.js +0 -12
  112. package/examples/v2_mariadb_auth/controllers/userController.js +0 -17
  113. package/examples/v2_mariadb_auth/package.json +0 -27
  114. package/examples/v2_mariadb_auth/routes.json +0 -37
  115. package/examples/v2_no_auth/README.md +0 -75
  116. package/examples/v2_no_auth/app.js +0 -72
  117. package/examples/v2_no_auth/controllers/healthController.js +0 -14
  118. package/examples/v2_no_auth/controllers/mainController.js +0 -19
  119. package/examples/v2_no_auth/controllers/productController.js +0 -31
  120. package/examples/v2_no_auth/controllers/publicController.js +0 -16
  121. package/examples/v2_no_auth/package.json +0 -22
  122. package/examples/v2_no_auth/routes.json +0 -37
  123. package/examples/v2_oauth/README.md +0 -70
  124. package/examples/v2_oauth/app.js +0 -90
  125. package/examples/v2_oauth/controllers/mainController.js +0 -45
  126. package/examples/v2_oauth/controllers/oauthController.js +0 -247
  127. package/examples/v2_oauth/controllers/protectedController.js +0 -13
  128. package/examples/v2_oauth/controllers/userController.js +0 -17
  129. package/examples/v2_oauth/package.json +0 -26
  130. package/examples/v2_oauth/routes.json +0 -44
  131. package/examples/v2_openapi/README.md +0 -77
  132. package/examples/v2_openapi/app.js +0 -222
  133. package/examples/v2_openapi/controllers/authController.js +0 -52
  134. package/examples/v2_openapi/controllers/mainController.js +0 -26
  135. package/examples/v2_openapi/controllers/productController.js +0 -17
  136. package/examples/v2_openapi/controllers/userController.js +0 -27
  137. package/examples/v2_openapi/package.json +0 -26
  138. package/examples/v2_openapi/routes.json +0 -37
  139. package/v2examplle/v2_json_auth/README.md +0 -83
  140. package/v2examplle/v2_json_auth/app.js +0 -72
  141. package/v2examplle/v2_json_auth/controllers/authController.js +0 -67
  142. package/v2examplle/v2_json_auth/controllers/mainController.js +0 -16
  143. package/v2examplle/v2_json_auth/controllers/protectedController.js +0 -12
  144. package/v2examplle/v2_json_auth/controllers/tokenController.js +0 -28
  145. package/v2examplle/v2_json_auth/controllers/userController.js +0 -15
  146. package/v2examplle/v2_json_auth/package.json +0 -26
  147. package/v2examplle/v2_json_auth/routes.json +0 -37
  148. package/v2examplle/v2_json_auth/tokens.json +0 -20
  149. package/v2examplle/v2_mariadb_auth/README.md +0 -94
  150. package/v2examplle/v2_mariadb_auth/app.js +0 -81
  151. package/v2examplle/v2_mariadb_auth/controllers/authController.js +0 -95
  152. package/v2examplle/v2_mariadb_auth/controllers/mainController.js +0 -31
  153. package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +0 -12
  154. package/v2examplle/v2_mariadb_auth/controllers/userController.js +0 -17
  155. package/v2examplle/v2_mariadb_auth/package.json +0 -27
  156. package/v2examplle/v2_mariadb_auth/routes.json +0 -37
  157. package/v2examplle/v2_sqlite_auth/README.md +0 -72
  158. package/v2examplle/v2_sqlite_auth/app.js +0 -74
  159. package/v2examplle/v2_sqlite_auth/app_fixed.js +0 -74
  160. package/v2examplle/v2_sqlite_auth/controllers/authController.js +0 -64
  161. package/v2examplle/v2_sqlite_auth/controllers/mainController.js +0 -24
  162. package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +0 -12
  163. package/v2examplle/v2_sqlite_auth/controllers/userController.js +0 -16
  164. package/v2examplle/v2_sqlite_auth/package.json +0 -27
  165. package/v2examplle/v2_sqlite_auth/routes.json +0 -30
  166. package/v2examplle/v2_sqlite_auth/test_api.sh +0 -47
  167. package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
@@ -1,220 +0,0 @@
1
- const messageController = require('./messageController');
2
-
3
- const authController = {
4
- // Mostrar formulario de login
5
- showLoginPage: (req, res) => {
6
- const html = `
7
- <!DOCTYPE html>
8
- <html lang="es">
9
- <head>
10
- <meta charset="UTF-8">
11
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
12
- <title>Login - API Frontend Demo</title>
13
- <link rel="stylesheet" href="/styles.css">
14
- </head>
15
- <body>
16
- <div class="container">
17
- <header>
18
- <h1>Área de Administración</h1>
19
- <nav>
20
- <ul>
21
- <li><a href="/">Inicio</a></li>
22
- <li><a href="/about">Acerca de</a></li>
23
- <li><a href="/contact">Contacto</a></li>
24
- <li><a href="/login">Login</a></li>
25
- <li><a href="/api/users">Usuarios (API)</a></li>
26
- </ul>
27
- </nav>
28
- </header>
29
-
30
- <main>
31
- <section class="login-section">
32
- <h2>Iniciar Sesión</h2>
33
- <form id="loginForm">
34
- <div class="form-group">
35
- <label for="username">Usuario:</label>
36
- <input type="text" id="username" name="username" required>
37
- </div>
38
-
39
- <div class="form-group">
40
- <label for="password">Contraseña:</label>
41
- <input type="password" id="password" name="password" required>
42
- </div>
43
-
44
- <button type="submit">Ingresar</button>
45
- </form>
46
-
47
- <div id="login-response"></div>
48
-
49
- <p><em>Usuario: admin | Contraseña: password123</em></p>
50
- </section>
51
- </main>
52
-
53
- <footer>
54
- <p>&copy; 2026 JERK JS Framework</p>
55
- </footer>
56
- </div>
57
- <script src="/script.js"></script>
58
- <script>
59
- document.addEventListener('DOMContentLoaded', function() {
60
- const loginForm = document.getElementById('loginForm');
61
-
62
- if (loginForm) {
63
- loginForm.addEventListener('submit', function(e) {
64
- e.preventDefault();
65
-
66
- const formData = new FormData(loginForm);
67
- const data = Object.fromEntries(formData);
68
-
69
- fetch('/api/login', {
70
- method: 'POST',
71
- headers: {
72
- 'Content-Type': 'application/json'
73
- },
74
- body: JSON.stringify(data)
75
- })
76
- .then(response => response.json())
77
- .then(result => {
78
- const responseDiv = document.getElementById('login-response');
79
-
80
- if (result.success) {
81
- responseDiv.innerHTML = '<p style="color: green;">Inicio de sesión exitoso. Redirigiendo...</p>';
82
-
83
- // Redirigir después de un breve delay
84
- setTimeout(() => {
85
- window.location.href = '/messages';
86
- }, 1500);
87
- } else {
88
- responseDiv.innerHTML = '<p style="color: red;">' + result.message + '</p>';
89
- }
90
- })
91
- .catch(error => {
92
- console.error('Error:', error);
93
- const responseDiv = document.getElementById('login-response');
94
- responseDiv.innerHTML = '<p style="color: red;">Error de conexión</p>';
95
- });
96
- });
97
- }
98
- });
99
- </script>
100
- </body>
101
- </html>`;
102
-
103
- res.writeHead(200);
104
- res.end(html);
105
- },
106
-
107
- // Procesar login
108
- processLogin: async (req, res) => {
109
- try {
110
- // req.body puede ser un string o un objeto, dependiendo de cómo se haya procesado
111
- let body;
112
- if (typeof req.body === 'string') {
113
- body = JSON.parse(req.body);
114
- } else {
115
- body = req.body;
116
- }
117
-
118
- const { username, password } = body;
119
-
120
- // Validar credenciales
121
- const user = await messageController.validateUser(username, password);
122
-
123
- if (user) {
124
- // Crear sesión de usuario autenticado
125
- if (req.session) {
126
- req.session.create({
127
- authenticated: true,
128
- userId: user.id,
129
- username: user.username
130
- });
131
- }
132
-
133
- res.writeHead(200, { 'Content-Type': 'application/json' });
134
- res.end(JSON.stringify({
135
- success: true,
136
- message: 'Inicio de sesión exitoso',
137
- userId: user.id
138
- }));
139
- } else {
140
- res.writeHead(401, { 'Content-Type': 'application/json' });
141
- res.end(JSON.stringify({
142
- success: false,
143
- message: 'Credenciales inválidas'
144
- }));
145
- }
146
- } catch (error) {
147
- console.error('Error en login:', error);
148
- res.writeHead(500, { 'Content-Type': 'application/json' });
149
- res.end(JSON.stringify({
150
- success: false,
151
- message: 'Error interno del servidor'
152
- }));
153
- }
154
- },
155
-
156
- // Mostrar mensajes (requiere estar logueado - en este ejemplo simplificado no verificamos sesión)
157
- showMessages: async (req, res) => {
158
- try {
159
- // Obtener mensajes de la base de datos
160
- const messages = await messageController.getMessages();
161
-
162
- const messagesHtml = messages.length > 0
163
- ? messages.map(msg => `
164
- <div class="message-item">
165
- <h4>${msg.name} (${msg.email})</h4>
166
- <p>${msg.message}</p>
167
- <small>Fecha: ${msg.created_at}</small>
168
- </div>
169
- `).join('')
170
- : '<p>No hay mensajes aún.</p>';
171
-
172
- const html = `
173
- <!DOCTYPE html>
174
- <html lang="es">
175
- <head>
176
- <meta charset="UTF-8">
177
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
178
- <title>Mensajes - API Frontend Demo</title>
179
- <link rel="stylesheet" href="/styles.css">
180
- </head>
181
- <body>
182
- <div class="container">
183
- <header>
184
- <h1>Mensajes Recibidos</h1>
185
- <nav>
186
- <ul>
187
- <li><a href="/">Inicio</a></li>
188
- <li><a href="/about">Acerca de</a></li>
189
- <li><a href="/contact">Contacto</a></li>
190
- <li><a href="/login">Login</a></li>
191
- <li><a href="/api/users">Usuarios (API)</a></li>
192
- </ul>
193
- </nav>
194
- </header>
195
-
196
- <main>
197
- <section class="messages-section">
198
- ${messagesHtml}
199
- </section>
200
- </main>
201
-
202
- <footer>
203
- <p>&copy; 2026 JERK JS Framework</p>
204
- </footer>
205
- </div>
206
- <script src="/script.js"></script>
207
- </body>
208
- </html>`;
209
-
210
- res.writeHead(200);
211
- res.end(html);
212
- } catch (error) {
213
- console.error('Error obteniendo mensajes:', error);
214
- res.writeHead(500);
215
- res.end('<h1>Error obteniendo mensajes</h1>');
216
- }
217
- }
218
- };
219
-
220
- module.exports = authController;
@@ -1,47 +0,0 @@
1
- const messageController = require('./messageController');
2
-
3
- const formController = {
4
- // Procesar el envío del formulario de contacto
5
- processContactForm: async (req, res) => {
6
- try {
7
- // req.body puede ser un string o un objeto, dependiendo de cómo se haya procesado
8
- let body;
9
- if (typeof req.body === 'string') {
10
- body = JSON.parse(req.body);
11
- } else {
12
- body = req.body;
13
- }
14
-
15
- const { name, email, message } = body;
16
-
17
- // Validar campos
18
- if (!name || !email || !message) {
19
- res.writeHead(400, { 'Content-Type': 'application/json' });
20
- res.end(JSON.stringify({
21
- success: false,
22
- message: 'Todos los campos son obligatorios'
23
- }));
24
- return;
25
- }
26
-
27
- // Guardar el mensaje en la base de datos
28
- await messageController.saveMessage(name, email, message);
29
-
30
- // Responder con éxito
31
- res.writeHead(200, { 'Content-Type': 'application/json' });
32
- res.end(JSON.stringify({
33
- success: true,
34
- message: 'Mensaje enviado exitosamente'
35
- }));
36
- } catch (error) {
37
- console.error('Error procesando formulario:', error);
38
- res.writeHead(500, { 'Content-Type': 'application/json' });
39
- res.end(JSON.stringify({
40
- success: false,
41
- message: 'Error interno del servidor'
42
- }));
43
- }
44
- }
45
- };
46
-
47
- module.exports = formController;
@@ -1,96 +0,0 @@
1
- const sqlite3 = require('sqlite3').verbose();
2
- const path = require('path');
3
-
4
- class MessageController {
5
- constructor() {
6
- // Usar una base de datos SQLite en memoria para este ejemplo
7
- // En una aplicación real, usarías una ruta a un archivo
8
- this.db = new sqlite3.Database(':memory:');
9
- this.initDatabase();
10
- }
11
-
12
- initDatabase() {
13
- // Crear tabla de mensajes
14
- this.db.serialize(() => {
15
- this.db.run(`
16
- CREATE TABLE messages (
17
- id INTEGER PRIMARY KEY AUTOINCREMENT,
18
- name TEXT NOT NULL,
19
- email TEXT NOT NULL,
20
- message TEXT NOT NULL,
21
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP
22
- )
23
- `);
24
-
25
- // Crear tabla de usuarios para login
26
- this.db.run(`
27
- CREATE TABLE users (
28
- id INTEGER PRIMARY KEY AUTOINCREMENT,
29
- username TEXT UNIQUE NOT NULL,
30
- password TEXT NOT NULL,
31
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP
32
- )
33
- `);
34
-
35
- // Insertar un usuario de ejemplo para pruebas
36
- this.db.run("INSERT OR IGNORE INTO users (username, password) VALUES (?, ?)", ['admin', 'password123']);
37
- });
38
- }
39
-
40
- // Guardar un mensaje en la base de datos
41
- saveMessage(name, email, message) {
42
- return new Promise((resolve, reject) => {
43
- const stmt = this.db.prepare("INSERT INTO messages (name, email, message) VALUES (?, ?, ?)");
44
- stmt.run([name, email, message], function(err) {
45
- if (err) {
46
- console.error('Error guardando mensaje:', err);
47
- reject(err);
48
- } else {
49
- console.log(`Mensaje guardado con ID: ${this.lastID}`);
50
- resolve(this.lastID);
51
- }
52
- });
53
- stmt.finalize();
54
- });
55
- }
56
-
57
- // Obtener todos los mensajes
58
- getMessages() {
59
- return new Promise((resolve, reject) => {
60
- this.db.all("SELECT * FROM messages ORDER BY created_at DESC", [], (err, rows) => {
61
- if (err) {
62
- console.error('Error obteniendo mensajes:', err);
63
- reject(err);
64
- } else {
65
- resolve(rows);
66
- }
67
- });
68
- });
69
- }
70
-
71
- // Validar credenciales de usuario
72
- validateUser(username, password) {
73
- return new Promise((resolve, reject) => {
74
- this.db.get("SELECT * FROM users WHERE username = ?", [username], (err, row) => {
75
- if (err) {
76
- console.error('Error validando usuario:', err);
77
- reject(err);
78
- } else if (row && row.password === password) {
79
- resolve(row);
80
- } else {
81
- resolve(null);
82
- }
83
- });
84
- });
85
- }
86
-
87
- // Cerrar la base de datos
88
- close() {
89
- this.db.close();
90
- }
91
- }
92
-
93
- // Instancia global para compartir la base de datos
94
- const messageController = new MessageController();
95
-
96
- module.exports = messageController;
@@ -1,178 +0,0 @@
1
- const messageController = require('./messageController');
2
-
3
- const pageController = {
4
- homePage: (req, res) => {
5
- const html = `
6
- <!DOCTYPE html>
7
- <html lang="es">
8
- <head>
9
- <meta charset="UTF-8">
10
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
11
- <title>Inicio - API Frontend Demo</title>
12
- <link rel="stylesheet" href="/styles.css">
13
- </head>
14
- <body>
15
- <div class="container">
16
- <header>
17
- <h1>Bienvenido a la API Frontend Demo</h1>
18
- <nav>
19
- <ul>
20
- <li><a href="/">Inicio</a></li>
21
- <li><a href="/about">Acerca de</a></li>
22
- <li><a href="/contact">Contacto</a></li>
23
- <li><a href="/login">Login</a></li>
24
- <li><a href="/api/users">Usuarios (API)</a></li>
25
- </ul>
26
- </nav>
27
- </header>
28
-
29
- <main>
30
- <section class="hero">
31
- <h2>Framework JERK JS</h2>
32
- <p>Esta es una demostración de cómo el framework puede servir tanto APIs como contenido HTML para frontends.</p>
33
- <p>El content-type de esta página se establece desde el archivo routes.json.</p>
34
- </section>
35
-
36
- <section class="features">
37
- <h3>Características</h3>
38
- <ul>
39
- <li>Soporte para múltiples content-types</li>
40
- <li>Rutas parametrizadas</li>
41
- <li>Middleware de seguridad</li>
42
- <li>CORS configurado</li>
43
- </ul>
44
- </section>
45
- </main>
46
-
47
- <footer>
48
- <p>&copy; 2026 JERK JS Framework</p>
49
- </footer>
50
- </div>
51
- <script src="/script.js"></script>
52
- </body>
53
- </html>`;
54
-
55
- res.writeHead(200);
56
- res.end(html);
57
- },
58
-
59
- aboutPage: (req, res) => {
60
- const html = `
61
- <!DOCTYPE html>
62
- <html lang="es">
63
- <head>
64
- <meta charset="UTF-8">
65
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
66
- <title>Acerca de - API Frontend Demo</title>
67
- <link rel="stylesheet" href="/styles.css">
68
- </head>
69
- <body>
70
- <div class="container">
71
- <header>
72
- <h1>Acerca de API Frontend Demo</h1>
73
- <nav>
74
- <ul>
75
- <li><a href="/">Inicio</a></li>
76
- <li><a href="/about">Acerca de</a></li>
77
- <li><a href="/contact">Contacto</a></li>
78
- <li><a href="/login">Login</a></li>
79
- <li><a href="/api/users">Usuarios (API)</a></li>
80
- </ul>
81
- </nav>
82
- </header>
83
-
84
- <main>
85
- <section>
86
- <h2>Nuestro Framework</h2>
87
- <p>El Framework JERK JS es una solución completa para construir APIs seguras y escalables.</p>
88
-
89
- <h3>Capacidades Extendidas</h3>
90
- <p>Ahora también puede servir contenido HTML y otros tipos de contenido gracias a la nueva funcionalidad de especificación de content-type en routes.json.</p>
91
-
92
- <h3>Características Técnicas</h3>
93
- <ul>
94
- <li>Arquitectura modular</li>
95
- <li>Sistema de hooks y filtros</li>
96
- <li>Seguridad avanzada (WAF)</li>
97
- <li>Soporte para múltiples métodos de autenticación</li>
98
- <li>Almacenamiento de tokens flexible</li>
99
- </ul>
100
- </section>
101
- </main>
102
-
103
- <footer>
104
- <p>&copy; 2026 JERK JS Framework</p>
105
- </footer>
106
- </div>
107
- <script src="/script.js"></script>
108
- </body>
109
- </html>`;
110
-
111
- res.writeHead(200);
112
- res.end(html);
113
- },
114
-
115
- contactPage: (req, res) => {
116
- const html = `
117
- <!DOCTYPE html>
118
- <html lang="es">
119
- <head>
120
- <meta charset="UTF-8">
121
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
122
- <title>Contacto - API Frontend Demo</title>
123
- <link rel="stylesheet" href="/styles.css">
124
- </head>
125
- <body>
126
- <div class="container">
127
- <header>
128
- <h1>Formulario de Contacto</h1>
129
- <nav>
130
- <ul>
131
- <li><a href="/">Inicio</a></li>
132
- <li><a href="/about">Acerca de</a></li>
133
- <li><a href="/contact">Contacto</a></li>
134
- <li><a href="/login">Login</a></li>
135
- <li><a href="/api/users">Usuarios (API)</a></li>
136
- </ul>
137
- </nav>
138
- </header>
139
-
140
- <main>
141
- <section>
142
- <form id="contactForm">
143
- <div class="form-group">
144
- <label for="name">Nombre:</label>
145
- <input type="text" id="name" name="name" required>
146
- </div>
147
-
148
- <div class="form-group">
149
- <label for="email">Email:</label>
150
- <input type="email" id="email" name="email" required>
151
- </div>
152
-
153
- <div class="form-group">
154
- <label for="message">Mensaje:</label>
155
- <textarea id="message" name="message" rows="5" required></textarea>
156
- </div>
157
-
158
- <button type="submit">Enviar</button>
159
- </form>
160
-
161
- <div id="response"></div>
162
- </section>
163
- </main>
164
-
165
- <footer>
166
- <p>&copy; 2026 JERK JS Framework</p>
167
- </footer>
168
- </div>
169
- <script src="/script.js"></script>
170
- </body>
171
- </html>`;
172
-
173
- res.writeHead(200);
174
- res.end(html);
175
- }
176
- };
177
-
178
- module.exports = pageController;