diff options
-rw-r--r-- | .changeset/red-parents-tease.md | 5 | ||||
-rw-r--r-- | packages/astro/package.json | 1 | ||||
-rw-r--r-- | packages/astro/src/assets/fonts/load.ts | 2 | ||||
-rw-r--r-- | packages/astro/src/assets/fonts/metrics.ts | 30 | ||||
-rw-r--r-- | packages/astro/src/assets/fonts/utils.ts | 14 | ||||
-rw-r--r-- | packages/astro/src/assets/fonts/vite-plugin-fonts.ts | 13 | ||||
-rw-r--r-- | packages/astro/test/units/assets/fonts/utils.test.js | 60 | ||||
-rw-r--r-- | pnpm-lock.yaml | 9 |
8 files changed, 18 insertions, 116 deletions
diff --git a/.changeset/red-parents-tease.md b/.changeset/red-parents-tease.md new file mode 100644 index 000000000..2390650ad --- /dev/null +++ b/.changeset/red-parents-tease.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Updates fallback font generation to always read font files returned by font providers diff --git a/packages/astro/package.json b/packages/astro/package.json index 7586e3699..ce1b273d5 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -123,7 +123,6 @@ "@astrojs/internal-helpers": "workspace:*", "@astrojs/markdown-remark": "workspace:*", "@astrojs/telemetry": "workspace:*", - "@capsizecss/metrics": "^3.5.0", "@capsizecss/unpack": "^2.4.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.4", diff --git a/packages/astro/src/assets/fonts/load.ts b/packages/astro/src/assets/fonts/load.ts index ce228ec6d..6855c9c0b 100644 --- a/packages/astro/src/assets/fonts/load.ts +++ b/packages/astro/src/assets/fonts/load.ts @@ -48,7 +48,7 @@ export async function loadFonts({ for (const family of families) { const preloadData: PreloadData = []; let css = ''; - let fallbackFontData: GetMetricsForFamilyFont = null; + let fallbackFontData: GetMetricsForFamilyFont | null = null; // When going through the urls/filepaths returned by providers, // We save the hash and the associated original value so we can use diff --git a/packages/astro/src/assets/fonts/metrics.ts b/packages/astro/src/assets/fonts/metrics.ts index d7b8b5229..f0d9b45df 100644 --- a/packages/astro/src/assets/fonts/metrics.ts +++ b/packages/astro/src/assets/fonts/metrics.ts @@ -1,11 +1,5 @@ -// Adapted from https://github.com/unjs/fontaine/ -import { fontFamilyToCamelCase } from '@capsizecss/metrics'; import { type Font, fromBuffer } from '@capsizecss/unpack'; -const QUOTES_RE = /^["']|["']$/g; - -const withoutQuotes = (str: string) => str.trim().replace(QUOTES_RE, ''); - export type FontFaceMetrics = Pick< Font, 'ascent' | 'descent' | 'lineGap' | 'unitsPerEm' | 'xWidthAvg' @@ -29,30 +23,6 @@ function filterRequiredMetrics({ }; } -export async function getMetricsForFamily(family: string) { - family = withoutQuotes(family); - - if (family in metricCache) return metricCache[family]; - - try { - const name = fontFamilyToCamelCase(family); - const { entireMetricsCollection } = await import('@capsizecss/metrics/entireMetricsCollection'); - const metrics = entireMetricsCollection[name as keyof typeof entireMetricsCollection]; - - if (!('descent' in metrics)) { - metricCache[family] = null; - return null; - } - - const filteredMetrics = filterRequiredMetrics(metrics); - metricCache[family] = filteredMetrics; - return filteredMetrics; - } catch { - metricCache[family] = null; - return null; - } -} - export async function readMetrics(family: string, buffer: Buffer) { const metrics = await fromBuffer(buffer); diff --git a/packages/astro/src/assets/fonts/utils.ts b/packages/astro/src/assets/fonts/utils.ts index 1803ecc8b..2d8c8ef22 100644 --- a/packages/astro/src/assets/fonts/utils.ts +++ b/packages/astro/src/assets/fonts/utils.ts @@ -78,14 +78,14 @@ export async function cache( storage: Storage, key: string, cb: () => Promise<Buffer>, -): Promise<{ cached: boolean; data: Buffer }> { +): Promise<Buffer> { const existing = await storage.getItemRaw(key); if (existing) { - return { cached: true, data: existing }; + return existing; } const data = await cb(); await storage.setItemRaw(key, data); - return { cached: false, data }; + return data; } export interface ProxyURLOptions { @@ -133,13 +133,13 @@ export function isGenericFontFamily(str: string): str is keyof typeof DEFAULT_FA export type GetMetricsForFamilyFont = { hash: string; url: string; -} | null; +}; export type GetMetricsForFamily = ( name: string, /** A remote url or local filepath to a font file. Used if metrics can't be resolved purely from the family name */ font: GetMetricsForFamilyFont, -) => Promise<FontFaceMetrics | null>; +) => Promise<FontFaceMetrics>; /** * Generates CSS for a given family fallbacks if possible. @@ -157,7 +157,7 @@ export async function generateFallbacksCSS({ family: Pick<ResolvedFontFamily, 'name' | 'nameWithHash'>; /** The family fallbacks */ fallbacks: Array<string>; - font: GetMetricsForFamilyFont; + font: GetMetricsForFamilyFont | null; metrics: { getMetricsForFamily: GetMetricsForFamily; generateFontFace: typeof generateFallbackFontFace; @@ -171,7 +171,7 @@ export async function generateFallbacksCSS({ let css = ''; - if (!metrics) { + if (!fontData || !metrics) { return { css, fallbacks }; } diff --git a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts index 7258255b1..2da11f2ad 100644 --- a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts +++ b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts @@ -20,7 +20,7 @@ import { VIRTUAL_MODULE_ID, } from './constants.js'; import { loadFonts } from './load.js'; -import { generateFallbackFontFace, getMetricsForFamily, readMetrics } from './metrics.js'; +import { generateFallbackFontFace, readMetrics } from './metrics.js'; import type { ResolveMod } from './providers/utils.js'; import type { PreloadData, ResolvedFontFamily } from './types.js'; import { cache, extractFontType, resolveFontFamily, sortObjectByKey } from './utils.js'; @@ -130,12 +130,7 @@ export function fontsPlugin({ settings, sync, logger }: Options): Plugin { hashString: h64ToString, generateFallbackFontFace, getMetricsForFamily: async (name, font) => { - let metrics = await getMetricsForFamily(name); - if (font && !metrics) { - const { data } = await cache(storage!, font.hash, () => fetchFont(font.url)); - metrics = await readMetrics(name, data); - } - return metrics; + return await readMetrics(name, await cache(storage!, font.hash, () => fetchFont(font.url))); }, log: (message) => logger.info('assets', message), }); @@ -200,7 +195,7 @@ export function fontsPlugin({ settings, sync, logger }: Options): Plugin { // Storage should be defined at this point since initialize it called before registering // the middleware. hashToUrlMap is defined at the same time so if it's not set by now, // no url will be matched and this line will not be reached. - const { data } = await cache(storage!, hash, () => fetchFont(url)); + const data = await cache(storage!, hash, () => fetchFont(url)); res.setHeader('Content-Length', data.length); res.setHeader('Content-Type', `font/${extractFontType(hash)}`); @@ -249,7 +244,7 @@ export function fontsPlugin({ settings, sync, logger }: Options): Plugin { logger.info('assets', 'Copying fonts...'); await Promise.all( Array.from(hashToUrlMap.entries()).map(async ([hash, url]) => { - const { data } = await cache(storage!, hash, () => fetchFont(url)); + const data = await cache(storage!, hash, () => fetchFont(url)); try { writeFileSync(new URL(hash, fontsDir), data); } catch (cause) { diff --git a/packages/astro/test/units/assets/fonts/utils.test.js b/packages/astro/test/units/assets/fonts/utils.test.js index 3e4d39e3d..68dc95e29 100644 --- a/packages/astro/test/units/assets/fonts/utils.test.js +++ b/packages/astro/test/units/assets/fonts/utils.test.js @@ -7,53 +7,12 @@ import { extractFontType, familiesToUnifontProviders, generateFallbacksCSS, - cache as internalCache, isFontType, isGenericFontFamily, proxyURL, resolveFontFamily, } from '../../../../dist/assets/fonts/utils.js'; -function createSpyCache() { - /** @type {Map<string, Buffer>} */ - const store = new Map(); - - const storage = { - /** - * @param {string} key - * @returns {Promise<Buffer | null>} - */ - getItemRaw: async (key) => { - return store.get(key) ?? null; - }, - /** - * @param {string} key - * @param {Buffer} value - * @returns {Promise<void>} - */ - setItemRaw: async (key, value) => { - store.set(key, value); - }, - }; - - return { - /** - * - * @param {Parameters<typeof internalCache>[1]} key - * @param {Parameters<typeof internalCache>[2]} cb - * @returns - */ - cache: (key, cb) => - internalCache( - // @ts-expect-error we only mock the required hooks - storage, - key, - cb, - ), - getKeys: () => Array.from(store.keys()), - }; -} - /** * * @param {string} id @@ -120,25 +79,6 @@ describe('fonts utils', () => { } }); - it('cache()', async () => { - const { cache, getKeys } = createSpyCache(); - - assert.deepStrictEqual(getKeys(), []); - - let buffer = Buffer.from('foo'); - let res = await cache('foo', async () => buffer); - assert.equal(res.cached, false); - assert.equal(res.data, buffer); - - assert.deepStrictEqual(getKeys(), ['foo']); - - res = await cache('foo', async () => buffer); - assert.equal(res.cached, true); - assert.equal(res.data, buffer); - - assert.deepStrictEqual(getKeys(), ['foo']); - }); - it('proxyURL()', () => { let { url, collected } = proxyURLSpy( 'foo', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ea93a9fb..57d2bc636 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -477,9 +477,6 @@ importers: '@astrojs/telemetry': specifier: workspace:* version: link:../telemetry - '@capsizecss/metrics': - specifier: ^3.5.0 - version: 3.5.0 '@capsizecss/unpack': specifier: ^2.4.0 version: 2.4.0 @@ -6586,9 +6583,6 @@ packages: resolution: {integrity: sha512-v9f+ueUOKkZCDKiCm0yxKtYgYNLD9zlKarNux0NSXOvNm94QEYL3RlMpGKgD2hq44pbF2qWqEmHnCvmk56kPJw==} engines: {node: '>=18'} - '@capsizecss/metrics@3.5.0': - resolution: {integrity: sha512-Ju2I/Qn3c1OaU8FgeW4Tc22D4C9NwyVfKzNmzst59bvxBjPoLYNZMqFYn+HvCtn4MpXwiaDtCE8fNuQLpdi9yA==} - '@capsizecss/unpack@2.4.0': resolution: {integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==} @@ -10007,6 +10001,7 @@ packages: libsql@0.5.4: resolution: {integrity: sha512-GEFeWca4SDAQFxjHWJBE6GK52LEtSskiujbG3rqmmeTO9t4sfSBKIURNLLpKDDF7fb7jmTuuRkDAn9BZGITQNw==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lightningcss-darwin-arm64@1.29.2: @@ -12819,8 +12814,6 @@ snapshots: dependencies: tar: 6.2.1 - '@capsizecss/metrics@3.5.0': {} - '@capsizecss/unpack@2.4.0': dependencies: blob-to-buffer: 1.2.9 |