Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(eslint-plugin): add minimal built-in flat presets #73873

Merged
merged 5 commits into from
Mar 18, 2025

Conversation

SukkaW
Copy link
Contributor

@SukkaW SukkaW commented Dec 13, 2024

Add minimal flat config presets for those who are building their own eslint flat presets and want to use their own parsers and settings.

The usage would be like:

// eslint.config.js
import eslintPluginNext from 'eslint-plugin-next';

export default [
  {
    files: [],
    plugins: {},
    settings: {},
    languageOptions: {},
    rules: {}
  },

  eslintPluginNext.flatConfigs.recommended,
  // or
  eslintPluginNext.flatConfigs.coreWebVitals,
]

@ijjk ijjk added CI approved Approve running CI for fork type: next labels Dec 13, 2024
@ijjk
Copy link
Member

ijjk commented Dec 13, 2024

Tests Passed

@ijjk
Copy link
Member

ijjk commented Dec 13, 2024

Stats from current PR

Default Build
General
vercel/next.js canary SukkaW/next.js eslint-plugin-presets Change
buildDuration 19s 16s N/A
buildDurationCached 15s 12.9s N/A
nodeModulesSize 416 MB 416 MB N/A
nextStartRea..uration (ms) 480ms 472ms N/A
Client Bundles (main, webpack)
vercel/next.js canary SukkaW/next.js eslint-plugin-presets Change
1187-HASH.js gzip 52.4 kB 52.4 kB N/A
8276.HASH.js gzip 169 B 168 B N/A
8377-HASH.js gzip 5.36 kB 5.36 kB N/A
bccd1874-HASH.js gzip 52.8 kB 52.8 kB N/A
framework-HASH.js gzip 57.5 kB 57.5 kB N/A
main-app-HASH.js gzip 232 B 235 B N/A
main-HASH.js gzip 34.1 kB 34.1 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 0 B 0 B
Legacy Client Bundles (polyfills)
vercel/next.js canary SukkaW/next.js eslint-plugin-presets Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary SukkaW/next.js eslint-plugin-presets Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 512 B 510 B N/A
css-HASH.js gzip 343 B 342 B N/A
dynamic-HASH.js gzip 1.84 kB 1.84 kB
edge-ssr-HASH.js gzip 265 B 265 B
head-HASH.js gzip 363 B 362 B N/A
hooks-HASH.js gzip 393 B 392 B N/A
image-HASH.js gzip 4.49 kB 4.49 kB N/A
index-HASH.js gzip 268 B 268 B
link-HASH.js gzip 2.35 kB 2.34 kB N/A
routerDirect..HASH.js gzip 328 B 328 B
script-HASH.js gzip 397 B 397 B
withRouter-HASH.js gzip 323 B 326 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.59 kB 3.59 kB
Client Build Manifests
vercel/next.js canary SukkaW/next.js eslint-plugin-presets Change
_buildManifest.js gzip 749 B 746 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary SukkaW/next.js eslint-plugin-presets Change
index.html gzip 523 B 524 B N/A
link.html gzip 538 B 538 B
withRouter.html gzip 519 B 521 B N/A
Overall change 538 B 538 B
Edge SSR bundle Size
vercel/next.js canary SukkaW/next.js eslint-plugin-presets Change
edge-ssr.js gzip 128 kB 128 kB N/A
page.js gzip 206 kB 206 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary SukkaW/next.js eslint-plugin-presets Change
middleware-b..fest.js gzip 669 B 666 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 31.2 kB 31.2 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 844 B 844 B
Next Runtimes
vercel/next.js canary SukkaW/next.js eslint-plugin-presets Change
274-experime...dev.js gzip 322 B 322 B
274.runtime.dev.js gzip 314 B 314 B
app-page-exp...dev.js gzip 359 kB 359 kB
app-page-exp..prod.js gzip 129 kB 129 kB
app-page-tur..prod.js gzip 142 kB 142 kB
app-page-tur..prod.js gzip 137 kB 137 kB
app-page.run...dev.js gzip 347 kB 347 kB
app-page.run..prod.js gzip 125 kB 125 kB
app-route-ex...dev.js gzip 37.5 kB 37.5 kB
app-route-ex..prod.js gzip 25.5 kB 25.5 kB
app-route-tu..prod.js gzip 25.5 kB 25.5 kB
app-route-tu..prod.js gzip 25.4 kB 25.4 kB
app-route.ru...dev.js gzip 39.2 kB 39.2 kB
app-route.ru..prod.js gzip 25.4 kB 25.4 kB
pages-api-tu..prod.js gzip 9.69 kB 9.69 kB
pages-api.ru...dev.js gzip 11.6 kB 11.6 kB
pages-api.ru..prod.js gzip 9.68 kB 9.68 kB
pages-turbo...prod.js gzip 21.7 kB 21.7 kB
pages.runtim...dev.js gzip 27.5 kB 27.5 kB
pages.runtim..prod.js gzip 21.7 kB 21.7 kB
server.runti..prod.js gzip 916 kB 916 kB
Overall change 2.44 MB 2.44 MB
build cache
vercel/next.js canary SukkaW/next.js eslint-plugin-presets Change
0.pack gzip 2.09 MB 2.08 MB N/A
index.pack gzip 74.7 kB 74.2 kB N/A
Overall change 0 B 0 B
Diff details
Diff for main-HASH.js

