From 5a4c37a11a5a5d697addf90958a24fa65f23d928 Mon Sep 17 00:00:00 2001 From: Tom Tang Date: Sun, 10 Mar 2024 03:23:32 +0800 Subject: [PATCH] fix: warn when fonts can't be resolved because of an override (#35) --- src/module.ts | 17 ++++++++++++----- src/providers/bunny.ts | 2 ++ src/providers/fontshare.ts | 2 ++ src/providers/google.ts | 3 +++ test/parse.test.ts | 10 ++++++++++ 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/module.ts b/src/module.ts index 96b95b6..166e0ef 100644 --- a/src/module.ts +++ b/src/module.ts @@ -163,7 +163,8 @@ export default defineNuxtModule({ if (override?.provider) { if (override.provider in providers) { const result = await providers[override.provider]!.resolveFontFaces!(fontFamily, defaults) - if (!result) { + const fonts = normalizeFontData(result?.fonts || []) + if (!fonts.length || !result) { return logger.warn(`Could not produce font face declaration from \`${override.provider}\` for font family \`${fontFamily}\`.`) } return { @@ -182,10 +183,16 @@ export default defineNuxtModule({ if (provider.resolveFontFaces) { const result = await provider.resolveFontFaces(fontFamily, defaults) if (result) { - return { - fallbacks: result.fallbacks || defaults.fallbacks, - // Rewrite font source URLs to be proxied/local URLs - fonts: normalizeFontData(result.fonts), + // Rewrite font source URLs to be proxied/local URLs + const fonts = normalizeFontData(result.fonts) + if (fonts.length > 0) { + return { + fallbacks: result.fallbacks || defaults.fallbacks, + fonts, + } + } + if (override) { + logger.warn(`Could not produce font face declaration for \`${fontFamily}\` with override.`) } } } diff --git a/src/providers/bunny.ts b/src/providers/bunny.ts index 39b941e..bdaf9f7 100644 --- a/src/providers/bunny.ts +++ b/src/providers/bunny.ts @@ -71,6 +71,8 @@ async function getFontDetails (family: string, variants: ResolveFontFacesOptions normal: '' } const styles = new Set(variants.styles.map(i => styleMap[i])) + if (weights.length === 0 || styles.size === 0) return [] + const resolvedVariants = weights.flatMap(w => [...styles].map(s => `${w}${s}`)) const css = await fontAPI('/css', { diff --git a/src/providers/fontshare.ts b/src/providers/fontshare.ts index 395f986..ccc3681 100644 --- a/src/providers/fontshare.ts +++ b/src/providers/fontshare.ts @@ -103,6 +103,8 @@ async function getFontDetails (family: string, variants: ResolveFontFacesOptions numbers.push(style.weight.number) } + if (numbers.length === 0) return [] + const css = await fontAPI(`/css?f[]=${font.slug + '@' + numbers.join(',')}`) // TODO: support subsets and axes diff --git a/src/providers/google.ts b/src/providers/google.ts index c1c8268..d0abc73 100644 --- a/src/providers/google.ts +++ b/src/providers/google.ts @@ -76,6 +76,9 @@ async function getFontDetails (family: string, variants: ResolveFontFacesOptions const weights = variableWeight ? [`${variableWeight.min}..${variableWeight.max}`] : variants.weights.filter(weight => String(weight) in font.fonts) + + if (weights.length === 0 || styles.length === 0) return [] + const resolvedVariants = weights.flatMap(w => [...styles].map(s => `${s},${w}`)).sort() let css = '' diff --git a/test/parse.test.ts b/test/parse.test.ts index 0e31681..d300621 100644 --- a/test/parse.test.ts +++ b/test/parse.test.ts @@ -107,6 +107,16 @@ describe('parsing', () => { }) }) +describe('error handling', () => { + it('handles no font details supplied', async () => { + const plugin = FontFamilyInjectionPlugin({ + dev: true, + resolveFontFace: () => ({ fonts: [] }) + }).raw({}, { framework: 'vite' }) as any + expect(await plugin.transform(`:root { font-family: 'Poppins', 'Arial', sans-serif }`).then((r: any) => r?.code)).toMatchInlineSnapshot(`undefined`) + }) +}) + const slugify = (str: string) => str.toLowerCase().replace(/[^\d\w]/g, '-') async function transform (css: string) { const plugin = FontFamilyInjectionPlugin({