@fitzzero/ quickdraw-lint (英语)
快速draw oxlint 插件和配置
(设计: docs/rfcs/0003-v5.md页:1 规矩是错的
与 5.0 API 相关: 写入订阅者永远不会看到, 帧由
手,读取与表一起生长,绕过被键入的客户端,和 4.x
这已经不复存在。 每个规则都经过测试,每个规则都可以
采用时不首先固定旧代码(基线,以下).
bun add -d @fitzzero/quickdraw-lint oxlint
// .oxlintrc.json in your app
{
"extends": [
"./node_modules/@fitzzero/quickdraw-lint/oxlint.base.jsonc",
// or, in an app built from the quickdraw template, the template config
// instead: it extends the base and adds the design-system rules
// "./node_modules/@fitzzero/quickdraw-lint/oxlint.template.jsonc",
],
// plugins, ignorePatterns, env, globals and settings are not inherited
"plugins": ["typescript", "import", "react", "nextjs", "jsx_a11y"],
"ignorePatterns": ["**/dist/**", "**/node_modules/**"],
}
配置通过相对自身的路径加载插件, 所以是一个应用程序
需要没有 jsPlugins 进入它自己的。 顶端的评论
oxlint.base.jsonc 列出扩展配置继承什么。 它的路径
覆盖( 明确类型在 packages/shared 财务报告和审定财务报表 packages/db网络
应用的放松预算) **/- 前置, 因此它们是否应用 lint 运行
从应用程序的根或每个软件包目录。 插件运行在
牛林一万五千二或后出.
规则
每个规则都是综合的:克林特的JS插件看到一个文件的语法,没有 类型。 如果一个规则需要猜测,它宁愿缺少一个案件而不是报告 正确的代码; 每一个规则的文件都说它留下了什么.
| 规则 | 报告 | 默认检查 |
|---|---|---|
no-untracked-write | 导入未跟踪的 Prisma 客户端( R)prisma, (中文(简体) ), PrismaClient 从应用程序的db包, @prisma/client 或生成的客户端),并通过命名的客户端写入 prisma (a) 参数、变量、解结构绑定或类成员键入) Tracked<...> 或者说 TrackedTransaction<...>从 @fitzzero/quickdraw-core 或者说 @fitzzero/quickdraw-core/prisma 无论名称如何,都是跟踪客户端 Tracked 无效) | 服务、工作、路线 |
no-foreign-write | 写给一个模型 , 其附件 defineService 既不拥有(model)或列表中 writes | 到处都是 |
no-nested-write | 嵌入关系书写( n)data: { labels: { create } }通过跟踪客户端(db, (中文(简体) ), tx,或使用快取键键键入的绑定或类成员 Tracked<...>: 只有父行被跟踪 | 到处都是 |
no-raw-sql-write | $executeRaw*,以及 $queryRaw* 运行写入,在不用 ctx.touch(...) (或 qd.collections.reset(...)(中文(简体) ) | 服务、工作、路线 |
no-manual-emit | .emit() 在袜子上。 IO 服务器或套接字(io.to(room).emit),以及 qd: 字符串、 框架的事件和房间名称 | 服务、工作、路线 |
no-inline-auth-guard | if (!ctx.principal) throw ... 及其变体a handler (声明) access 换句话说,还有一份很好的检查, if (ctx.principal.kind !== "user") throw ... (声明) kinds 改为) | 到处都是 |
no-plain-error-refusal | 内置出错的投出( n)new Error(...), (中文(简体) ), TypeError(...),有或无 new在给定为 auth.authenticate 改为 createServer 或者说 createHttpRouter,作为 loadPrincipal 改为 socketAuth,或作为 principal 改为 createMcpRegistry (写在那里,或 function 或者说 const ),服务器会为自己失败而接受,因此客户端会永远重试证书(MCP代理商从未被告知其代号被拒绝) try 带有 catch 或一个 catch 条款 | 除了测试,到处都是 |
no-unbounded-read | findMany 无 take (由ids读取, id 平等, { in } 或者说 { equals },被绑定; { not }, (中文(简体) ), { notIn } 财务报告和审定财务报表 { gt } 无) | 服务 |
no-db-call-in-loop | 每个项目的数据库呼叫 for编号 :for...of编号 :for...in 循环或 .map 回拨、等待或发送到 Promise.all (无) while, (中文(简体) ), createMany, (中文(简体) ), in: 自己的游戏, tx 写作) | 服务、工作、路线 |
no-emit-in-loop | ctx.rooms.emit, (中文(简体) ), emitToUser 或溪流的 push 每件物品到同一房间、用户或流量范围(fan-out很好;批次与 pushMany(中文(简体) ) | 服务、工作、路线 |
no-load-then-filter | findMany 其行仅存 .filter编辑或 .find条件a where 可表达 | 服务、工作、路线 |
no-prisma-in-routes | 模型在路由处理器中调用 Prisma 客户端 | 路线 |
no-cross-service-internal-imports | 导入索引以外的其它服务目录文件 | 服务 |
no-await-void-mutate | await mutation.mutate(...)数字 : mutate 返回无; 使用 mutateAsync | 客户端代码 |
no-untyped-client | a TanStack 查询钩 queryFn编号 :mutationFn 即用手拨打快速拨打的电话 queryKey 是一个快画键( 客户端缺少时可能会使用成员键 ) key 财务报告和审定财务报表 call(中文(简体) ) | 客户端代码 |
no-manual-refetch | 快速绘图查询 refetch() 在(或者在回调中)快速拉动突变之后 invalidateQueries编号 :refetchQueries编号 :resetQueries 快捷键上 | 客户端代码 |
no-raw-socket | socket.emit, (中文(简体) ), socket.on, (中文(简体) ), socket.off 还有其他生的苏克特 IO呼叫:一个 socket (或 x.socket不管怎么样 socket.io-client是因为 io(), (中文(简体) ), connect() 或者说 Manager 以任何名称制作(通过变量和 this 字段),并带有a qd: 任何接收器上的事件名称 | 客户端代码 |
no-v4-api | 每删除或移动 4.x API 5.0; 每个信件名替换 | 到处都是 |
prefer-kit | 工具箱采用的一种手写方法(get, (中文(简体) ), list, (中文(简体) ), create, (中文(简体) ), search, (中文(简体) ), share, (中文(简体) ), adminList,或 getTask, (中文(简体) ), listTasks, (中文(简体) ), createTask, (中文(简体) ), updateTask, (中文(简体) ), deleteTask 用于模型 "task"· ; remove 仅以成员模式或以其他分享方式进行) defineService 谁 model 是一个字符串( 或 const (其中之一)以及 methods 不传播任何工具包(一个散开的变量或一个调用计数),或重复其旁所传播的工具包(crud.handlers' access 字面名称, search 页:1 search.handlers,用于 admin.handlers页:1 // quickdraw: hand-written because <reason> 上面的评论保持安静 | 除了测试,到处都是 |
no-todo-schema | todoSchema(),占位符计划4.x迁移(@fitzzero/quickdraw-codemod(a) 一种方法没有的地方留下:它证明什么都没有 query() 或者说 mutation() 无输入 keys,它也会隐藏输入键从 defineServiceid-reach (less) 检查,消息说是这样 | 到处都是 |
require-describe | 合同成员 describe合同(defineContract),每个 query 财务报告和审定财务报表 mutation、 收集、 流、 通道和事件, 写成对象字元( 在别处构建的扩展或定义被留下) , 静态 describe 下级 minWords 单词(默认 3); MCP 桥描述一个方法的工具,并 quickdraw-docs 带领每个区域 | 除了测试,到处都是 |
no-unused-baseline | 基线文件中的允许性,即不再使用任何违规行为(以下) | 基线文件 |
no-raw-button-strings, (中文(简体) ), no-raw-tooltip-strings, (中文(简体) ), no-raw-typography-strings | mUI 中的原始字符串 Button, (中文(简体) ), Typography 财务报告和审定财务报表 Tooltip 标题oxlint.template.jsonc(中文(简体) ) | *.tsx, (中文(简体) ), *.jsx |
基础配置打开 除了最后三个 error时,除
no-unused-baseline, (中文(简体) ), no-todo-schema, (中文(简体) ), prefer-kit, (中文(简体) ), require-describe 财务报告和审定财务报表
no-plain-error-refusal警告他们。 警告不会失败升级; 一旦应用程序没有
报告从一个,它可以设置规则到 "error" 在它自己的配置中
(单位:千美元)"quickdraw/require-describe": "error",说)所以新代码不能添加任何.
oxlint.template.jsonc 扩展基数并添加后三个基数.
哪些文件是规则检查
一个只检查该层文件的规则。 默认跟随
模板的布局。 这些规则涉及服务、工作和路线,
no-raw-socket, (中文(简体) ), prefer-kit 财务报告和审定财务报表 require-describe 跳过测试( e)__tests__/, (中文(简体) ), test/, (中文(简体) ), tests/, (中文(简体) ), *.test.*, (中文(简体) ),
*.spec.*哪些种子、检查和探测;其他规则检查
测试也.
| 层 | 球盖 |
|---|---|
| 服务 | **/services/** |
| 任务 | **/jobs/** |
| 路线 | **/routes/**, (中文(简体) ), **/routes.* |
| 客户端代码 | **/*.tsx, (中文(简体) ), **/*.jsx, (中文(简体) ), **/apps/web/** |
客户端代码也是任何导入的文件 @tanstack/react-query, (中文(简体) ),
socket.io-client 或者说 @fitzzero/quickdraw-core/client,所以钩在
.ts 文件检查 oxlint 的出处、 应用程序根或 apps/web
相同; 对于客户端规则, globs 会在其中添加文件 .
每个文件范围的规则 files 财务报告和审定财务报表 ignore 光滑,与
相对于牛林运行地点的路径( 保留它们) **/- 前缀 :
{
"rules": {
"quickdraw/no-unbounded-read": ["error", { "files": ["**/server/services/**"] }],
},
}
其他选项: clients (数据库客户端的名称为: ["db", "tx"] 写作规则,加 prisma 关于规则
查看数据库的电话; modules (未跟踪客户端的说明符)
模块) no-untracked-write· ; emitters 打开 no-manual-emit· ; sockets, (中文(简体) ),
allowedEvents 财务报告和审定财务报表 allowedPrefixes 打开 no-raw-socket· ; clients (类型)
客户姓名, ["qd"]继续 no-untyped-client 财务报告和审定财务报表 no-manual-refetch· ;
minWords (静态描述中最少的字,默认为3)
require-describe· ; shared 财务报告和审定财务报表 allow (单位:千美元){ "<service>": ["<service>/<file>"] }继续
no-cross-service-internal-imports每一个规则的选项都在它的计划,
所以一个拼错的选项在启动时会失败克林特.
写作规则( :no-untracked-write, (中文(简体) ), no-nested-write, (中文(简体) ), no-foreign-write(中文(简体) )
也取一个客户端的快取 Tracked<...> 或者说
TrackedTransaction<...> 担任跟踪客户,无论其名称为何:a
参数或变量,一个其模式类型给予它的已解结构绑定
1( 类型字词, 或此文件的接口或类型别名 : { db }: { db: Tracked<Db> }),或 this.<member> 其类别宣布为(财产,或
构造器的参数属性). 类型在文件导入时计数
从 @fitzzero/quickdraw-core 或者说 @fitzzero/quickdraw-core/prisma下页
任何名称或通过命名空间导入,或通过此文件的别名类型
说吧 应用程序的一类名称 Tracked,或从
另一个模块(包含再导出)不读:规则查看一个文件,
而只有速战速决的型态 将客户端控制在履带式的.
基线
应用程序采用基础配置而不修正所有已有的违规情况 首先,快活的规则 和克林特自己的:
bunx quickdraw-lint baseline -c .oxlintrc.json # writes .quickdraw-lint-baseline.json
// .oxlintrc.json: every rule reads the file
{
"settings": { "quickdraw": { "baseline": ".quickdraw-lint-baseline.json" } },
}
// package.json: lint through quickdraw-lint check (per package: -c ../../.oxlintrc.json src)
{ "scripts": { "lint": "quickdraw-lint check -c .oxlintrc.json ." } }
quickdraw-lint baseline 使用您的配置运行牛林( r)-c 选择一个;
选项后的路径,默认情况下当前目录)并记录 a
规则、档案和散列
的线条的修剪文本。 然后,只有当
其指纹没有被记录,或者发生频率超过记录。 这么说吧
修复旧的违规情况,并在同一份文件中增加一个新的违规情况
新一条,在其行上,同时编辑文件的其他地方(移动行)
没有改变它们) 扰动什么。 禁用注释的违反
封面没有记录,也没有使用备忘,文件牛林无法解析
永远不会被记录:没有基线存在语法错误。 提交文件 .
快速画规则应用文件本身,所以简单 oxlint 运行( a)
编辑部也把记录的违纪事件排除在外。 牛林自己的规矩
(单位:千美元)no-unused-vars, (中文(简体) ), no-shadow,.)在本地运行,其中JS插件无法运行
联系他们: quickdraw-lint check 运行克林特 并留下他们的记录
也违反,所以它是一个应用程序的指针。 每一次都会传来
选项它不知道 (-c, (中文(简体) ), --fix,路径)到牛林,打印什么是
左为 file:line:column: message [Severity/rule] (单位:千美元)--format json 页:1
牛林的JSON报告,过滤,取 --quiet, (中文(简体) ), --deny-warnings 财务报告和审定财务报表
--max-warnings <n> 和 oxlint 一样,当错误发生时退出 1 .
记录的违规情况一旦确定,其津贴即予使用
no-unused-baseline 在文件的顶端警告( i)quickdraw-lint check
以同样方式报告牛林本身的规则未使用的津贴
基线命令再次生效,使文件缩水,没有新的信息可以带走
津贴地点。 一个规则将文件作为选项,而不是
设置 : ["error", { "baseline": ".quickdraw-lint-baseline.json" }]A级
相对路径从每个已挂起的文件目录向上查找, 所以一个
寄存器根的文件还服务从软件包启动的 lint 运行
目录. 快速规则按着它的名字 任何其他规则按着它
代码为:
{
"version": 2,
"files": {
"apps/api/src/services/task.ts": {
"eslint(no-unused-vars)": { "9a0364b9e99bb480": 1 },
"no-unbounded-read": { "5d41402abc4b2a76": 1, "7d793037a0760186": 2 }
}
}
}
1版本文件(每个文件的计数,从早先的 5.0 预释)是 拒绝留言,说要再次写给指挥部.
从4.1规则
4.1规则在5.0之前不变地移到这里;5.0代替. A 类 仍然为已删除规则命名的配置无法装入, 因此删除这些名称 从您的覆盖 :
| 4.1 规则 | 5.0 (中文(简体) ) |
|---|---|
no-cross-service-mutations | no-foreign-write: 所有者来自 defineService是因为 model 财务报告和审定财务报表 writes,所以没有允许者保留 |
no-direct-prisma-mutations | no-untracked-write (没有) this.create 首选:通过 db(中文(简体) ) |
no-manual-collection-events | no-manual-emit (收集从履带式写作中获得的三角洲) |
no-raw-socket-emit, (中文(简体) ), no-raw-socket-on | no-raw-socket,没有针对应用程序的默认豁免 |
no-raw-service-room-string | 删除:实体和收集室属于框架(no-manual-emit 报告 qd: 名称) |
require-zod-schema | 删除: 宣布每一种合同方法 input 财务报告和审定财务报表 output |
no-service-method-record, (中文(简体) ), no-unsafe-payload-cast | 删除: 没有服务类或 defineMethod 通用;投入由合同打出 |
no-raw-button-strings, (中文(简体) ), no-raw-tooltip-strings, (中文(简体) ), no-raw-typography-strings | 移动到 oxlint.template.jsonc |
发展中国家
bun run --filter @fitzzero/quickdraw-lint test 运行每个规则的案件
由牛林自己负责 RuleTester (单位:千美元)oxlint/plugins-dev:克林特的剖析器和
插件运行时间, in vitest),以及 plugin/test/oxlint.test.mjs 运行牛林
带有已运出配置的 CLI : 每条规则必须在此报告其实例( 使用
模板配置, 核心软件包的固定程序必须通过
判断服务定义的规则和基线命令
圆通相去. plugin/test/check.test.mjs 运行配置路径覆盖
从应用程序根和软件包目录中,以及 quickdraw-lint check。 。 。 .
该插件的 .mjs 文档和 bin/ 船是怎样的,没有建筑.