rhine-lint 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +244 -58
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,81 +1,267 @@
1
1
  # Rhine Lint
2
2
 
3
- 内置 EsLint 与 Prettier 的代码风格包。可零配置直接使用 rl 命令。
3
+ <p align="center">
4
+ <img src="https://img.shields.io/npm/v/rhine-lint?style=flat-square" alt="npm version" />
5
+ <img src="https://img.shields.io/npm/l/rhine-lint?style=flat-square" alt="license" />
6
+ <img src="https://img.shields.io/badge/style-opinionated-blue?style=flat-square" alt="style" />
7
+ </p>
4
8
 
5
- 不建议在你的项目中,重复安装 eslint, prettier, typescript-eslint, 及各种插件包。
9
+ **Rhine Lint** 是一个「零配置」的现代化代码规范解决方案。它深度整合了 **ESLint (v9 Flat Config)** 与 **Prettier**,为你提供开箱即用的最佳实践。你无需再手动安装数十个 `eslint-plugin-*` 依赖,也无需编写数百行的配置文件。只需一个依赖,一行命令,即可获得顶级的代码质量守护。
6
10
 
7
- ## Performance
11
+ ## 特性 Features
8
12
 
9
- ```text
10
- 执行 rl 即执行 eslint . prettier .
11
-
12
- 执行 rl <filename> 即执行 eslint <filename> 和 prettier <filename> .
13
+ - **零配置启动 Zero Config**: 默认提供适用于 TypeScript、React、Next.js 的最佳实践配置,安装即用。
14
+ - **统一工具链 Unified Toolchain**: 一个 `rl` 命令同时执行代码检查 (Lint) 和代码格式化 (Format)。
15
+ - **全栈支持 Full Stack**:
16
+ - **JavaScript / TypeScript**: 完整的类型检查支持。
17
+ - **Frontend**: React (v18/v19), React Hooks, JSX A11y.
18
+ - **Frameworks**: Next.js (Pages & App Router).
19
+ - **Styles**: CSS, SCSS format supports.
20
+ - **Others**: JSON, Markdown support.
21
+ - **智能配置生成 Smart Config**: 运行时动态生成配置文件,无需担心 ESLint/Prettier 配置文件污染项目根目录。
22
+ - **灵活扩展 Extensible**: 支持 `rhine-lint.config.ts` 进行规则覆盖或深度定制。
13
23
 
14
- 执行 rl --fix 即执行 eslint . --fix 和 prettier . --write
15
- ```
24
+ ## 安装 Installation
16
25
 
17
- ## Install
26
+ 在你的项目中作为开发依赖安装:
18
27
 
19
28
  ```bash
29
+ # Bun (Recommended)
20
30
  bun add -D rhine-lint
31
+
32
+ # npm
33
+ npm install --save-dev rhine-lint
34
+
35
+ # pnpm
36
+ pnpm add -D rhine-lint
37
+
38
+ # yarn
39
+ yarn add -D rhine-lint
21
40
  ```
22
41
 
23
- ## Arguments
42
+ ## 快速开始 Quick Start
24
43
 
25
- ```text
26
- --config 指定配置文件路径
44
+ ### 命令行使用 (CLI)
27
45
 
28
- --fix 是否修复
46
+ 安装完成后,你可以直接使用 `rl` 命令:
29
47
 
30
- --level 指定项目种类 (js | ts | frontend | nextjs). 默认 frontend.
48
+ ```bash
49
+ # 检查当前目录下所有文件 (默认 lint + check format)
50
+ npx rl
51
+
52
+ # 自动修复所有可修复的代码风格问题
53
+ npx rl --fix
54
+
55
+ # 检查指定文件或目录
56
+ npx rl src/components
57
+
58
+ # 指定项目类型 (覆盖自动检测或默认值)
59
+ npx rl --level nextjs
31
60
  ```
32
61
 
33
- ## Config
34
- 会自动检测以下文件作为配置:
35
- ```text
36
- rhine-lint.config.js
37
- rhine-lint.config.ts
38
- rhine-lint.config.cjs
39
- rhine-lint.config.mjs
40
- rhine-lint.config.json
41
- config/rhine-lint.config.js
42
- config/rhine-lint.config.ts
43
- config/rhine-lint.config.cjs
44
- config/rhine-lint.config.mjs
45
- config/rhine-lint.config.json
62
+ ### 推荐配置
63
+
64
+ 在 `package.json` 中添加 scripts,方便日常使用:
65
+
66
+ ```json
67
+ {
68
+ "scripts": {
69
+ "lint": "rl",
70
+ "lint:fix": "rl --fix"
71
+ }
72
+ }
46
73
  ```
