summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/red-parents-tease.md5
-rw-r--r--packages/astro/package.json1
-rw-r--r--packages/astro/src/assets/fonts/load.ts2
-rw-r--r--packages/astro/src/assets/fonts/metrics.ts30
-rw-r--r--packages/astro/src/assets/fonts/utils.ts14
-rw-r--r--packages/astro/src/assets/fonts/vite-plugin-fonts.ts13
-rw-r--r--packages/astro/test/units/assets/fonts/utils.test.js60
-rw-r--r--pnpm-lock.yaml9
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