From 234ff106e6f3072df51ef79260c610474680b831 Mon Sep 17 00:00:00 2001 From: Rajnish Singh <10815566+rajnish93@users.noreply.github.com> Date: Sat, 29 Nov 2025 02:32:22 +0530 Subject: [PATCH] fix(eslint-plugin-next): ensure named exports for ESM compatibility --- packages/eslint-plugin-next/src/index.ts | 85 ++++++++++++++---------- 1 file changed, 51 insertions(+), 34 deletions(-) diff --git a/packages/eslint-plugin-next/src/index.ts b/packages/eslint-plugin-next/src/index.ts index 168c00cfc5e358..ef0095d92a5285 100644 --- a/packages/eslint-plugin-next/src/index.ts +++ b/packages/eslint-plugin-next/src/index.ts @@ -53,36 +53,30 @@ const coreWebVitalsRules = { '@next/next/no-sync-scripts': 'error', } satisfies Linter.RulesRecord -const plugin = { - meta: { - name: '@next/eslint-plugin-next', - }, - rules: { - 'google-font-display': googleFontDisplay, - 'google-font-preconnect': googleFontPreconnect, - 'inline-script-id': inlineScriptId, - 'next-script-for-ga': nextScriptForGa, - 'no-assign-module-variable': noAssignModuleVariable, - 'no-async-client-component': noAsyncClientComponent, - 'no-before-interactive-script-outside-document': - noBeforeInteractiveScriptOutsideDocument, - 'no-css-tags': noCssTags, - 'no-document-import-in-page': noDocumentImportInPage, - 'no-duplicate-head': noDuplicateHead, - 'no-head-element': noHeadElement, - 'no-head-import-in-document': noHeadImportInDocument, - 'no-html-link-for-pages': noHtmlLinkForPages, - 'no-img-element': noImgElement, - 'no-page-custom-font': noPageCustomFont, - 'no-script-component-in-head': noScriptComponentInHead, - 'no-styled-jsx-in-document': noStyledJsxInDocument, - 'no-sync-scripts': noSyncScripts, - 'no-title-in-document-head': noTitleInDocumentHead, - 'no-typos': noTypos, - 'no-unwanted-polyfillio': noUnwantedPolyfillio, - } satisfies Record, - configs: {} as ESLintPluginConfigs, -} +const rules = { + 'google-font-display': googleFontDisplay, + 'google-font-preconnect': googleFontPreconnect, + 'inline-script-id': inlineScriptId, + 'next-script-for-ga': nextScriptForGa, + 'no-assign-module-variable': noAssignModuleVariable, + 'no-async-client-component': noAsyncClientComponent, + 'no-before-interactive-script-outside-document': + noBeforeInteractiveScriptOutsideDocument, + 'no-css-tags': noCssTags, + 'no-document-import-in-page': noDocumentImportInPage, + 'no-duplicate-head': noDuplicateHead, + 'no-head-element': noHeadElement, + 'no-head-import-in-document': noHeadImportInDocument, + 'no-html-link-for-pages': noHtmlLinkForPages, + 'no-img-element': noImgElement, + 'no-page-custom-font': noPageCustomFont, + 'no-script-component-in-head': noScriptComponentInHead, + 'no-styled-jsx-in-document': noStyledJsxInDocument, + 'no-sync-scripts': noSyncScripts, + 'no-title-in-document-head': noTitleInDocumentHead, + 'no-typos': noTypos, + 'no-unwanted-polyfillio': noUnwantedPolyfillio, +} satisfies Record type ESLintPluginConfigs = { 'recommended-legacy': Linter.LegacyConfig @@ -91,7 +85,16 @@ type ESLintPluginConfigs = { 'core-web-vitals': Linter.Config } -Object.assign(plugin.configs, { +// Define plugin first with empty configs to be used in configs definition +const plugin = { + meta: { + name: '@next/eslint-plugin-next', + }, + rules, + configs: {} as ESLintPluginConfigs, +} + +const configs: ESLintPluginConfigs = { 'recommended-legacy': { plugins: ['@next/next'], rules: recommendedRules, @@ -118,7 +121,21 @@ Object.assign(plugin.configs, { ...coreWebVitalsRules, }, }, -} satisfies ESLintPluginConfigs) +} + +// Assign configs to plugin +Object.assign(plugin.configs, configs) + +export = { + ...plugin, + configs, +} -export default plugin -export const { rules, configs } = plugin +// @ts-ignore +module.exports = plugin +// @ts-ignore +module.exports.meta = plugin.meta +// @ts-ignore +module.exports.rules = rules +// @ts-ignore +module.exports.configs = plugin.configs