53 lines
1.6 KiB
JavaScript
53 lines
1.6 KiB
JavaScript
import nextTs from 'eslint-config-next/typescript';
|
||
import nextVitals from 'eslint-config-next/core-web-vitals';
|
||
import { defineConfig, globalIgnores } from 'eslint/config';
|
||
|
||
const syntaxRules = [
|
||
{
|
||
selector: 'JSXOpeningElement[name.name="head"]',
|
||
message:
|
||
'禁止使用 head 标签,优先使用 metadata。三方 CSS、字体等资源可以在 globals.css 中顶部通过 @import 引入或者使用 next/font;preload, preconnect, dns-prefetch 通过 ReactDOM 的 preload、preconnect、dns-prefetch 方法引入;json-ld 可阅读 https://nextjs.org/docs/app/guides/json-ld',
|
||
},
|
||
];
|
||
|
||
const nextConfigRestrictedSyntaxRules = [
|
||
{
|
||
selector:
|
||
'Property[key.name=/^(root|outputFileTracingRoot)$/] > Literal[value=/^\\//]',
|
||
message:
|
||
'禁止在 next.config 中写死绝对路径,请改用 path.resolve(__dirname, ...)、import.meta.dirname 或 process.cwd() 动态拼接。',
|
||
},
|
||
];
|
||
|
||
const eslintConfig = defineConfig([
|
||
...nextVitals,
|
||
...nextTs,
|
||
{
|
||
rules: {
|
||
'react-hooks/set-state-in-effect': 'off',
|
||
'no-restricted-syntax': ['error', ...syntaxRules],
|
||
},
|
||
},
|
||
{
|
||
files: ['next.config.ts'],
|
||
rules: {
|
||
'no-restricted-syntax': ['error', ...nextConfigRestrictedSyntaxRules],
|
||
},
|
||
},
|
||
// Override default ignores of eslint-config-next.
|
||
globalIgnores([
|
||
// Default ignores of eslint-config-next:
|
||
'.next/**',
|
||
'out/**',
|
||
'build/**',
|
||
'next-env.d.ts',
|
||
// Build artifacts:
|
||
'server.js',
|
||
'dist/**',
|
||
// Script files (CommonJS):
|
||
'scripts/**/*.js',
|
||
]),
|
||
]);
|
||
|
||
export default eslintConfig;
|