@creo-team/slint-config (英语)
用于TypeScript/React的ESLint平面配置:严格的类型检查,Prettier,JSDoc,复杂性限制,合成正确,没有魔法数字. 一种风格和一套规则,所以代码保持一致和可审查性——因此Cursor和Claude等工具可以修复并生成匹配的代码. 与 ESLint MCP 服务器。 。 。 .
安装
npm install @creo-team/eslint-config --save-dev
节点 : ^22.22.2 || >=24.15.0. 偏好节点24. 类型脚本 7 与此配置一起工作;参见 类型脚本。 。 。 .
使用模式
1. 单还本付息(违约)
一个应用或软件包,一个 tsconfig。使用预设的状态.
无害环境管理 (单位:千美元)eslint.config.mjs:
import eslintConfig from '@creo-team/eslint-config'
export default eslintConfig
常见JS (单位:千美元)eslint.config.js:
const eslintConfig = require('@creo-team/eslint-config')
module.exports = eslintConfig
2. 有选择的单一回购
自定义忽略或使用哪个 tsconfig :
const { createConfig } = require('@creo-team/eslint-config')
module.exports = createConfig({
ignores: ['dist/**', 'build/**'],
tsconfig: 'tsconfig.app.json', // optional; default: getTsConfigFile()
})
在无害环境管理中(eslint.config.mjs),使用时 import { createConfig } from '@creo-team/eslint-config'。 。 。 .
3. Monorepo——一个根配置(建议)
多个包(例如. app/, (中文(简体) ), lib/, (中文(简体) ), infra/),每个都有自己的 tsconfig.json启用 项目服务 因此,类型意识规则会解决每个文件最近的 tsconfig 。 一个 eslint.config.js 返回根; 运行 eslint . 从根起.
const { createConfig } = require('@creo-team/eslint-config')
module.exports = createConfig({
ignores: [
'**/node_modules/**',
'**/dist/**',
'**/.next/**',
'**/build/**',
'**/out/**',
'**/cdk.out/**',
'**/*.config.js',
'**/*.config.mjs',
'**/*.config.ts',
],
projectService: true,
})
根号 package.json (npm工作空间):
{
"workspaces": ["nextjs", "aws/infra", "shared"],
"scripts": {
"lint": "eslint .",
"fix": "eslint . --fix"
},
"devDependencies": {
"@creo-team/eslint-config": "^5.0.0",
"eslint": "^10.11.0"
}
}
所需经费: 每个带有类型脚本的软件包都有一个 tsconfig.json 在目录中。 不需要根 tsconfig 。 见 text-slint 项目服务。 。 。 .
示例 见 examples/monorepo/ 这回贷。 运行 cd examples/monorepo && npm install && npm run lint 以验证.
4. Monorepo——每个工作空间配置
林特跑出来了 每个工作区 (单位:千美元)npm run lint -w nextjs) (中文(简体) ). 每个工作区都有自己的 eslint.config.js 及其国家 tsconfig预设(无) projectService); 配置以工作空间 cwd 运行, 所以 getTsConfigFile() 发现软件包的 tsconfig .
- 根号
package.json数字 :"lint": "npm run lint -w nextjs"(或运行每个工作空间). - 工作空间 (例如:.
nextjs/eslint.config.js: 使用预设为或与createConfig({ ignores: ['.next/**', ...] })。 。 。 .
单重播和每个工作空间配置 没有 需求 projectService。 。 。 .
脚本
在任意设置中,在运行 ESLint 的软件包中添加:
{
"scripts": {
"lint": "eslint .",
"fix": "eslint . --fix"
}
}
类型脚本
类型意识规则需要 tsconfig.json (或 tsconfig.eslint.json包括你的来源。 与 项目服务 (monorepo),每个文件使用最接近的tsconfig. 没有它,则使用一个 tsconfig(参见 已键入) (中文(简体) ).
类型脚本 7. TypeScript 7 飞船还没有JavaScript API,所以打字-eslint运行在 TypeScript 6 API上(类型标注-slint#10940) (中文(简体) ). 这个配置依赖于它,所以只有工作空间内有 TypeScript 7 的单重音符 liints as-is. 如果运行 ESLint 的软件包安装 typescript@7 它本身, 碰撞。 使用 正式并肩设置 相反: tsc 保留类型脚本 7并 tsc6 是类型脚本 6.
{
"devDependencies": {
"@typescript/native": "npm:typescript@^7.0.2",
"typescript": "npm:@typescript/typescript6@^6.0.2"
}
}
扩展
展开并覆盖 :
const { error, warn } = require('@creo-team/eslint-config/constants')
const base = require('@creo-team/eslint-config')
module.exports = [...base, { rules: { 'no-console': warn } }]
自定义规则
覆盖任意规则,通过扩展基础配置并添加自己的. 使用来自 @creo-team/eslint-config/constants -没有魔法弦.
1. 命名公约——允许常数使用UPPER SNAKE
默认 : camelCase 用于变量, PascalCase 用于类型和enum成员。 允许 UPPER_SNAKE 常数:
const { createConfig } = require('@creo-team/eslint-config')
const { error, FilesPattern, namingConvention } = require('@creo-team/eslint-config/constants')
const base = createConfig()
module.exports = [
...base,
{
files: FilesPattern.TsAndTsx,
rules: {
'@typescript-eslint/naming-convention': [error, ...namingConvention.withUpperCaseVariables],
},
},
]
2. 文件命名——为 .ts 编号 : .tsx 文件
安装 斯林特-插孔-独角兽,然后添加:
const { createConfig } = require('@creo-team/eslint-config')
const { error, FilenameCase, FilesPattern } = require('@creo-team/eslint-config/constants')
const { default: unicorn } = require('eslint-plugin-unicorn') // ESM-only; require(esm) returns the module namespace
const base = createConfig()
module.exports = [
...base,
{
files: FilesPattern.TsAndTsx,
plugins: { unicorn },
rules: {
'unicorn/filename-case': [error, { case: FilenameCase.KebabCase }],
},
},
]
3. 放松JSDoc或无魔法号码
const { createConfig } = require('@creo-team/eslint-config')
const { off } = require('@creo-team/eslint-config/constants')
module.exports = [
...createConfig(),
{
rules: {
'jsdoc/require-jsdoc': off,
'no-magic-numbers': off,
},
},
]
4. 规则的严重程度和命名常数
从 @creo-team/eslint-config/constants 用于一致的无打字功能:
const { createConfig } = require('@creo-team/eslint-config')
const { error, off, warn } = require('@creo-team/eslint-config/constants')
module.exports = [
...createConfig(),
{
rules: {
'no-console': warn,
'jsdoc/require-jsdoc': off,
'some-rule': [error, { option: true }],
},
},
]
5. 自定义命名公约——建立自己的
使用 NamingFormat 财务报告和审定财务报表 NamingSelector 用于完全控制:
const { createConfig } = require('@creo-team/eslint-config')
const {
error,
FilesPattern,
NamingFormat,
NamingSelector,
} = require('@creo-team/eslint-config/constants')
const base = createConfig()
module.exports = [
...base,
{
files: FilesPattern.TsAndTsx,
rules: {
'@typescript-eslint/naming-convention': [
error,
{ format: [NamingFormat.CamelCase], selector: NamingSelector.Default },
{ format: [NamingFormat.PascalCase], selector: NamingSelector.TypeLike },
{ format: [NamingFormat.PascalCase], selector: NamingSelector.EnumMember },
// ... add more as needed
],
},
},
]
实例: 见 examples/rule-overrides/ 用于工作配置和测试.
为什么这个配置
可预见、可审查的代码. 规则的选定是为了让样式决定一次(Pretier + stylistic),意图被记录(JSDoc),结构被保留在界限内(复杂,行限,没有魔法数). 这减少了无意义的辩论形式,使diffs更容易阅读.
关键规则和他们给你的:
| 规则/领域 | 养恤金 |
|---|---|
| 严格类型检查 (类型书写-slint) | 抓取类型错误和不安全 any 在运行时间之前。 更少的“工作到不工作”错误 |
| 联合来文文件 (段落、返回、描述) | 公共API是自我描述. IDE 提示和“去定义”工作而不开启执行 |
| 复杂程度(最多15个) | 分会和有条件者仍受约束。 函数仍可验证且易于解释 |
| 最大行/ 函数( 200) | 长的功能被分开。 便于命名、测试和再利用 |
| 无魔法数( 警告) | 文学成为被命名为常数. 改变阈值或状态代码发生在一个地方 |
| 不承诺执行者返回 | 从“ 承诺” 执行者获取返回值—— 总是错误 |
| 无等闲 (警告) | 旗子按顺序等待,应该 Promise.all() |
| 无控制台( 警告) | 捕获剩余调试日志, 特别是来自 AI 生成的代码 |
| 进口规则 (无循环,顺序,解析器) | 没有循环解析; 一致导入顺序; TypeScript 路径解析工作 |
| 高级 | 一个问题。 代码审查中没有样式 |
LLM - 和助手友好. Cursor, Claude等工具在代码库一致并被记录的情况下表现得更好. 这种配置执行一种风格(因此生成了代码匹配),要求JSDoc在公共表面(因此模型有上下文),并保持了复杂度和魔法数字的检查(因此建议保持相同的风格和重构是本地的). 使用 ESLint MCP 服务器 这样助理就可以运行 ESLint 并修复您的编辑器中的违规.
可选: 项目结构锁定
锁定在 monrepo 工作空间 dirs 和 app 目录结构中. 要求数 项目结构数字 :
npm install eslint-plugin-project-structure --save-dev
Monorepo-锁定工作空间 dirs
仅执行 nextjs, (中文(简体) ), aws/infra,以及 shared 存在于根上 :
const { createConfig } = require('@creo-team/eslint-config')
module.exports = createConfig({
projectService: true,
structure: {
workspaces: ['nextjs', 'aws/infra', 'shared'],
},
ignores: ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/cdk.out/**', '**/*.config.*'],
})
Monorepo + 应用结构
锁定工作空间并强制应用布局(例如. components, (中文(简体) ), lib, (中文(简体) ), utils内部 nextjs 软件包 :
const { createConfig } = require('@creo-team/eslint-config')
module.exports = createConfig({
projectService: true,
structure: {
workspaces: ['nextjs', 'aws/infra', 'shared'],
appStructure: 'nextjs', // preset: app/, components/, lib/, utils/, hooks/, styles/, public/
appPath: 'nextjs', // which workspace gets app structure
},
ignores: ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/cdk.out/**', '**/*.config.*'],
})
单回波——仅应用结构
执行单个 Next.js app 的结构:
const { createConfig } = require('@creo-team/eslint-config')
module.exports = createConfig({
structure: {
appStructure: 'nextjs', // app/, components/, lib/, utils/, hooks/, styles/, public/
},
ignores: ['.next/**', 'node_modules/**'],
})
App 结构预设
| 预设 | 迪尔 |
|---|---|
nextjs | app,组件, lib, utils, 钩子, 样式, 公共 |
nextjsAppRouter | 相同的 + 设置 |
react | src/{组件, lib, utils, 钩子, 样式}, 公共 |
express | src/{路由,控制器,服务,utils,中件} |
src | src/{组件, lib, utils, 设置} |
自定义 dirs
通过一系列目录名称而不是预设 :
structure: {
appStructure: ['components', 'lib', 'utils', 'hooks', 'settings'],
}
常数(@creo-team/eslint-config/constants(中文(简体) )
导入规则值和预设—— 无魔法字符串 :
| 导出 | 使用 |
|---|---|
error, (中文(简体) ), warn, (中文(简体) ), off | 规则严重性 |
NamingFormat | CamelCase, (中文(简体) ), PascalCase, (中文(简体) ), UpperCase |
NamingSelector | Default, (中文(简体) ), Import, (中文(简体) ), Variable, (中文(简体) ), TypeLike, (中文(简体) ), EnumMember |
namingConvention | default, (中文(简体) ), withUpperCaseVariables 预设 |
FilesPattern | TsAndTsx —— 说 ['**/*.ts', '**/*.tsx'] |
FilenameCase | KebabCase, (中文(简体) ), CamelCase, (中文(简体) ), PascalCase (独角兽) |
AppStructurePreset | NextJs, (中文(简体) ), Express, (中文(简体) ), React等 (中文(简体) ). |
包含的内容
- 类型脚本 ESLint ——推荐+严格打字,字型
- 高级 ——格式化(tabs,120平面宽度,无分号)
- 联合来文文件 需要描述、参数、声明/方法的返回(不是箭头函数)
- 导入 ——顺序,无循环,解析器类型Script
- 完美主义者 — 字母排序( 已禁用导入排序)
- 同步正确性 ——不承诺-执行-返回(error),不等待-落地(warn)
- 质量 – 复杂(最大为15个),最大行,最大行-每个函数,无磁体数字(警告),无锥(警告)
文档
- 欧洲标准化组织 ——建筑与规则哲学
- 欧洲审计署 -v3.0.0 审计结果和决定
- AI-CODE-STANDS.md (英语) - 人工智能助理指南
释放流量
特伦克制. 弹出 version 内 package.json,推动 main → github-release 创建标签 + GitHub 释放 → npm-publish 发布至npm. OIDC信任出版,无符号.
实例
- 莫诺雷波:
examples/monorepo/——根配置为projectServicenpm工作空间。 见 实例/README.md。 。 。 . - 结构 :
examples/structure/——锁定工作空间和app dirs与structure选项。 见 实例/结构/README.md。 。 。 .
发展
见 捐款额本地测试 npm link数字 :
# In eslint-config repo
npm link
# In consuming project
npm link @creo-team/eslint-config
环境变量 (可选) :
ESLINT_DEBUG——启用调试日志ESLINT_TSCONFIG—— 覆盖 tsconfig 文件ESLINT_FALLBACK_TSCONFIG控制倒置的 tsconfigESLINT_START_DIR——搜索启动目录
许可证
ISC (英语).