@aurelienbn/克林特-插文-xstate
17个xState v5 和 v6 alpha 机器的克林特规则(使用 @xstate/effect),与 setup().createMachine(),形状 eslint-plugin-xstate 看不见.
v6 支持被选中
[email protected], (中文(简体) ),@xstate/[email protected]财务报告和审定财务报表@xstate/[email protected];α APIs可以在发行间移动.
eslint-plugin-xstate | 此插件 | |
|---|---|---|
setup().createMachine() 机器 | 裸着 createMachine 仅被调用 | qq 设置意识 |
XState v6 alpha + 状态 @xstate/effect | ❌ | v5和v6拼写 |
| 维持 | QQ 上次发布 2023- 12, ESLint 8 同行 | 牛林 >= 1.82.0 < 2.0.0 |
pnpm add -D @aurelienbbn/oxlint-plugin-xstate oxlint
{
"jsPlugins": ["@aurelienbbn/oxlint-plugin-xstate"],
"rules": {
"xstate/require-setup-create-machine": "error",
"xstate/no-context-mutation": "error",
"xstate/require-effect-actor": "error",
"xstate/no-deferred-enqueue": "error"
}
}
无预设,无自定义:按名称启用每个规则.
13个固体、2个MayBE、2个已贬值
solid █████████████ 13 error
MAYBE ██ 2 off or warn: no-unreachable-transition · promise-actor-abort-signal
deprecated ██ 2 v5 only: no-imperative-action-creator · prefer-send-to
no-imperative-action-creator 财务报告和审定财务报表 prefer-send-to 自0.2.0起贬值. XState v6 移除动作创建器并 sendParent (导入一个是类型错误);两种规则在迁移前仍然在v5上工作.
no-direct-named-action 与显示直接的上游 v6 文档相矛盾 actions.x(...) 打电话 无论如何,它都报告他们:在α.64中,一个直通电话两次跑一次 send在纯度期间运行 transition() 财务报告和审定财务报表 snapshot.can()。 。 。 .
什么火吗
setup({ types: {} }).createMachine({
entry: ({ context }) => {
assign({ count: context.count + 1 });
}, // ❌ no-imperative-action-creator: builds an action, runs nothing
});
setup({ types: {} }).createMachine({
entry: assign({ count: ({ context }) => context.count + 1 }), // ✅
});
actorRef.send({ type: "ADD_ITEM", id: "x" }); // ❌ require-event-satisfies
actorRef.send({ type: "ADD_ITEM" } satisfies CartEvent); // ✅
setup({}).createMachine({ id: "app.cart" });
// ❌ require-setup-create-machine: neither `types` (v5) nor `schemas` (v6)
// v6 alpha / @xstate/effect
createActor(setupEffect({ actors }).createMachine(config)); // ❌ require-effect-actor: status 'error', use createEffectActor
on: { SAVE: (_, enq) => { setTimeout(() => enq.raise({ type: "SAVED" }), 100); } } // ❌ no-deferred-enqueue
on: { SAVE: (_, enq) => { enq.raise({ type: "SAVED" }, { delay: 100 }); } } // ✅
after: { "5m": { target: "expired" } } // ❌ valid-duration: write "PT5M" or 300000
require-event-satisfies 类型被删除的事项
setup({ types }) machine ──▶ TypeScript already checks the payload → rule redundant
sendTo / sendParent targets,
AnyActorRef, untyped refs ──▶ event type erased → rule is the only check
完全输入代码库? 缩小 sendCalleeNames 给被抹去的发件人. satisfies unknown 编号 : any 规则是执行语法,而不是预期的事件结合.
选项和默认
| 规则 | 选项 | 默认 |
|---|---|---|
machine-naming | pattern | ^[a-z][a-z0-9-]*\.[a-z][a-z0-9-]*$ (基因活性克巴布(kebab-case)取名空间,不特指io) |
named-actor-src | v5 文件 : invoke.src 或第一个参数: spawnChild 编号 : enqueue.spawnChild 是一个调用,一个函数,或者一个不绑定于字符串常数的标识符; v6: 第一个参数 enq.spawn 这是一个呼吁, new,或函数 | false· ; true 还检查 spawn(...) 从一个 assign 参数或 v6 上下文厂。 xqq v6 文件( 没有只导入 v5 文件, 没有) types: invoke.src,标识符 |
guards | false· ; true 还报告内在函数 guard 数值 | |
no-context-mutation | allowCollectionMethods | false· ; true 豁免地图/设置 set 编号 : add 编号 : delete 编号 : clear; v6 类型 createLogic 编号 : createAsyncLogic 编号 : <setup>.createInvoke 编号 : createStateConfig(path, config), (中文(简体) ), setupEffect (单位:千美元)@xstate/effect, (中文(简体) ), .provide 编号 : .extend |
require-event-satisfies | sendCalleeNames | ["send", "raise", "sendTo", "sendParent", "emit", "sendBack"]; v6 类型 enq.raise 编号 : sendTo 编号 : emit 编号 : sendBack 处理器的第二个参数; @xstate/effect send(actor, ev) 编号 : send(ev)· ; .send 打开 <system>.createActor 财务报告和审定财务报表 yield* createEffectActor 参考 |
每项规则的确切触发因素和范围
| 规则 | * 开火 | 匹配/ QQ 跳过 |
|---|---|---|
no-imperative-action-creator | qq已贬值(只有v5). assign 编号 : raise 编号 : sendTo 编号 : sendParent 编号 : forwardTo 编号 : emit 编号 : cancel 编号 : stopChild 编号 : stop 编号 : spawnChild 编号 : log 编号 : enqueueActions 作为被丢弃的语句(亦包括 void 编号 : await,或用简洁的箭头返回 entry 编号 : exit 编号 : actions 或者说 setup({ actions }) | 从 xstate或调用 setup() 结果 |
no-context-mutation | 任务, ++ 编号 : --, (中文(简体) ), delete,或根植于 context 或者说 snapshot.context 编号 : getSnapshot().context | context 由内部执行功能解构 setup 编号 : createMachine 编号 : createStateConfig 编号 : createAction 编号 : assign 编号 : enqueueActions方法: push, (中文(简体) ), pop, (中文(简体) ), shift, (中文(简体) ), unshift, (中文(简体) ), splice, (中文(简体) ), sort, (中文(简体) ), reverse, (中文(简体) ), fill, (中文(简体) ), copyWithin, (中文(简体) ), set, (中文(简体) ), add, (中文(简体) ), delete, (中文(简体) ), clear地图/地图 allowCollectionMethods: true |
no-machine-in-render | createMachine, (中文(简体) ), <setup>.createMachine (包括:. setupEffect, (中文(简体) ), system.setup, (中文(简体) ), createActor, (中文(简体) ), <system>.createActor, (中文(简体) ), interpret, (中文(简体) ), createActorAtoms 直接在部件或钩体中 | 最近的附加函数是一个组件( q)/^[A-Z]/)或钩(/^use[A-Z]/, (中文(简体) ), memo 编号 : forwardRef 包含, 在导入的文件中 react 或者说 @xstate/react. . . . . . useMemo, (中文(简体) ), useEffect处理者, machine.provide(...) |
named-actor-src | invoke.src 或第一个参数: spawnChild 编号 : enqueue.spawnChild 那是一个调用,一个函数,或者一个不绑定于字符串常数的标识符 | invoke.src 内 createMachine 编号 : <setup>.createMachine 编号 : <setup>.createStateConfig 相会. 成员表达式 |
stable-selector-result | 内入 useSelector 或者说 actor.select 选择器返回新的对象/阵列,没有参照参数 | useSelector 从 @xstate/react, (中文(简体) ), @xstate/store-react遗产 @xstate/store/react, (中文(简体) ), <ActorContext>.useSelector。新鲜=对象/阵列正文, .map 编号 : .filter 编号 : .flatMap 编号 : .toSorted, (中文(简体) ), Object.keys 编号 : values 编号 : entries· ; .select 打开 createActor 编号 : <system>.createActor 编号 : useActorRef 裁判员。 原子数 .select |
require-setup-create-machine | createMachine, (中文(简体) ), setup, (中文(简体) ), setupEffect 或者说 <system>.setup 他们的字面特征没有 types 也没有 schemas,除非每个 .createMachine 编号 : .extend 在文件的设置上声明 | 命名和命名空间导入,别名,词典阴影。 ⏭️ setup(...) 无法静态读取的参数( 识别符、 扩展符) |
require-event-satisfies | 发送到不包含的对象升字事件 satisfies | send, (中文(简体) ), raise, (中文(简体) ), sendTo, (中文(简体) ), sendParent, (中文(简体) ), emit 从 xstate· ; enqueue.raise 编号 : sendTo 编号 : sendParent 编号 : emit 打开 enqueueActions' enqueue· ; .send 参考书目 createActor, (中文(简体) ), useActorRef, (中文(简体) ), <ActorContext>.useActorRef(),则 useMachine 编号 : useActor 二联( t)send 和演员-后备插槽)。 无关 .send 方法 |
machine-naming | 当前静态机器 id 失败 pattern | * 缺少身份证; createStateConfig (状态-节点标识,而不是机器标识) |
no-unreachable-transition | 未加保护的分支不持续于 always, (中文(简体) ), on.<EVENT>, (中文(简体) ), after.<DELAY>, (中文(简体) ), onDone, (中文(简体) ), onError 数组( v5); 无目标无条件 always 与 actions 或者说 context,或者一个 v6 always 函数返回无目标 { context } 在每个路径上补丁( 无限循环) | 有分数或计算键的分枝 |
prefer-send-to | qq已贬值(只有v5). sendParent 进口自 xstate,以及 <object>.sendParent(...) 例如 enqueue.sendParent | |
promise-actor-abort-signal | 内入 fromPromise, (中文(简体) ), createAsyncLogic({ run }) 或者说 <setup>.createInvoke({ src }) 全球逻辑 fetch 读作(无正文或正文) GET 编号 : HEAD从未引用 signal | 被包裹的HTTP客户端是隐形的 |
require-effect-actor | createActor 编号 : useMachine 编号 : useActor 编号 : useActorRef 编号 : createActorContext 给定 fromEffect* 逻辑或a setupEffect 机器(内含,通过 const, (中文(简体) ), .provide, (中文(简体) ), .extend(中文(简体) ) | ⏭️ createEffectActor, (中文(简体) ), createActorAtoms |
no-discarded-effect | enq(() => Effect.…),或从 entry 编号 : exit / 过渡 | Effect 进口自 effect。 。 。 Effect.run* 编号 : Effect.is*, (中文(简体) ), enq(actions.x, params) |
no-deferred-enqueue | enq 编号 : enq.* 在计时器内,承诺,听众或排队效应回调,或之后 await,在v6处理器中 | qq 同步回调(forEach, (中文(简体) ), createAsyncLogic run |
no-direct-named-action | actions.x(...) 在 v6 处理器中直接调用 | { actions } 编号 : { actions: a } 编号 : args.actions内部 enq(() => …),行动实施,上下文厂 |
valid-duration | 时间类似 after 键, timeout,或 createAsyncLogic 超时字符串 X状态无法解析和否 delays 条目名称 | 接受ms数字, <n>ms, (中文(简体) ), <n>s,ISO 8601 (中文(简体) )PT5M) (中文(简体) ). 仅报告 |
no-persist-live-snapshot | JSON.stringify 联 合 国 getSnapshot()页:1 useMachine 快照,或者说 subscribe 听众快照 | ⏭️ getPersistedSnapshot(), (中文(简体) ), getSnapshot().context,接收者不能证明是行为者 |
配置规则处理 <setup>.createStateConfig(...) (v6):第二个论点是: createStateConfig(path, config)作为机器配置。 v6 规则确认处理器为 entry 编号 : exit 编号 : always 编号 : on 编号 : after 编号 : onDone 编号 : onError 编号 : onSnapshot 编号 : onTimeout 编号 : to 插槽,与 enq 作为他们的第二个参数.
未运出 : no-deprecated-xstate-api。 。 。 . 类型意识 typescript/no-deprecated 已报告 interpret, (中文(简体) ), stop, (中文(简体) ), getNextSnapshot 以及其它问题 @deprecated 出口.
资信: no-imperative-action-creator 财务报告和审定财务报表 no-unreachable-transition 重新执行 eslint-plugin-xstate是因为 no-imperative-action 财务报告和审定财务报表 no-infinite-loop 思想(理查德·拉弗斯); no-discarded-effect 重新实施州/州的想法 no-inline-effect (麻省理工学院). 没有复制代码 .
登记的合同库存
从软件包导出 pnpm catalog. 规则特定选项和限制在上文和源测试中都有描述.
| 规则/检查 | 触发或审查范围 |
|---|---|
machine-naming | 要求 X State 机器ID 遵循配置的命名公约 . |
named-actor-src | 要求引用.src和产卵儿童() (X State v5)和enq.spawn () (X State v6) 引用按键而不是内置演员逻辑在设置({ 演员})中声明的演员. |
no-context-mutation | XState 语境中被禁的就地变异(在上下文或shapt.context上指定、删除和变异数组/Map/Set方法). |
no-deferred-enqueue | 禁止从计时器中调用 v6 处理器的 enq, 许诺, 倾听, 或 等效回调, 或等待之后 . |
no-direct-named-action | 禁用在 v6 处理器中直接调用命名动作, 而不是 enq( actions. name, params) . |
no-discarded-effect | 在 inline enq( () QQ.) 效应内所建的或从机器处理器返回的禁用效果, X State 丢弃它们未运行 . |
no-imperative-action-creator | Forbid X State 动作创建者( 指定, 提升, send To, ...) 调用为已丢弃的语句或从内置动作函数返回, 在那里他们默默无声 . |
no-machine-in-render | Forbid 创建 Machine, setup (. create Machine), create Actor, system.create Actor, 解释并创建 ActorAtoms 直接在一个 React 组件或钩身中调用. |
no-persist-live-snapshot | Forbid JSON.stringify of a actor's live快照(GetSnapshot (),使用Machine快照,订阅者听众快照),而不是取PersistedSnapshot (). |
no-unreachable-transition | 强制将一个无保护的过渡放置在同一过渡阵列(XState v5)的其他分支上,并且无目标过渡总是会重新运行其动作或上下文永远更新. |
prefer-send-to | Prefer sendTo () 由演员参考器通过输入通过 sendParrent () and enqueue. sendParrent (). |
promise-actor-abort-signal | 需要内置的同声演员逻辑(来自Promise, CreateAsyncLogic run, CreateInvoke src),该逻辑要求获取一个读取以转发演员的中止信号. |
require-effect-actor | 要求以创建效果Actor开始@xstate/effect逻辑(从effect *,设置效果机),而不是创建Actor或@xstate/ react hooks. |
require-event-satisfies | 要求发送到机器上的物体读取事件符合. |
require-setup-create-machine | 要求 X State 机器在创建 Machine (), 设置 (), 设置效果 () 或 system. setup () 上声明类型 (XState v5) 或 schemas (XState v6) . |
stable-selector-result | 禁入内行使用Selector 和 actor. 选择当没有通过参照参数时返回新对象或数组的选择器. |
valid-duration | 要求在按键后, 状态超时, 并创建 AsyncLogic 超时, 作为持续时间字符串写入以使用格式 X State 剖析, 除非它们指定一个已声明的延迟 . |
信用概念
- 由Sandro Maglione(启发、独立重新执行)自动操作
- 由Richard Laffers(概念)撰写
- 由理查德·拉弗斯所著 (概念)
- statelyai/xstate no-inline-effect(麻省理工学院;概念,独立执行)