oxlint-plugin-inhuman
v0.1.11
Published
Oxlint JS plugin for opinionated rules that steer AI and humans toward explicit, guard-clause-first, error-safe code.
Maintainers
Readme
oxlint-plugin-inhuman
Opinionated Oxlint rules that encode pet peeves and steer AI toward explicit, safer code.
This plugin also re-exposes the no-branching rules under the inhuman/* namespace from
oxlint-plugin-no-branching.
Install
npm i -D oxlint-plugin-inhumanOxlint Config (Explicit)
Oxlint requires enabling JS plugin rules explicitly under rules.
{
"jsPlugins": ["oxlint-plugin-inhuman"],
"rules": {
"inhuman/require-guard-clauses": "error",
"inhuman/no-swallowed-catch": "error",
"inhuman/export-code-last": "error",
"inhuman/no-empty-wrappers": "error",
"inhuman/no-local-property-alias": "error",
"inhuman/no-single-use-local-function": "error",
"inhuman/max-function-size": "error",
"inhuman/no-switch": "error",
"inhuman/no-else": "error"
}
}Rules
inhuman/require-guard-clauses
Forbids a single wrapper if (...) { ... } that is the entire function body.
inhuman/no-swallowed-catch
Forbids empty or comment-only catch blocks, including catch { /* ignore */ }.
inhuman/export-code-last
Requires value exports at the bottom of the file. Type-only exports are exempt and may appear anywhere.
Local export lists like export { b } are not allowed; export the declaration directly instead.
Local alias exports like export const x = y are also not allowed.
Default exports must be on declarations; export default foo is only allowed when foo is a variable used internally.
Primitive export const values (for example strings, numbers, booleans, null, bigint, or static templates) are exempt and may appear at the top.
Direct Zod schema exports (for example export const User = z.object(...)) are exempt and may appear at the top, including the colocated export type User = z.infer<typeof User> pattern.
Direct Effect schema exports are also exempt (for example export const User = Schema.Struct(...) or export const User = S.Struct(...) from effect/Schema), including colocated type aliases like export type User = Schema.Schema.Type<typeof User>.
Options default:
allowReExport: false
Optional config:
{
"rules": {
"inhuman/export-code-last": ["error", { "allowReExport": true }]
}
}inhuman/no-empty-wrappers
Forbids empty wrapper functions that only pass through to a single call. Also forbids hiding the pass-through call behind a temporary variable and immediately returning it.
inhuman/no-local-property-alias
Forbids local aliases for property reads like const fooBar = Foo.bar.
Names that communicate snapshot or boundary intent are allowed by allow-name-pattern.
Options default:
allow-name-pattern: "(^|_)(original|snapshot|initial|previous|cached|bound)($|[A-Z_])|(Original|Snapshot|Initial|Previous|Cached|Bound)$"
Optional config:
{
"rules": {
"inhuman/no-local-property-alias": [
"error",
{
"allow-name-pattern": "(Original|Snapshot|Initial|Cached|Bound)$"
}
]
}
}inhuman/no-single-use-local-function
Forbids local functions with one return expression that are called once.
Names matching settings.inhuman.predicateNamePattern are exempt.
The rule-level predicateNamePattern option overrides the shared setting.
Settings default:
settings.inhuman.predicateNamePattern: "^(is|has|can|should|must|needs|will)[A-Z_]"
Shared config:
{
"settings": {
"inhuman": {
"predicateNamePattern": "^(is|has|can|should|must|needs|will|keeps)[A-Z_]"
}
},
"rules": {
"inhuman/no-single-use-local-function": "error"
}
}Rule-local override:
{
"rules": {
"inhuman/no-single-use-local-function": [
"error",
{ "predicateNamePattern": "^(is|has|can|should)[A-Z_]" }
]
}
}inhuman/max-function-size
Limits functions while allowing named callback containers to use larger limits.
By default, functions are limited to 100 lines and common test suite containers are limited to 800 lines.
Use scoped entries to override the limit for functions inside named calls or functions.
Options default:
max-lines: 100scoped: [{ "inside": ["describe", "suite", "test", "test.describe"], "max-lines": 800 }]
Optional config:
{
"rules": {
"inhuman/max-function-size": [
"error",
{
"max-lines": 100,
"scoped": [
{
"inside": ["describe", "suite", "test", "test.describe"],
"max-lines": 800
}
]
}
]
}
}inhuman/no-switch
Re-exported from oxlint-plugin-no-branching.
inhuman/no-else
Re-exported from oxlint-plugin-no-branching.
Local Demo
bunx oxlint examplesExpected errors include:
examples/fail/wrapper-if.jsexamples/fail/swallowed-catch.jsexamples/fail/exports-before-non-export.jsexamples/fail/export-list.jsexamples/fail/export-alias.jsexamples/fail/export-alias-member.jsexamples/fail/export-alias-chain.jsexamples/fail/default-export-identifier.jsexamples/fail/default-export-unused-identifier.jsexamples/fail/empty-wrapper-impl.tsexamples/fail/empty-wrapper-generic.tsexamples/fail/empty-wrapper-local.tsexamples/fail/non-primitive-const-top.tsexamples/fail/switch.jsexamples/fail/else.jsexamples/fail/else-if.js
