ericsssan/ez
GitHub: ericsssan/ez
Ez 是用 Zig 实现的高性能 JS/TS linter,通过零拷贝 AST 共享让现有 ESLint 插件无需重写即可高速运行。
Stars: 0 | Forks: 0
# Ez
一个用 Zig 编写的高性能 JavaScript/TypeScript 解析器和 linter,配备零拷贝的 ESLint 插件运行器,允许你运行任何 ESLint 插件而无需重新实现其规则。
## 解析器一致性
| 测试套件 | 必须解析 | 必须拒绝 | 备注 |
|-------|-----------|-------------|-------|
| tc39/test262-parser-tests | 3,966/3,966 (100%) | 1,387/1,391 (99.7%) | 6 个已知的过期测试被跳过 |
| TypeScript | 3,466/3,466 (100%) | 583/1,009 (57.8%) | 1,432 个被跳过(decorators 等) |
| Babel (JS) | 3,911/4,122 (94.9%) | 1,583/1,587 (99.7%) | 2,871 个被跳过(JSX/TS/proposals) |
“必须拒绝”衡量了解析器是否正确地对无效代码报告解析错误。TypeScript 较低的“必须拒绝”得分(57.8%)反映了其缺乏针对 TS 的特定错误检测——ez 能在不崩溃的情况下解析代码,但尚未能诊断出所有的 TypeScript 语义/语法违规。
## 功能
- **Zig 原生解析器** — SIMD 加速的词法分析器、arena 分配、MultiArrayList AST(结构体数组布局)
- **语义分析** — 作用域树、符号表、引用追踪
- **零拷贝 JS 桥接** — AST 作为原始 `ArrayBuffer` 共享;Node.js 读取时无需复制或序列化
- **ESLint 插件运行器** — 通过 `require()` 加载任何 ESLint 插件,并针对 ez AST 运行其规则
- **兼容 ESTree 的节点视图** — 命名字段获取器(`node.test`、`node.consequent`、`node.body` 等)、`node.parent`、`node.range`、`node.loc`
- **AST 选择器** — visitor keys 中支持 `esquery` 风格的选择器(`"IfStatement > BlockStatement"`、`"CallExpression[callee.name='require']"`)
- **自动修复** — `--fix` 原地应用规则提供的修复
- **完整的 SourceCode API** — `getText()`、`getTokenBefore/After()`、`getScope()`、`getAncestors()`
## ESLint 插件兼容性
已针对当前版本进行测试:
| 插件 | 通过的规则数 |
|--------|---------------|
| `eslint` (核心) | 292/292 |
| `eslint-plugin-n` | 43/43 |
| `eslint-plugin-es-x` | 208/208 |
| `eslint-plugin-import` | 45/46 |
## 快速开始
### 构建原生模块
```
zig build # builds zig-out/lib/libez.{dylib,so,dll}
```
### 安装 JS 依赖
```
cd js && npm install
```
### 运行 lint 规则
```
# 对文件或目录运行所有 eslint 核心规则
node js/lint.js --eslint-plugin eslint src/
# 运行特定规则
node js/lint.js --eslint-plugin eslint --rule eqeqeq src/index.js
# 运行第三方 plugin
node js/lint.js --eslint-plugin eslint-plugin-unicorn src/
# TypeScript-eslint plugin
node js/lint.js --eslint-plugin @typescript-eslint/eslint-plugin src/
# 多个 plugins
node js/lint.js -p eslint -p eslint-plugin-n src/
# 应用 autofixes
node js/lint.js --eslint-plugin eslint --fix src/
# JSON 输出
node js/lint.js --eslint-plugin eslint --format=json src/ | jq .
# 使用 config file 配置 rule 选项
node js/lint.js --eslint-plugin eslint --config .eslintrc.json src/
```
### CLI 选项
```
--eslint-plugin, -p Load ESLint plugin (repeatable)
--rule, -r Only run rules matching this name (repeatable)
--config, -c ESLint config file (.eslintrc.json) for rule options
--format=json Output JSON array instead of text
--fix Apply autofixes to files (writes in place)
--help, -h Show help
```
## 工作原理
Ez 将其 AST 序列化为一个扁平的 `ArrayBuffer`,并直接与 Node.js 共享——没有 JSON,也没有拷贝。JS 端通过对同一内存的 Typed Array 视图读取节点标签、token 和额外数据。ESLint 插件规则像往常一样调用 `context.report()`;ez 收集这些报告并对其进行格式化。
有关完整架构的详细信息,请参阅 [DESIGN.md](DESIGN.md):MultiArrayList AST 布局、SIMD 词法分析器、arena 分配以及 JS 桥接协议。
## 环境要求
- Zig `0.16.0-dev` 或更高版本
- Node.js 18+(用于 JS 插件运行器)
## 许可证
MIT
标签:CMS安全, DoH影响, JavaScript, Linter, MITM代理, pptx, TypeScript, Zig, 云安全监控, 动态分析, 安全插件, 数据可视化, 静态分析