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
);
}
}`,
],
invalid: [
{
code: `
export class Blah extends Head {
render() {
return (
Hello title
);
}
}`,
errors: [
{
message: ERROR_MSG_GOOGLE_TAG_MANAGER,
type: 'JSXOpeningElement',
},
],
},
{
code: `
export class Blah extends Head {
render() {
return (
Hello title
);
}
}`,
errors: [
{
message: ERROR_MSG_GOOGLE_ANALYTICS,
type: 'JSXOpeningElement',
},
],
},
{
code: `
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)
})