UNPKG

astro

Version:

Astro is a modern site builder with web best practices, performance, and DX front-of-mind.

183 lines (182 loc) • 6.19 kB
import { providers } from "unifont"; import { FontaceFontFileReader } from "../infra/fontace-font-file-reader.js"; import { LocalFontProvider } from "./local.js"; import { fileURLToPath } from "node:url"; import { readFile } from "node:fs/promises"; const VARIABLE_SUFFIX_RE = / Variable$/; /** [Adobe](https://docs.astro.build/en/reference/font-provider-reference/#adobe) */ function adobe(config) { const provider = providers.adobe(config); let initializedProvider; return { name: provider._name, config, async init(context) { initializedProvider = await provider(context); }, async resolveFont({ familyName, ...rest }) { return await initializedProvider?.resolveFont(familyName, rest); }, async listFonts() { return await initializedProvider?.listFonts?.(); }, async getFontProperties({ familyName }) { return await initializedProvider?.getFontProperties?.(familyName); } }; } /** [Bunny](https://docs.astro.build/en/reference/font-provider-reference/#bunny) */ function bunny() { const provider = providers.bunny(); let initializedProvider; return { name: provider._name, async init(context) { initializedProvider = await provider(context); }, async resolveFont({ familyName, ...rest }) { return await initializedProvider?.resolveFont(familyName, rest); }, async listFonts() { return await initializedProvider?.listFonts?.(); }, async getFontProperties({ familyName }) { return await initializedProvider?.getFontProperties?.(familyName); } }; } /** [Fontshare](https://docs.astro.build/en/reference/font-provider-reference/#fontshare) */ function fontshare() { const provider = providers.fontshare(); let initializedProvider; return { name: provider._name, async init(context) { initializedProvider = await provider(context); }, async resolveFont({ familyName, ...rest }) { return await initializedProvider?.resolveFont(familyName, rest); }, async listFonts() { return await initializedProvider?.listFonts?.(); }, async getFontProperties({ familyName }) { return await initializedProvider?.getFontProperties?.(familyName); } }; } /** [Fontsource](https://docs.astro.build/en/reference/font-provider-reference/#fontsource) */ function fontsource() { const provider = providers.fontsource(); let initializedProvider; return { name: provider._name, async init(context) { initializedProvider = await provider(context); }, async resolveFont({ familyName, ...rest }) { const result = await initializedProvider?.resolveFont(familyName, rest); // The fontsource API uses family names without a "Variable" suffix (e.g. "Inter"), // but fontsource's website and npm packages use "Inter Variable" for variable fonts. // Retry without the suffix so both naming conventions work. See #18143. if (!result?.fonts?.length && familyName.endsWith(" Variable")) { return await initializedProvider?.resolveFont(familyName.replace(VARIABLE_SUFFIX_RE, ""), rest); } return result; }, async listFonts() { return await initializedProvider?.listFonts?.(); }, async getFontProperties({ familyName }) { return await initializedProvider?.getFontProperties?.(familyName); } }; } /** [Google](https://docs.astro.build/en/reference/font-provider-reference/#google) */ function google() { const provider = providers.google(); let initializedProvider; return { name: provider._name, async init(context) { initializedProvider = await provider(context); }, async resolveFont({ familyName, ...rest }) { return await initializedProvider?.resolveFont(familyName, rest); }, async listFonts() { return await initializedProvider?.listFonts?.(); }, async getFontProperties({ familyName }) { return await initializedProvider?.getFontProperties?.(familyName); } }; } /** [Google Icons](https://docs.astro.build/en/reference/font-provider-reference/#google-icons) */ function googleicons() { const provider = providers.googleicons(); let initializedProvider; return { name: provider._name, async init(context) { initializedProvider = await provider(context); }, async resolveFont({ familyName, ...rest }) { return await initializedProvider?.resolveFont(familyName, rest); }, async listFonts() { return await initializedProvider?.listFonts?.(); }, async getFontProperties({ familyName }) { return await initializedProvider?.getFontProperties?.(familyName); } }; } /** [Local](https://docs.astro.build/en/reference/font-provider-reference/#local) */ function local() { return new LocalFontProvider({ fontFileReader: new FontaceFontFileReader() }); } /** [NPM](https://docs.astro.build/en/reference/font-provider-reference/#npm) */ function npm(options) { let initializedProvider; return { name: providers.npm()._name, async init(context) { initializedProvider = await providers.npm({ ...options, root: fileURLToPath(context.root), readFile: (path) => readFile(path, "utf-8").catch(() => null) })(context); }, async resolveFont({ familyName, ...rest }) { return await initializedProvider?.resolveFont(familyName, rest); }, async listFonts() { return await initializedProvider?.listFonts?.(); }, async getFontProperties({ familyName }) { return await initializedProvider?.getFontProperties?.(familyName); } }; } /** * Astro exports a few built-in providers: * - [Adobe](https://docs.astro.build/en/reference/font-provider-reference/#adobe) * - [Bunny](https://docs.astro.build/en/reference/font-provider-reference/#bunny) * - [Fontshare](https://docs.astro.build/en/reference/font-provider-reference/#fontshare) * - [Fontsource](https://docs.astro.build/en/reference/font-provider-reference/#fontsource) * - [Google](https://docs.astro.build/en/reference/font-provider-reference/#google) * - [Google Icons](https://docs.astro.build/en/reference/font-provider-reference/#google-icons) * - [Local](https://docs.astro.build/en/reference/font-provider-reference/#local) * - [NPM](https://docs.astro.build/en/reference/font-provider-reference/#npm) */ export const fontProviders = { adobe, bunny, fontshare, fontsource, google, googleicons, local, npm };