ack-angular
Version:
Extra special directives, components, providers and pipes to aide in tackling everyday interface development needs in Angular2
98 lines • 13.8 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class ErrorLog {
constructor() {
this.log = [];
this.maxLog = 30;
}
monitorWindow(win) {
win = win || window;
const callback = (evt) => this.add(evt, false);
win.addEventListener('error', callback);
}
reject(err) {
const e = this.add(err);
return Promise.reject(e);
}
rejector() {
return (err) => this.reject(err);
}
add(e, toConsole) {
const ob = this.paramAudit(e, toConsole);
this.log.unshift(ob);
if (this.maxLog) {
while (this.log.length > this.maxLog) {
this.log.pop(); //remove last
}
}
return logObToErrorObject(ob);
}
//api error to js Error object
paramAudit(e, toConsole) {
if (e.constructor === String) {
e = new Error(e);
}
if (toConsole == null || toConsole)
console.error(e);
const err = this.objectifyError(e);
err['datetime'] = err['datetime'] || getDateTimeString();
if (!e.message && e.status == -1) {
e.message = "Cannot connect to server";
e.details = e.details || "Connection to internet maybe down. Also possible CORS needs be to enabled at remote server.";
}
return err;
}
/** Convert Error object to a regular object */
objectifyError(err) {
const keys = Object.getOwnPropertyNames(err);
keys.push.apply(keys, Object.keys(err));
const recErr = {}; //new Error(err.message || err.name || err.type || 'Unexpected Error Occured')
keys.forEach(v => recErr[v] = err[v]);
const knownKeys = ["stack", "message", "name", "arguments", "type"];
knownKeys.forEach(key => {
if (typeof err[key] != 'undefined') {
recErr[key] = err[key];
}
});
const body = err.body || err._body;
//auto attempt to parse body
if (body && !err.data && err.headers) {
const contentType = err.headers.get('content-type');
if (contentType && contentType.toLowerCase() == 'application/json') {
try {
recErr.data = JSON.parse(body);
}
catch (e) { }
}
}
return recErr;
}
/** same as reject but uses native throw instead of native Promise.reject */
rethrow(err) {
const e = this.add(err);
throw e;
}
}
ErrorLog.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.4", ngImport: i0, type: ErrorLog, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
ErrorLog.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.4", ngImport: i0, type: ErrorLog });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.4", ngImport: i0, type: ErrorLog, decorators: [{
type: Injectable
}] });
function getErrorMessage(err) {
return err.message || err.statusText || err.name || 'Unexpected Error Occured';
}
function getResponseMessage(res) {
if (res.data && res.data.error && res.data.error.message) {
return res.data.error.message;
}
return getErrorMessage(res);
}
function logObToErrorObject(log) {
const e = new Error(getResponseMessage(log));
Object.keys(log).forEach(v => e[v] = log[v]);
return e;
}
function getDateTimeString() {
return (function (d) { return (('0' + (d.getMonth() + 1)).slice(-2) + '/' + ('0' + d.getDate()).slice(-2) + '/' + d.getFullYear()); })(new Date()) + ' ' + (function (d) { var h = d.getHours(), t = 'AM', m = d.getMinutes(); var mn = m < 10 ? '0' + m : m; h = h >= 12 ? (t = 'PM', h - 12 || 12) : h == 0 ? 12 : h; return ('0' + h).slice(-2) + ':' + ('0' + mn).slice(-2) + ' ' + t; })(new Date());
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXJyb3JMb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvdmlkZXJzL0Vycm9yTG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTdCLE1BQU0sT0FBTyxRQUFRO0lBQW5DO1FBQ1MsUUFBRyxHQUFVLEVBQUUsQ0FBQTtRQUNmLFdBQU0sR0FBRyxFQUFFLENBQUE7S0FrRm5CO0lBaEZDLGFBQWEsQ0FBQyxHQUFTO1FBQ3JCLEdBQUcsR0FBRyxHQUFHLElBQUksTUFBTSxDQUFBO1FBQ25CLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQyxLQUFLLENBQUMsQ0FBQTtRQUNsRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBUTtRQUNiLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdkIsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzFCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0lBRUQsR0FBRyxDQUFDLENBQU0sRUFBRSxTQUFlO1FBQ3pCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFFLEVBQUUsQ0FBRSxDQUFDO1FBQ3ZCLElBQUcsSUFBSSxDQUFDLE1BQU0sRUFBQztZQUNiLE9BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUMs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QUFDLENBQUEsQ0FBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEdBQUMsR0FBRyxHQUFDLENBQUMsVUFBUyxDQUFDLElBQUUsSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFDLENBQUMsR0FBQyxJQUFJLEVBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBLElBQUksRUFBRSxHQUFHLENBQUMsR0FBQyxFQUFFLENBQUEsQ0FBQyxDQUFBLEdBQUcsR0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFBLENBQUMsR0FBRyxDQUFDLElBQUUsRUFBRSxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsR0FBQyxJQUFJLEVBQUMsQ0FBQyxHQUFDLEVBQUUsSUFBRSxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxJQUFFLENBQUMsQ0FBQSxDQUFDLENBQUEsRUFBRSxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQSxPQUFPLENBQUMsR0FBRyxHQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEdBQUcsR0FBQyxDQUFDLEdBQUcsR0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxHQUFHLEdBQUMsQ0FBQyxDQUFBLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzdULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKCkgZXhwb3J0IGNsYXNzIEVycm9yTG9ne1xuICBwdWJsaWMgbG9nOiBhbnlbXSA9IFtdXG4gIHB1YmxpYyBtYXhMb2cgPSAzMFxuXG4gIG1vbml0b3JXaW5kb3cod2luPzogYW55KXtcbiAgICB3aW4gPSB3aW4gfHwgd2luZG93XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoZXZ0OiBhbnkpID0+IHRoaXMuYWRkKGV2dCxmYWxzZSlcbiAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBjYWxsYmFjayk7XG4gIH1cblxuICByZWplY3QoZXJyOiBhbnkpe1xuICAgIGNvbnN0IGUgPSB0aGlzLmFkZChlcnIpXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpXG4gIH1cblxuICByZWplY3Rvcigpe1xuICAgIHJldHVybiAoZXJyOiBhbnkpID0+IHRoaXMucmVqZWN0KGVycilcbiAgfVxuXG4gIGFkZChlOiBhbnksIHRvQ29uc29sZT86IGFueSl7XG4gICAgY29uc3Qgb2IgPSB0aGlzLnBhcmFtQXVkaXQoZSx0b0NvbnNvbGUpXG4gICAgdGhpcy5sb2cudW5zaGlmdCggb2IgKTtcbiAgICBpZih0aGlzLm1heExvZyl7XG4gICAgICB3aGlsZSh0aGlzLmxvZy5sZW5ndGg+dGhpcy5tYXhMb2cpe1xuICAgICAgICB0aGlzLmxvZy5wb3AoKS8vcmVtb3ZlIGxhc3RcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvZ09iVG9FcnJvck9iamVjdChvYilcbiAgfVxuXG4gIC8vYXBpIGVycm9yIHRvIGpzIEVycm9yIG9iamVjdFxuICBwYXJhbUF1ZGl0KGU6IGFueSwgdG9Db25zb2xlPzogYW55KXtcbiAgICBpZihlLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpe1xuICAgICAgZSA9IG5ldyBFcnJvcihlIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgaWYodG9Db25zb2xlPT1udWxsIHx8IHRvQ29uc29sZSljb25zb2xlLmVycm9yKGUpXG5cbiAgICBjb25zdCBlcnIgPSB0aGlzLm9iamVjdGlmeUVycm9yKGUpO1xuICAgIGVyclsnZGF0ZXRpbWUnXSA9IGVyclsnZGF0ZXRpbWUnXXx8Z2V0RGF0ZVRpbWVTdHJpbmcoKVxuXG4gICAgaWYoIWUubWVzc2FnZSAmJiBlLnN0YXR1cz09LTEpe1xuICAgICAgZS5tZXNzYWdlID0gXCJDYW5ub3QgY29ubmVjdCB0byBzZXJ2ZXJcIlxuICAgICAgZS5kZXRhaWxzID0gZS5kZXRhaWxzIHx8IFwiQ29ubmVjdGlvbiB0byBpbnRlcm5ldCBtYXliZSBkb3duLiBBbHNvIHBvc3NpYmxlIENPUlMgbmVlZHMgYmUgdG8gZW5hYmxlZCBhdCByZW1vdGUgc2VydmVyLlwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGVyclxuICB9XG5cbiAgLyoqIENvbnZlcnQgRXJyb3Igb2JqZWN0IHRvIGEgcmVndWxhciBvYmplY3QgKi9cbiAgb2JqZWN0aWZ5RXJyb3IoZXJyOiBhbnkpe1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnIpXG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIE9iamVjdC5rZXlzKGVycikpXG5cbiAgICBjb25zdCByZWNFcnI6e2RhdGE/OmFueX0gPSB7fS8vbmV3IEVycm9yKGVyci5tZXNzYWdlIHx8IGVyci5uYW1lIHx8IGVyci50eXBlIHx8ICdVbmV4cGVjdGVkIEVycm9yIE9jY3VyZWQnKVxuICAgIGtleXMuZm9yRWFjaCh2PT5yZWNFcnJbdl09ZXJyW3ZdKVxuXG4gICAgY29uc3Qga25vd25LZXlzID0gW1wic3RhY2tcIixcIm1lc3NhZ2VcIixcIm5hbWVcIixcImFyZ3VtZW50c1wiLFwidHlwZVwiXVxuICAgIGtub3duS2V5cy5mb3JFYWNoKGtleT0+e1xuICAgICAgaWYodHlwZW9mIGVycltrZXldIT0ndW5kZWZpbmVkJyl7XG4gICAgICAgIHJlY0VycltrZXldID0gZXJyW2tleV1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgYm9keSA9IGVyci5ib2R5IHx8IGVyci5fYm9keVxuXG4gICAgLy9hdXRvIGF0dGVtcHQgdG8gcGFyc2UgYm9keVxuICAgIGlmKGJvZHkgJiYgIWVyci5kYXRhICYmIGVyci5oZWFkZXJzKXtcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gZXJyLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKVxuICAgICAgaWYoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUudG9Mb3dlckNhc2UoKT09J2FwcGxpY2F0aW9uL2pzb24nKXtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgcmVjRXJyLmRhdGEgPSBKU09OLnBhcnNlKGJvZHkpXG4gICAgICAgIH1jYXRjaChlKXt9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY0VyclxuICB9XG5cbiAgLyoqIHNhbWUgYXMgcmVqZWN0IGJ1dCB1c2VzIG5hdGl2ZSB0aHJvdyBpbnN0ZWFkIG9mIG5hdGl2ZSBQcm9taXNlLnJlamVjdCAqL1xuICByZXRocm93KGVycjogYW55KXtcbiAgICBjb25zdCBlID0gdGhpcy5hZGQoZXJyKVxuICAgIHRocm93IGVcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRFcnJvck1lc3NhZ2UoZXJyOiBhbnkpe1xuICByZXR1cm4gZXJyLm1lc3NhZ2UgfHwgZXJyLnN0YXR1c1RleHQgfHwgZXJyLm5hbWUgfHwgJ1VuZXhwZWN0ZWQgRXJyb3IgT2NjdXJlZCdcbn1cblxuZnVuY3Rpb24gZ2V0UmVzcG9uc2VNZXNzYWdlKHJlczogYW55KXtcbiAgaWYocmVzLmRhdGEgJiYgcmVzLmRhdGEuZXJyb3IgJiYgcmVzLmRhdGEuZXJyb3IubWVzc2FnZSl7XG4gICAgcmV0dXJuIHJlcy5kYXRhLmVycm9yLm1lc3NhZ2VcbiAgfVxuICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UocmVzKVxufVxuXG5mdW5jdGlvbiBsb2dPYlRvRXJyb3JPYmplY3QobG9nOiBhbnkpe1xuICBjb25zdCBlID0gbmV3IEVycm9yKCBnZXRSZXNwb25zZU1lc3NhZ2UobG9nKSApXG4gIE9iamVjdC5rZXlzKGxvZykuZm9yRWFjaCggdj0+ZVt2XT1sb2dbdl0gKVxuICByZXR1cm4gZVxufVxuXG5mdW5jdGlvbiBnZXREYXRlVGltZVN0cmluZygpe1xuICByZXR1cm4gKGZ1bmN0aW9uKGQpe3JldHVybiAoKCcwJysoZC5nZXRNb250aCgpKzEpKS5zbGljZSgtMikrJy8nKygnMCcrZC5nZXREYXRlKCkpLnNsaWNlKC0yKSsnLycrZC5nZXRGdWxsWWVhcigpKX0pKG5ldyBEYXRlKCkpKycgJysoZnVuY3Rpb24oZCl7dmFyIGg9ZC5nZXRIb3VycygpLHQ9J0FNJyxtPWQuZ2V0TWludXRlcygpO3ZhciBtbiA9IG08MTA/JzAnK206bTtoID0gaD49MTI/KHQ9J1BNJyxoLTEyfHwxMik6aD09MD8xMjpoO3JldHVybiAoJzAnK2gpLnNsaWNlKC0yKSsnOicrKCcwJyttbikuc2xpY2UoLTIpKycgJyt0fSkobmV3IERhdGUoKSlcbn0iXX0=