54 lines
1.7 KiB
JavaScript
54 lines
1.7 KiB
JavaScript
import { FONT_FORMATS } from "../constants.js";
|
|
function resolveLocalFont({
|
|
family,
|
|
urlProxy,
|
|
fontTypeExtractor,
|
|
fontFileReader
|
|
}) {
|
|
return {
|
|
fonts: family.variants.map((variant) => {
|
|
const shouldInfer = variant.weight === void 0 || variant.style === void 0;
|
|
const data = {
|
|
// If it should be inferred, we don't want to set the value
|
|
weight: variant.weight,
|
|
style: variant.style,
|
|
src: [],
|
|
unicodeRange: variant.unicodeRange,
|
|
display: variant.display,
|
|
stretch: variant.stretch,
|
|
featureSettings: variant.featureSettings,
|
|
variationSettings: variant.variationSettings
|
|
};
|
|
data.src = variant.src.map((source, index) => {
|
|
if (shouldInfer && index === 0) {
|
|
const result = fontFileReader.extract({ family: family.name, url: source.url });
|
|
if (variant.weight === void 0) data.weight = result.weight;
|
|
if (variant.style === void 0) data.style = result.style;
|
|
}
|
|
const type = fontTypeExtractor.extract(source.url);
|
|
return {
|
|
originalURL: source.url,
|
|
url: urlProxy.proxy({
|
|
url: source.url,
|
|
type,
|
|
// We only use the first source for preloading. For example if woff2 and woff
|
|
// are available, we only keep woff2.
|
|
collectPreload: index === 0,
|
|
data: {
|
|
weight: data.weight,
|
|
style: data.style
|
|
},
|
|
init: null
|
|
}),
|
|
format: FONT_FORMATS.find((e) => e.type === type)?.format,
|
|
tech: source.tech
|
|
};
|
|
});
|
|
return data;
|
|
})
|
|
};
|
|
}
|
|
export {
|
|
resolveLocalFont
|
|
};
|