id-length

Enforce a minimum and a maximum length for identifier names

A one-letter name such as e, n or x sends you back to the declaration to find out what it holds. A very long name makes every line that uses it hard to scan.

The rule checks a name where your code introduces it: variables, parameters, functions, classes, imports, object keys and class members. By default a name needs at least 2 characters, and there's no maximum.

Configure#

Off by default. To turn it on:

bunfig.toml
[lint.rules]
"id-length" = "error" # or "warn"

Every option, set to its default. The ones that are commented out are unset by default.

bunfig.toml
[lint.rules]
"id-length" = ["error", {
  min = 2,
  # max = <number>,
  properties = "always", # "always" or "never"
  exceptions = [], # list of strings
  exceptionPatterns = [], # list of strings
}]

Examples#

example.js4 problems
const n = items.length;

const prices = items.map((x) => x.price);

try {
  save();
} catch (e) {
  report(e);
}

const point = { y: 0 };
example.jsNo problems
const count = items.length;

const prices = items.map((item) => item.price);

try {
  save();
} catch (error) {
  report(error);
}

Type parameters aren't checked:

example.tsNo problems
function first<T>(items: T[]): T {
  return items[0];
}

Options#

bunfig.toml
[lint.rules]
id-length = ["error", { min = 3, max = 30, exceptions = ["i", "id"] }]
OptionDefaultWhat it does
min2The shortest name allowed.
maxnoneThe longest name allowed.
properties"always""never" stops checking object keys and the properties you assign to.
exceptions[]Names that are always allowed.
exceptionPatterns[]Regular expressions. A name that matches one is always allowed.
checkGenerictrueOnly for an oxlint config, where the rule also checks type parameters such as the T in Box<T>. false stops checking them. bunfig.toml rejects this option.
example.jswith { "max": 20 }1 problem
const numberOfItemsInTheShoppingCart = cart.items.length;
example.jswith { "exceptions": ["i"] }No problems
for (let i = 0; i < items.length; i++) {
  render(items[i]);
}
example.jswith { "exceptionPatterns": ["^[xyz]$"] }No problems
function move(x, y, z) {
  return [x + 1, y + 1, z + 1];
}

properties#

example.jswith { "properties": "never" }No problems
const point = { x: 0, y: 0 };
point.x = 10;

Variables and class members are still checked:

example.jswith { "properties": "never" }2 problems
const p = { x: 0, y: 0 };

class Point {
  x = 0;
}