You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
1.2 KiB
JavaScript

'use strict';
const createError = require("create-error");
const DatabaseError = require("./database-error");
let UnknownError = createError("UnknownError");
let handlers = [
require("./errors/unique-constraint-violation"),
require("./errors/check-constraint-violation"),
require("./errors/foreign-key-constraint-violation"),
require("./errors/enum"),
require("./errors/invalid-type"),
require("./errors/undefined-column"),
require("./errors/not-null-constraint-violation"),
]
function convertError(error) {
let handler = handlers.find(handler => handler.check(error));
if (handler != null) {
return handler.convert(error);
} else {
throw new UnknownError("The specified error is not of a recognized type");
}
}
function rethrowBetterError(originalError) {
try {
let betterError = convertError(originalError);
throw betterError;
} catch (err) {
if (err instanceof UnknownError) {
throw originalError;
} else {
throw err;
}
}
}
let errorTypes = handlers.reduce((errors, handler) => {
errors[handler.errorName] = handler.error;
return errors;
}, {});
module.exports = Object.assign({
convert: convertError,
rethrow: rethrowBetterError,
UnknownError: UnknownError,
DatabaseError: DatabaseError
}, errorTypes)