UNPKG

tripledoc

Version:

Library to read, create and update documents on a Solid Pod

67 lines (50 loc) 1.66 kB
'use strict'; var template = require('string-template'); var extend = require('xtend/mutable'); var assert = require('assert'); var isWordBoundary = /[_.-](\w|$)/g; module.exports = TypedError; function TypedError(args) { assert(args, 'TypedError: must specify options'); assert(args.type, 'TypedError: must specify options.type'); assert(args.message, 'TypedError: must specify options.message'); assert(!has(args, 'fullType'), 'TypedError: fullType field is reserved'); var message = args.message; if (args.type && !args.name) { var errorName = camelCase(args.type) + 'Error'; args.name = errorName[0].toUpperCase() + errorName.substr(1); } extend(createError, args); createError._name = args.name; return createError; function createError(opts) { var result = new Error(); Object.defineProperty(result, 'type', { value: result.type, enumerable: true, writable: true, configurable: true }); var options = extend({}, args, opts); if (!options.fullType) { options.fullType = options.type; } extend(result, options); if (opts && opts.message) { result.message = template(opts.message, options); } else if (message) { result.message = template(message, options); } return result; } } function camelCase(str) { return str.replace(isWordBoundary, upperCase); } function upperCase(_, x) { return x.toUpperCase(); } function has(obj, key) { return Object.prototype.hasOwnProperty.call(obj, key); }