summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Tanishq Manuja <tanishqmanuja@gmail.com> 2025-04-17 17:38:27 +0530
committerGravatar GitHub <noreply@github.com> 2025-04-17 14:08:27 +0200
commit67b749391a9069ae1d94ef646b68a99973ef44d7 (patch)
tree86160a15a80329f78ed575bbcbc58cf7731dcb99
parent6bc6d2d9379c2825e0220f4dda66303ded2e7838 (diff)
downloadastro-67b749391a9069ae1d94ef646b68a99973ef44d7.tar.gz
astro-67b749391a9069ae1d94ef646b68a99973ef44d7.tar.zst
astro-67b749391a9069ae1d94ef646b68a99973ef44d7.zip
fix(font): type to format mapping (#13643)
Co-authored-by: Florian Lefebvre <contact@florian-lefebvre.dev>
-rw-r--r--.changeset/moody-windows-flash.md5
-rw-r--r--packages/astro/src/assets/fonts/constants.ts7
-rw-r--r--packages/astro/src/assets/fonts/providers/local.ts3
-rw-r--r--packages/astro/src/assets/fonts/utils.ts10
-rw-r--r--packages/astro/test/units/assets/fonts/providers.test.js6
-rw-r--r--packages/astro/test/units/assets/fonts/utils.test.js12
6 files changed, 34 insertions, 9 deletions
diff --git a/.changeset/moody-windows-flash.md b/.changeset/moody-windows-flash.md
new file mode 100644
index 000000000..2a09b033e
--- /dev/null
+++ b/.changeset/moody-windows-flash.md
@@ -0,0 +1,5 @@
+---
+'astro': patch
+---
+
+Fixes a case where the font face `src` format would be invalid when using the experimental fonts API
diff --git a/packages/astro/src/assets/fonts/constants.ts b/packages/astro/src/assets/fonts/constants.ts
index 9e22d1da4..c7831f2b3 100644
--- a/packages/astro/src/assets/fonts/constants.ts
+++ b/packages/astro/src/assets/fonts/constants.ts
@@ -20,6 +20,13 @@ export const URL_PREFIX = '/_astro/fonts/';
export const CACHE_DIR = './fonts/';
export const FONT_TYPES = ['woff2', 'woff', 'otf', 'ttf', 'eot'] as const;
+export const FONT_FORMAT_MAP: Record<(typeof FONT_TYPES)[number], string> = {
+ woff2: 'woff2',
+ woff: 'woff',
+ otf: 'opentype',
+ ttf: 'truetype',
+ eot: 'embedded-opentype',
+};
// Extracted from https://raw.githubusercontent.com/seek-oss/capsize/refs/heads/master/packages/metrics/src/entireMetricsCollection.json
export const SYSTEM_METRICS = {
diff --git a/packages/astro/src/assets/fonts/providers/local.ts b/packages/astro/src/assets/fonts/providers/local.ts
index 80f500e75..95aa5eb6f 100644
--- a/packages/astro/src/assets/fonts/providers/local.ts
+++ b/packages/astro/src/assets/fonts/providers/local.ts
@@ -1,6 +1,7 @@
import type * as unifont from 'unifont';
import type { ResolvedLocalFontFamily } from '../types.js';
import { extractFontType } from '../utils.js';
+import { FONT_FORMAT_MAP } from '../constants.js';
// https://fonts.nuxt.com/get-started/providers#local
// https://github.com/nuxt/fonts/blob/main/src/providers/local.ts
@@ -26,7 +27,7 @@ export function resolveLocalFont({ family, proxyURL }: Options): ResolveFontResu
return {
originalURL,
url: proxyURL(originalURL),
- format: extractFontType(originalURL),
+ format: FONT_FORMAT_MAP[extractFontType(originalURL)],
tech,
};
}),
diff --git a/packages/astro/src/assets/fonts/utils.ts b/packages/astro/src/assets/fonts/utils.ts
index 8768c41ae..cf230ffd3 100644
--- a/packages/astro/src/assets/fonts/utils.ts
+++ b/packages/astro/src/assets/fonts/utils.ts
@@ -46,11 +46,11 @@ export function renderFontSrc(sources: Exclude<unifont.FontFaceData['src'][numbe
.map((src) => {
if ('url' in src) {
let rendered = `url("${src.url}")`;
- for (const key of ['format', 'tech'] as const) {
- const value = src[key];
- if (value) {
- rendered += ` ${key}(${value})`;
- }
+ if (src.format) {
+ rendered += ` format("${src.format}")`
+ }
+ if (src.tech) {
+ rendered += ` tech(${src.tech})`
}
return rendered;
}
diff --git a/packages/astro/test/units/assets/fonts/providers.test.js b/packages/astro/test/units/assets/fonts/providers.test.js
index 18c5945eb..7ae267125 100644
--- a/packages/astro/test/units/assets/fonts/providers.test.js
+++ b/packages/astro/test/units/assets/fonts/providers.test.js
@@ -115,7 +115,7 @@ describe('fonts providers', () => {
{
originalURL: '/src/fonts/foo.ttf',
url: '/_astro/fonts/foo.ttf',
- format: 'ttf',
+ format: 'truetype',
tech: undefined,
},
],
@@ -153,7 +153,7 @@ describe('fonts providers', () => {
{
originalURL: '/src/fonts/bar.eot',
url: '/_astro/fonts/bar.eot',
- format: 'eot',
+ format: 'embedded-opentype',
tech: 'color-SVG',
},
],
@@ -166,7 +166,7 @@ describe('fonts providers', () => {
{
originalURL: '/src/fonts/bar.eot',
url: '/_astro/fonts/bar.eot',
- format: 'eot',
+ format: 'embedded-opentype',
tech: undefined,
},
],
diff --git a/packages/astro/test/units/assets/fonts/utils.test.js b/packages/astro/test/units/assets/fonts/utils.test.js
index a3a12c27c..1a4eb1a09 100644
--- a/packages/astro/test/units/assets/fonts/utils.test.js
+++ b/packages/astro/test/units/assets/fonts/utils.test.js
@@ -550,6 +550,18 @@ describe('fonts utils', () => {
false,
);
});
+ it('wraps format in quotes', () => {
+ assert.equal(
+ renderFontSrc([{ url: 'test', format: 'woff2' }]).includes('format("woff2")'),
+ true,
+ );
+ });
+ it('does not wrap tech in quotes', () => {
+ assert.equal(
+ renderFontSrc([{ url: 'test', tech: 'x' }]).includes('tech(x)'),
+ true,
+ );
+ });
});
it('toCSS', () => {