Skip to content
File

Blob: src/worker/sites/preload-headers.ts

typescript50 lines
1import type { SiteDocumentAssets } from "@/sites/types";
2 
3type PreloadKind = "script" | "style";
4 
5function createPreloadLinkHeaderValue(href: string, kind: PreloadKind): string {
6 return `<${href}>; rel=preload; as=${kind}`;
7}
8 
9function withSitesPreloadHeaders(
10 headersInit: HeadersInit,
11 assets: SiteDocumentAssets,
12 scriptHrefs: readonly string[],
13): Record<string, string> {
14 const headers = new Headers(headersInit);
15 const seen = new Set<string>();
16 
17 function append(href: string | null | undefined, kind: PreloadKind): void {
18 if (!href) return;
19 
20 const value = createPreloadLinkHeaderValue(href, kind);
21 if (seen.has(value)) return;
22 
23 seen.add(value);
24 headers.append("Link", value);
25 }
26 
27 append(assets.stylesheetHref, "style");
28 append(assets.fontStylesheetHref, "style");
29 for (const href of scriptHrefs) append(href, "script");
30 
31 return Object.fromEntries(headers.entries());
32}
33 
34export function withSitesStaticDocumentPreloadHeaders(
35 headersInit: HeadersInit,
36 assets: SiteDocumentAssets,
37): Record<string, string> {
38 return withSitesPreloadHeaders(headersInit, assets, []);
39}
40 
41export function withSitesPageDocumentPreloadHeaders(
42 headersInit: HeadersInit,
43 assets: SiteDocumentAssets,
44): Record<string, string> {
45 return withSitesPreloadHeaders(headersInit, assets, [
46 ...(assets.scriptSrc ? [assets.scriptSrc] : []),
47 ...assets.modulePreloadHrefs,
48 ]);
49}