Skip to content

Prefer Membership Filter In Jecs

ErrorAuto-fixableRoblox
small-rules/prefer-membership-filter-in-jecs

Move discarded Jecs query component values into a membership-only with filter.

Rationale

query() returns component values in argument order. When a loop does not consume one of those values, putting the component in with() makes its membership-only role explicit. This is a clarity rule, not a generated-code performance claim.

The rule handles direct query chains only. It leaves stored queries and rest bindings alone, and it withholds a fix when moving a component expression could change evaluation order or side effects.

Diagnostic Messages

preferMembershipFilter
Move components whose values are not consumed from query() to with().

Configuration

This rule does not accept options.

{
"jsPlugins": [
"@pobammer-ts/small-rules"
],
"rules": {
"small-rules/prefer-membership-filter-in-jecs": "error"
}
}

Examples

discarded queried component value
import { world } from "@rbxts/jecs";
const gameWorld = world();
for (const [entity, visual, transform] of gameWorld.query(Visual, Transform).with(User)) {
render(entity, visual);
}

After auto-fix

import { world } from "@rbxts/jecs";
const gameWorld = world();
for (const [entity, visual] of gameWorld.query(Visual).with(Transform, User)) {
render(entity, visual);
}
membership-only components in with
import { world } from "@rbxts/jecs";
const gameWorld = world();
for (const [entity, visual] of gameWorld.query(Visual).with(Transform, User)) render(entity, visual);