diff --git a/packages/font/src/google/loader.test.ts b/packages/font/src/google/loader.test.ts index f636443c71898..9884eb7a2eae1 100644 --- a/packages/font/src/google/loader.test.ts +++ b/packages/font/src/google/loader.test.ts @@ -124,6 +124,7 @@ describe('next/font/google loader', () => { mockFetchResource.mockResolvedValue(Buffer.from('OK')) const { css } = await nextFontGoogleFontLoader({ functionName, + deploymentId: undefined, data: [ { adjustFontFallback: false, diff --git a/packages/font/src/local/loader.test.ts b/packages/font/src/local/loader.test.ts index 85168f4083910..7145062ab7b05 100644 --- a/packages/font/src/local/loader.test.ts +++ b/packages/font/src/local/loader.test.ts @@ -5,6 +5,7 @@ describe('next/font/local loader', () => { test('Default CSS', async () => { const { css } = await nextFontLocalFontLoader({ functionName: '', + deploymentId: undefined, data: [{ src: './my-font.woff2' }], emitFontFile: () => '/_next/static/media/my-font.woff2', resolve: jest.fn(), @@ -28,9 +29,37 @@ describe('next/font/local loader', () => { `) }) + test('with dpl query string', async () => { + const { css } = await nextFontLocalFontLoader({ + functionName: '', + deploymentId: 'dpl_123', + data: [{ src: './my-font.woff2' }], + emitFontFile: () => '/_next/static/media/my-font.woff2', + resolve: jest.fn(), + isDev: false, + isServer: true, + variableName: 'myFont', + loaderContext: { + fs: { + readFile: (_: string, cb: any) => cb(null, 'fontdata'), + }, + } as any, + }) + + expect(css).toMatchInlineSnapshot(` + "@font-face { + font-family: myFont; + src: url(/_next/static/media/my-font.woff2?dpl=dpl_123) format('woff2'); + font-display: swap; + } + " + `) + }) + test('Weight and style', async () => { const { css } = await nextFontLocalFontLoader({ functionName: '', + deploymentId: undefined, data: [{ src: './my-font.woff2', weight: '100 900', style: 'italic' }], emitFontFile: () => '/_next/static/media/my-font.woff2', resolve: jest.fn(), @@ -59,6 +88,7 @@ describe('next/font/local loader', () => { test('Other properties', async () => { const { css } = await nextFontLocalFontLoader({ functionName: '', + deploymentId: undefined, data: [ { src: './my-font.woff2', @@ -95,6 +125,7 @@ describe('next/font/local loader', () => { test('Multiple weights default style', async () => { const { css } = await nextFontLocalFontLoader({ functionName: '', + deploymentId: undefined, data: [ { style: 'italic', @@ -171,6 +202,7 @@ describe('next/font/local loader', () => { test('Multiple styles default weight', async () => { const { css } = await nextFontLocalFontLoader({ functionName: '', + deploymentId: undefined, data: [ { weight: '400', @@ -233,6 +265,7 @@ describe('next/font/local loader', () => { test('Custom font-family in declarations', async () => { const { css } = await nextFontLocalFontLoader({ functionName: '', + deploymentId: undefined, data: [ { src: './my-font.woff2', diff --git a/packages/font/src/local/loader.ts b/packages/font/src/local/loader.ts index c5db34d7d5839..49fb93c323828 100644 --- a/packages/font/src/local/loader.ts +++ b/packages/font/src/local/loader.ts @@ -19,6 +19,7 @@ const nextFontLocalFontLoader: FontLoader = async ({ data, emitFontFile, resolve, + deploymentId, loaderContext, }) => { const { @@ -45,6 +46,10 @@ const nextFontLocalFontLoader: FontLoader = async ({ preload, typeof adjustFontFallback === 'undefined' || !!adjustFontFallback ) + // Should match behavior in get-asset-query-string.ts + const qs = deploymentId + ? `${fontUrl.includes('?') ? '&' : '?'}dpl=${deploymentId}` + : '' // Try to load font metadata from the font file using fontkit. // The data is used to calculate the fallback font override values. @@ -66,7 +71,7 @@ const nextFontLocalFontLoader: FontLoader = async ({ ? declarations.map(({ prop, value }) => [prop, value]) : []), ...(hasCustomFontFamily ? [] : [['font-family', variableName]]), - ['src', `url(${fontUrl}) format('${format}')`], + ['src', `url(${fontUrl + qs}) format('${format}')`], ['font-display', display], ...(weight ?? defaultWeight ? [['font-weight', weight ?? defaultWeight]] diff --git a/packages/next/font/index.d.ts b/packages/next/font/index.d.ts index fe10e31d59b92..0d97d953a96a5 100644 --- a/packages/next/font/index.d.ts +++ b/packages/next/font/index.d.ts @@ -19,6 +19,7 @@ export type FontLoader = (options: { resolve: (src: string) => string isDev: boolean isServer: boolean + deploymentId: string | undefined loaderContext: any }) => Promise<{ css: string diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index d4a58bcbafff7..12597dcaa57cb 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -2454,6 +2454,7 @@ export default async function getBaseWebpackConfig( isEdgeRuntime: isEdgeServer, targetWeb: isClient || isEdgeServer, assetPrefix: config.assetPrefix || '', + deploymentId: config.deploymentId, sassOptions: config.sassOptions, productionBrowserSourceMaps: config.productionBrowserSourceMaps, future: config.future, diff --git a/packages/next/src/build/webpack/config/blocks/css/loaders/next-font.ts b/packages/next/src/build/webpack/config/blocks/css/loaders/next-font.ts index 10ec131f9e0af..55909b3d5e3a3 100644 --- a/packages/next/src/build/webpack/config/blocks/css/loaders/next-font.ts +++ b/packages/next/src/build/webpack/config/blocks/css/loaders/next-font.ts @@ -62,6 +62,7 @@ export function getNextFontLoader( isDev: ctx.isDevelopment, isServer: ctx.isServer, assetPrefix: ctx.assetPrefix, + deploymentId: ctx.deploymentId, fontLoaderPath, postcss, }, diff --git a/packages/next/src/build/webpack/config/index.ts b/packages/next/src/build/webpack/config/index.ts index 4daa1b35696a2..ccd7d4203374d 100644 --- a/packages/next/src/build/webpack/config/index.ts +++ b/packages/next/src/build/webpack/config/index.ts @@ -19,6 +19,7 @@ export async function buildConfiguration( isEdgeRuntime, targetWeb, assetPrefix, + deploymentId, sassOptions, productionBrowserSourceMaps, future, @@ -36,6 +37,7 @@ export async function buildConfiguration( isEdgeRuntime: boolean targetWeb: boolean assetPrefix: string + deploymentId: string | undefined sassOptions: any productionBrowserSourceMaps: boolean transpilePackages: NextConfigComplete['transpilePackages'] @@ -61,6 +63,7 @@ export async function buildConfiguration( ? assetPrefix.slice(0, -1) : assetPrefix : '', + deploymentId, sassOptions, productionBrowserSourceMaps, transpilePackages, diff --git a/packages/next/src/build/webpack/config/utils.ts b/packages/next/src/build/webpack/config/utils.ts index 004e0acac5b6d..c3862a11099ff 100644 --- a/packages/next/src/build/webpack/config/utils.ts +++ b/packages/next/src/build/webpack/config/utils.ts @@ -19,6 +19,7 @@ export type ConfigurationContext = { targetWeb: boolean assetPrefix: string + deploymentId: string | undefined sassOptions: any productionBrowserSourceMaps: boolean diff --git a/packages/next/src/build/webpack/loaders/next-font-loader/index.ts b/packages/next/src/build/webpack/loaders/next-font-loader/index.ts index b50745f79d539..9740c07e90d5b 100644 --- a/packages/next/src/build/webpack/loaders/next-font-loader/index.ts +++ b/packages/next/src/build/webpack/loaders/next-font-loader/index.ts @@ -45,6 +45,7 @@ export default async function nextFontLoader(this: any) { assetPrefix, fontLoaderPath, postcss: getPostcss, + deploymentId, } = this.getOptions() if (assetPrefix && !/^\/|https?:\/\//.test(assetPrefix)) { @@ -66,7 +67,7 @@ export default async function nextFontLoader(this: any) { * NextFontManifestPlugin uses this to see if fallback fonts are being used. * This is used to collect stats on fallback fonts usage by the Google Aurora team. */ - const emitFontFile = ( + const emitFontFile: Parameters[0]['emitFontFile'] = ( content: Buffer, ext: string, preload: boolean, @@ -109,6 +110,7 @@ export default async function nextFontLoader(this: any) { ), isDev, isServer, + deploymentId, loaderContext: this, }) )