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
JavaScript
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
};