npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@icapps/tree-house-errors

v3.3.0

Published

NodeJS default error definitions with an error parser utility function

Downloads

311

Readme

Treehouse errors

Custom NodeJS error classes and definitions with an error parser utility function

npm version Dependencies Build Status Coverage Status Greenkeeper badge

Installation

Install via npm

npm install @icapps/tree-house-errors

or via yarn

yarn add @icapps/tree-house-errors

Error types

ApiError

Base error class which extends from the Error class. ApiError accepts a generic T for the details property; if not specified, it defaults to any.

// All keys are required
const error = {
  code: 'BAD_REQUEST_DUE_TO',
  message: 'This is a bad request',
}

// All keys are optional
const optionalArgs = {
  message: 'Overwrite the message for custom error',
  detail: 'Extra details containing pertinent information',
  stack: 'stacktrace...',
}

throw new ApiError(400, error, optionalArgs);

GenericError

Extends from ApiError with a preset of status code 0 and GENERIC_ERROR as error. This should be used when it's internal without needing an actual status code.

throw new GenericError(); // or
throw new GenericError(error, optionalArgs);

BadRequestError

Extends from ApiError with a preset of status code 400 and BAD_REQUEST as error.

throw new BadRequestError(); // or
throw new BadRequestError(error, optionalArgs);

NotFoundError

Extends from ApiError with a preset of status code 404 and RESOURCE_NOT_FOUND as error.

throw new NotFoundError(); // or
throw new NotFoundError(error, optionalArgs);

ForbiddenError

Extends from ApiError with a preset of status code 403 and FORBIDDEN as error.

throw new ForbiddenError(); // or
throw new ForbiddenError(error, optionalArgs);

InternalServerError

Extends from ApiError with a preset of status code 500 and INTERNAL_ERROR as error.

throw new InternalServerError(); // or
throw new InternalServerError(error, optionalArgs);

UnauthorizedError

Extends from ApiError with a preset of status code 401 and UNAUTHORIZED as error.

throw new UnauthorizedError(); // or
throw new UnauthorizedError(error, optionalArgs);

ValidationError

Extends from ApiError with a preset of status code 400 and INVALID_INPUT as error.

throw new ValidationError(); // or
throw new ValidationError(error, optionalArgs);

AuthenticationError

Extends from ApiError with a preset of status code 400 and AUTHENTICATION_FAILED as error.

throw new AuthenticationError(); // or
throw new AuthenticationError(error, optionalArgs);

Error definitions

Predefined error types that can be used over multiple projects with a message and code per type. The current list provides following errors:

INTERNAL_ERROR:         { code: 'INTERNAL_ERROR',i18n: 'internal_error',message: 'An unkown error occurred' },
INVALID_INPUT:          { code: 'INVALID_INPUT', i18n: 'invalid_input', message: 'Invalid input provided' },
AUTHENTICATION_FAILED:  { code: 'AUTHENTICATION_FAILED', i18n: 'authentication_failed', message: 'Authentication failed' },
BAD_REQUEST:            { code: 'BAD_REQUEST', i18n: 'bad_request', message: 'Bad request' },
MISSING_HEADERS:        { code: 'MISSING_HEADERS', i18n: 'missing_headers', message: 'Missing headers' },
UNAUTHORIZED:           { code: 'UNAUTHORIZED', i18n: 'unauthorized', message: 'Unauthorized' },
FORBIDDEN:              { code: 'FORBIDDEN', i18n: 'forbidden', message: 'No access' },
RESOURCE_NOT_FOUND:     { code: 'RESOURCE_NOT_FOUND', i18n: 'resource_not_found', message: 'Resource not found' },

Example

import { errorConfig as errors } from '@icapps/tree-house-errors'
throw new ApiError(400, errors.BAD_REQUEST);

Error parsing

isApiError(apiError, type?)

Will return boolean indicating whether error is instance of ApiError. Can also be used to provide an extra check matching a specific error type (will only match code, not message)

  // Will return true
  isApiError(new BadRequestError())

  // Will return false
  isApiError(new Error('Something'))

  // Will return true
  isApiError(new BadRequestError(errors.MY_CUSTOM_ERROR), errors.MY_CUSTOM_ERROR)

Will automatically cast to ApiError if succeeds and using Typescript

isJsonApiError(object)

Will return boolean indicating whether object has all required properties to be a parsed ApiError.

  // Will return true
  isJsonApiError({ status: 200, code: 'MY_CODE', title: 'MY_ERROR', detail: {} })

  // Will return false
  isJsonApiError({ status: 200, code: 'MY_CODE' })

Will automatically cast to ParsedError if succeeds and using Typescript

parseErrors(error, i18nOptions (optional))

Parse any data into an error object with all properties needed for jsonade parser. Also parses express-validation and celebrate errors.

const error = new BadRequestError(...);
const parsedError = parseErrors(error);

// jsonade serializer afterwards (optional)
serializer.serialize([parsedError]);

With i18n support (optional):

const error = new BadRequestError(...);
const parsedError = parseErrors(error, {
  defaultLocale: 'en',          // Optional (defaults to 'en')
  language: 'nl',               // Optional (defaults to 'en')
  path: __dirname = '/locales',
});

// jsonade serializer afterwards (optional)
serializer.serialize([parsedError]);

The parseErrors function will load the i18n configuration once, and reuse the same instance afterwards. It is not possible to overwrite the configuration after the first call. This has to do with performance and caching of translations.

parseJsonErrors(object)

Parse json object containing errors into javascript ApiError instances. Will return an array with all non-errors filtered out or default InternalServerError if no errors were found.

  try {
    await doApiCall(...);
    // Returns { errors: [{ status: 400, code: 'BAD_REQUEST', ... }] }
  } catch(errorResponse) {
    const errors = parseJsonResponse(errorResponse);
    // Will return array containing `ApiError` objects
  }

Make sure the object contains an errors root key: { errors: [ ... ] }

Tests

  • You can run npm run test to run all tests
  • You can run npm run test:coverage to run all tests with coverage report

Bugs

When you find issues, please report them:

Be sure to include all of the output from the npm command that didn't work as expected. The npm-debug.log file is also helpful to provide.

Authors

See the list of contributors who participated in this project.

License

This project is licensed under the ISC License - see the LICENSE.md file for details