47
74
 
48
- 配置文件格式:
49
- ```ts
50
- export type Config = {
51
- level?: 'none' | 'js' | 'ts' | 'frontend' | 'nextjs',
52
- fix?: boolean,
53
- tsconfig?: string,
54
- eslint?: {
55
- scope?: {
56
- script?: boolean,
57
- typeChecked?: boolean,
58
- projectBaseTypeChecked?: boolean,
59
- frontend?: boolean,
60
- nextjs?: boolean,
61
- markdown?: boolean,
62
- json?: boolean,
63
- stylesheet?: boolean,
64
- ignorePrettier?: boolean,
65
- },
66
- config?: [
67
- // EsLint Flatten Config
68
- ],
69
- // Default false for Merge Mode, true for Overlay Mode
70
- overlay?: boolean,
75
+ ## 配置 Configuration
76
+
77
+ 虽然 Rhine Lint 是零配置的,但也支持通过配置文件进行深度定制。它会自动检测项目根目录下的 `rhine-lint.config.{ts,js,mjs,json}`。
78
+
79
+ ### 配置文件示例 (`rhine-lint.config.ts`)
80
+
81
+ ```typescript
82
+ import { type Config } from 'rhine-lint';
83
+
84
+ export default {
85
+ // 指定项目级别: 'js' | 'ts' | 'frontend' | 'nextjs'
86
+ // 默认为 'frontend'
87
+ level: 'nextjs',
88
+
89
+ // 是否默认开启修复模式 (可选)
90
+ fix: false,
91
+
92
+ // 自定义缓存目录 (可选)
93
+ // cacheDir: './.cache/rhine-lint',
94
+
95
+ // ESLint 专项配置
96
+ eslint: {
97
+ // 启用/禁用特定范围的规则
98
+ scope: {
99
+ frontend: true, // 开启前端规则 (React 等)
100
+ nextjs: true, // 开启 Next.js 规则
101
+ imoprtX: true, // 开启 Import 排序等规则
71
102
  },
72
- prettier?: {
73
- config?: {
74
- // Prettier Config
75
- },
76
- // Default false for Merge Mode, true for Overlay Mode
77
- overlay?: boolean,
103
+
104
+ // 自定义 ESLint 规则 (Flat Config 格式)
105
+ // 这里的配置会与默认配置合并
106
+ config: [
107
+ {
108
+ rules: {
109
+ 'no-console': 'warn',
110
+ 'react/no-unknown-property': 'off'
111
+ }
112
+ }
113
+ ...
114
+ ]
115
+ },
116
+
117
+ // Prettier 专项配置
118
+ prettier: {
119
+ config: {
120
+ printWidth: 100,
121
+ semi: true,
122
+ ...
78
123
  }
79
- }
124
+ }
125
+ } as Config;
126
+ ```
127
+
128
+ ### 参数说明 (Arguments)
129
+
130
+ CLI 参数优先级高于配置文件:
131
+
132
+ - `--fix`: 自动修复错误。
133
+ - `--config <path>`: 指定配置文件路径。
134
+ - `--level <level>`: 强制指定项目类型(`js`, `ts`, `frontend`, `nextjs`)。
135
+ - `--cache-dir <dir>`: 指定缓存目录(默认使用 `node_modules/.cache/rhine-lint`)。
136
+
137
+ ### 缓存目录 Cache Directory
138
+
139
+ Rhine Lint 需要一个目录来存放运行时动态生成的 "Virtual Config" 文件。这些文件是临时的,通常不需要用户关心。
140
+ 缓存目录的解析优先级如下(由高到低):
141
+
142
+ 1. **CLI 参数**: 命令行中显式指定 `--cache-dir <path>`。
143
+ 2. **配置文件**: `rhine-lint.config.ts` 中的 `cacheDir` 字段。
144
+ 3. **默认位置 (标准)**: `node_modules/.cache/rhine-lint`(如果项目中有 `node_modules` 目录)。
145
+ 4. **回退位置**: `.cache/rhine-lint`(如果找不到 `node_modules`,则在项目根目录下创建)。
146
+
147
+ > **注意**: 如果你的项目触发了第 4 种情况(回退位置),建议将 `.cache/` 添加到你的 `.gitignore` 文件中,以免这些临时文件被提交到版本库。正常情况下,Rhine Lint 会在执行结束后尝试清理这些临时文件,但保留在 `.gitignore` 中是更安全的做法。
148
+
149
+ ## 项目级别 Project Levels
150
+
151
+ Rhine Lint 根据 `level` 参数加载不同的规则集:
152
+
153
+ - **`js`**: 基础 JavaScript 项目。仅包含标准 JS 规则和 Prettier。
154
+ - **`ts`**: TypeScript 项目。包含 TS 类型检查规则、TSDoc 等。
155
+ - **`frontend`** (默认): 前端 React 项目。包含 `ts` 级别所有规则,加上 `React`, `React Hooks`, `JSX` 相关规则。
156
+ - **`nextjs`**: Next.js 项目。包含 `frontend` 级别所有规则,加上 `@next/eslint-plugin-next` 的 Core Web Vitals 等规则。
157
+
158
+ ## 技术实现与原理 Implementation Insights
159
+
160
+ 本章节详细阐述 **Rhine Lint** 的内部工作机制。如果你希望为本项目贡献代码,或者想深度定制功能,可以通过以下内容快速上手。
161
+
162
+ Rhine Lint 的核心本质是一个 **Configuration Factory (配置工厂)** 与 **Execution Orchestrator (执行编排器)**。它并没有重写 Linter,而是站在巨人的肩膀上(ESLint & Prettier),通过一层薄封装来解决配置复杂性问题。
163
+
164
+ ### 1. 核心架构 Core Architecture
165
+
166
+ 整个执行流程可以分为三个阶段:**初始化 (Init)** -> **生成 (Generate)** -> **执行 (Execute)**。
167
+
168
+ ```mermaid
169
+ graph TD
170
+ CLI[src/cli.ts] -->|解析参数| ConfigMgr[src/core/config.ts]
171
+
172
+ subgraph Configuration Phase
173
+ ConfigMgr -->|1. 读取用户配置| UserConfig[rhine-lint.config.ts]
174
+ ConfigMgr -->|2. 读取内置模板| Assets[src/assets/*.js]
175
+ ConfigMgr -->|3. 合并与编译| VirtualConfig[生成临时 Config\n.cache/rhine-lint/*.mjs]
176
+ end
177
+
178
+ subgraph Execution Phase
179
+ CLI --> Executor[src/core/runner.ts]
180
+ Executor -->|Spawn Process| ESLint[(ESLint Binary)]
181
+ Executor -->|Spawn Process| Prettier[(Prettier Binary)]
182
+ ESLint -.->|读取| VirtualConfig
183
+ Prettier -.->|读取| VirtualConfig
184
+ end
185
+
186
+ ESLint -->|Output| Formatter[结果清洗与展示]
187
+ Prettier -->|Output| Formatter
80
188
  ```
81
189
 
190
+ ### 2. 模块详解 Module Deep Dive
191
+
192
+ #### CLI 入口 (`src/cli.ts`)
193
+ - **职责**: 程序的入口点。
194
+ - **实现**: 使用 `cac` 库处理命令行参数(如 `--fix`, `--level`)。
195
+ - **逻辑**:
196
+ 1. 它不会直接调用 ESLint API,而是准备好环境路径。
197
+ 2. 调用 `generateTempConfig` 准备配置文件。
198
+ 3. 调用 `runEslint` 和 `runPrettier` 启动子进程。
199
+ 4. 最终根据子进程的 exit code 决定 `rl` 命令是成功还是失败。
200
+
201
+ #### 配置生成器 (`src/core/config.ts`) 🔥核心
202
+ 这是项目最复杂的部分。为了实现「零配置」且不污染用户目录,我们采用 **虚拟配置 (Virtual Configuration)** 策略。
203
+
204
+ - **动态生成**: 我们不依赖用户项目里的 `.eslintrc`。相反,我们在运行时,在 `node_modules/.cache/rhine-lint/` 下生成一个真实的 `eslint.config.mjs`。
205
+ - **JIT 编译**: 生成的配置文件不仅仅是 JSON,它是一段 **JavaScript 代码**。
206
+ - 它会 `import` rhine-lint 内部的 `src/assets/eslint.config.js`。
207
+ - 它会使用 `jiti` 或动态导入 (`import()`) 来加载用户的 `rhine-lint.config.ts`。
208
+ - 它会在内存中通过 `defu` 库将默认配置和用户配置进行深层合并。
209
+ - **关键点**: 这种设计使得 `rhine-lint` 内部的依赖(如 `eslint-plugin-react`)可以被正确解析,而不需要用户显式安装它们。
210
+
211
+ #### 规则资产 (`src/assets/`)
212
+ 这里存放了 Lint 规则的「源头」。
213
+
214
+ - **`eslint.config.js`**: 这是一个 **Factory Function**。它导出一个 `createConfig(options)` 函数。
215
+ - **Flat Config**: 采用了 ESLint v9 的 Flat Config 数组格式。
216
+ - **按需加载**: 根据传入的 `options.level` (如 `frontend` 或 `nextjs`),它会动态 `push` 不同的配置块(Block)到数组中。例如,只有在 `nextjs` 模式下,才会加载 `@next/eslint-plugin-next` 相关规则。
217
+ - **插件集成**: 所有插件(`react`, `import-x`, `unused-imports` 等)都在这里被引入并配置。
218
+
219
+ #### 执行引擎 (`src/core/runner.ts`)
220
+ - **进程隔离**: 我们使用 Node.js 的 `child_process.spawn` 来调用 `eslint` 和 `prettier` 的可执行文件。
221
+ - **为什么不使用 API?**:
222
+ - 使用 API (如 `new ESLint()`) 可能会导致单例冲突,或者在某些边缘情况下与 CLI 行为不一致。
223
+ - 通过 spawn 调用 CLI 能够最大程度保证兼容性,并且利用多核 CPU 并行运行 Lint 和 Prettier。
224
+ - **输出清洗**: 原生的 ESLint 输出对于普通用户来说可能太过冗长。我们在这一层捕获 stdout/stderr,移除了 ANSI 乱码,并提取出关键的 "X problems found" 摘要信息,给用户最直观的反馈。
225
+
226
+ ### 3. 开发指引 Development Guide
227
+
228
+ 如果你想为 Rhine Lint 添加新功能,请遵循以下路径:
229
+
230
+ #### 添加一个新的 ESLint 插件
231
+ 1. **安装依赖**: 在 `rhine-lint` 项目中安装插件,例如 `bun add eslint-plugin-vue`。
232
+ 2. **注册插件**: 修改 `src/assets/eslint.config.js`。
233
+ - 导入插件。
234
+ - 在 `createConfig` 函数中,添加新的逻辑分支(例如 `if (OPTIONS.ENABLE_VUE) { ... }`)。
235
+ - 定义好 `plugins` 和 `rules`。
236
+ 3. **更新类型**: 在 `src/config.ts` 的 `Config` 类型定义中添加新的 Scope 开关。
237
+ 4. **测试**: 在 `playground` 目录中创建一个 Vue 文件,运行 `bun start --level vue` (假设你添加了 vue level) 进行验证。
238
+
239
+ #### 调试 (Debugging)
240
+ 本项目完全使用 TypeScript 编写。
241
+
242
+ - **Build**: `bun run build` (使用 `tsc` 编译到 `dist/`)。
243
+ - **Link**: 在本项目根目录运行 `npm link`,然后在测试项目运行 `npm link rhine-lint`。
244
+ - **Watch**: 也可以使用 `bun run dev` (如果配置了) 或手动监听文件变化。
245
+
246
+ ### 4. 目录结构
247
+
248
+ ```text
249
+ rhine-lint/
250
+ ├── src/
251
+ │ ├── assets/ # 默认的配置文件模板 (ESLint/Prettier)
252
+ │ ├── core/
253
+ │ │ ├── config.ts # 配置加载与临时文件生成逻辑
254
+ │ │ └── runner.ts # 子进程执行器
255
+ │ ├── utils/ # 工具函数 (Logger 等)
256
+ │ ├── cli.ts # 命令行入口
257
+ │ ├── config.ts # 类型定义
258
+ │ └── index.ts # 导出给用户的 API
259
+ ├── scripts/ # 构建脚本
260
+ └── package.json
261
+ ```
262
+
263
+ ---
264
+
265
+ ## License
266
+
267
+ MIT © [RhineAI](https://github.com/RhineAI)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rhine-lint",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "module": "./dist/index.js",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",