( root: string, server: ViteDevServer | PreviewServer, )
| 449 | } |
| 450 | |
| 451 | export function indexHtmlMiddleware( |
| 452 | root: string, |
| 453 | server: ViteDevServer | PreviewServer, |
| 454 | ): Connect.NextHandleFunction { |
| 455 | const isDev = isDevServer(server) |
| 456 | const fullBundle = isDev && server.environments.client.bundledDev |
| 457 | |
| 458 | // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...` |
| 459 | return async function viteIndexHtmlMiddleware(req, res, next) { |
| 460 | if (res.writableEnded) { |
| 461 | return next() |
| 462 | } |
| 463 | |
| 464 | const url = req.url && cleanUrl(req.url) |
| 465 | // htmlFallbackMiddleware appends '.html' to URLs |
| 466 | if (url?.endsWith('.html') && req.headers['sec-fetch-dest'] !== 'script') { |
| 467 | if (fullBundle) { |
| 468 | let pathname |
| 469 | try { |
| 470 | pathname = decodeURIComponent(url) |
| 471 | } catch { |
| 472 | // ignore malformed URI |
| 473 | return next() |
| 474 | } |
| 475 | const filePath = pathname.slice(1) // remove first / |
| 476 | |
| 477 | let file = fullBundle.memoryFiles.get(filePath) |
| 478 | if (!file && fullBundle.memoryFiles.size !== 0) { |
| 479 | return next() |
| 480 | } |
| 481 | const secFetchDest = req.headers['sec-fetch-dest'] |
| 482 | if ( |
| 483 | [ |
| 484 | 'document', |
| 485 | 'iframe', |
| 486 | 'frame', |
| 487 | 'fencedframe', |
| 488 | '', |
| 489 | undefined, |
| 490 | ].includes(secFetchDest) && |
| 491 | ((await fullBundle.triggerBundleRegenerationIfStale()) || |
| 492 | file === undefined) |
| 493 | ) { |
| 494 | file = { source: await generateFallbackHtml(server as ViteDevServer) } |
| 495 | } |
| 496 | if (!file) { |
| 497 | return next() |
| 498 | } |
| 499 | |
| 500 | const html = |
| 501 | typeof file.source === 'string' |
| 502 | ? file.source |
| 503 | : Buffer.from(file.source) |
| 504 | const headers = server.config.server.headers |
| 505 | return send(req, res, html, 'html', { headers, etag: file.etag }) |
| 506 | } |
| 507 | |
| 508 | let filePath: string |
no test coverage detected