| /** |
| * Used to create Error subclasses until the community moves away from ES5. |
| * |
| * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors |
| * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123 |
| * |
| * @param createImpl A factory function to create the actual constructor implementation. The returned |
| * function should be a named function that calls `_super` internally. |
| */ |
| export function createErrorClass<T>(createImpl: (_super: any) => any): T { |
| const _super = (instance: any) => { |
| Error.call(instance); |
| instance.stack = new Error().stack; |
| }; |
| |
| const ctorFunc = createImpl(_super); |
| ctorFunc.prototype = Object.create(Error.prototype); |
| ctorFunc.prototype.constructor = ctorFunc; |
| return ctorFunc; |
| } |