From bf2cd06e7df297661c3e367b224f2b31cd0d4ba5 Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Wed, 23 Apr 2025 19:16:07 +0200 Subject: [PATCH 1/7] feat(fonts): warn if local font is in public dir --- packages/astro/src/assets/fonts/utils.ts | 18 +++++++++++++----- .../src/assets/fonts/vite-plugin-fonts.ts | 17 ++++++++++++++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/packages/astro/src/assets/fonts/utils.ts b/packages/astro/src/assets/fonts/utils.ts index 627a60b0e66f..e33354aa30d4 100644 --- a/packages/astro/src/assets/fonts/utils.ts +++ b/packages/astro/src/assets/fonts/utils.ts @@ -1,6 +1,6 @@ import { createRequire } from 'node:module'; import { extname } from 'node:path'; -import { fileURLToPath, pathToFileURL } from 'node:url'; +import { pathToFileURL } from 'node:url'; import type * as unifont from 'unifont'; import type { Storage } from 'unstorage'; import { AstroError, AstroErrorData } from '../../core/errors/index.js'; @@ -248,8 +248,11 @@ function dedupe>(arr: T): T { function resolveVariants({ variants, - root, -}: { variants: LocalFontFamily['variants']; root: URL }): ResolvedLocalFontFamily['variants'] { + resolveEntrypoint: _resolveEntrypoint, +}: { + variants: LocalFontFamily['variants']; + resolveEntrypoint: (url: string) => string; +}): ResolvedLocalFontFamily['variants'] { return variants.map((variant) => ({ ...variant, weight: variant.weight.toString(), @@ -258,7 +261,7 @@ function resolveVariants({ const url = (isValue ? value : value.url).toString(); const tech = isValue ? undefined : value.tech; return { - url: fileURLToPath(resolveEntrypoint(root, url)), + url: _resolveEntrypoint(url), tech, }; }), @@ -275,9 +278,11 @@ export async function resolveFontFamily({ generateNameWithHash, root, resolveMod, + resolveLocalEntrypoint, }: Omit & { family: FontFamily; generateNameWithHash: (family: FontFamily) => string; + resolveLocalEntrypoint: (url: string) => string; }): Promise { const nameWithHash = generateNameWithHash(family); @@ -285,7 +290,10 @@ export async function resolveFontFamily({ return { ...family, nameWithHash, - variants: resolveVariants({ variants: family.variants, root }), + variants: resolveVariants({ + variants: family.variants, + resolveEntrypoint: resolveLocalEntrypoint, + }), fallbacks: family.fallbacks ? dedupe(family.fallbacks) : undefined, }; } diff --git a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts index a7bf8ad9a91a..4eda6b593286 100644 --- a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts +++ b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts @@ -26,6 +26,7 @@ import type { PreloadData, ResolvedFontFamily } from './types.js'; import { cache, extractFontType, + resolveEntrypoint, resolveFontFamily, sortObjectByKey, withoutQuotes, @@ -118,18 +119,32 @@ export function fontsPlugin({ settings, sync, logger }: Options): Plugin { const families: Array = []; + const root = settings.config.root; + const pathsToWarn = new Set(); + for (const family of settings.config.experimental.fonts!) { families.push( await resolveFontFamily({ family, - root: settings.config.root, + root, resolveMod, generateNameWithHash: (_family) => `${withoutQuotes(_family.name)}-${h64ToString(JSON.stringify(sortObjectByKey(_family)))}`, + resolveLocalEntrypoint: (url) => { + const resolvedPath = fileURLToPath(resolveEntrypoint(root, url)); + if (resolvedPath.startsWith(fileURLToPath(settings.config.publicDir))) { + pathsToWarn.add(resolvedPath); + } + return resolvedPath; + }, }), ); } + for (const path of [...pathsToWarn]) { + logger.warn('assets', `The font file ${JSON.stringify(path)} used by a local family is located in \`config.public\`. This will result in duplicated files in the output.`) + } + await loadFonts({ base: baseUrl, families, From a3866bc72a497f962fc75e5f7aba9d22e3e2273c Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Wed, 23 Apr 2025 20:57:07 +0200 Subject: [PATCH 2/7] fix: test --- packages/astro/test/units/assets/fonts/utils.test.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/astro/test/units/assets/fonts/utils.test.js b/packages/astro/test/units/assets/fonts/utils.test.js index 7e2eccdba3c6..1ac51e33ac36 100644 --- a/packages/astro/test/units/assets/fonts/utils.test.js +++ b/packages/astro/test/units/assets/fonts/utils.test.js @@ -11,6 +11,7 @@ import { isGenericFontFamily, proxyURL, renderFontSrc, + resolveEntrypoint, resolveFontFamily, toCSS, } from '../../../../dist/assets/fonts/utils.js'; @@ -280,6 +281,7 @@ describe('fonts utils', () => { resolveMod: async () => ({ provider: () => {} }), generateNameWithHash: (family) => `${family.name}-x`, root, + resolveLocalEntrypoint: (url) => fileURLToPath(resolveEntrypoint(root, url)), }), { name: 'Custom', @@ -313,6 +315,7 @@ describe('fonts utils', () => { resolveMod: async () => ({ provider: () => {} }), generateNameWithHash: (family) => `${family.name}-x`, root, + resolveLocalEntrypoint: (url) => fileURLToPath(resolveEntrypoint(root, url)), }), { name: 'Custom', @@ -341,6 +344,7 @@ describe('fonts utils', () => { resolveMod: (id) => import(id), generateNameWithHash: (family) => `${family.name}-x`, root, + resolveLocalEntrypoint: (url) => fileURLToPath(resolveEntrypoint(root, url)), }); assert.equal(res.name, 'Custom'); // Required to make TS happy @@ -358,6 +362,7 @@ describe('fonts utils', () => { resolveMod: (id) => import(id), generateNameWithHash: (family) => `${family.name}-x`, root, + resolveLocalEntrypoint: (url) => fileURLToPath(resolveEntrypoint(root, url)), }); assert.equal(res.name, 'Custom'); // Required to make TS happy @@ -379,6 +384,7 @@ describe('fonts utils', () => { resolveMod: async () => ({ provider: () => Object.assign(() => {}, { _name: 'test' }) }), generateNameWithHash: (family) => `${family.name}-x`, root, + resolveLocalEntrypoint: (url) => fileURLToPath(resolveEntrypoint(root, url)), }); assert.equal(res.name, 'Custom'); if (res.provider !== 'local') { From f9d90638501e7109f2751e1bc75e8c5afe7457d2 Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Wed, 23 Apr 2025 21:00:53 +0200 Subject: [PATCH 3/7] feat: improve message --- packages/astro/src/assets/fonts/vite-plugin-fonts.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts index 4eda6b593286..d56d87facd37 100644 --- a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts +++ b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts @@ -142,7 +142,10 @@ export function fontsPlugin({ settings, sync, logger }: Options): Plugin { } for (const path of [...pathsToWarn]) { - logger.warn('assets', `The font file ${JSON.stringify(path)} used by a local family is located in \`config.public\`. This will result in duplicated files in the output.`) + logger.warn( + 'assets', + `The font file ${JSON.stringify(path)} used by a local family is located in \`config.publicDir\`. This will result in duplicated files in the output.`, + ); } await loadFonts({ From ce62187e45fc8f51c99ba10bcda095867b1078f5 Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Wed, 23 Apr 2025 21:02:02 +0200 Subject: [PATCH 4/7] chore: changeset --- .changeset/social-bats-kiss.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/social-bats-kiss.md diff --git a/.changeset/social-bats-kiss.md b/.changeset/social-bats-kiss.md new file mode 100644 index 000000000000..deaa57f84660 --- /dev/null +++ b/.changeset/social-bats-kiss.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Adds warnings when using local font files in the `publicDir` when using the experimental fonts API From b187ea0f92b461fea19a7375eeade9ba94510547 Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Wed, 23 Apr 2025 21:39:40 +0200 Subject: [PATCH 5/7] Update .changeset/social-bats-kiss.md Co-authored-by: Armand Philippot --- .changeset/social-bats-kiss.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/social-bats-kiss.md b/.changeset/social-bats-kiss.md index deaa57f84660..393a002180d4 100644 --- a/.changeset/social-bats-kiss.md +++ b/.changeset/social-bats-kiss.md @@ -2,4 +2,4 @@ 'astro': patch --- -Adds warnings when using local font files in the `publicDir` when using the experimental fonts API +Adds warnings about using local font files in the `publicDir` when the experimental fonts API is enabled. From db6f348f26a3d59fa2f1481fa1e9bf974336da44 Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Thu, 24 Apr 2025 08:32:56 +0200 Subject: [PATCH 6/7] Update packages/astro/src/assets/fonts/vite-plugin-fonts.ts --- packages/astro/src/assets/fonts/vite-plugin-fonts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts index d56d87facd37..eeb41b3c89ed 100644 --- a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts +++ b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts @@ -144,7 +144,7 @@ export function fontsPlugin({ settings, sync, logger }: Options): Plugin { for (const path of [...pathsToWarn]) { logger.warn( 'assets', - `The font file ${JSON.stringify(path)} used by a local family is located in \`config.publicDir\`. This will result in duplicated files in the output.`, + `Found a local font file ${JSON.stringify(path)} in the \`public/\` folder. To avoid duplicated files in the build output, move this file into \`src/\``, ); } From c06f9bdc550ed57633dffb41bdd163918f71429e Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Thu, 24 Apr 2025 08:54:23 +0200 Subject: [PATCH 7/7] Update packages/astro/src/assets/fonts/vite-plugin-fonts.ts --- packages/astro/src/assets/fonts/vite-plugin-fonts.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts index eeb41b3c89ed..c024aa5d9439 100644 --- a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts +++ b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts @@ -142,6 +142,7 @@ export function fontsPlugin({ settings, sync, logger }: Options): Plugin { } for (const path of [...pathsToWarn]) { + // TODO: remove when stabilizing logger.warn( 'assets', `Found a local font file ${JSON.stringify(path)} in the \`public/\` folder. To avoid duplicated files in the build output, move this file into \`src/\``,