Diff too large to display

Commit: 2c5cd72

@SukkaW SukkaW marked this pull request as draft December 13, 2024 02:09
@SukkaW SukkaW marked this pull request as ready for review December 13, 2024 02:26
@darthmaim
Copy link
Contributor

Take a look at these two comments and the surrounding discussion and also at the ESLint docs:

TLDR: ESLint prefers not to use a flatConfigs export, but instead export all configs from .configs, and suffix old eslintrc-style configs with -legacy.

@SukkaW
Copy link
Contributor Author

SukkaW commented Dec 13, 2024

TLDR: ESLint prefers not to use a flatConfigs export, but instead export all configs from .configs, and suffix old eslintrc-style configs with -legacy.

Adding a -legacy suffix means there will be a breaking change, which means we need to wait for another major version release. Are you willing to wait for another year?

In the meantime, attaching an extra type-safe flat preset under the configs is impossible without triggering a TypeScript error. Self-reference also doesn't work, you will get a "used-before-declare" error.

While plugin.flatConfigs is not recommended, you can import anything into the eslint.config.js, so why bother?

@darthmaim
Copy link
Contributor

Yeah I agree, just wanted to make sure that this is considered and that there is already a plan in place to match the recommendation in the next major next.js release.

Ideally the flat config would have been part of 15.0 along with eslint 9 support, sadly eslint 9 support landed with such short notice before 15.0 that no one catched this in canary :(

module.exports = plugin
module.exports.flatConfig = {
recommended: {
name: 'eslint-plugin-next recommended',
Copy link

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in 8a7d85c (#73873).

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rakleed kindly ask to review and merge the changes, thanks

@theoludwig
Copy link
Contributor

Related issue: #73655

@SukkaW SukkaW requested review from CHC383 and rakleed February 23, 2025 14:28
'@next/next': plugin,
},
rules: {
...recommendedRules,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally I think coreWebVitals should just include the coreWebVitalsRules instead of including the recommededRules, which is the same as the legacy configs, and users who want both presets could add them separately. However, I don't against the new rules set either, maybe it is up to the Next js members to decide.

@CHC383
Copy link

CHC383 commented Feb 25, 2025

Hi @devjiwonchoi, I saw you were involved in #73655, could you review this PR? This doesn't fix #73655 but it is at least one step towards flat configs

@juliolmuller
Copy link

I think this resolves #73655, #74133 and #75298.

@devjiwonchoi
Copy link
Member

Sorry for the delay, and thank you for the PR!

@devjiwonchoi devjiwonchoi merged commit 61e7fdb into vercel:canary Mar 18, 2025
103 checks passed
@Austin1serb
Copy link

I think this resolves #73655, #74133 and #75298.

👋 Just confirming that #75298 is still reproducible with [email protected] and flat config using [email protected]. Here’s the output from running pnpm next lint:

Invalid Options:
- Unknown options: useEslintrc, extensions, resolvePluginsRelativeTo, rulePaths, ignorePath, reportUnusedDisableDirectives
- 'extensions' has been removed.
- 'resolvePluginsRelativeTo' has been removed.
- 'ignorePath' has been removed.
- 'rulePaths' has been removed. Please define your rules using plugins.
- 'reportUnusedDisableDirectives' has been removed. Please use the 'overrideConfig.linterOptions.reportUnusedDisableDirectives' option instead.
dependencies:
next 15.3.0-canary.18
eslint 8.57.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CI approved Approve running CI for fork type: next
Projects
None yet
Development

Successfully merging this pull request may close these issues.

10 participants