jerkjs 2.1.1 → 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.
- package/CHANGELOG.md +3 -2
- package/README.md +1 -1
- package/examples.arj +0 -0
- package/index.js +1 -1
- package/lib/middleware/compressor.js +34 -18
- package/package.json +1 -1
- package/standard/CompressionTestController.js +38 -0
- package/standard/HealthController.js +16 -0
- package/standard/HomeController.js +12 -0
- package/standard/ProductController.js +18 -0
- package/standard/README.md +47 -0
- package/standard/UserController.js +23 -0
- package/standard/package.json +22 -0
- package/standard/routes.json +58 -0
- package/standard/server.js +140 -0
- package/cookies.txt +0 -5
- package/examples/advanced/controllers/productController.js +0 -64
- package/examples/advanced/controllers/userController.js +0 -85
- package/examples/advanced/routes.json +0 -51
- package/examples/advanced_example.js +0 -93
- package/examples/basic/controllers/userController.js +0 -85
- package/examples/basic_example.js +0 -72
- package/examples/frontend/README.md +0 -71
- package/examples/frontend/app.js +0 -71
- package/examples/frontend/controllers/apiController.js +0 -39
- package/examples/frontend/controllers/authController.js +0 -220
- package/examples/frontend/controllers/formController.js +0 -47
- package/examples/frontend/controllers/messageController.js +0 -96
- package/examples/frontend/controllers/pageController.js +0 -178
- package/examples/frontend/controllers/staticController.js +0 -167
- package/examples/frontend/routes.json +0 -90
- package/examples/hooks/app.js +0 -136
- package/examples/hooks/controllers/authController.js +0 -54
- package/examples/hooks/controllers/mainController.js +0 -41
- package/examples/hooks/controllers/productController.js +0 -39
- package/examples/hooks/controllers/userController.js +0 -69
- package/examples/hooks/routes.json +0 -51
- package/examples/hooks/views/home.html +0 -50
- package/examples/mvc_example/app.js +0 -138
- package/examples/mvc_example/views/home/index.html +0 -26
- package/examples/mvc_example/views/home/simple.html +0 -3
- package/examples/mvc_example/views/layout.html +0 -23
- package/examples/mvc_example/views/test.html +0 -3
- package/examples/mvc_example/views/user/invalid.html +0 -6
- package/examples/mvc_example/views/user/list.html +0 -36
- package/examples/mvc_example/views/user/notfound.html +0 -6
- package/examples/mvc_example/views/user/profile.html +0 -11
- package/examples/mvc_routes_example/app.js +0 -34
- package/examples/mvc_routes_example/controllers/mainController.js +0 -27
- package/examples/mvc_routes_example/controllers/productController.js +0 -47
- package/examples/mvc_routes_example/controllers/userController.js +0 -76
- package/examples/mvc_routes_example/routes.json +0 -30
- package/examples/mvc_routes_example/views/layout.html +0 -31
- package/examples/mvc_routes_example/views/main/index.html +0 -11
- package/examples/mvc_routes_example/views/product/catalog.html +0 -24
- package/examples/mvc_routes_example/views/user/invalid.html +0 -6
- package/examples/mvc_routes_example/views/user/list.html +0 -40
- package/examples/mvc_routes_example/views/user/notfound.html +0 -6
- package/examples/mvc_routes_example/views/user/profile.html +0 -18
- package/examples/mvc_welcome/README.md +0 -34
- package/examples/mvc_welcome/app.js +0 -50
- package/examples/mvc_welcome/controllers/welcomeController.js +0 -41
- package/examples/mvc_welcome/package.json +0 -26
- package/examples/mvc_welcome/views/home/welcome.html +0 -82
- package/examples/performance_demo/app.js +0 -172
- package/examples/performance_demo_with_hooks/README.md +0 -52
- package/examples/performance_demo_with_hooks/app.js +0 -290
- package/examples/public/README.md +0 -92
- package/examples/public/app.js +0 -72
- package/examples/public/controllers/healthController.js +0 -20
- package/examples/public/controllers/mainController.js +0 -22
- package/examples/public/controllers/userController.js +0 -139
- package/examples/public/routes.json +0 -51
- package/examples/v2/README.md +0 -72
- package/examples/v2/app.js +0 -74
- package/examples/v2/app_fixed.js +0 -74
- package/examples/v2/controllers/authController.js +0 -64
- package/examples/v2/controllers/mainController.js +0 -24
- package/examples/v2/controllers/protectedController.js +0 -12
- package/examples/v2/controllers/userController.js +0 -16
- package/examples/v2/package.json +0 -27
- package/examples/v2/routes.json +0 -30
- package/examples/v2/test_api.sh +0 -47
- package/examples/v2/tokens_example.sqlite +0 -0
- package/examples/v2.1_firewall_demo/README.md +0 -113
- package/examples/v2.1_firewall_demo/app.js +0 -182
- package/examples/v2.1_firewall_demo/package.json +0 -27
- package/examples/v2.1_hooks_demo/README.md +0 -85
- package/examples/v2.1_hooks_demo/app.js +0 -101
- package/examples/v2.1_hooks_demo/controllers/hooksController.js +0 -29
- package/examples/v2.1_hooks_demo/controllers/mainController.js +0 -18
- package/examples/v2.1_hooks_demo/package.json +0 -27
- package/examples/v2.1_hooks_demo/routes.json +0 -16
- package/examples/v2.1_openapi_demo/README.md +0 -82
- package/examples/v2.1_openapi_demo/app.js +0 -296
- package/examples/v2.1_openapi_demo/package.json +0 -26
- package/examples/v2_cors/README.md +0 -82
- package/examples/v2_cors/app.js +0 -108
- package/examples/v2_cors/package.json +0 -23
- package/examples/v2_json_auth/README.md +0 -83
- package/examples/v2_json_auth/app.js +0 -72
- package/examples/v2_json_auth/controllers/authController.js +0 -67
- package/examples/v2_json_auth/controllers/mainController.js +0 -16
- package/examples/v2_json_auth/controllers/protectedController.js +0 -12
- package/examples/v2_json_auth/controllers/tokenController.js +0 -28
- package/examples/v2_json_auth/controllers/userController.js +0 -15
- package/examples/v2_json_auth/package.json +0 -26
- package/examples/v2_json_auth/routes.json +0 -37
- package/examples/v2_json_auth/tokens.json +0 -20
- package/examples/v2_mariadb_auth/README.md +0 -94
- package/examples/v2_mariadb_auth/app.js +0 -81
- package/examples/v2_mariadb_auth/controllers/authController.js +0 -95
- package/examples/v2_mariadb_auth/controllers/mainController.js +0 -31
- package/examples/v2_mariadb_auth/controllers/protectedController.js +0 -12
- package/examples/v2_mariadb_auth/controllers/userController.js +0 -17
- package/examples/v2_mariadb_auth/package.json +0 -27
- package/examples/v2_mariadb_auth/routes.json +0 -37
- package/examples/v2_no_auth/README.md +0 -75
- package/examples/v2_no_auth/app.js +0 -72
- package/examples/v2_no_auth/controllers/healthController.js +0 -14
- package/examples/v2_no_auth/controllers/mainController.js +0 -19
- package/examples/v2_no_auth/controllers/productController.js +0 -31
- package/examples/v2_no_auth/controllers/publicController.js +0 -16
- package/examples/v2_no_auth/package.json +0 -22
- package/examples/v2_no_auth/routes.json +0 -37
- package/examples/v2_oauth/README.md +0 -70
- package/examples/v2_oauth/app.js +0 -90
- package/examples/v2_oauth/controllers/mainController.js +0 -45
- package/examples/v2_oauth/controllers/oauthController.js +0 -247
- package/examples/v2_oauth/controllers/protectedController.js +0 -13
- package/examples/v2_oauth/controllers/userController.js +0 -17
- package/examples/v2_oauth/package.json +0 -26
- package/examples/v2_oauth/routes.json +0 -44
- package/examples/v2_openapi/README.md +0 -77
- package/examples/v2_openapi/app.js +0 -222
- package/examples/v2_openapi/controllers/authController.js +0 -52
- package/examples/v2_openapi/controllers/mainController.js +0 -26
- package/examples/v2_openapi/controllers/productController.js +0 -17
- package/examples/v2_openapi/controllers/userController.js +0 -27
- package/examples/v2_openapi/package.json +0 -26
- package/examples/v2_openapi/routes.json +0 -37
- package/v2examplle/v2_json_auth/README.md +0 -83
- package/v2examplle/v2_json_auth/app.js +0 -72
- package/v2examplle/v2_json_auth/controllers/authController.js +0 -67
- package/v2examplle/v2_json_auth/controllers/mainController.js +0 -16
- package/v2examplle/v2_json_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_json_auth/controllers/tokenController.js +0 -28
- package/v2examplle/v2_json_auth/controllers/userController.js +0 -15
- package/v2examplle/v2_json_auth/package.json +0 -26
- package/v2examplle/v2_json_auth/routes.json +0 -37
- package/v2examplle/v2_json_auth/tokens.json +0 -20
- package/v2examplle/v2_mariadb_auth/README.md +0 -94
- package/v2examplle/v2_mariadb_auth/app.js +0 -81
- package/v2examplle/v2_mariadb_auth/controllers/authController.js +0 -95
- package/v2examplle/v2_mariadb_auth/controllers/mainController.js +0 -31
- package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_mariadb_auth/controllers/userController.js +0 -17
- package/v2examplle/v2_mariadb_auth/package.json +0 -27
- package/v2examplle/v2_mariadb_auth/routes.json +0 -37
- package/v2examplle/v2_sqlite_auth/README.md +0 -72
- package/v2examplle/v2_sqlite_auth/app.js +0 -74
- package/v2examplle/v2_sqlite_auth/app_fixed.js +0 -74
- package/v2examplle/v2_sqlite_auth/controllers/authController.js +0 -64
- package/v2examplle/v2_sqlite_auth/controllers/mainController.js +0 -24
- package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_sqlite_auth/controllers/userController.js +0 -16
- package/v2examplle/v2_sqlite_auth/package.json +0 -27
- package/v2examplle/v2_sqlite_auth/routes.json +0 -30
- package/v2examplle/v2_sqlite_auth/test_api.sh +0 -47
- package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"path": "/api/users",
|
|
4
|
-
"method": "GET",
|
|
5
|
-
"auth": "jwt",
|
|
6
|
-
"authOptions": {
|
|
7
|
-
"jwtSecret": "secret-jwt-key"
|
|
8
|
-
},
|
|
9
|
-
"controller": "./basic/controllers/userController.js",
|
|
10
|
-
"handler": "getUsers"
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
"path": "/api/users/:id",
|
|
14
|
-
"method": "GET",
|
|
15
|
-
"auth": "jwt",
|
|
16
|
-
"authOptions": {
|
|
17
|
-
"jwtSecret": "secret-jwt-key"
|
|
18
|
-
},
|
|
19
|
-
"controller": "./basic/controllers/userController.js",
|
|
20
|
-
"handler": "getUserById"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"path": "/api/users",
|
|
24
|
-
"method": "POST",
|
|
25
|
-
"auth": "apiKey",
|
|
26
|
-
"authOptions": {
|
|
27
|
-
"apiKeyHeader": "X-API-Key",
|
|
28
|
-
"apiKeyValues": ["secret-key-123"]
|
|
29
|
-
},
|
|
30
|
-
"controller": "./basic/controllers/userController.js",
|
|
31
|
-
"handler": "createUser"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"path": "/api/products",
|
|
35
|
-
"method": "GET",
|
|
36
|
-
"auth": "none",
|
|
37
|
-
"controller": "./advanced/controllers/productController.js",
|
|
38
|
-
"handler": "getProducts"
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"path": "/api/products/:id",
|
|
42
|
-
"method": "PUT",
|
|
43
|
-
"auth": "apiKey",
|
|
44
|
-
"authOptions": {
|
|
45
|
-
"apiKeyHeader": "X-API-Key",
|
|
46
|
-
"apiKeyValues": ["secret-key-123"]
|
|
47
|
-
},
|
|
48
|
-
"controller": "./advanced/controllers/productController.js",
|
|
49
|
-
"handler": "updateProduct"
|
|
50
|
-
}
|
|
51
|
-
]
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ejemplo real de uso del framework JERK
|
|
3
|
-
* Este script demuestra cómo cargar rutas desde un archivo JSON
|
|
4
|
-
* y usar los controladores definidos en el archivo de rutas
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const path = require('path');
|
|
8
|
-
const { JERK, RouteLoader, Authenticator, Logger } = require('../index');
|
|
9
|
-
|
|
10
|
-
// Crear instancia del logger
|
|
11
|
-
const logger = new Logger({ level: 'info', timestamp: true });
|
|
12
|
-
|
|
13
|
-
logger.info('Iniciando ejemplo real de carga de rutas desde JSON');
|
|
14
|
-
|
|
15
|
-
// Crear instancia del servidor
|
|
16
|
-
const server = new JERK({
|
|
17
|
-
port: 6000,
|
|
18
|
-
host: 'localhost'
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
// Crear instancia del autenticador
|
|
22
|
-
const authenticator = new Authenticator();
|
|
23
|
-
|
|
24
|
-
// Registrar estrategias de autenticación que se usan en routes.json
|
|
25
|
-
authenticator.use('apiKey', authenticator.apiKeyStrategy('X-API-Key', ['secret-key-123']));
|
|
26
|
-
authenticator.use('jwt', authenticator.jwtStrategy('secret-jwt-key'));
|
|
27
|
-
|
|
28
|
-
// Cargar rutas desde el archivo JSON
|
|
29
|
-
const routeLoader = new RouteLoader();
|
|
30
|
-
|
|
31
|
-
// Middleware de logging
|
|
32
|
-
server.use((req, res, next) => {
|
|
33
|
-
logger.info(`${req.method} ${req.url} - IP: ${req.connection.remoteAddress}`);
|
|
34
|
-
next();
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
logger.info('Cargando rutas desde advanced/routes.json...');
|
|
38
|
-
|
|
39
|
-
// Cargar las rutas desde el archivo JSON
|
|
40
|
-
// Cambiamos temporalmente el directorio de trabajo para que las rutas relativas funcionen correctamente
|
|
41
|
-
const originalCwd = process.cwd();
|
|
42
|
-
process.chdir(__dirname); // Cambiar al directorio actual (examples)
|
|
43
|
-
|
|
44
|
-
routeLoader.loadRoutes(server, './advanced/routes.json')
|
|
45
|
-
.then(routes => {
|
|
46
|
-
process.chdir(originalCwd); // Restaurar directorio original
|
|
47
|
-
|
|
48
|
-
logger.info(`Cargadas ${routes.length} rutas desde el archivo JSON:`);
|
|
49
|
-
routes.forEach((route, index) => {
|
|
50
|
-
logger.info(` ${index + 1}. ${route.method} ${route.path} -> ${route.controller}#${route.handler}`);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
logger.info('\nIniciando servidor en http://localhost:6000');
|
|
54
|
-
|
|
55
|
-
// Iniciar el servidor
|
|
56
|
-
const httpServer = server.start();
|
|
57
|
-
|
|
58
|
-
logger.info('\nENDPOINTS DISPONIBLES (cargados desde routes.json):');
|
|
59
|
-
logger.info('GET /api/users - Obtener todos los usuarios (JWT req)');
|
|
60
|
-
logger.info('GET /api/users/:id - Obtener usuario por ID (JWT req)');
|
|
61
|
-
logger.info('POST /api/users - Crear usuario (API Key req)');
|
|
62
|
-
logger.info('GET /api/products - Obtener productos (sin auth)');
|
|
63
|
-
logger.info('PUT /api/products/:id - Actualizar producto (API Key req)');
|
|
64
|
-
|
|
65
|
-
logger.info('\nEJEMPLOS DE USO:');
|
|
66
|
-
logger.info('# Obtener productos (sin autenticación):');
|
|
67
|
-
logger.info('curl -X GET http://localhost:6000/api/products');
|
|
68
|
-
|
|
69
|
-
logger.info('\nEl servidor se detendrá automáticamente en 120 segundos...');
|
|
70
|
-
|
|
71
|
-
// Programar apagado automático para la demostración
|
|
72
|
-
setTimeout(() => {
|
|
73
|
-
logger.info('Finalizando ejemplo...');
|
|
74
|
-
httpServer.close(() => {
|
|
75
|
-
logger.info('Servidor detenido. Ejemplo completado.');
|
|
76
|
-
console.log('\nEjemplo real completado exitosamente!');
|
|
77
|
-
console.log('El framework JERK ha demostrado su capacidad para:');
|
|
78
|
-
console.log(' - Cargar rutas dinámicamente desde archivos JSON');
|
|
79
|
-
console.log(' - Usar controladores definidos externamente');
|
|
80
|
-
console.log(' - Aplicar diferentes tipos de autenticación');
|
|
81
|
-
process.exit(0);
|
|
82
|
-
});
|
|
83
|
-
}, 120000);
|
|
84
|
-
|
|
85
|
-
})
|
|
86
|
-
.catch(error => {
|
|
87
|
-
process.chdir(originalCwd); // Asegurarse de restaurar el directorio en caso de error
|
|
88
|
-
logger.error('Error cargando rutas:', error.message);
|
|
89
|
-
process.exit(1);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// Mantener el proceso activo
|
|
93
|
-
process.stdin.resume();
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Controlador de ejemplo para usuarios
|
|
3
|
-
* Archivo: examples/basic/controllers/userController.js
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
// Simulación de base de datos
|
|
7
|
-
let users = [
|
|
8
|
-
{ id: 1, name: 'John Doe', email: 'john@example.com' },
|
|
9
|
-
{ id: 2, name: 'Jane Smith', email: 'jane@example.com' }
|
|
10
|
-
];
|
|
11
|
-
|
|
12
|
-
// Obtener todos los usuarios
|
|
13
|
-
function getUsers(req, res) {
|
|
14
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
15
|
-
res.end(JSON.stringify({
|
|
16
|
-
success: true,
|
|
17
|
-
data: users
|
|
18
|
-
}));
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Obtener un usuario por ID
|
|
22
|
-
function getUserById(req, res) {
|
|
23
|
-
const userId = parseInt(req.params.id);
|
|
24
|
-
const user = users.find(u => u.id === userId);
|
|
25
|
-
|
|
26
|
-
if (!user) {
|
|
27
|
-
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
28
|
-
res.end(JSON.stringify({
|
|
29
|
-
success: false,
|
|
30
|
-
message: 'Usuario no encontrado'
|
|
31
|
-
}));
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
36
|
-
res.end(JSON.stringify({
|
|
37
|
-
success: true,
|
|
38
|
-
data: user
|
|
39
|
-
}));
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Crear un nuevo usuario
|
|
43
|
-
function createUser(req, res) {
|
|
44
|
-
try {
|
|
45
|
-
const { name, email } = req.body;
|
|
46
|
-
|
|
47
|
-
// Validar datos
|
|
48
|
-
if (!name || !email) {
|
|
49
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
50
|
-
res.end(JSON.stringify({
|
|
51
|
-
success: false,
|
|
52
|
-
message: 'Nombre y correo electrónico son requeridos'
|
|
53
|
-
}));
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Crear nuevo usuario
|
|
58
|
-
const newUser = {
|
|
59
|
-
id: users.length + 1,
|
|
60
|
-
name,
|
|
61
|
-
email
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
users.push(newUser);
|
|
65
|
-
|
|
66
|
-
res.writeHead(201, { 'Content-Type': 'application/json' });
|
|
67
|
-
res.end(JSON.stringify({
|
|
68
|
-
success: true,
|
|
69
|
-
data: newUser
|
|
70
|
-
}));
|
|
71
|
-
} catch (error) {
|
|
72
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
73
|
-
res.end(JSON.stringify({
|
|
74
|
-
success: false,
|
|
75
|
-
message: 'Error al crear usuario'
|
|
76
|
-
}));
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Exportar handlers
|
|
81
|
-
module.exports = {
|
|
82
|
-
getUsers,
|
|
83
|
-
getUserById,
|
|
84
|
-
createUser
|
|
85
|
-
};
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ejemplo basico de uso del framework JERK
|
|
3
|
-
* Este script demuestra cómo usar directamente los controladores
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const { JERK, Logger } = require('../index');
|
|
7
|
-
const userController = require('./basic/controllers/userController');
|
|
8
|
-
|
|
9
|
-
// Crear instancia del logger
|
|
10
|
-
const logger = new Logger({ level: 'info', timestamp: true });
|
|
11
|
-
|
|
12
|
-
logger.info('Iniciando ejemplo basico con controladores');
|
|
13
|
-
|
|
14
|
-
// Crear instancia del servidor
|
|
15
|
-
const server = new JERK({
|
|
16
|
-
port: 6001,
|
|
17
|
-
host: 'localhost'
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
// Middleware de logging
|
|
21
|
-
server.use((req, res, next) => {
|
|
22
|
-
logger.info(`${req.method} ${req.url}`);
|
|
23
|
-
next();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
// Usar los handlers directamente desde el controlador
|
|
27
|
-
server.addRoute('GET', '/api/users', userController.getUsers);
|
|
28
|
-
server.addRoute('GET', '/api/users/:id', userController.getUserById);
|
|
29
|
-
server.addRoute('POST', '/api/users', userController.createUser);
|
|
30
|
-
|
|
31
|
-
logger.info('Agregando rutas usando handlers del controlador userController');
|
|
32
|
-
|
|
33
|
-
logger.info('\nIniciando servidor en http://localhost:6001');
|
|
34
|
-
|
|
35
|
-
// Iniciar el servidor
|
|
36
|
-
const httpServer = server.start();
|
|
37
|
-
|
|
38
|
-
logger.info('\nENDPOINTS DISPONIBLES:');
|
|
39
|
-
logger.info('GET /api/users - Obtener todos los usuarios');
|
|
40
|
-
logger.info('GET /api/users/:id - Obtener usuario por ID');
|
|
41
|
-
logger.info('POST /api/users - Crear nuevo usuario');
|
|
42
|
-
|
|
43
|
-
logger.info('\nEJEMPLOS DE USO:');
|
|
44
|
-
logger.info('# Obtener todos los usuarios:');
|
|
45
|
-
logger.info('curl -X GET http://localhost:6001/api/users');
|
|
46
|
-
logger.info('');
|
|
47
|
-
logger.info('# Obtener usuario por ID:');
|
|
48
|
-
logger.info('curl -X GET http://localhost:6001/api/users/1');
|
|
49
|
-
logger.info('');
|
|
50
|
-
logger.info('# Crear nuevo usuario:');
|
|
51
|
-
logger.info('curl -X POST -H "Content-Type: application/json" \\');
|
|
52
|
-
logger.info(' -d \'{"name":"Juan Perez", "email":"juan@example.com"}\' \\');
|
|
53
|
-
logger.info(' http://localhost:6001/api/users');
|
|
54
|
-
|
|
55
|
-
logger.info('\nEl servidor se detendrá automáticamente en 60 segundos...');
|
|
56
|
-
|
|
57
|
-
// Programar apagado automático para la demostración
|
|
58
|
-
setTimeout(() => {
|
|
59
|
-
logger.info('Finalizando ejemplo basico...');
|
|
60
|
-
httpServer.close(() => {
|
|
61
|
-
logger.info('Servidor detenido. Ejemplo basico completado.');
|
|
62
|
-
console.log('\nEjemplo basico completado exitosamente!');
|
|
63
|
-
console.log('El framework JERK ha demostrado su capacidad para:');
|
|
64
|
-
console.log(' - Usar controladores directamente');
|
|
65
|
-
console.log(' - Manejar rutas parametrizadas');
|
|
66
|
-
console.log(' - Procesar solicitudes POST con cuerpo JSON');
|
|
67
|
-
process.exit(0);
|
|
68
|
-
});
|
|
69
|
-
}, 60000);
|
|
70
|
-
|
|
71
|
-
// Mantener el proceso activo
|
|
72
|
-
process.stdin.resume();
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# Ejemplo Frontend con JERK JS
|
|
2
|
-
|
|
3
|
-
Este ejemplo demuestra cómo el Framework JERK JS puede utilizarse para servir tanto APIs como contenido HTML para frontends, gracias a la nueva funcionalidad de especificación de content-type en el archivo routes.json.
|
|
4
|
-
|
|
5
|
-
## Características
|
|
6
|
-
|
|
7
|
-
- API REST y páginas HTML en el mismo servidor
|
|
8
|
-
- Especificación de content-type en routes.json
|
|
9
|
-
- Soporte para diferentes tipos de contenido (HTML, CSS, JavaScript, JSON)
|
|
10
|
-
- Frontend completamente funcional con estilos y scripts
|
|
11
|
-
- Navegación entre páginas HTML
|
|
12
|
-
|
|
13
|
-
## Configuración
|
|
14
|
-
|
|
15
|
-
1. Asegúrate de tener instaladas las dependencias del framework JERK
|
|
16
|
-
2. No se requiere configuración adicional para este ejemplo
|
|
17
|
-
|
|
18
|
-
## Uso
|
|
19
|
-
|
|
20
|
-
1. Inicia el servidor:
|
|
21
|
-
```bash
|
|
22
|
-
node app.js
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
2. El servidor escuchará en `http://localhost:8082`
|
|
26
|
-
|
|
27
|
-
## Endpoints
|
|
28
|
-
|
|
29
|
-
- `GET /` - Página de inicio HTML
|
|
30
|
-
- `GET /about` - Página Acerca de HTML
|
|
31
|
-
- `GET /contact` - Formulario de contacto HTML
|
|
32
|
-
- `GET /api/users` - API JSON de usuarios
|
|
33
|
-
- `GET /api/users/:id` - API JSON de usuario específico
|
|
34
|
-
- `GET /styles.css` - Archivo CSS
|
|
35
|
-
- `GET /script.js` - Archivo JavaScript
|
|
36
|
-
|
|
37
|
-
## Nueva funcionalidad: Content-Type en routes.json
|
|
38
|
-
|
|
39
|
-
Este ejemplo demuestra la nueva funcionalidad que permite especificar el content-type directamente en el archivo routes.json:
|
|
40
|
-
|
|
41
|
-
```json
|
|
42
|
-
{
|
|
43
|
-
"path": "/",
|
|
44
|
-
"method": "GET",
|
|
45
|
-
"controller": "./controllers/pageController.js",
|
|
46
|
-
"handler": "homePage",
|
|
47
|
-
"auth": "none",
|
|
48
|
-
"contentType": "text/html"
|
|
49
|
-
}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
El campo `contentType` permite especificar el header Content-Type que se enviará con la respuesta, lo que permite servir diferentes tipos de contenido desde el mismo servidor.
|
|
53
|
-
|
|
54
|
-
## Estructura del proyecto
|
|
55
|
-
|
|
56
|
-
```
|
|
57
|
-
examples/frontend/
|
|
58
|
-
├── app.js # Punto de entrada de la aplicación
|
|
59
|
-
├── routes.json # Definición de rutas con content-type
|
|
60
|
-
├── controllers/ # Controladores de las rutas
|
|
61
|
-
│ ├── pageController.js # Controladores para páginas HTML
|
|
62
|
-
│ ├── apiController.js # Controladores para endpoints API
|
|
63
|
-
│ └── staticController.js # Controladores para recursos estáticos
|
|
64
|
-
└── README.md
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## Seguridad
|
|
68
|
-
|
|
69
|
-
- CORS configurado para permitir solicitudes desde navegadores
|
|
70
|
-
- No se requiere autenticación para acceder a los endpoints
|
|
71
|
-
- El framework incluye protección WAF por defecto
|
package/examples/frontend/app.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
const {
|
|
2
|
-
APIServer,
|
|
3
|
-
RouteLoader,
|
|
4
|
-
Logger,
|
|
5
|
-
Cors,
|
|
6
|
-
SessionManager
|
|
7
|
-
} = require('../../index.js');
|
|
8
|
-
|
|
9
|
-
async function startServer() {
|
|
10
|
-
// Crear instancia del servidor
|
|
11
|
-
const server = new APIServer({
|
|
12
|
-
port: 8082,
|
|
13
|
-
host: 'localhost'
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
// Crear instancia del logger
|
|
17
|
-
const logger = new Logger({ level: 'info' });
|
|
18
|
-
|
|
19
|
-
try {
|
|
20
|
-
// Crear instancia del administrador de sesiones
|
|
21
|
-
const sessionManager = new SessionManager({
|
|
22
|
-
cookieName: 'frontend_session',
|
|
23
|
-
secret: 'frontend-session-secret-change-in-production',
|
|
24
|
-
timeout: 3600000 // 1 hora
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
// Aplicar middleware de sesión
|
|
28
|
-
server.use(sessionManager.middleware());
|
|
29
|
-
|
|
30
|
-
// Hacer que sessionManager esté disponible en el servidor para el RouteLoader
|
|
31
|
-
server.sessionManager = sessionManager;
|
|
32
|
-
|
|
33
|
-
// Configurar CORS para permitir solicitudes desde navegadores
|
|
34
|
-
const cors = new Cors({
|
|
35
|
-
origin: '*',
|
|
36
|
-
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
|
|
37
|
-
allowedHeaders: [
|
|
38
|
-
'Content-Type',
|
|
39
|
-
'Authorization',
|
|
40
|
-
'X-Requested-With',
|
|
41
|
-
'Accept',
|
|
42
|
-
'Origin'
|
|
43
|
-
]
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// Aplicar middleware de CORS
|
|
47
|
-
server.use(cors.middleware());
|
|
48
|
-
|
|
49
|
-
// Cargar rutas desde archivo JSON
|
|
50
|
-
const routeLoader = new RouteLoader();
|
|
51
|
-
await routeLoader.loadRoutes(server, './routes.json');
|
|
52
|
-
|
|
53
|
-
// Iniciar el servidor
|
|
54
|
-
server.start();
|
|
55
|
-
|
|
56
|
-
logger.info('Servidor frontend iniciado en http://localhost:8082');
|
|
57
|
-
logger.info('Endpoints disponibles:');
|
|
58
|
-
logger.info('- GET / (Página de inicio HTML)');
|
|
59
|
-
logger.info('- GET /about (Página Acerca de HTML)');
|
|
60
|
-
logger.info('- GET /api/users (API JSON)');
|
|
61
|
-
logger.info('- GET /contact (Formulario de contacto HTML)');
|
|
62
|
-
} catch (error) {
|
|
63
|
-
logger.error('Error iniciando el servidor:', error.message);
|
|
64
|
-
process.exit(1);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Iniciar el servidor
|
|
69
|
-
startServer();
|
|
70
|
-
|
|
71
|
-
module.exports = { startServer };
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
// Simulación de base de datos en memoria
|
|
2
|
-
const users = [
|
|
3
|
-
{ id: 1, name: 'Juan Pérez', email: 'juan@example.com', age: 30 },
|
|
4
|
-
{ id: 2, name: 'María García', email: 'maria@example.com', age: 25 },
|
|
5
|
-
{ id: 3, name: 'Pedro Rodríguez', email: 'pedro@example.com', age: 35 }
|
|
6
|
-
];
|
|
7
|
-
|
|
8
|
-
const apiController = {
|
|
9
|
-
getUsers: (req, res) => {
|
|
10
|
-
res.writeHead(200);
|
|
11
|
-
res.end(JSON.stringify({
|
|
12
|
-
success: true,
|
|
13
|
-
data: users,
|
|
14
|
-
count: users.length
|
|
15
|
-
}));
|
|
16
|
-
},
|
|
17
|
-
|
|
18
|
-
getUserById: (req, res) => {
|
|
19
|
-
const userId = parseInt(req.params.id);
|
|
20
|
-
const user = users.find(u => u.id === userId);
|
|
21
|
-
|
|
22
|
-
if (!user) {
|
|
23
|
-
res.writeHead(404);
|
|
24
|
-
res.end(JSON.stringify({
|
|
25
|
-
success: false,
|
|
26
|
-
error: 'Usuario no encontrado'
|
|
27
|
-
}));
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
res.writeHead(200);
|
|
32
|
-
res.end(JSON.stringify({
|
|
33
|
-
success: true,
|
|
34
|
-
data: user
|
|
35
|
-
}));
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
module.exports = apiController;
|