import { RuleTester } from 'eslint' import { rules } from '@next/eslint-plugin-next' const NextESLintRule = rules['next-script-for-ga'] const url = 'https://nextjs.org/docs/messages/next-script-for-ga' const ERROR_MSG_GOOGLE_ANALYTICS = `Prefer \`GoogleAnalytics\` component from \`@next/third-parties/google\` when using the inline script for Google Analytics. See: ${url}` const ERROR_MSG_GOOGLE_TAG_MANAGER = `Prefer \`GoogleTagManager\` component from \`@next/third-parties/google\` when using the inline script for Google Tag Manager. See: ${url}` const tests = { valid: [ `import Script from 'next/script' export class Blah extends Head { render() { return (

Hello title

); } }`, `import Script from 'next/script' export class Blah extends Head { render() { return (

Hello title

); } }`, `import Script from 'next/script' export class Blah extends Head { render() { return (

Hello title

); } }`, `export class Blah extends Head { render() { return (

Hello title

); } }`, errors: [ { message: ERROR_MSG_GOOGLE_ANALYTICS, type: 'JSXOpeningElement', }, ], }, { code: ` export class Blah extends Head { createGoogleAnalyticsMarkup() { return { __html: \` window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-148481588-2');\`, }; } render() { return (

Hello title

); } }`, errors: [ { message: ERROR_MSG_GOOGLE_ANALYTICS, type: 'JSXOpeningElement', }, ], }, ], } describe('next-script-for-ga', () => { new RuleTester({ languageOptions: { ecmaVersion: 2018, sourceType: 'module', parserOptions: { ecmaFeatures: { modules: true, jsx: true, }, }, }, }).run('eslint', NextESLintRule, tests) })