@aurelienbbn/oxlint-plugin-xstate

中文文档
0.2.0发布于 2026/10/14MITTypeScriptES Module构建来源已验证近 30 天下载 2417

X国产机器和演员的自定义克克林特规则.

中文使用文档
文档目录5 节
  1. 13个固体、2个MayBE、2个已贬值
  2. 什么火吗
  3. require-event-satisfies 类型被删除的事项
  4. 登记的合同库存
  5. 信用概念

@aurelienbn/克林特-插文-xstate

npm downloads CI license node

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-namingpattern^[a-z][a-z0-9-]*\.[a-z][a-z0-9-]*$ (基因活性克巴布(kebab-case)取名空间,不特指io)
named-actor-srcv5 文件 : invoke.src 或第一个参数: spawnChild 编号 : enqueue.spawnChild 是一个调用,一个函数,或者一个不绑定于字符串常数的标识符; v6: 第一个参数 enq.spawn 这是一个呼吁, new,或函数false· ; true 还检查 spawn(...) 从一个 assign 参数或 v6 上下文厂。 xqq v6 文件( 没有只导入 v5 文件, 没有) types: invoke.src,标识符
guardsfalse· ; true 还报告内在函数 guard 数值
no-context-mutationallowCollectionMethodsfalse· ; true 豁免地图/设置 set 编号 : add 编号 : delete 编号 : clear; v6 类型 createLogic 编号 : createAsyncLogic 编号 : <setup>.createInvoke 编号 : createStateConfig(path, config), (中文(简体) ), setupEffect (单位:千美元)@xstate/effect, (中文(简体) ), .provide 编号 : .extend
require-event-satisfiessendCalleeNames["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-creatorqq已贬值(只有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().contextcontext 由内部执行功能解构 setup 编号 : createMachine 编号 : createStateConfig 编号 : createAction 编号 : assign 编号 : enqueueActions方法: push, (中文(简体) ), pop, (中文(简体) ), shift, (中文(简体) ), unshift, (中文(简体) ), splice, (中文(简体) ), sort, (中文(简体) ), reverse, (中文(简体) ), fill, (中文(简体) ), copyWithin, (中文(简体) ), set, (中文(简体) ), add, (中文(简体) ), delete, (中文(简体) ), clear地图/地图 allowCollectionMethods: true
no-machine-in-rendercreateMachine, (中文(简体) ), <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-srcinvoke.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-machinecreateMachine, (中文(简体) ), setup, (中文(简体) ), setupEffect 或者说 <system>.setup 他们的字面特征没有 types 也没有 schemas,除非每个 .createMachine 编号 : .extend 在文件的设置上声明命名和命名空间导入,别名,词典阴影。 ⏭️ setup(...) 无法静态读取的参数( 识别符、 扩展符)
require-event-satisfies发送到不包含的对象升字事件 satisfiessend, (中文(简体) ), 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-toqq已贬值(只有v5). sendParent 进口自 xstate,以及 <object>.sendParent(...) 例如 enqueue.sendParent
promise-actor-abort-signal内入 fromPromise, (中文(简体) ), createAsyncLogic({ run }) 或者说 <setup>.createInvoke({ src }) 全球逻辑 fetch 读作(无正文或正文) GET 编号 : HEAD从未引用 signal被包裹的HTTP客户端是隐形的
require-effect-actorcreateActor 编号 : useMachine 编号 : useActor 编号 : useActorRef 编号 : createActorContext 给定 fromEffect* 逻辑或a setupEffect 机器(内含,通过 const, (中文(简体) ), .provide, (中文(简体) ), .extend(中文(简体) )⏭️ createEffectActor, (中文(简体) ), createActorAtoms
no-discarded-effectenq(() => Effect.…),或从 entry 编号 : exit / 过渡Effect 进口自 effect。 。 。 Effect.run* 编号 : Effect.is*, (中文(简体) ), enq(actions.x, params)
no-deferred-enqueueenq 编号 : enq.* 在计时器内,承诺,听众或排队效应回调,或之后 await,在v6处理器中qq 同步回调(forEach, (中文(简体) ), createAsyncLogic run
no-direct-named-actionactions.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-snapshotJSON.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-mutationXState 语境中被禁的就地变异(在上下文或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-creatorForbid X State 动作创建者( 指定, 提升, send To, ...) 调用为已丢弃的语句或从内置动作函数返回, 在那里他们默默无声 .
no-machine-in-renderForbid 创建 Machine, setup (. create Machine), create Actor, system.create Actor, 解释并创建 ActorAtoms 直接在一个 React 组件或钩身中调用.
no-persist-live-snapshotForbid JSON.stringify of a actor's live快照(GetSnapshot (),使用Machine快照,订阅者听众快照),而不是取PersistedSnapshot ().
no-unreachable-transition强制将一个无保护的过渡放置在同一过渡阵列(XState v5)的其他分支上,并且无目标过渡总是会重新运行其动作或上下文永远更新.
prefer-send-toPrefer 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(麻省理工学院;概念,独立执行)

版本与发布记录

@aurelienbbn/oxlint-plugin-xstate 共发布 3 个版本,首次发布于 2026/09/25;过去 12 个月发布了 3 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.2.0latest2026/10/1424 天前
0.1.12026/09/251 个月前
0.1.02026/09/251 个月前

关于 @aurelienbbn/oxlint-plugin-xstate 的常见问题

@aurelienbbn/oxlint-plugin-xstate 是什么?

X国产机器和演员的自定义克克林特规则.

如何安装 @aurelienbbn/oxlint-plugin-xstate?

在项目目录运行 npm install @aurelienbbn/oxlint-plugin-xstate,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:oxlint(>=1.82.0 <2.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@aurelienbbn/oxlint-plugin-xstate 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@aurelienbbn/oxlint-plugin-xstate 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@aurelienbbn/oxlint-plugin-xstate 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^22.19.0 || ^24.11.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@aurelienbbn/oxlint-plugin-xstate 可以商用吗?

@aurelienbbn/oxlint-plugin-xstate 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@aurelienbbn/oxlint-plugin-xstate 的下载量有多少?

根据 npm 官方下载统计,@aurelienbbn/oxlint-plugin-xstate 在 2026/10/07 – 2026/11/05 这 30 天内被下载 2,417 次,日均约 81 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@aurelienbbn/oxlint-plugin-xstate 还在维护吗?

最新版本 0.2.0 发布于 2026/10/14(24 天前);至今共发布 3 个版本,其中过去 12 个月发布了 3 个;首次发布于 2026/09/25。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。