routing-controllers
Version:
Create structured, declarative and beautifully organized class-based controllers with heavy decorators usage for Express / Koa using TypeScript.
90 lines • 3.73 kB
JavaScript
import { instanceToPlain } from 'class-transformer';
import { HttpError } from '../http-error/HttpError';
/**
* Base driver functionality for all other drivers.
* Abstract layer to organize controllers integration with different http server implementations.
*/
export class BaseDriver {
constructor() {
// -------------------------------------------------------------------------
// Public Properties
// -------------------------------------------------------------------------
/**
* Global application prefix.
*/
this.routePrefix = '';
}
// -------------------------------------------------------------------------
// Protected Methods
// -------------------------------------------------------------------------
transformResult(result, action, options) {
// check if we need to transform result
const shouldTransform = this.useClassTransformer && // transform only if class-transformer is enabled
action.options.transformResponse !== false && // don't transform if action response transform is disabled
result instanceof Object && // don't transform primitive types (string/number/boolean)
!((result instanceof Uint8Array || result.pipe instanceof Function) // don't transform binary data // don't transform streams
);
// transform result if needed
if (shouldTransform) {
const options = action.responseClassTransformOptions || this.classToPlainTransformOptions;
result = instanceToPlain(result, options);
}
return result;
}
processJsonError(error) {
if (!this.isDefaultErrorHandlingEnabled)
return error;
if (typeof error.toJSON === 'function')
return error.toJSON();
let processedError = {};
if (error instanceof Error) {
const name = error.name && error.name !== 'Error' ? error.name : error.constructor.name;
processedError.name = name;
if (error.message)
processedError.message = error.message;
if (error.stack && this.developmentMode)
processedError.stack = error.stack;
Object.keys(error)
.filter(key => key !== 'stack' &&
key !== 'name' &&
key !== 'message' &&
(!(error instanceof HttpError) || key !== 'httpCode'))
.forEach(key => (processedError[key] = error[key]));
if (this.errorOverridingMap)
Object.keys(this.errorOverridingMap)
.filter(key => name === key)
.forEach(key => (processedError = this.merge(processedError, this.errorOverridingMap[key])));
return Object.keys(processedError).length > 0 ? processedError : undefined;
}
return error;
}
processTextError(error) {
if (!this.isDefaultErrorHandlingEnabled)
return error;
if (error instanceof Error) {
if (this.developmentMode && error.stack) {
return error.stack;
}
else if (error.message) {
return error.message;
}
}
return error;
}
merge(obj1, obj2) {
const result = {};
for (const i in obj1) {
if (i in obj2 && typeof obj1[i] === 'object' && i !== null) {
result[i] = this.merge(obj1[i], obj2[i]);
}
else {
result[i] = obj1[i];
}
}
for (const i in obj2) {
result[i] = obj2[i];
}
return result;
}
}
//# sourceMappingURL=BaseDriver.js.map