@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.
@@ -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"}
@@ -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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"}