@ressjs/vite-router 0.3.0 → 0.4.1
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 +94 -166
- package/dist/helpers/html-generator.d.ts +13 -0
- package/dist/helpers/html-generator.js +108 -0
- package/dist/helpers/request-handler.d.ts +17 -0
- package/dist/helpers/request-handler.js +79 -0
- package/dist/helpers/vite-config.d.ts +10 -0
- package/dist/helpers/vite-config.js +97 -0
- package/dist/index.d.ts +6 -9
- package/dist/index.js +21 -6
- package/dist/pages.d.ts +26 -0
- package/dist/pages.js +296 -0
- package/dist/platform.d.ts +24 -0
- package/dist/platform.js +143 -0
- package/dist/render.d.ts +13 -0
- package/dist/render.js +98 -0
- package/dist/{simple-router.d.ts → router.d.ts} +5 -21
- package/dist/router.js +118 -0
- package/package.json +19 -9
- package/dist/entry-generator.d.ts +0 -33
- package/dist/entry-generator.d.ts.map +0 -1
- package/dist/entry-generator.js +0 -112
- package/dist/entry-generator.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/page-detector.d.ts +0 -43
- package/dist/page-detector.d.ts.map +0 -1
- package/dist/page-detector.js +0 -91
- package/dist/page-detector.js.map +0 -1
- package/dist/router-factory.d.ts +0 -57
- package/dist/router-factory.d.ts.map +0 -1
- package/dist/router-factory.js +0 -152
- package/dist/router-factory.js.map +0 -1
- package/dist/simple-router.d.ts.map +0 -1
- package/dist/simple-router.js +0 -340
- package/dist/simple-router.js.map +0 -1
package/dist/router-factory.js
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { Router } from 'express';
|
|
2
|
-
import { PageDetector } from './page-detector.js';
|
|
3
|
-
import { EntryGenerator } from './entry-generator.js';
|
|
4
|
-
import { createRenderServer } from '@ressjs/core';
|
|
5
|
-
export class RouterFactory {
|
|
6
|
-
constructor(options) {
|
|
7
|
-
this.options = {
|
|
8
|
-
outputDir: 'temp',
|
|
9
|
-
enableSSR: true,
|
|
10
|
-
enablePlatformDetection: true,
|
|
11
|
-
staticDir: 'public',
|
|
12
|
-
...options
|
|
13
|
-
};
|
|
14
|
-
this.pageDetector = new PageDetector({
|
|
15
|
-
pagesDir: this.options.pagesDir,
|
|
16
|
-
distPath: this.options.outputDir
|
|
17
|
-
});
|
|
18
|
-
this.entryGenerator = new EntryGenerator({
|
|
19
|
-
pagesDir: this.options.pagesDir,
|
|
20
|
-
outputDir: this.options.outputDir
|
|
21
|
-
});
|
|
22
|
-
if (this.options.enableSSR) {
|
|
23
|
-
this.renderServer = createRenderServer();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Crea un Express Router con todas las rutas automáticas
|
|
28
|
-
*/
|
|
29
|
-
createRouter() {
|
|
30
|
-
const router = Router();
|
|
31
|
-
// Middleware para detectar páginas y generar entries
|
|
32
|
-
router.use(this.pageDetectionMiddleware.bind(this));
|
|
33
|
-
// Middleware para SSR
|
|
34
|
-
if (this.options.enableSSR) {
|
|
35
|
-
router.use(this.ssrMiddleware.bind(this));
|
|
36
|
-
}
|
|
37
|
-
// Fallback para servir archivos estáticos
|
|
38
|
-
router.use(this.staticMiddleware.bind(this));
|
|
39
|
-
return router;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Middleware para detectar páginas y preparar context
|
|
43
|
-
*/
|
|
44
|
-
async pageDetectionMiddleware(req, _res, next) {
|
|
45
|
-
try {
|
|
46
|
-
console.log(`[ViteRouter] Processing request: ${req.path}`);
|
|
47
|
-
const detectedPages = await this.pageDetector.getDetectedPages();
|
|
48
|
-
console.log(`[ViteRouter] Detected ${detectedPages.length} pages:`, detectedPages.map(p => p.route));
|
|
49
|
-
const matchedPage = this.pageDetector.matchRoute(req.path, detectedPages);
|
|
50
|
-
console.log(`[ViteRouter] Matched page for ${req.path}:`, matchedPage);
|
|
51
|
-
if (!matchedPage) {
|
|
52
|
-
console.log(`[ViteRouter] No page matched for ${req.path}, passing to next middleware`);
|
|
53
|
-
return next();
|
|
54
|
-
}
|
|
55
|
-
// Detectar platform si está habilitado
|
|
56
|
-
const platform = this.options.enablePlatformDetection
|
|
57
|
-
? this.entryGenerator.detectPlatformFromRequest(req)
|
|
58
|
-
: 'desktop';
|
|
59
|
-
console.log(`[ViteRouter] Detected platform: ${platform}`);
|
|
60
|
-
// Generar entry específico para este platform
|
|
61
|
-
const entry = await this.entryGenerator.generatePlatformSpecificEntry(matchedPage.route, platform, detectedPages);
|
|
62
|
-
console.log(`[ViteRouter] Generated entry for ${matchedPage.route}`);
|
|
63
|
-
req.routeContext = {
|
|
64
|
-
page: matchedPage,
|
|
65
|
-
platform,
|
|
66
|
-
entry
|
|
67
|
-
};
|
|
68
|
-
next();
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
console.error('Error in page detection middleware:', error);
|
|
72
|
-
next(error);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Middleware para Server-Side Rendering
|
|
77
|
-
*/
|
|
78
|
-
async ssrMiddleware(req, res, next) {
|
|
79
|
-
const context = req.routeContext;
|
|
80
|
-
if (!context) {
|
|
81
|
-
return next();
|
|
82
|
-
}
|
|
83
|
-
try {
|
|
84
|
-
console.log(`[ViteRouter] SSR rendering for ${req.url}`);
|
|
85
|
-
// Usar el renderServer del core con la URL
|
|
86
|
-
const html = await this.renderServer({ url: req.url });
|
|
87
|
-
// Inyectar el entry client específico del platform
|
|
88
|
-
const finalHtml = this.injectClientEntry(html, context);
|
|
89
|
-
res.setHeader('Content-Type', 'text/html');
|
|
90
|
-
res.send(finalHtml);
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
console.error('SSR Error:', error);
|
|
94
|
-
next(error);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Middleware para archivos estáticos
|
|
99
|
-
*/
|
|
100
|
-
staticMiddleware(_req, _res, next) {
|
|
101
|
-
// Si llegamos aquí, no se encontró una página
|
|
102
|
-
// Express.static se encargará de servir archivos estáticos
|
|
103
|
-
next();
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Inyecta el entry client específico del platform en el HTML
|
|
107
|
-
*/
|
|
108
|
-
injectClientEntry(html, context) {
|
|
109
|
-
// Buscar el punto de inserción del script
|
|
110
|
-
const scriptInsertPoint = html.indexOf('</head>');
|
|
111
|
-
if (scriptInsertPoint === -1) {
|
|
112
|
-
return html;
|
|
113
|
-
}
|
|
114
|
-
// Generar script tag con el entry específico
|
|
115
|
-
const scriptTag = `
|
|
116
|
-
<script>
|
|
117
|
-
// Platform detection
|
|
118
|
-
document.documentElement.classList.add('${context.platform}')
|
|
119
|
-
|
|
120
|
-
// Entry específico del platform
|
|
121
|
-
${context.entry}
|
|
122
|
-
</script>`;
|
|
123
|
-
return html.slice(0, scriptInsertPoint) + scriptTag + html.slice(scriptInsertPoint);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Limpia archivos temporales
|
|
127
|
-
*/
|
|
128
|
-
async cleanup() {
|
|
129
|
-
await this.entryGenerator.cleanup();
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Inicializa el router (genera entries iniciales)
|
|
133
|
-
*/
|
|
134
|
-
async initialize() {
|
|
135
|
-
await this.entryGenerator.generateDynamicEntries();
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Factory function para crear un router fácilmente
|
|
140
|
-
*/
|
|
141
|
-
export function createViteRouter(options) {
|
|
142
|
-
const factory = new RouterFactory(options);
|
|
143
|
-
return factory.createRouter();
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Factory function async para inicializar y crear el router
|
|
147
|
-
*/
|
|
148
|
-
export async function createInitializedViteRouter(options) {
|
|
149
|
-
const factory = new RouterFactory(options);
|
|
150
|
-
await factory.initialize();
|
|
151
|
-
return factory.createRouter();
|
|
152
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router-factory.js","sourceRoot":"","sources":["../src/router-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simple-router.d.ts","sourceRoot":"","sources":["../src/simple-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAKhC,MAAM,WAAW,iBAAiB;IAChC,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,QAAQ,CAAC,EAAE,GAAG,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,GAAG,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAC3F;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B;;;;GA6E7E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,MAAM,CAWxE;AAgTD;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAItE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,sCAEhC;AAGD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA"}
|
package/dist/simple-router.js
DELETED
|
@@ -1,340 +0,0 @@
|
|
|
1
|
-
import { Router } from 'express';
|
|
2
|
-
import { getPages, createRenderServer, generateTempEntries } from '@ressjs/core';
|
|
3
|
-
import fs from 'node:fs/promises';
|
|
4
|
-
import express from 'express';
|
|
5
|
-
/**
|
|
6
|
-
* Crea un servidor Express completo con vite-router automático
|
|
7
|
-
* Esta es la función de alto nivel para casos simples
|
|
8
|
-
*/
|
|
9
|
-
export async function createAutoViteServer(options = {}) {
|
|
10
|
-
const { port = 5173, base = '/', enablePlatformDetection = true } = options;
|
|
11
|
-
const isProduction = process.env.NODE_ENV === 'production';
|
|
12
|
-
const app = express();
|
|
13
|
-
let vite;
|
|
14
|
-
let manifest = {};
|
|
15
|
-
let templateHtml = '';
|
|
16
|
-
// Configuración automática de Vite
|
|
17
|
-
if (!isProduction) {
|
|
18
|
-
console.log('[AutoViteServer] Setting up development server...');
|
|
19
|
-
const { createServer } = await import('vite');
|
|
20
|
-
vite = await createServer({
|
|
21
|
-
server: { middlewareMode: true },
|
|
22
|
-
appType: 'custom',
|
|
23
|
-
base,
|
|
24
|
-
});
|
|
25
|
-
app.use(vite.middlewares);
|
|
26
|
-
// Sirve los entry-client generados en dev (incluyendo los específicos por plataforma)
|
|
27
|
-
app.use('/dist/.entries', express.static('dist/.entries'));
|
|
28
|
-
// Cargar manifest si existe
|
|
29
|
-
try {
|
|
30
|
-
manifest = JSON.parse(await fs.readFile('./dist/server/.vite/manifest.json', 'utf-8'));
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
console.log('[AutoViteServer] No server manifest found (normal in dev)');
|
|
34
|
-
manifest = {};
|
|
35
|
-
}
|
|
36
|
-
// Generar entries automáticamente
|
|
37
|
-
await generateTempEntries();
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
console.log('[AutoViteServer] Setting up production server...');
|
|
41
|
-
const compression = (await import('compression')).default;
|
|
42
|
-
const sirv = (await import('sirv')).default;
|
|
43
|
-
app.use(compression());
|
|
44
|
-
app.use(base, sirv('./dist/client', { extensions: [] }));
|
|
45
|
-
// Cargar assets de producción
|
|
46
|
-
manifest = JSON.parse(await fs.readFile('./dist/client/.vite/manifest.json', 'utf-8'));
|
|
47
|
-
templateHtml = await fs.readFile('./index.html', 'utf-8');
|
|
48
|
-
}
|
|
49
|
-
// Crear vite-router con configuración automática
|
|
50
|
-
const viteRouter = createViteRouter({
|
|
51
|
-
enablePlatformDetection,
|
|
52
|
-
vite,
|
|
53
|
-
manifest,
|
|
54
|
-
templateHtml,
|
|
55
|
-
isProduction
|
|
56
|
-
});
|
|
57
|
-
app.use('/', viteRouter);
|
|
58
|
-
app.use(express.static('public'));
|
|
59
|
-
// Función para iniciar el servidor
|
|
60
|
-
const start = () => {
|
|
61
|
-
return app.listen(port, () => {
|
|
62
|
-
const pages = getPages();
|
|
63
|
-
console.log(`🚀 Auto Vite Server started at http://localhost:${port}`);
|
|
64
|
-
console.log(`📄 Auto-detected routes:`);
|
|
65
|
-
pages.forEach(page => {
|
|
66
|
-
console.log(` ${page.route} -> ${page.file}`);
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
|
-
return { app, vite, start };
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Crea un Express router que automáticamente detecta páginas, las rutea,
|
|
74
|
-
* y maneja todo el SSR + hidratación del cliente.
|
|
75
|
-
*
|
|
76
|
-
* Si no se pasan opciones, auto-configura Vite, manifest, templates, etc.
|
|
77
|
-
*/
|
|
78
|
-
export function createViteRouter(options = {}) {
|
|
79
|
-
// Si no se pasan opciones críticas, configurar automáticamente
|
|
80
|
-
const needsAutoConfig = !options.vite && !options.manifest && !options.templateHtml;
|
|
81
|
-
if (needsAutoConfig) {
|
|
82
|
-
console.log('[ViteRouter] Auto-configuring...');
|
|
83
|
-
return createAutoConfiguredRouter(options);
|
|
84
|
-
}
|
|
85
|
-
// Configuración manual (para casos avanzados)
|
|
86
|
-
return createManualRouter(options);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Router con configuración automática
|
|
90
|
-
*/
|
|
91
|
-
function createAutoConfiguredRouter(options) {
|
|
92
|
-
const { enablePlatformDetection = true, renderFunction } = options;
|
|
93
|
-
const isProduction = process.env.NODE_ENV === 'production';
|
|
94
|
-
let vite;
|
|
95
|
-
let manifest = {};
|
|
96
|
-
let templateHtml = '';
|
|
97
|
-
let renderServer = null;
|
|
98
|
-
let initialized = false;
|
|
99
|
-
// Router principal que va a manejar todo
|
|
100
|
-
const mainRouter = Router();
|
|
101
|
-
// Función para inicializar una sola vez
|
|
102
|
-
const initializeIfNeeded = async () => {
|
|
103
|
-
if (initialized)
|
|
104
|
-
return { vite, manifest, templateHtml };
|
|
105
|
-
if (!isProduction) {
|
|
106
|
-
console.log('[ViteRouter] Setting up development mode...');
|
|
107
|
-
const { createServer } = await import('vite');
|
|
108
|
-
vite = await createServer({
|
|
109
|
-
server: { middlewareMode: true },
|
|
110
|
-
appType: 'custom',
|
|
111
|
-
base: process.env.BASE || '/',
|
|
112
|
-
});
|
|
113
|
-
// Agregar Vite middleware al router principal
|
|
114
|
-
mainRouter.use(vite.middlewares);
|
|
115
|
-
// Cargar manifest si existe
|
|
116
|
-
try {
|
|
117
|
-
manifest = JSON.parse(await fs.readFile('./dist/server/.vite/manifest.json', 'utf-8'));
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
console.log('[ViteRouter] No server manifest found (normal in dev)');
|
|
121
|
-
manifest = {};
|
|
122
|
-
}
|
|
123
|
-
// Generar entries automáticamente
|
|
124
|
-
await generateTempEntries();
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
console.log('[ViteRouter] Setting up production mode...');
|
|
128
|
-
// Configurar middleware de producción
|
|
129
|
-
const compression = (await import('compression')).default;
|
|
130
|
-
const sirv = (await import('sirv')).default;
|
|
131
|
-
mainRouter.use(compression());
|
|
132
|
-
mainRouter.use(sirv('./dist/client', { extensions: [] }));
|
|
133
|
-
// Cargar assets de producción
|
|
134
|
-
manifest = JSON.parse(await fs.readFile('./dist/client/.vite/manifest.json', 'utf-8'));
|
|
135
|
-
templateHtml = await fs.readFile('./index.html', 'utf-8');
|
|
136
|
-
}
|
|
137
|
-
initialized = true;
|
|
138
|
-
return { vite, manifest, templateHtml };
|
|
139
|
-
};
|
|
140
|
-
// Crear las rutas de páginas
|
|
141
|
-
const pages = getPages();
|
|
142
|
-
console.log(`[ViteRouter] Creating auto-configured router for ${pages.length} pages`);
|
|
143
|
-
pages.forEach(page => {
|
|
144
|
-
console.log(`[ViteRouter] Route: ${page.route} -> ${page.file}`);
|
|
145
|
-
mainRouter.get(page.route, async (req, res, next) => {
|
|
146
|
-
try {
|
|
147
|
-
// Inicializar si es necesario (lazy initialization)
|
|
148
|
-
await initializeIfNeeded();
|
|
149
|
-
// Detectar platform
|
|
150
|
-
let platform = 'desktop';
|
|
151
|
-
if (enablePlatformDetection) {
|
|
152
|
-
const userAgent = req.headers['user-agent']?.toLowerCase() || '';
|
|
153
|
-
const isMobile = ['mobile', 'android', 'iphone', 'ipad', 'blackberry', 'windows phone']
|
|
154
|
-
.some(keyword => userAgent.includes(keyword));
|
|
155
|
-
platform = isMobile ? 'mobile' : 'desktop';
|
|
156
|
-
}
|
|
157
|
-
// Si hay función de render personalizada, usarla
|
|
158
|
-
if (renderFunction) {
|
|
159
|
-
const html = await renderFunction({ url: req.url, platform, req });
|
|
160
|
-
res.setHeader('Content-Type', 'text/html');
|
|
161
|
-
res.send(html);
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
// Crear renderServer lazy-loading
|
|
165
|
-
if (!renderServer) {
|
|
166
|
-
const renderOptions = vite ? { vite } : {};
|
|
167
|
-
renderServer = createRenderServer(renderOptions);
|
|
168
|
-
}
|
|
169
|
-
// Renderizar
|
|
170
|
-
const urlObj = new URL(req.url, 'http://localhost');
|
|
171
|
-
const pathname = urlObj.pathname;
|
|
172
|
-
const rendered = await renderServer({ url: pathname });
|
|
173
|
-
// Obtener template
|
|
174
|
-
let template;
|
|
175
|
-
if (!isProduction) {
|
|
176
|
-
template = await fs.readFile('./index.html', 'utf-8');
|
|
177
|
-
template = await vite.transformIndexHtml(req.url, template);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
template = templateHtml;
|
|
181
|
-
}
|
|
182
|
-
// Generar HTML completo
|
|
183
|
-
const html = generateFullHTML(template, rendered, page, manifest, platform, isProduction);
|
|
184
|
-
res.setHeader('Content-Type', 'text/html');
|
|
185
|
-
res.send(html);
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
console.error(`[ViteRouter] Error handling ${req.url}:`, error);
|
|
189
|
-
if (vite?.ssrFixStacktrace) {
|
|
190
|
-
vite.ssrFixStacktrace(error);
|
|
191
|
-
}
|
|
192
|
-
next(error);
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
return mainRouter;
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Router con configuración manual (para casos avanzados)
|
|
200
|
-
*/
|
|
201
|
-
function createManualRouter(options) {
|
|
202
|
-
const { enablePlatformDetection = true, vite, manifest = {}, templateHtml = '', isProduction = process.env.NODE_ENV === 'production', renderFunction } = options;
|
|
203
|
-
const router = Router();
|
|
204
|
-
const pages = getPages();
|
|
205
|
-
let renderServer = null;
|
|
206
|
-
console.log(`[ViteRouter] Creating router for ${pages.length} pages`);
|
|
207
|
-
pages.forEach(page => {
|
|
208
|
-
console.log(`[ViteRouter] Route: ${page.route} -> ${page.file}`);
|
|
209
|
-
router.get(page.route, async (req, res, next) => {
|
|
210
|
-
try {
|
|
211
|
-
// Detectar platform
|
|
212
|
-
let platform = 'desktop';
|
|
213
|
-
if (enablePlatformDetection) {
|
|
214
|
-
const userAgent = req.headers['user-agent']?.toLowerCase() || '';
|
|
215
|
-
const isMobile = ['mobile', 'android', 'iphone', 'ipad', 'blackberry', 'windows phone']
|
|
216
|
-
.some(keyword => userAgent.includes(keyword));
|
|
217
|
-
platform = isMobile ? 'mobile' : 'desktop';
|
|
218
|
-
}
|
|
219
|
-
// Si hay función de render personalizada, usarla
|
|
220
|
-
if (renderFunction) {
|
|
221
|
-
const html = await renderFunction({ url: req.url, platform, req });
|
|
222
|
-
res.setHeader('Content-Type', 'text/html');
|
|
223
|
-
res.send(html);
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
// Crear renderServer lazy-loading
|
|
227
|
-
if (!renderServer) {
|
|
228
|
-
const renderOptions = vite ? { vite } : {};
|
|
229
|
-
renderServer = createRenderServer(renderOptions);
|
|
230
|
-
}
|
|
231
|
-
// Renderizar
|
|
232
|
-
const urlObj = new URL(req.url, 'http://localhost');
|
|
233
|
-
const pathname = urlObj.pathname;
|
|
234
|
-
const rendered = await renderServer({ url: pathname });
|
|
235
|
-
// Obtener template
|
|
236
|
-
let template;
|
|
237
|
-
if (!isProduction) {
|
|
238
|
-
template = await fs.readFile('./index.html', 'utf-8');
|
|
239
|
-
template = await vite.transformIndexHtml(req.url, template);
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
template = templateHtml;
|
|
243
|
-
}
|
|
244
|
-
// Generar HTML completo
|
|
245
|
-
const html = generateFullHTML(template, rendered, page, manifest, platform, isProduction);
|
|
246
|
-
res.setHeader('Content-Type', 'text/html');
|
|
247
|
-
res.send(html);
|
|
248
|
-
}
|
|
249
|
-
catch (error) {
|
|
250
|
-
console.error(`[ViteRouter] Error handling ${req.url}:`, error);
|
|
251
|
-
if (vite?.ssrFixStacktrace) {
|
|
252
|
-
vite.ssrFixStacktrace(error);
|
|
253
|
-
}
|
|
254
|
-
next(error);
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
|
-
});
|
|
258
|
-
return router;
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Genera el HTML completo con assets y hidratación
|
|
262
|
-
*/
|
|
263
|
-
function generateFullHTML(template, rendered, page, manifest, platform, isProduction) {
|
|
264
|
-
// Función para obtener script del cliente según la plataforma
|
|
265
|
-
function getClientScript(pageFile, platform) {
|
|
266
|
-
const rel = pageFile.replace(/^app\/pages\//, '').replace(/\.tsx$|\.jsx$/, '');
|
|
267
|
-
if (!isProduction) {
|
|
268
|
-
// En dev, intentar cargar el entry-client específico de la plataforma
|
|
269
|
-
if (platform === 'mobile') {
|
|
270
|
-
return `/dist/.entries/${rel}__entry-client.mobile.tsx`;
|
|
271
|
-
}
|
|
272
|
-
return `/dist/.entries/${rel}__entry-client.tsx`;
|
|
273
|
-
}
|
|
274
|
-
// En producción, buscar en el manifest el entry-client correcto
|
|
275
|
-
let entryKey = `dist/.entries/${rel}__entry-client.tsx`;
|
|
276
|
-
if (platform === 'mobile') {
|
|
277
|
-
const mobileKey = `dist/.entries/${rel}__entry-client.mobile.tsx`;
|
|
278
|
-
if (manifest[mobileKey]) {
|
|
279
|
-
entryKey = mobileKey;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
const chunk = manifest[entryKey];
|
|
283
|
-
return chunk ? `/${chunk.file}` : null;
|
|
284
|
-
}
|
|
285
|
-
// Función para obtener CSS del cliente (restaurado para producción)
|
|
286
|
-
function getClientCss(pageFile, platform) {
|
|
287
|
-
if (!isProduction || !pageFile) {
|
|
288
|
-
return ''; // En dev, Vite maneja los estilos automáticamente vía HMR
|
|
289
|
-
}
|
|
290
|
-
// En producción, el CSS se incluye en el entry-client correspondiente
|
|
291
|
-
const rel = pageFile.replace(/^app\/pages\//, '').replace(/\.tsx$|\.jsx$/, '');
|
|
292
|
-
// Determinar qué entry-client usar según la plataforma
|
|
293
|
-
let entryKey = `dist/.entries/${rel}__entry-client.tsx`;
|
|
294
|
-
if (platform === 'mobile') {
|
|
295
|
-
const mobileKey = `dist/.entries/${rel}__entry-client.mobile.tsx`;
|
|
296
|
-
if (manifest[mobileKey]) {
|
|
297
|
-
entryKey = mobileKey;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
const entryChunk = manifest[entryKey];
|
|
301
|
-
if (entryChunk && entryChunk.css) {
|
|
302
|
-
return entryChunk.css.map((cssFile) => `<link rel="stylesheet" href="/${cssFile}">`).join('');
|
|
303
|
-
}
|
|
304
|
-
return '';
|
|
305
|
-
}
|
|
306
|
-
// Generar HTML completo
|
|
307
|
-
const scriptSrc = getClientScript(page.file, platform);
|
|
308
|
-
const scriptTag = scriptSrc ? `<script type="module" src="${scriptSrc}"></script>` : '';
|
|
309
|
-
const cssLinks = page?.file ? getClientCss(page.file, platform) : '';
|
|
310
|
-
const html = template
|
|
311
|
-
.replace('<!--app-head-->', cssLinks)
|
|
312
|
-
.replace('<!--app-html-->', rendered.html)
|
|
313
|
-
.replace('</body>', `<script>
|
|
314
|
-
window.__INITIAL_PROPS__=${JSON.stringify(rendered.props || {})};
|
|
315
|
-
window.__PAGE_ROUTE__=${JSON.stringify(page.route)};
|
|
316
|
-
window.__PAGE_FILE__=${JSON.stringify(page.file)};
|
|
317
|
-
</script>
|
|
318
|
-
${scriptTag}
|
|
319
|
-
</body>`);
|
|
320
|
-
// Inyectar platform class si no es desktop
|
|
321
|
-
return platform !== 'desktop'
|
|
322
|
-
? html.replace('<html', `<html class="${platform}"`)
|
|
323
|
-
: html;
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Detecta platform desde el User-Agent
|
|
327
|
-
*/
|
|
328
|
-
export function detectPlatform(userAgent) {
|
|
329
|
-
const ua = userAgent.toLowerCase();
|
|
330
|
-
const mobileKeywords = ['mobile', 'android', 'iphone', 'ipad', 'blackberry', 'windows phone'];
|
|
331
|
-
return mobileKeywords.some(keyword => ua.includes(keyword)) ? 'mobile' : 'desktop';
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Helper para listar páginas detectadas
|
|
335
|
-
*/
|
|
336
|
-
export function listDetectedPages() {
|
|
337
|
-
return getPages();
|
|
338
|
-
}
|
|
339
|
-
// Re-export del core para conveniencia
|
|
340
|
-
export { getPages } from '@ressjs/core';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simple-router.js","sourceRoot":"","sources":["../src/simple-router.ts"],"names":[],"mappings":"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"}
|