Files
next.js/test/unit/eslint-plugin-next/google-font-display.test.ts
Jiwon ChoiandGitHub e1b8c00d0f [eslint-plugin] Remove eslint-v8 testing (#84721)
ESLint plugin defaults to flat config, and we also dropped the built-in
lint check at https://github.com/vercel/next.js/pull/83136, so we can
sunset the deprecated ESLint v8 testing.
2025-10-10 22:50:42 +02:00

179 lines
4.0 KiB
TypeScript

import { RuleTester } from 'eslint'
import { rules } from '@next/eslint-plugin-next'
const NextESLintRule = rules['google-font-display']
const tests = {
valid: [
`import Head from "next/head";
export default Test = () => {
return (
<Head>
<link href={test} rel="test" />
<link
href={process.env.NEXT_PUBLIC_CANONICAL_URL}
rel="canonical"
/>
<link
href={new URL("../public/favicon.ico", import.meta.url).toString()}
rel="icon"
/>
<link
href="https://fonts.googleapis.com/css2?family=Krona+One&display=optional"
rel="stylesheet"
/>
</Head>
);
};
`,
`import Document, { Html, Head } from "next/document";
class MyDocument extends Document {
render() {
return (
<Html>
<Head>
<link
href="https://fonts.googleapis.com/css?family=Krona+One&display=swap"
rel="stylesheet"
/>
</Head>
</Html>
);
}
}
export default MyDocument;
`,
`import Document, { Html, Head } from "next/document";
class MyDocument extends Document {
render() {
return (
<Html>
<Head>
<link
href="https://fonts.googleapis.com/css?family=Krona+One&display=swap"
rel="stylesheet"
crossOrigin=""
/>
</Head>
</Html>
);
}
}
export default MyDocument;
`,
],
invalid: [
{
code: `import Head from "next/head";
export default Test = () => {
return (
<Head>
<link
href="https://fonts.googleapis.com/css2?family=Krona+One"
rel="stylesheet"
/>
</Head>
);
};
`,
errors: [
{
message:
'A font-display parameter is missing (adding `&display=optional` is recommended). See: https://nextjs.org/docs/messages/google-font-display',
type: 'JSXOpeningElement',
},
],
},
{
code: `import Head from "next/head";
export default Test = () => {
return (
<Head>
<link
href="https://fonts.googleapis.com/css2?family=Krona+One&display=block"
rel="stylesheet"
/>
</Head>
);
};
`,
errors: [
{
message:
'Block is not recommended. See: https://nextjs.org/docs/messages/google-font-display',
type: 'JSXOpeningElement',
},
],
},
{
code: `import Head from "next/head";
export default Test = () => {
return (
<Head>
<link
href="https://fonts.googleapis.com/css2?family=Krona+One&display=auto"
rel="stylesheet"
/>
</Head>
);
};
`,
errors: [
{
message:
'Auto is not recommended. See: https://nextjs.org/docs/messages/google-font-display',
type: 'JSXOpeningElement',
},
],
},
{
code: `import Head from "next/head";
export default Test = () => {
return (
<Head>
<link
href="https://fonts.googleapis.com/css2?display=fallback&family=Krona+One"
rel="stylesheet"
/>
</Head>
);
};
`,
errors: [
{
message:
'Fallback is not recommended. See: https://nextjs.org/docs/messages/google-font-display',
type: 'JSXOpeningElement',
},
],
},
],
}
describe('google-font-display', () => {
new RuleTester({
languageOptions: {
ecmaVersion: 2020,
sourceType: 'module',
parserOptions: {
ecmaFeatures: {
modules: true,
jsx: true,
},
},
},
}).run('eslint', NextESLintRule, tests)
})