diff --git a/src/providers/fontsource.ts b/src/providers/fontsource.ts index 86fbae2..d1a0e4e 100644 --- a/src/providers/fontsource.ts +++ b/src/providers/fontsource.ts @@ -24,8 +24,6 @@ export default { }, } satisfies FontProvider -/** internal */ - const fontAPI = $fetch.create({ baseURL: 'https://api.fontsource.org/v1' }) @@ -103,23 +101,23 @@ async function getFontDetails (family: string, variants: ResolveFontFacesOptions const font = fonts[id]! const weights = variants.weights.filter(weight => font.weights.includes(Number(weight))) const styles = variants.styles.filter(style => font.styles.includes(style)) + const subsets = variants.subsets ? variants.subsets.filter(subset => font.subsets.includes(subset)) : [font.defSubset] if (weights.length === 0 || styles.length === 0) return [] const fontDetail = await fontAPI(`/fonts/${font.id}`, { responseType: 'json' }) const fontFaceData: NormalizedFontFaceData[] = [] - // TODO: support subsets apart from default - const defaultSubset = fontDetail.defSubset - - for (const weight of weights) { - for (const style of styles) { - const variantUrl = fontDetail.variants[weight]![style]![defaultSubset]!.url - fontFaceData.push({ - style, - weight, - src: Object.entries(variantUrl).map(([format, url]) => ({ url, format })), - unicodeRange: fontDetail.unicodeRange[defaultSubset]?.split(',') - }) + for (const subset of subsets) { + for (const weight of weights) { + for (const style of styles) { + const variantUrl = fontDetail.variants[weight]![style]![subset]!.url + fontFaceData.push({ + style, + weight, + src: Object.entries(variantUrl).map(([format, url]) => ({url, format})), + unicodeRange: fontDetail.unicodeRange[subset]?.split(',') + }) + } } } diff --git a/test/basic.test.ts b/test/basic.test.ts index 47a525f..b517508 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -40,6 +40,16 @@ describe('providers', async () => { [ "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular Italic"),local("Roboto Mono Italic"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-weight:400;font-style:italic}", "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular"),local("Roboto Mono"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-weight:400;font-style:normal}", + "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular Italic"),local("Roboto Mono Italic"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;font-weight:400;font-style:italic}", + "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular"),local("Roboto Mono"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;font-weight:400;font-style:normal}", + "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular Italic"),local("Roboto Mono Italic"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;font-weight:400;font-style:italic}", + "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular"),local("Roboto Mono"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;font-weight:400;font-style:normal}", + "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular Italic"),local("Roboto Mono Italic"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;font-weight:400;font-style:italic}", + "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular"),local("Roboto Mono"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;font-weight:400;font-style:normal}", + "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular Italic"),local("Roboto Mono Italic"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;font-weight:400;font-style:italic}", + "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular"),local("Roboto Mono"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;font-weight:400;font-style:normal}", + "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular Italic"),local("Roboto Mono Italic"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;font-weight:400;font-style:italic}", + "@font-face{font-family:Roboto Mono;src:local("Roboto Mono Regular"),local("Roboto Mono"),url(/_fonts/file.woff2) format(woff2),url(/_fonts/file.woff) format(woff),url(/_fonts/file.ttf) format(ttf);font-display:swap;unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;font-weight:400;font-style:normal}", ] `) })