Rules
Ajel Require Error Handling

ajel/ajel-require-error-handling

This rule enforces narrowing the error type with instanceof.

Summary

The ajel-require-error-handling rule ensures that when calling ajel or sjel, the error variable is properly narrowed using the instanceof operator. This helps developers perform more specific error handling and enhances the type safety of the code.

Rule Details

This rule checks for variable declarations associated with an ajel or sjel call and ensures that the error variable is subsequently narrowed using the instanceof operator in a BinaryExpression.

Why is this Rule Useful?

Properly narrowing the error type with instanceof promotes more precise error handling.

Options

  • ajelAlias (default: 'ajel'): Specify the alias for the ajel method. This allows you to customize the method name if it differs from the default 'ajel'.
  • sjelAlias (default: 'sjel'): Specify the alias for the sjel method. This allows you to customize the method name if it differs from the default 'sjel'.

Implementation

Examples

import { ajel, sjel } from 'ajel';
 
class CustomError extends Error { }
class CustomError2 extends Error { }
class CustomError3 extends Error { }
 
const foobarFn = async () => {
  const result = await ajel(Promise.resolve('result'));
  const result2 = sjel(JSON.parse, '{}');
  const result3 = await ajel(Promise.resolve('result'));
  const result5 = sjel((stringvar: string) => stringvar, '{}');
 
  //------ Test2 SJEL
  if (result2 instanceof CustomError) {
    //We can access the error here in BinaryExpression with var instanceof
    console.log(result2);
    return;
  }
 
  // Cant Access the result2 variable here
  // console.log(result2);
 
  if (result2 instanceof Error) {
    console.log(result2);
    // This return narrows the type of result2 to its Result
    return;
  }
  // Type is narrowed - no longer a union of Result | Error -> just Result
  console.log(result2);
 
  //------ Test AJEL
  // Cant Access the result variable here
  // console.log(result);
 
  switch (true) {
    case result instanceof CustomError3:
      //We can access the error here in BinaryExpression with var instanceof
      console.log(test);
      break;
    //We support fall through
    case result instanceof CustomError2:
    case result instanceof CustomError:
      console.log(result);
      break;
    case result instanceof Error:
      break;
  }
  console.log(result);
 
  //---- No handling of AJEL and SJEL returns reports Errors
  // console.log(result3);
  // console.log(result5);
};