Skip to content

Commit

Permalink
fix(@angular/build): allow missing HTML file request to fallback to i…
Browse files Browse the repository at this point in the history
…ndex

If a HTTP request is made to the development server that explicitly requests
an HTML file (i.e., `/abc.html`), the development server will now attempt to
fallback to the root `index.html` file if the requested HTML file does not exist.
Since this may indicate a defect or other application misconfiguration such as a
missing asset, a warning will also be issued in the console during development to
notify the developer that something may be wrong.

(cherry picked from commit 13a3e43)
clydin committed Sep 19, 2024

Verified

This commit was signed with the committer’s verified signature.
renovate-bot Mend Renovate
1 parent d6384f1 commit 9d0b671
Showing 1 changed file with 28 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -10,20 +10,42 @@ import type { ServerResponse } from 'node:http';
import type { Connect } from 'vite';
import { lookupMimeTypeFromRequest } from '../utils';

const ALLOWED_FALLBACK_METHODS = Object.freeze(['GET', 'HEAD']);

export function angularHtmlFallbackMiddleware(
req: Connect.IncomingMessage,
res: ServerResponse,
next: Connect.NextFunction,
): void {
// Similar to how it is handled in vite
// https://github.com/vitejs/vite/blob/main/packages/vite/src/node/server/middlewares/htmlFallback.ts#L15C19-L15C45
if (!req.method || !ALLOWED_FALLBACK_METHODS.includes(req.method)) {
// No fallback for unsupported request methods
next();

return;
}

if (req.url) {
const mimeType = lookupMimeTypeFromRequest(req.url);
if (mimeType === 'text/html' || mimeType === 'application/xhtml+xml') {
// eslint-disable-next-line no-console
console.warn(
`Request for HTML file "${req.url}" was received but no asset found. Asset may be missing from build.`,
);
} else if (mimeType) {
// No fallback for request of asset-like files
next();

return;
}
}

if (
(req.method === 'GET' || req.method === 'HEAD') &&
(!req.url || !lookupMimeTypeFromRequest(req.url)) &&
(!req.headers.accept ||
req.headers.accept.includes('text/html') ||
req.headers.accept.includes('text/*') ||
req.headers.accept.includes('*/*'))
!req.headers.accept ||
req.headers.accept.includes('text/html') ||
req.headers.accept.includes('text/*') ||
req.headers.accept.includes('*/*')
) {
req.url = '/index.html';
}

0 comments on commit 9d0b671

Please sign in to comment.