Files
skills-here-run-place/node_modules/astro/dist/assets/fonts/infra/unifont-font-resolver.js
Alejandro Martinez f09af719cf Initial commit
2026-02-12 02:04:10 +01:00

99 lines
2.5 KiB
JavaScript

import { createUnifont, defineFontProvider } from "unifont";
class UnifontFontResolver {
#unifont;
#hasher;
constructor({
unifont,
hasher
}) {
this.#unifont = unifont;
this.#hasher = hasher;
}
static idFromProvider({ hasher, provider }) {
const hash = hasher.hashObject({
name: provider.name,
...provider.config
});
return `${provider.name}-${hash}`;
}
static astroToUnifontProvider(astroProvider, root) {
return defineFontProvider(astroProvider.name, async (_options, ctx) => {
await astroProvider?.init?.({ ...ctx, root });
return {
async resolveFont(familyName, { options, ...rest }) {
return await astroProvider.resolveFont({ familyName, options, ...rest });
},
async listFonts() {
return astroProvider.listFonts?.();
}
};
})(astroProvider.config);
}
static extractUnifontProviders({
families,
hasher,
root
}) {
const providers = /* @__PURE__ */ new Map();
for (const { provider } of families) {
const id = this.idFromProvider({ hasher, provider });
if (!providers.has(id)) {
const unifontProvider = this.astroToUnifontProvider(provider, root);
unifontProvider._name = this.idFromProvider({ hasher, provider });
providers.set(id, unifontProvider);
}
}
return Array.from(providers.values());
}
static async create({
families,
hasher,
storage,
root
}) {
return new UnifontFontResolver({
unifont: await createUnifont(this.extractUnifontProviders({ families, hasher, root }), {
storage,
// TODO: consider enabling, would require new astro errors
throwOnError: false
}),
hasher
});
}
async resolveFont({
familyName,
provider,
options,
...rest
}) {
const id = UnifontFontResolver.idFromProvider({
hasher: this.#hasher,
provider
});
const { fonts } = await this.#unifont.resolveFont(
familyName,
{
// Options are currently namespaced by provider name, it may change in
// https://github.com/unjs/unifont/pull/287
options: {
[id]: options
},
...rest
},
[id]
);
return fonts;
}
async listFonts({ provider }) {
return await this.#unifont.listFonts([
UnifontFontResolver.idFromProvider({
hasher: this.#hasher,
provider
})
]);
}
}
export {
UnifontFontResolver
};