or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

anti-pattern-prevention-rules.mdarray-object-rules.mdcode-quality-rules.mdcode-style-rules.mddom-browser-rules.mdimport-export-rules.mdindex.mdmodern-javascript-rules.mdplugin-configuration.md
tile.json

code-quality-rules.mddocs/

Code Quality Rules

Rules focused on preventing bugs, improving code reliability, and enforcing best practices for error handling and code structure.

Capabilities

Better Regex

Improves regular expressions for better performance and readability.

/**
 * Optimizes regular expressions using clean-regexp
 * Suggests improvements for regex patterns
 */
'unicorn/better-regex': 'error' | 'warn' | 'off' | [
  'error' | 'warn',
  {
    sortCharacterClasses?: boolean; // Default: true
  }
];

Usage Examples:

// ❌ Bad - inefficient regex
const regex1 = /[0-9]/;
const regex2 = /[a-zA-Z0-9_]/;

// ✅ Good - optimized regex
const regex1 = /\d/;
const regex2 = /\w/;

Catch Error Name

Enforces consistent error parameter naming in catch blocks.

/**
 * Ensures catch block error parameters follow naming conventions
 * Default name is 'error', customizable via options
 */
'unicorn/catch-error-name': 'error' | 'warn' | 'off' | [
  'error' | 'warn',
  {
    name?: string; // Default: 'error'
    ignore?: string[]; // Default: []
  }
];

Usage Examples:

// ❌ Bad - inconsistent error naming
try {
  riskyOperation();
} catch (e) {
  console.log(e.message);
}

// ✅ Good - consistent error naming
try {
  riskyOperation();
} catch (error) {
  console.log(error.message);
}

Consistent Function Scoping

Enforces consistent function scoping by moving functions to appropriate scopes.

/**
 * Moves functions to higher scope when they don't reference local variables
 * Improves performance and readability
 */
'unicorn/consistent-function-scoping': 'error' | 'warn' | 'off' | [
  'error' | 'warn',
  {
    checkArrowFunctions?: boolean; // Default: true
  }
];

Usage Examples:

// ❌ Bad - function can be moved to module scope
function processData() {
  function helper(item) {
    return item.toString();
  }
  
  return data.map(helper);
}

// ✅ Good - helper function moved to module scope
function helper(item) {
  return item.toString();
}

function processData() {
  return data.map(helper);
}

Custom Error Definition

Enforces proper custom error class definitions.

/**
 * Ensures custom error classes extend Error correctly
 * Validates proper error constructor implementation
 */
'unicorn/custom-error-definition': 'error' | 'warn' | 'off';

Usage Examples:

// ❌ Bad - incomplete custom error
class CustomError {
  constructor(message) {
    this.message = message;
  }
}

// ✅ Good - proper custom error
class CustomError extends Error {
  constructor(message) {
    super(message);
    this.name = 'CustomError';
  }
}

Error Message

Enforces proper error message format and content.

/**
 * Validates error message format and suggests improvements
 * Encourages descriptive error messages
 */
'unicorn/error-message': 'error' | 'warn' | 'off';

Usage Examples:

// ❌ Bad - generic error message
throw new Error('Error');

// ✅ Good - descriptive error message
throw new Error('Invalid user ID: expected positive integer, received ' + userId);

Throw New Error

Enforces using new when throwing errors.

/**
 * Requires 'new' keyword when throwing Error constructors
 * Ensures proper error instantiation
 */
'unicorn/throw-new-error': 'error' | 'warn' | 'off';

Usage Examples:

// ❌ Bad - missing 'new' keyword
throw Error('Something went wrong');

// ✅ Good - using 'new' keyword
throw new Error('Something went wrong');

Consistent Assert

Enforces consistent assertion message format.

/**
 * Ensures consistent assertion message patterns
 * Validates assert.ok, assert.equal, and similar calls
 */
'unicorn/consistent-assert': 'error' | 'warn' | 'off' | [
  'error' | 'warn',
  {
    assertionStyle?: 'always' | 'never'; // Default: 'always'
  }
];

Usage Examples:

import assert from 'assert';

// ❌ Bad - inconsistent assertion style
assert(condition);
assert.equal(actual, expected, 'Values should be equal');

// ✅ Good - consistent assertion style
assert(condition, 'Condition should be true');
assert.equal(actual, expected, 'Values should be equal');

Consistent Date Clone

Enforces consistent Date object cloning.

/**
 * Ensures consistent patterns for cloning Date objects
 * Prefers new Date(date) over other cloning methods
 */
'unicorn/consistent-date-clone': 'error' | 'warn' | 'off';

Usage Examples:

// ❌ Bad - inconsistent date cloning
const cloned1 = new Date(date.getTime());
const cloned2 = new Date(+date);

