astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
60 lines (59 loc) • 1.49 kB
JavaScript
import { createUnifont } from "unifont";
import { LOCAL_PROVIDER_NAME } from "../constants.js";
class UnifontFontResolver {
#unifont;
constructor({ unifont }) {
this.#unifont = unifont;
}
static extractUnifontProviders({
families,
hasher
}) {
const hashes = /* @__PURE__ */ new Set();
const providers = [];
for (const { provider } of families) {
if (provider === LOCAL_PROVIDER_NAME) {
continue;
}
const unifontProvider = provider.provider(provider.config);
const hash = hasher.hashObject({
name: unifontProvider._name,
...provider.config
});
unifontProvider._name += `-${hash}`;
provider.name = unifontProvider._name;
if (!hashes.has(hash)) {
hashes.add(hash);
providers.push(unifontProvider);
}
}
return providers;
}
static async create({
families,
hasher,
storage
}) {
return new UnifontFontResolver({
unifont: await createUnifont(this.extractUnifontProviders({ families, hasher }), {
storage,
// TODO: consider enabling, would require new astro errors
throwOnError: false
})
});
}
async resolveFont({
familyName,
provider,
...rest
}) {
const { fonts } = await this.#unifont.resolveFont(familyName, rest, [provider]);
return fonts;
}
async listFonts({ provider }) {
return await this.#unifont.listFonts([provider]);
}
}
export {
UnifontFontResolver
};