| /** | 
|  * 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; | 
| } |