From f5ddca14e547add98deae7a2a004b9055ac42134 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 30 Sep 2025 11:26:59 +0900 Subject: [PATCH 1/5] feat: add `excludeFallbackFormats` to google provider --- src/providers/google.ts | 11 ++++++++++- test/providers/google.test.ts | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/providers/google.ts b/src/providers/google.ts index 93481f4..b2c9884 100644 --- a/src/providers/google.ts +++ b/src/providers/google.ts @@ -23,6 +23,10 @@ interface ProviderOption { glyphs?: { [fontFamily: string]: string[] } + /** + * Experimental: exclude fallback font format for old browsers without woff2 support + */ + excludeFallbackFormats?: (fontFamily: string) => boolean } } @@ -113,7 +117,12 @@ export default defineFontProvider('google', async (_options = {} let priority = 0 const resolvedFontFaceData: FontFaceData[] = [] - for (const extension in userAgents) { + let formats = Object.keys(userAgents) + if (_options.experimental?.excludeFallbackFormats?.(family)) { + formats = formats.slice(0, 1) // keep only woff2 + } + + for (const extension of formats) { const rawCss = await $fetch('/css2', { baseURL: 'https://fonts.googleapis.com', headers: { diff --git a/test/providers/google.test.ts b/test/providers/google.test.ts index 1da83c5..e0f387c 100644 --- a/test/providers/google.test.ts +++ b/test/providers/google.test.ts @@ -215,4 +215,22 @@ body { }) expect(fonts.length).toBe(18) }) + + it('experimental.includeFallbackFormat', async () => { + const unifont = await createUnifont([ + providers.google({ + experimental: { + excludeFallbackFormats: (fontFamily: string) => fontFamily === 'Poppins', + }, + }), + ]) + { + const { fonts } = await unifont.resolveFont('Poppins', {}) + expect(fonts.filter(f => f.src.some(s => 'format' in s && s.format !== 'woff2'))).toEqual([]) + } + { + const { fonts } = await unifont.resolveFont('Geist', {}) + expect(fonts.filter(f => f.src.some(s => 'format' in s && s.format !== 'woff2'))).not.toEqual([]) + } + }) }) From da8d7e62ff438c1d47c36093b9134480b31b94f0 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 30 Sep 2025 11:40:20 +0900 Subject: [PATCH 2/5] tweak naming --- src/providers/google.ts | 6 +++--- test/providers/google.test.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/providers/google.ts b/src/providers/google.ts index b2c9884..0f24f14 100644 --- a/src/providers/google.ts +++ b/src/providers/google.ts @@ -24,9 +24,9 @@ interface ProviderOption { [fontFamily: string]: string[] } /** - * Experimental: exclude fallback font format for old browsers without woff2 support + * Experimental: include only modern font format without fallback for old browsers */ - excludeFallbackFormats?: (fontFamily: string) => boolean + modernFormatsOnly?: (fontFamily: string) => boolean } } @@ -118,7 +118,7 @@ export default defineFontProvider('google', async (_options = {} const resolvedFontFaceData: FontFaceData[] = [] let formats = Object.keys(userAgents) - if (_options.experimental?.excludeFallbackFormats?.(family)) { + if (_options.experimental?.modernFormatsOnly?.(family)) { formats = formats.slice(0, 1) // keep only woff2 } diff --git a/test/providers/google.test.ts b/test/providers/google.test.ts index e0f387c..c730cab 100644 --- a/test/providers/google.test.ts +++ b/test/providers/google.test.ts @@ -220,7 +220,7 @@ body { const unifont = await createUnifont([ providers.google({ experimental: { - excludeFallbackFormats: (fontFamily: string) => fontFamily === 'Poppins', + modernFormatsOnly: (fontFamily: string) => fontFamily === 'Poppins', }, }), ]) From b5513b598e79ae66c33c96d9fba3794b5f946e30 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 30 Sep 2025 11:54:48 +0900 Subject: [PATCH 3/5] rename --- test/providers/google.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/providers/google.test.ts b/test/providers/google.test.ts index c730cab..d61712d 100644 --- a/test/providers/google.test.ts +++ b/test/providers/google.test.ts @@ -216,7 +216,7 @@ body { expect(fonts.length).toBe(18) }) - it('experimental.includeFallbackFormat', async () => { + it('experimental.modernFormatsOnly', async () => { const unifont = await createUnifont([ providers.google({ experimental: { From 37224de362f2d967a5c61c1ff58570a8bd00b875 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 30 Sep 2025 12:00:57 +0900 Subject: [PATCH 4/5] tweak --- src/providers/google.ts | 14 +++++++++++--- test/providers/google.test.ts | 4 +++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/providers/google.ts b/src/providers/google.ts index 0f24f14..6d38f2c 100644 --- a/src/providers/google.ts +++ b/src/providers/google.ts @@ -26,7 +26,9 @@ interface ProviderOption { /** * Experimental: include only modern font format without fallback for old browsers */ - modernFormatsOnly?: (fontFamily: string) => boolean + modernFormatsOnly?: boolean | { + [fontFamily: string]: boolean + } } } @@ -118,8 +120,14 @@ export default defineFontProvider('google', async (_options = {} const resolvedFontFaceData: FontFaceData[] = [] let formats = Object.keys(userAgents) - if (_options.experimental?.modernFormatsOnly?.(family)) { - formats = formats.slice(0, 1) // keep only woff2 + const modernFormatsOnly = _options.experimental?.modernFormatsOnly + if ( + modernFormatsOnly === true + || (modernFormatsOnly + && typeof modernFormatsOnly === 'object' + && modernFormatsOnly?.[family] === true) + ) { + formats = formats.slice(0, 1) // keep only 1st user agent } for (const extension of formats) { diff --git a/test/providers/google.test.ts b/test/providers/google.test.ts index d61712d..dd303d0 100644 --- a/test/providers/google.test.ts +++ b/test/providers/google.test.ts @@ -220,7 +220,9 @@ body { const unifont = await createUnifont([ providers.google({ experimental: { - modernFormatsOnly: (fontFamily: string) => fontFamily === 'Poppins', + modernFormatsOnly: { + Poppins: true, + }, }, }), ]) From 8a674910a0308dda72c70eda71c6ca6467e6336c Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 30 Sep 2025 12:03:06 +0900 Subject: [PATCH 5/5] test: tweak --- test/providers/google.test.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/test/providers/google.test.ts b/test/providers/google.test.ts index dd303d0..ccecf73 100644 --- a/test/providers/google.test.ts +++ b/test/providers/google.test.ts @@ -228,11 +228,19 @@ body { ]) { const { fonts } = await unifont.resolveFont('Poppins', {}) - expect(fonts.filter(f => f.src.some(s => 'format' in s && s.format !== 'woff2'))).toEqual([]) + const remoteFontSources = fonts.flatMap(fnt => + fnt.src.flatMap(src => ('url' in src ? src : [])), + ) + expect(remoteFontSources).not.toEqual([]) + expect(remoteFontSources.filter(s => s.format !== 'woff2')).toEqual([]) } { const { fonts } = await unifont.resolveFont('Geist', {}) - expect(fonts.filter(f => f.src.some(s => 'format' in s && s.format !== 'woff2'))).not.toEqual([]) + const remoteFontSources = fonts.flatMap(fnt => + fnt.src.flatMap(src => ('url' in src ? src : [])), + ) + expect(remoteFontSources).not.toEqual([]) + expect(remoteFontSources.filter(s => s.format !== 'woff2')).not.toEqual([]) } }) })