// ✅ Good - consistent date cloning
const cloned = new Date(date);

Consistent Destructuring

Enforces consistent destructuring patterns.

/**
 * Promotes consistent destructuring usage
 * Suggests destructuring when accessing multiple properties
 */
'unicorn/consistent-destructuring': 'error' | 'warn' | 'off';

Usage Examples:

// ❌ Bad - repeated property access
function processUser(user) {
  console.log(user.name);
  console.log(user.email);
  console.log(user.age);
}

// ✅ Good - consistent destructuring
function processUser(user) {
  const { name, email, age } = user;
  console.log(name);
  console.log(email);
  console.log(age);
}

Consistent Empty Array Spread

Enforces consistent empty array spreading patterns.

/**
 * Ensures consistent patterns when spreading empty arrays
 * Prevents unnecessary empty array spreads
 */
'unicorn/consistent-empty-array-spread': 'error' | 'warn' | 'off';

Usage Examples:

// ❌ Bad - unnecessary empty array spread
const result = [...[], ...items];

// ✅ Good - clean array spread
const result = [...items];

Consistent Existence Index Check

Enforces consistent patterns for checking array index existence.

/**
 * Promotes consistent array index existence checking
 * Suggests .includes() over indexOf() !== -1 patterns
 */
'unicorn/consistent-existence-index-check': 'error' | 'warn' | 'off';

Usage Examples:

// ❌ Bad - inconsistent existence check
if (array.indexOf(item) !== -1) {
  // handle found item
}

// ✅ Good - consistent existence check
if (array.includes(item)) {
  // handle found item
}

Explicit Length Check

Enforces explicit length checks instead of implicit truthy checks.

/**
 * Requires explicit length checks for arrays and strings
 * Improves code clarity and prevents subtle bugs
 */
'unicorn/explicit-length-check': 'error' | 'warn' | 'off' | [
  'error' | 'warn',
  {
    'non-zero'?: 'greater-than' | 'not-equal'; // Default: 'greater-than'
  }
];

Usage Examples:

// ❌ Bad - implicit length check
if (array) {
  // Process array
}

// ✅ Good - explicit length check
if (array.length > 0) {
  // Process array
}

No Accessor Recursion

Prevents infinite recursion in getter/setter methods.

/**
 * Detects potential infinite recursion in accessor methods
 * Prevents common getter/setter implementation mistakes
 */
'unicorn/no-accessor-recursion': 'error' | 'warn' | 'off';

Usage Examples:

class Example {
  // ❌ Bad - infinite recursion
  get value() {
    return this.value;
  }
  
  // ✅ Good - proper getter implementation
  get value() {
    return this._value;
  }
  
  set value(newValue) {
    this._value = newValue;
  }
}

No Useless Error Capture Stack Trace

Prevents unnecessary Error.captureStackTrace calls.

/**
 * Identifies unnecessary Error.captureStackTrace usage
 * Prevents redundant stack trace manipulation
 */
'unicorn/no-useless-error-capture-stack-trace': 'error' | 'warn' | 'off';

Usage Examples:

// ❌ Bad - unnecessary captureStackTrace
class CustomError extends Error {
  constructor(message) {
    super(message);
    Error.captureStackTrace(this, CustomError); // Unnecessary
  }
}

// ✅ Good - clean error class
class CustomError extends Error {
  constructor(message) {
    super(message);
    this.name = 'CustomError';
  }
}

Configuration Examples

Recommended Quality Rules Setup

export default [
  {
    plugins: {
      unicorn: eslintPluginUnicorn,
    },
    rules: {
      // Error prevention
      'unicorn/better-regex': 'error',
      'unicorn/catch-error-name': 'error',
      'unicorn/custom-error-definition': 'error',
      'unicorn/throw-new-error': 'error',
      
      // Code consistency
      'unicorn/consistent-function-scoping': 'error',
      'unicorn/consistent-destructuring': 'error',
      'unicorn/explicit-length-check': 'error',
      
      // Error handling best practices
      'unicorn/error-message': 'error',
      'unicorn/no-accessor-recursion': 'error',
      'unicorn/no-useless-error-capture-stack-trace': 'error',
    },
  },
];

Customized Quality Rules

export default [
  {
    plugins: {
      unicorn: eslintPluginUnicorn,
    },
    rules: {
      // Custom error naming convention
      'unicorn/catch-error-name': ['error', { name: 'err' }],
      
      // Custom assertion style
      'unicorn/consistent-assert': ['error', { assertionStyle: 'never' }],
      
      // Custom length check style
      'unicorn/explicit-length-check': ['error', { 'non-zero': 'not-equal' }],
      
      // Disable function scoping for arrow functions
      'unicorn/consistent-function-scoping': ['error', { checkArrowFunctions: false }],
    },
  },
];