34 lines
1.3 KiB
TypeScript
34 lines
1.3 KiB
TypeScript
import type {
|
|||
|
|
FontLoadRequestConfig,
|
||
|
|
UnifiedFont,
|
||
|
|
} from '../../model';
|
||
|
|
import { getFontUrl } from '../getFontUrl/getFontUrl';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Build the font-lifecycle load request for a single font at a given weight.
|
||
|
|
*
|
||
|
|
* Returns a 0-or-1 element array rather than `FontLoadRequestConfig | undefined`
|
||
|
|
* so call sites can `flatMap` over a font list — resolve the URL and drop fonts
|
||
|
|
* that have none in a single pass, with no separate filter step. An empty array
|
||
|
|
* means the font has no loadable asset for this weight (or its fallbacks) and is
|
||
|
|
* silently skipped.
|
||
|
|
*
|
||
|
|
* `isVariable` is forwarded from the font's features so the lifecycle manager can
|
||
|
|
* dedupe variable fonts per ID (they load once regardless of weight) while still
|
||
|
|
* loading static fonts per weight.
|
||
|
|
*
|
||
|
|
* @param font - Unified font to load
|
||
|
|
* @param weight - Numeric weight (100-900)
|
||
|
|
* @returns Single-element config array, or `[]` when no URL resolves
|
||
|
|
* @throws Error when weight is outside the valid 100-900 range (propagated from `getFontUrl`)
|
||
|
|
*/
|
||
|
|
export function createFontLoadRequestContfig(font: UnifiedFont, weight: number): FontLoadRequestConfig[] {
|
||
|
|
const url = getFontUrl(font, weight);
|
||
|
|
|
||
|
|
if (!url) {
|
||
|
|
return [];
|
||
|
|
}
|
||
|
|
|
||
|
|
return [{ id: font.id, name: font.name, weight, url, isVariable: font.features?.isVariable }];
|
||
|
|
}
|