Swap the eagerly-constructed fontCatalogStore singleton for a lazy getFontCatalog() accessor (plus __resetFontCatalog for tests), so the InfiniteQueryObserver is created on first use rather than at module load. Update the model barrels and all consumers (FontVirtualList, SampleList, SampleListSection) to the accessor. Also extract createFontLoadRequestConfig from FontVirtualList: it resolves a font's URL for a weight and returns a 0-or-1 element array, letting callers flatMap over a list to build load requests and drop unresolvable fonts in one pass.
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 }];
|
|
}
|