bugsnag-browser-lite
Advanced tools
Comparing version
'use strict'; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } | ||
@@ -7,8 +9,4 @@ | ||
var ErrorStackParser = _interopDefault(require('error-stack-parser')); | ||
var React = require('react'); | ||
const notifyUrl = "https://notify.bugsnag.com"; | ||
let config = { | ||
notifyUrl | ||
}; | ||
const _pad = n => n < 10 ? `0${n}` : n; // Date#toISOString | ||
@@ -21,3 +19,4 @@ | ||
return d.getUTCFullYear() + "-" + _pad(d.getUTCMonth() + 1) + "-" + _pad(d.getUTCDate()) + "T" + _pad(d.getUTCHours()) + ":" + _pad(d.getUTCMinutes()) + ":" + _pad(d.getUTCSeconds()) + "." + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + "Z"; | ||
} // const REPORT_FILTER_PATHS = [ | ||
} | ||
// "events.[].app", | ||
@@ -32,3 +31,3 @@ // "events.[].metaData", | ||
function prepareReportJson(report) { | ||
let payload = jsonStringify(report, null, null); | ||
let payload = jsonStringify(report, null); | ||
@@ -42,3 +41,3 @@ if (payload.length > 10e5) { | ||
}; | ||
payload = jsonStringify(report, null, null); | ||
payload = jsonStringify(report, null); | ||
if (payload.length > 10e5) throw new Error("payload exceeded 1MB limit"); | ||
@@ -50,5 +49,4 @@ } | ||
function sendReport(report, cb = () => {}) { | ||
console.log('report', report) | ||
if (typeof XMLHttpRequest !== "undefined" && false) { | ||
function sendReport(config, report, cb = () => {}) { | ||
if (typeof XMLHttpRequest !== "undefined") { | ||
try { | ||
@@ -64,3 +62,3 @@ const url = config.notifyUrl; | ||
req.setRequestHeader("Content-Type", "application/json"); | ||
req.setRequestHeader("Bugsnag-Api-Key", config.apiKey); | ||
req.setRequestHeader("Bugsnag-Api-Key", config.apiKey || ""); | ||
req.setRequestHeader("Bugsnag-Payload-Version", "5"); | ||
@@ -82,3 +80,7 @@ req.setRequestHeader("Bugsnag-Sent-At", isoDate()); | ||
function normaliseFunctionName(name) { | ||
return /^global code$/i.test(name) ? "global code" : name; | ||
if (name !== undefined) { | ||
return /^global code$/i.test(name) ? "global code" : name; | ||
} else { | ||
return name; | ||
} | ||
} // takes a stacktrace.js style stackframe (https://github.com/stacktracejs/stackframe) | ||
@@ -99,3 +101,3 @@ // and returns a Bugsnag compatible stackframe (https://docs.bugsnag.com/api/error-reporting/#json-payload) | ||
if (f.lineNumber > -1 && !f.file && !f.method) { | ||
if (f.lineNumber && f.lineNumber > -1 && !f.file && !f.method) { | ||
f.file = "global code"; | ||
@@ -173,10 +175,10 @@ } | ||
}; | ||
} // Javascript Error object contains a `name` property which gives the type of | ||
} | ||
// error. E.g. SyntaxError, TypeError, RangeError, EvalError | ||
// User can create their own custom error too and give it a custom name | ||
function prepareBugsnagReport(config, error, opts) { | ||
function prepareBugsnagReport(apiKey, error, opts) { | ||
return { | ||
apiKey: config.apiKey, | ||
apiKey, | ||
payloadVersion: 5, | ||
@@ -203,22 +205,96 @@ notifier: { | ||
} | ||
const notifyUrl = "https://notify.bugsnag.com"; | ||
class BugsnagClient { | ||
constructor(apiKey) { | ||
this.config = { | ||
apiKey, | ||
notifyUrl | ||
}; | ||
} | ||
function notify(error, opts) { | ||
console.log('error', error) | ||
sendReport(prepareBugsnagReport(config, error, opts)); | ||
notify(error, opts) { | ||
sendReport(this.config, prepareBugsnagReport(this.config.apiKey, error, opts)); | ||
} | ||
} | ||
const bugsnagClient = { | ||
notify | ||
const formatComponentStack = str => { | ||
const lines = str.split(/\s*\n\s*/g); | ||
let ret = ""; | ||
for (let line = 0, len = lines.length; line < len; line++) { | ||
if (lines[line].length) ret += `${ret.length ? "\n" : ""}${lines[line]}`; | ||
} | ||
return ret; | ||
}; | ||
class ErrorBoundary extends React.Component { | ||
constructor(props) { | ||
super(props); | ||
this.state = { | ||
error: null | ||
}; | ||
} | ||
static getDerivedStateFromError(error) { | ||
// Update state so the next render will show the fallback UI. | ||
return { | ||
error | ||
}; | ||
} | ||
componentDidCatch(error, info) { | ||
const { | ||
bugsnagClient | ||
} = this.props; | ||
const handledState = { | ||
severity: "error", | ||
unhandled: true, | ||
severityReason: { | ||
type: "unhandledException" | ||
} | ||
}; | ||
if (info && info.componentStack) { | ||
info.componentStack = formatComponentStack(info.componentStack); | ||
} | ||
bugsnagClient.notify(error, { | ||
metaData: { | ||
react: info | ||
}, | ||
...handledState | ||
}); | ||
} | ||
render() { | ||
const { | ||
error | ||
} = this.state; | ||
if (error) { | ||
const { | ||
FallbackComponent | ||
} = this.props; | ||
if (FallbackComponent) { | ||
return React.createElement(FallbackComponent, this.state); | ||
} | ||
return null; | ||
} | ||
return this.props.children; | ||
} | ||
} | ||
// import { ErrorBoundary } from "./bugsnag_react"; | ||
function bugsnag(apiKey) { | ||
config.apiKey = apiKey; | ||
return bugsnagClient; | ||
return new BugsnagClient(apiKey); | ||
} | ||
exports.bugsnag = bugsnag; | ||
exports.getStacktrace = getStacktrace; | ||
exports.hasStack = hasStack; | ||
exports.isoDate = isoDate; | ||
exports.notifyUrl = notifyUrl; | ||
exports.prepareBugsnagReport = prepareBugsnagReport; | ||
exports.BugsnagClient = BugsnagClient; | ||
exports.ErrorBoundary = ErrorBoundary; | ||
exports.default = bugsnag; | ||
//# sourceMappingURL=bugsnag-browser-lite.cjs.development.js.map |
@@ -1,2 +0,2 @@ | ||
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var t=e(require("safe-json-stringify")),n=e(require("error-stack-parser"));let r={notifyUrl:"https://notify.bugsnag.com"};const a=e=>e<10?"0"+e:e;function s(){const e=new Date;return e.getUTCFullYear()+"-"+a(e.getUTCMonth()+1)+"-"+a(e.getUTCDate())+"T"+a(e.getUTCHours())+":"+a(e.getUTCMinutes())+":"+a(e.getUTCSeconds())+"."+(e.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"}function o(e){return!(!e||!e.stack&&!e.stacktrace&&!e["opera#sourceloc"]||"string"!=typeof(e.stack||e.stacktrace||e["opera#sourceloc"])||e.stack===`${e.name}: ${e.message}`)}function i(e){const t={file:e.fileName,method:(n=e.functionName,/^global code$/i.test(n)?"global code":n),lineNumber:e.lineNumber,columnNumber:e.columnNumber};var n;return t.lineNumber>-1&&!t.file&&!t.method&&(t.file="global code"),t}function u(e){return o(e)?n.parse(e).map(i):[]}function l(){let e="Unknown OS";return-1!=navigator.appVersion.indexOf("Win")&&(e="Windows"),-1!=navigator.appVersion.indexOf("Mac")&&(e="MacOS"),-1!=navigator.appVersion.indexOf("X11")&&(e="UNIX"),-1!=navigator.appVersion.indexOf("Linux")&&(e="Linux"),e}function g(){const e=navigator,t=navigator.userAgent;let n,r,a,o=navigator.appName,i=""+parseFloat(navigator.appVersion);return-1!=(r=t.indexOf("Opera"))?(o="Opera",i=t.substring(r+6),-1!=(r=t.indexOf("Version"))&&(i=t.substring(r+8))):-1!=(r=t.indexOf("MSIE"))?(o="Microsoft Internet Explorer",i=t.substring(r+5)):-1!=(r=t.indexOf("Chrome"))?(o="Chrome",i=t.substring(r+7)):-1!=(r=t.indexOf("Safari"))?(o="Safari",i=t.substring(r+7),-1!=(r=t.indexOf("Version"))&&(i=t.substring(r+8))):-1!=(r=t.indexOf("Firefox"))?(o="Firefox",i=t.substring(r+8)):(n=t.lastIndexOf(" ")+1)<(r=t.lastIndexOf("/"))&&(o=t.substring(n,r),i=t.substring(r+1),o.toLowerCase()==o.toUpperCase()&&(o=navigator.appName)),-1!=(a=i.indexOf(";"))&&(i=i.substring(0,a)),-1!=(a=i.indexOf(" "))&&(i=i.substring(0,a)),{language:e.language,userAgent:e.userAgent,time:s(),osName:l(),browserName:o,browserVersion:i}}function c(e,t,n){return{apiKey:e.apiKey,payloadVersion:5,notifier:{name:"saltside web",version:"1.0.0",url:"https://saltside.se/"},events:[{exceptions:[{errorClass:t.name||"[no errorr name]",message:t.message||"[no errror message]",stacktrace:u(t)}],device:g(),app:{releaseStage:"development"},metaData:n?n.metaData:void 0,user:n?n.user:void 0}]}}const p={notify:function(e,n){!function(e,n=(()=>{})){if("undefined"!=typeof XMLHttpRequest)try{const a=r.notifyUrl,o=new XMLHttpRequest;o.onreadystatechange=function(){o.readyState===XMLHttpRequest.DONE&&n()},o.open("POST",a),o.setRequestHeader("Content-Type","application/json"),o.setRequestHeader("Bugsnag-Api-Key",r.apiKey),o.setRequestHeader("Bugsnag-Payload-Version","5"),o.setRequestHeader("Bugsnag-Sent-At",s()),o.send(function(e){let n=t(e,null,null);if(n.length>1e6&&(delete e.events[0].metaData,e.events[0].metaData={notifier:`WARNING!\nSerialized payload was ${n.length/1e6}MB (limit = 1MB)\nmetaData was removed`},n=t(e,null,null),n.length>1e6))throw new Error("payload exceeded 1MB limit");return n}(e))}catch(e){console.error(e)}else console.error("Bugsnag logger: Could not find XMLHttpRequest")}(c(r,e,n))}};exports.bugsnag=function(e){return r.apiKey=e,p},exports.getStacktrace=u,exports.hasStack=o,exports.isoDate=s,exports.notifyUrl="https://notify.bugsnag.com",exports.prepareBugsnagReport=c; | ||
function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}function t(){const e=new Date;return e.getUTCFullYear()+"-"+l(e.getUTCMonth()+1)+"-"+l(e.getUTCDate())+"T"+l(e.getUTCHours())+":"+l(e.getUTCMinutes())+":"+l(e.getUTCSeconds())+"."+(e.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"}function r(e){const t={file:e.fileName,method:(r=e.functionName,void 0!==r&&/^global code$/i.test(r)?"global code":r),lineNumber:e.lineNumber,columnNumber:e.columnNumber};var r;return t.lineNumber&&t.lineNumber>-1&&!t.file&&!t.method&&(t.file="global code"),t}function n(e){return function(e){return!(!e||!e.stack&&!e.stacktrace&&!e["opera#sourceloc"]||"string"!=typeof(e.stack||e.stacktrace||e["opera#sourceloc"])||e.stack===`${e.name}: ${e.message}`)}(e)?s.parse(e).map(r):[]}function o(){let e="Unknown OS";return-1!=navigator.appVersion.indexOf("Win")&&(e="Windows"),-1!=navigator.appVersion.indexOf("Mac")&&(e="MacOS"),-1!=navigator.appVersion.indexOf("X11")&&(e="UNIX"),-1!=navigator.appVersion.indexOf("Linux")&&(e="Linux"),e}function a(){const e=navigator,r=navigator.userAgent;let n,a,i,s=navigator.appName,u=""+parseFloat(navigator.appVersion);return-1!=(a=r.indexOf("Opera"))?(s="Opera",u=r.substring(a+6),-1!=(a=r.indexOf("Version"))&&(u=r.substring(a+8))):-1!=(a=r.indexOf("MSIE"))?(s="Microsoft Internet Explorer",u=r.substring(a+5)):-1!=(a=r.indexOf("Chrome"))?(s="Chrome",u=r.substring(a+7)):-1!=(a=r.indexOf("Safari"))?(s="Safari",u=r.substring(a+7),-1!=(a=r.indexOf("Version"))&&(u=r.substring(a+8))):-1!=(a=r.indexOf("Firefox"))?(s="Firefox",u=r.substring(a+8)):(n=r.lastIndexOf(" ")+1)<(a=r.lastIndexOf("/"))&&(s=r.substring(n,a),u=r.substring(a+1),s.toLowerCase()==s.toUpperCase()&&(s=navigator.appName)),-1!=(i=u.indexOf(";"))&&(u=u.substring(0,i)),-1!=(i=u.indexOf(" "))&&(u=u.substring(0,i)),{language:e.language,userAgent:e.userAgent,time:t(),osName:o(),browserName:s,browserVersion:u}}Object.defineProperty(exports,"__esModule",{value:!0});var i=e(require("safe-json-stringify")),s=e(require("error-stack-parser")),u=require("react");const l=e=>e<10?"0"+e:e;class c{constructor(e){this.config={apiKey:e,notifyUrl:"https://notify.bugsnag.com"}}notify(e,r){!function(e,r,n=(()=>{})){if("undefined"!=typeof XMLHttpRequest)try{const o=e.notifyUrl,a=new XMLHttpRequest;a.onreadystatechange=function(){a.readyState===XMLHttpRequest.DONE&&n()},a.open("POST",o),a.setRequestHeader("Content-Type","application/json"),a.setRequestHeader("Bugsnag-Api-Key",e.apiKey||""),a.setRequestHeader("Bugsnag-Payload-Version","5"),a.setRequestHeader("Bugsnag-Sent-At",t()),a.send(function(e){let t=i(e,null);if(t.length>1e6&&(delete e.events[0].metaData,e.events[0].metaData={notifier:`WARNING!\nSerialized payload was ${t.length/1e6}MB (limit = 1MB)\nmetaData was removed`},t=i(e,null),t.length>1e6))throw Error("payload exceeded 1MB limit");return t}(r))}catch(e){console.error(e)}else console.error("Bugsnag logger: Could not find XMLHttpRequest")}(this.config,function(e,t,r){return{apiKey:e,payloadVersion:5,notifier:{name:"saltside web",version:"1.0.0",url:"https://saltside.se/"},events:[{exceptions:[{errorClass:t.name||"[no errorr name]",message:t.message||"[no errror message]",stacktrace:n(t)}],device:a(),app:{releaseStage:"development"},metaData:r?r.metaData:void 0,user:r?r.user:void 0}]}}(this.config.apiKey,e,r))}}exports.BugsnagClient=c,exports.ErrorBoundary=class extends u.Component{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){const{bugsnagClient:r}=this.props;t&&t.componentStack&&(t.componentStack=(e=>{const t=e.split(/\s*\n\s*/g);let r="";for(let e=0,n=t.length;e<n;e++)t[e].length&&(r+=`${r.length?"\n":""}${t[e]}`);return r})(t.componentStack)),r.notify(e,{metaData:{react:t},severity:"error",unhandled:!0,severityReason:{type:"unhandledException"}})}render(){const{error:e}=this.state;if(e){const{FallbackComponent:e}=this.props;return e?u.createElement(e,this.state):null}return this.props.children}},exports.default=function(e){return new c(e)}; | ||
//# sourceMappingURL=bugsnag-browser-lite.cjs.production.min.js.map |
@@ -1,203 +0,2 @@ | ||
import jsonStringify from 'safe-json-stringify'; | ||
import ErrorStackParser from 'error-stack-parser'; | ||
const notifyUrl = "https://notify.bugsnag.com"; | ||
let config = { | ||
notifyUrl | ||
}; | ||
const _pad = n => n < 10 ? `0${n}` : n; // Date#toISOString | ||
function isoDate() { | ||
// from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString | ||
const d = new Date(); | ||
return d.getUTCFullYear() + "-" + _pad(d.getUTCMonth() + 1) + "-" + _pad(d.getUTCDate()) + "T" + _pad(d.getUTCHours()) + ":" + _pad(d.getUTCMinutes()) + ":" + _pad(d.getUTCSeconds()) + "." + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + "Z"; | ||
} // const REPORT_FILTER_PATHS = [ | ||
// "events.[].app", | ||
// "events.[].metaData", | ||
// "events.[].user", | ||
// "events.[].breadcrumbs", | ||
// "events.[].request", | ||
// "events.[].device", | ||
// ]; | ||
function prepareReportJson(report) { | ||
let payload = jsonStringify(report, null, null); | ||
if (payload.length > 10e5) { | ||
delete report.events[0].metaData; | ||
report.events[0].metaData = { | ||
notifier: `WARNING! | ||
Serialized payload was ${payload.length / 10e5}MB (limit = 1MB) | ||
metaData was removed` | ||
}; | ||
payload = jsonStringify(report, null, null); | ||
if (payload.length > 10e5) throw new Error("payload exceeded 1MB limit"); | ||
} | ||
return payload; | ||
} | ||
function sendReport(report, cb = () => {}) { | ||
if (typeof XMLHttpRequest !== "undefined") { | ||
try { | ||
const url = config.notifyUrl; | ||
const req = new XMLHttpRequest(); | ||
req.onreadystatechange = function () { | ||
if (req.readyState === XMLHttpRequest.DONE) cb(); | ||
}; | ||
req.open("POST", url); | ||
req.setRequestHeader("Content-Type", "application/json"); | ||
req.setRequestHeader("Bugsnag-Api-Key", config.apiKey); | ||
req.setRequestHeader("Bugsnag-Payload-Version", "5"); | ||
req.setRequestHeader("Bugsnag-Sent-At", isoDate()); | ||
req.send(prepareReportJson(report)); | ||
} catch (e) { | ||
console.error(e); | ||
} | ||
} else { | ||
console.error("Bugsnag logger: Could not find XMLHttpRequest"); | ||
} | ||
} | ||
function hasStack(error) { | ||
return !!error && (!!error.stack || !!error.stacktrace || !!error["opera#sourceloc"]) && typeof (error.stack || error.stacktrace || error["opera#sourceloc"]) === "string" && error.stack !== `${error.name}: ${error.message}`; | ||
} | ||
function normaliseFunctionName(name) { | ||
return /^global code$/i.test(name) ? "global code" : name; | ||
} // takes a stacktrace.js style stackframe (https://github.com/stacktracejs/stackframe) | ||
// and returns a Bugsnag compatible stackframe (https://docs.bugsnag.com/api/error-reporting/#json-payload) | ||
function formatStackframe(frame) { | ||
const f = { | ||
file: frame.fileName, | ||
method: normaliseFunctionName(frame.functionName), | ||
lineNumber: frame.lineNumber, | ||
columnNumber: frame.columnNumber | ||
}; // Some instances result in no file: | ||
// - calling notify() from chrome's terminal results in no file/method. | ||
// - non-error exception thrown from global code in FF | ||
// This adds one. | ||
if (f.lineNumber > -1 && !f.file && !f.method) { | ||
f.file = "global code"; | ||
} | ||
return f; | ||
} | ||
function getStacktrace(error) { | ||
if (hasStack(error)) { | ||
return ErrorStackParser.parse(error).map(formatStackframe); | ||
} | ||
return []; | ||
} | ||
function getOsName() { | ||
let osName = "Unknown OS"; | ||
if (navigator.appVersion.indexOf("Win") != -1) osName = "Windows"; | ||
if (navigator.appVersion.indexOf("Mac") != -1) osName = "MacOS"; | ||
if (navigator.appVersion.indexOf("X11") != -1) osName = "UNIX"; | ||
if (navigator.appVersion.indexOf("Linux") != -1) osName = "Linux"; | ||
return osName; | ||
} | ||
function detectDeviceInfo() { | ||
const nav = navigator; | ||
const nAgt = navigator.userAgent; | ||
let browserName = navigator.appName; | ||
let browserVersion = "" + parseFloat(navigator.appVersion); | ||
let nameOffset, verOffset, ix; // In Opera, the true version is after "Opera" or after "Version" | ||
if ((verOffset = nAgt.indexOf("Opera")) != -1) { | ||
browserName = "Opera"; | ||
browserVersion = nAgt.substring(verOffset + 6); | ||
if ((verOffset = nAgt.indexOf("Version")) != -1) browserVersion = nAgt.substring(verOffset + 8); | ||
} // In MSIE, the true version is after "MSIE" in userAgent | ||
else if ((verOffset = nAgt.indexOf("MSIE")) != -1) { | ||
browserName = "Microsoft Internet Explorer"; | ||
browserVersion = nAgt.substring(verOffset + 5); | ||
} // In Chrome, the true version is after "Chrome" | ||
else if ((verOffset = nAgt.indexOf("Chrome")) != -1) { | ||
browserName = "Chrome"; | ||
browserVersion = nAgt.substring(verOffset + 7); | ||
} // In Safari, the true version is after "Safari" or after "Version" | ||
else if ((verOffset = nAgt.indexOf("Safari")) != -1) { | ||
browserName = "Safari"; | ||
browserVersion = nAgt.substring(verOffset + 7); | ||
if ((verOffset = nAgt.indexOf("Version")) != -1) browserVersion = nAgt.substring(verOffset + 8); | ||
} // In Firefox, the true version is after "Firefox" | ||
else if ((verOffset = nAgt.indexOf("Firefox")) != -1) { | ||
browserName = "Firefox"; | ||
browserVersion = nAgt.substring(verOffset + 8); | ||
} // In most other browsers, "name/version" is at the end of userAgent | ||
else if ((nameOffset = nAgt.lastIndexOf(" ") + 1) < (verOffset = nAgt.lastIndexOf("/"))) { | ||
browserName = nAgt.substring(nameOffset, verOffset); | ||
browserVersion = nAgt.substring(verOffset + 1); | ||
if (browserName.toLowerCase() == browserName.toUpperCase()) { | ||
browserName = navigator.appName; | ||
} | ||
} // trim the browserVersion string at semicolon/space if present | ||
if ((ix = browserVersion.indexOf(";")) != -1) browserVersion = browserVersion.substring(0, ix); | ||
if ((ix = browserVersion.indexOf(" ")) != -1) browserVersion = browserVersion.substring(0, ix); | ||
return { | ||
language: nav.language, | ||
userAgent: nav.userAgent, | ||
time: isoDate(), | ||
osName: getOsName(), | ||
browserName, | ||
browserVersion | ||
}; | ||
} // Javascript Error object contains a `name` property which gives the type of | ||
// error. E.g. SyntaxError, TypeError, RangeError, EvalError | ||
// User can create their own custom error too and give it a custom name | ||
function prepareBugsnagReport(config, error, opts) { | ||
return { | ||
apiKey: config.apiKey, | ||
payloadVersion: 5, | ||
notifier: { | ||
name: "saltside web", | ||
version: "1.0.0", | ||
url: "https://saltside.se/" | ||
}, | ||
events: [{ | ||
exceptions: [{ | ||
errorClass: error.name || "[no errorr name]", | ||
message: error.message || "[no errror message]", | ||
stacktrace: getStacktrace(error) | ||
}], | ||
device: detectDeviceInfo(), | ||
app: { | ||
releaseStage: "development" | ||
}, | ||
metaData: opts ? opts.metaData : undefined, | ||
user: opts ? opts.user : undefined | ||
}] | ||
}; | ||
} | ||
function notify(error, opts) { | ||
sendReport(prepareBugsnagReport(config, error, opts)); | ||
} | ||
const bugsnagClient = { | ||
notify | ||
}; | ||
function bugsnag(apiKey) { | ||
config.apiKey = apiKey; | ||
return bugsnagClient; | ||
} | ||
export { bugsnag, getStacktrace, hasStack, isoDate, notifyUrl, prepareBugsnagReport }; | ||
function e(){const e=new Date;return e.getUTCFullYear()+"-"+l(e.getUTCMonth()+1)+"-"+l(e.getUTCDate())+"T"+l(e.getUTCHours())+":"+l(e.getUTCMinutes())+":"+l(e.getUTCSeconds())+"."+(e.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"}function t(e){const t={file:e.fileName,method:(r=e.functionName,void 0!==r&&/^global code$/i.test(r)?"global code":r),lineNumber:e.lineNumber,columnNumber:e.columnNumber};var r;return t.lineNumber&&t.lineNumber>-1&&!t.file&&!t.method&&(t.file="global code"),t}function r(e){return function(e){return!(!e||!e.stack&&!e.stacktrace&&!e["opera#sourceloc"]||"string"!=typeof(e.stack||e.stacktrace||e["opera#sourceloc"])||e.stack===`${e.name}: ${e.message}`)}(e)?i.parse(e).map(t):[]}function n(){let e="Unknown OS";return-1!=navigator.appVersion.indexOf("Win")&&(e="Windows"),-1!=navigator.appVersion.indexOf("Mac")&&(e="MacOS"),-1!=navigator.appVersion.indexOf("X11")&&(e="UNIX"),-1!=navigator.appVersion.indexOf("Linux")&&(e="Linux"),e}function o(){const t=navigator,r=navigator.userAgent;let o,a,i,s=navigator.appName,u=""+parseFloat(navigator.appVersion);return-1!=(a=r.indexOf("Opera"))?(s="Opera",u=r.substring(a+6),-1!=(a=r.indexOf("Version"))&&(u=r.substring(a+8))):-1!=(a=r.indexOf("MSIE"))?(s="Microsoft Internet Explorer",u=r.substring(a+5)):-1!=(a=r.indexOf("Chrome"))?(s="Chrome",u=r.substring(a+7)):-1!=(a=r.indexOf("Safari"))?(s="Safari",u=r.substring(a+7),-1!=(a=r.indexOf("Version"))&&(u=r.substring(a+8))):-1!=(a=r.indexOf("Firefox"))?(s="Firefox",u=r.substring(a+8)):(o=r.lastIndexOf(" ")+1)<(a=r.lastIndexOf("/"))&&(s=r.substring(o,a),u=r.substring(a+1),s.toLowerCase()==s.toUpperCase()&&(s=navigator.appName)),-1!=(i=u.indexOf(";"))&&(u=u.substring(0,i)),-1!=(i=u.indexOf(" "))&&(u=u.substring(0,i)),{language:t.language,userAgent:t.userAgent,time:e(),osName:n(),browserName:s,browserVersion:u}}import a from"safe-json-stringify";import i from"error-stack-parser";import{Component as s,createElement as u}from"react";const l=e=>e<10?"0"+e:e;class c{constructor(e){this.config={apiKey:e,notifyUrl:"https://notify.bugsnag.com"}}notify(t,n){!function(t,r,n=(()=>{})){if("undefined"!=typeof XMLHttpRequest)try{const o=t.notifyUrl,i=new XMLHttpRequest;i.onreadystatechange=function(){i.readyState===XMLHttpRequest.DONE&&n()},i.open("POST",o),i.setRequestHeader("Content-Type","application/json"),i.setRequestHeader("Bugsnag-Api-Key",t.apiKey||""),i.setRequestHeader("Bugsnag-Payload-Version","5"),i.setRequestHeader("Bugsnag-Sent-At",e()),i.send(function(e){let t=a(e,null);if(t.length>1e6&&(delete e.events[0].metaData,e.events[0].metaData={notifier:`WARNING!\nSerialized payload was ${t.length/1e6}MB (limit = 1MB)\nmetaData was removed`},t=a(e,null),t.length>1e6))throw Error("payload exceeded 1MB limit");return t}(r))}catch(e){console.error(e)}else console.error("Bugsnag logger: Could not find XMLHttpRequest")}(this.config,function(e,t,n){return{apiKey:e,payloadVersion:5,notifier:{name:"saltside web",version:"1.0.0",url:"https://saltside.se/"},events:[{exceptions:[{errorClass:t.name||"[no errorr name]",message:t.message||"[no errror message]",stacktrace:r(t)}],device:o(),app:{releaseStage:"development"},metaData:n?n.metaData:void 0,user:n?n.user:void 0}]}}(this.config.apiKey,t,n))}}class f extends s{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){const{bugsnagClient:r}=this.props;t&&t.componentStack&&(t.componentStack=(e=>{const t=e.split(/\s*\n\s*/g);let r="";for(let e=0,n=t.length;e<n;e++)t[e].length&&(r+=`${r.length?"\n":""}${t[e]}`);return r})(t.componentStack)),r.notify(e,{metaData:{react:t},severity:"error",unhandled:!0,severityReason:{type:"unhandledException"}})}render(){const{error:e}=this.state;if(e){const{FallbackComponent:e}=this.props;return e?u(e,this.state):null}return this.props.children}}export default function(e){return new c(e)}export{c as BugsnagClient,f as ErrorBoundary}; | ||
//# sourceMappingURL=bugsnag-browser-lite.esm.js.map |
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('safe-json-stringify'), require('error-stack-parser')) : | ||
typeof define === 'function' && define.amd ? define(['exports', 'safe-json-stringify', 'error-stack-parser'], factory) : | ||
(global = global || self, factory(global['bugsnag-browser-lite'] = {}, global.jsonStringify, global.ErrorStackParser)); | ||
}(this, (function (exports, jsonStringify, ErrorStackParser) { 'use strict'; | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('safe-json-stringify'), require('error-stack-parser'), require('react')) : | ||
typeof define === 'function' && define.amd ? define(['exports', 'safe-json-stringify', 'error-stack-parser', 'react'], factory) : | ||
(global = global || self, factory(global['bugsnag-browser-lite'] = {}, global.jsonStringify, global.ErrorStackParser, global.React)); | ||
}(this, (function (exports, jsonStringify, ErrorStackParser, React) { 'use strict'; | ||
@@ -10,7 +10,2 @@ jsonStringify = jsonStringify && Object.prototype.hasOwnProperty.call(jsonStringify, 'default') ? jsonStringify['default'] : jsonStringify; | ||
const notifyUrl = "https://notify.bugsnag.com"; | ||
let config = { | ||
notifyUrl | ||
}; | ||
const _pad = n => n < 10 ? `0${n}` : n; // Date#toISOString | ||
@@ -23,3 +18,4 @@ | ||
return d.getUTCFullYear() + "-" + _pad(d.getUTCMonth() + 1) + "-" + _pad(d.getUTCDate()) + "T" + _pad(d.getUTCHours()) + ":" + _pad(d.getUTCMinutes()) + ":" + _pad(d.getUTCSeconds()) + "." + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + "Z"; | ||
} // const REPORT_FILTER_PATHS = [ | ||
} | ||
// "events.[].app", | ||
@@ -34,3 +30,3 @@ // "events.[].metaData", | ||
function prepareReportJson(report) { | ||
let payload = jsonStringify(report, null, null); | ||
let payload = jsonStringify(report, null); | ||
@@ -44,3 +40,3 @@ if (payload.length > 10e5) { | ||
}; | ||
payload = jsonStringify(report, null, null); | ||
payload = jsonStringify(report, null); | ||
if (payload.length > 10e5) throw new Error("payload exceeded 1MB limit"); | ||
@@ -52,3 +48,3 @@ } | ||
function sendReport(report, cb = () => {}) { | ||
function sendReport(config, report, cb = () => {}) { | ||
if (typeof XMLHttpRequest !== "undefined") { | ||
@@ -65,3 +61,3 @@ try { | ||
req.setRequestHeader("Content-Type", "application/json"); | ||
req.setRequestHeader("Bugsnag-Api-Key", config.apiKey); | ||
req.setRequestHeader("Bugsnag-Api-Key", config.apiKey || ""); | ||
req.setRequestHeader("Bugsnag-Payload-Version", "5"); | ||
@@ -83,3 +79,7 @@ req.setRequestHeader("Bugsnag-Sent-At", isoDate()); | ||
function normaliseFunctionName(name) { | ||
return /^global code$/i.test(name) ? "global code" : name; | ||
if (name !== undefined) { | ||
return /^global code$/i.test(name) ? "global code" : name; | ||
} else { | ||
return name; | ||
} | ||
} // takes a stacktrace.js style stackframe (https://github.com/stacktracejs/stackframe) | ||
@@ -100,3 +100,3 @@ // and returns a Bugsnag compatible stackframe (https://docs.bugsnag.com/api/error-reporting/#json-payload) | ||
if (f.lineNumber > -1 && !f.file && !f.method) { | ||
if (f.lineNumber && f.lineNumber > -1 && !f.file && !f.method) { | ||
f.file = "global code"; | ||
@@ -174,10 +174,10 @@ } | ||
}; | ||
} // Javascript Error object contains a `name` property which gives the type of | ||
} | ||
// error. E.g. SyntaxError, TypeError, RangeError, EvalError | ||
// User can create their own custom error too and give it a custom name | ||
function prepareBugsnagReport(config, error, opts) { | ||
function prepareBugsnagReport(apiKey, error, opts) { | ||
return { | ||
apiKey: config.apiKey, | ||
apiKey, | ||
payloadVersion: 5, | ||
@@ -204,23 +204,100 @@ notifier: { | ||
} | ||
const notifyUrl = "https://notify.bugsnag.com"; | ||
class BugsnagClient { | ||
constructor(apiKey) { | ||
this.config = { | ||
apiKey, | ||
notifyUrl | ||
}; | ||
} | ||
function notify(error, opts) { | ||
sendReport(prepareBugsnagReport(config, error, opts)); | ||
notify(error, opts) { | ||
sendReport(this.config, prepareBugsnagReport(this.config.apiKey, error, opts)); | ||
} | ||
} | ||
const bugsnagClient = { | ||
notify | ||
const formatComponentStack = str => { | ||
const lines = str.split(/\s*\n\s*/g); | ||
let ret = ""; | ||
for (let line = 0, len = lines.length; line < len; line++) { | ||
if (lines[line].length) ret += `${ret.length ? "\n" : ""}${lines[line]}`; | ||
} | ||
return ret; | ||
}; | ||
class ErrorBoundary extends React.Component { | ||
constructor(props) { | ||
super(props); | ||
this.state = { | ||
error: null | ||
}; | ||
} | ||
static getDerivedStateFromError(error) { | ||
// Update state so the next render will show the fallback UI. | ||
return { | ||
error | ||
}; | ||
} | ||
componentDidCatch(error, info) { | ||
const { | ||
bugsnagClient | ||
} = this.props; | ||
const handledState = { | ||
severity: "error", | ||
unhandled: true, | ||
severityReason: { | ||
type: "unhandledException" | ||
} | ||
}; | ||
if (info && info.componentStack) { | ||
info.componentStack = formatComponentStack(info.componentStack); | ||
} | ||
bugsnagClient.notify(error, { | ||
metaData: { | ||
react: info | ||
}, | ||
...handledState | ||
}); | ||
} | ||
render() { | ||
const { | ||
error | ||
} = this.state; | ||
if (error) { | ||
const { | ||
FallbackComponent | ||
} = this.props; | ||
if (FallbackComponent) { | ||
return React.createElement(FallbackComponent, this.state); | ||
} | ||
return null; | ||
} | ||
return this.props.children; | ||
} | ||
} | ||
// import { ErrorBoundary } from "./bugsnag_react"; | ||
function bugsnag(apiKey) { | ||
config.apiKey = apiKey; | ||
return bugsnagClient; | ||
return new BugsnagClient(apiKey); | ||
} | ||
exports.bugsnag = bugsnag; | ||
exports.getStacktrace = getStacktrace; | ||
exports.hasStack = hasStack; | ||
exports.isoDate = isoDate; | ||
exports.notifyUrl = notifyUrl; | ||
exports.prepareBugsnagReport = prepareBugsnagReport; | ||
exports.BugsnagClient = BugsnagClient; | ||
exports.ErrorBoundary = ErrorBoundary; | ||
exports.default = bugsnag; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
}))); | ||
//# sourceMappingURL=bugsnag-browser-lite.umd.development.js.map |
@@ -1,2 +0,2 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("safe-json-stringify"),require("error-stack-parser")):"function"==typeof define&&define.amd?define(["exports","safe-json-stringify","error-stack-parser"],t):t((e=e||self)["bugsnag-browser-lite"]={},e.jsonStringify,e.ErrorStackParser)}(this,(function(e,t,n){"use strict";t=t&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t,n=n&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n;let r={notifyUrl:"https://notify.bugsnag.com"};const a=e=>e<10?"0"+e:e;function s(){const e=new Date;return e.getUTCFullYear()+"-"+a(e.getUTCMonth()+1)+"-"+a(e.getUTCDate())+"T"+a(e.getUTCHours())+":"+a(e.getUTCMinutes())+":"+a(e.getUTCSeconds())+"."+(e.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"}function o(e){return!(!e||!e.stack&&!e.stacktrace&&!e["opera#sourceloc"]||"string"!=typeof(e.stack||e.stacktrace||e["opera#sourceloc"])||e.stack===`${e.name}: ${e.message}`)}function i(e){const t={file:e.fileName,method:(n=e.functionName,/^global code$/i.test(n)?"global code":n),lineNumber:e.lineNumber,columnNumber:e.columnNumber};var n;return t.lineNumber>-1&&!t.file&&!t.method&&(t.file="global code"),t}function u(e){return o(e)?n.parse(e).map(i):[]}function l(){let e="Unknown OS";return-1!=navigator.appVersion.indexOf("Win")&&(e="Windows"),-1!=navigator.appVersion.indexOf("Mac")&&(e="MacOS"),-1!=navigator.appVersion.indexOf("X11")&&(e="UNIX"),-1!=navigator.appVersion.indexOf("Linux")&&(e="Linux"),e}function f(){const e=navigator,t=navigator.userAgent;let n,r,a,o=navigator.appName,i=""+parseFloat(navigator.appVersion);return-1!=(r=t.indexOf("Opera"))?(o="Opera",i=t.substring(r+6),-1!=(r=t.indexOf("Version"))&&(i=t.substring(r+8))):-1!=(r=t.indexOf("MSIE"))?(o="Microsoft Internet Explorer",i=t.substring(r+5)):-1!=(r=t.indexOf("Chrome"))?(o="Chrome",i=t.substring(r+7)):-1!=(r=t.indexOf("Safari"))?(o="Safari",i=t.substring(r+7),-1!=(r=t.indexOf("Version"))&&(i=t.substring(r+8))):-1!=(r=t.indexOf("Firefox"))?(o="Firefox",i=t.substring(r+8)):(n=t.lastIndexOf(" ")+1)<(r=t.lastIndexOf("/"))&&(o=t.substring(n,r),i=t.substring(r+1),o.toLowerCase()==o.toUpperCase()&&(o=navigator.appName)),-1!=(a=i.indexOf(";"))&&(i=i.substring(0,a)),-1!=(a=i.indexOf(" "))&&(i=i.substring(0,a)),{language:e.language,userAgent:e.userAgent,time:s(),osName:l(),browserName:o,browserVersion:i}}function g(e,t,n){return{apiKey:e.apiKey,payloadVersion:5,notifier:{name:"saltside web",version:"1.0.0",url:"https://saltside.se/"},events:[{exceptions:[{errorClass:t.name||"[no errorr name]",message:t.message||"[no errror message]",stacktrace:u(t)}],device:f(),app:{releaseStage:"development"},metaData:n?n.metaData:void 0,user:n?n.user:void 0}]}}const c={notify:function(e,n){!function(e,n=(()=>{})){if("undefined"!=typeof XMLHttpRequest)try{const a=r.notifyUrl,o=new XMLHttpRequest;o.onreadystatechange=function(){o.readyState===XMLHttpRequest.DONE&&n()},o.open("POST",a),o.setRequestHeader("Content-Type","application/json"),o.setRequestHeader("Bugsnag-Api-Key",r.apiKey),o.setRequestHeader("Bugsnag-Payload-Version","5"),o.setRequestHeader("Bugsnag-Sent-At",s()),o.send(function(e){let n=t(e,null,null);if(n.length>1e6&&(delete e.events[0].metaData,e.events[0].metaData={notifier:`WARNING!\nSerialized payload was ${n.length/1e6}MB (limit = 1MB)\nmetaData was removed`},n=t(e,null,null),n.length>1e6))throw new Error("payload exceeded 1MB limit");return n}(e))}catch(e){console.error(e)}else console.error("Bugsnag logger: Could not find XMLHttpRequest")}(g(r,e,n))}};e.bugsnag=function(e){return r.apiKey=e,c},e.getStacktrace=u,e.hasStack=o,e.isoDate=s,e.notifyUrl="https://notify.bugsnag.com",e.prepareBugsnagReport=g})); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("safe-json-stringify"),require("error-stack-parser"),require("react")):"function"==typeof define&&define.amd?define(["exports","safe-json-stringify","error-stack-parser","react"],t):t((e=e||self)["bugsnag-browser-lite"]={},e.jsonStringify,e.ErrorStackParser,e.React)}(this,(function(e,t,n,r){function o(){const e=new Date;return e.getUTCFullYear()+"-"+c(e.getUTCMonth()+1)+"-"+c(e.getUTCDate())+"T"+c(e.getUTCHours())+":"+c(e.getUTCMinutes())+":"+c(e.getUTCSeconds())+"."+(e.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"}function a(e){const t={file:e.fileName,method:(n=e.functionName,void 0!==n&&/^global code$/i.test(n)?"global code":n),lineNumber:e.lineNumber,columnNumber:e.columnNumber};var n;return t.lineNumber&&t.lineNumber>-1&&!t.file&&!t.method&&(t.file="global code"),t}function i(e){return function(e){return!(!e||!e.stack&&!e.stacktrace&&!e["opera#sourceloc"]||"string"!=typeof(e.stack||e.stacktrace||e["opera#sourceloc"])||e.stack===`${e.name}: ${e.message}`)}(e)?n.parse(e).map(a):[]}function s(){let e="Unknown OS";return-1!=navigator.appVersion.indexOf("Win")&&(e="Windows"),-1!=navigator.appVersion.indexOf("Mac")&&(e="MacOS"),-1!=navigator.appVersion.indexOf("X11")&&(e="UNIX"),-1!=navigator.appVersion.indexOf("Linux")&&(e="Linux"),e}function u(){const e=navigator,t=navigator.userAgent;let n,r,a,i=navigator.appName,u=""+parseFloat(navigator.appVersion);return-1!=(r=t.indexOf("Opera"))?(i="Opera",u=t.substring(r+6),-1!=(r=t.indexOf("Version"))&&(u=t.substring(r+8))):-1!=(r=t.indexOf("MSIE"))?(i="Microsoft Internet Explorer",u=t.substring(r+5)):-1!=(r=t.indexOf("Chrome"))?(i="Chrome",u=t.substring(r+7)):-1!=(r=t.indexOf("Safari"))?(i="Safari",u=t.substring(r+7),-1!=(r=t.indexOf("Version"))&&(u=t.substring(r+8))):-1!=(r=t.indexOf("Firefox"))?(i="Firefox",u=t.substring(r+8)):(n=t.lastIndexOf(" ")+1)<(r=t.lastIndexOf("/"))&&(i=t.substring(n,r),u=t.substring(r+1),i.toLowerCase()==i.toUpperCase()&&(i=navigator.appName)),-1!=(a=u.indexOf(";"))&&(u=u.substring(0,a)),-1!=(a=u.indexOf(" "))&&(u=u.substring(0,a)),{language:e.language,userAgent:e.userAgent,time:o(),osName:s(),browserName:i,browserVersion:u}}t=t&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t,n=n&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n;const c=e=>e<10?"0"+e:e;class l{constructor(e){this.config={apiKey:e,notifyUrl:"https://notify.bugsnag.com"}}notify(e,n){!function(e,n,r=(()=>{})){if("undefined"!=typeof XMLHttpRequest)try{const a=e.notifyUrl,i=new XMLHttpRequest;i.onreadystatechange=function(){i.readyState===XMLHttpRequest.DONE&&r()},i.open("POST",a),i.setRequestHeader("Content-Type","application/json"),i.setRequestHeader("Bugsnag-Api-Key",e.apiKey||""),i.setRequestHeader("Bugsnag-Payload-Version","5"),i.setRequestHeader("Bugsnag-Sent-At",o()),i.send(function(e){let n=t(e,null);if(n.length>1e6&&(delete e.events[0].metaData,e.events[0].metaData={notifier:`WARNING!\nSerialized payload was ${n.length/1e6}MB (limit = 1MB)\nmetaData was removed`},n=t(e,null),n.length>1e6))throw Error("payload exceeded 1MB limit");return n}(n))}catch(e){console.error(e)}else console.error("Bugsnag logger: Could not find XMLHttpRequest")}(this.config,function(e,t,n){return{apiKey:e,payloadVersion:5,notifier:{name:"saltside web",version:"1.0.0",url:"https://saltside.se/"},events:[{exceptions:[{errorClass:t.name||"[no errorr name]",message:t.message||"[no errror message]",stacktrace:i(t)}],device:u(),app:{releaseStage:"development"},metaData:n?n.metaData:void 0,user:n?n.user:void 0}]}}(this.config.apiKey,e,n))}}e.BugsnagClient=l,e.ErrorBoundary=class extends r.Component{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){const{bugsnagClient:n}=this.props;t&&t.componentStack&&(t.componentStack=(e=>{const t=e.split(/\s*\n\s*/g);let n="";for(let e=0,r=t.length;e<r;e++)t[e].length&&(n+=`${n.length?"\n":""}${t[e]}`);return n})(t.componentStack)),n.notify(e,{metaData:{react:t},severity:"error",unhandled:!0,severityReason:{type:"unhandledException"}})}render(){const{error:e}=this.state;if(e){const{FallbackComponent:e}=this.props;return e?r.createElement(e,this.state):null}return this.props.children}},e.default=function(e){return new l(e)},Object.defineProperty(e,"__esModule",{value:!0})})); | ||
//# sourceMappingURL=bugsnag-browser-lite.umd.production.min.js.map |
{ | ||
"name": "bugsnag-browser-lite", | ||
"version": "1.1.1", | ||
"version": "2.0.0", | ||
"description": "Bugsnag error reporting on the browser", | ||
"main": "./dist/index.js", | ||
"main": "dist/index.js", | ||
"module": "dist/bugsnag-browser-lite.esm.js", | ||
@@ -11,3 +11,4 @@ "umd:main": "dist/bugsnag-browser-lite.umd.production.min.js", | ||
"jsnext:main": "dist/bugsnag-browser-lite.esm.js", | ||
"types": "./dist/index.d.ts", | ||
"source": "src/bugsnag.ts", | ||
"types": "./dist/bugsnag.d.ts", | ||
"files": [ | ||
@@ -20,2 +21,15 @@ "dist" | ||
}, | ||
"husky": { | ||
"hooks": { | ||
"pre-commit": "lint-staged" | ||
} | ||
}, | ||
"lint-staged": { | ||
"*.{ts,tsx}": [ | ||
"tslint --fix", | ||
"prettier --write", | ||
"git add", | ||
"npm run test -- --bail --passWithNoTests --findRelatedTests" | ||
] | ||
}, | ||
"keywords": [ | ||
@@ -37,5 +51,14 @@ "bugsnag", | ||
"@babel/preset-typescript": "^7.9.0", | ||
"@types/react": "^16.9.34", | ||
"@types/react-dom": "^16.9.6", | ||
"husky": "^4.2.5", | ||
"jest": "^25.3.0", | ||
"lint-staged": "^10.1.3", | ||
"prettier": "^2.0.4", | ||
"react": "^16.13.1", | ||
"react-dom": "^16.13.1", | ||
"rimraf": "^3.0.2", | ||
"rollup-plugin-terser": "^5.3.0", | ||
"tsdx": "^0.13.1", | ||
"tslint": "^6.1.1", | ||
"typescript": "^3.8.3", | ||
@@ -48,3 +71,7 @@ "xhr-mock": "^2.5.1" | ||
"safe-json-stringify": "^1.2.0" | ||
}, | ||
"peerDependencies": { | ||
"react": "*", | ||
"react-dom": "*" | ||
} | ||
} |
@@ -17,3 +17,3 @@ bugsnag-browser-lite is a light weight replacement for [@bugsnag/js](https://github.com/bugsnag/bugsnag-js). | ||
``` | ||
import { bugsnag } from 'bugsnag-browser-lite'; | ||
import bugsnag from 'bugsnag-browser-lite'; | ||
@@ -26,2 +26,14 @@ const bugsnagClient = bugsnag('your-bugsnag-api-key') | ||
Catching and logging all unhandled exceptions in react. | ||
``` | ||
import bugsnag, { ErrorBoundary } from 'bugsnag-browser-lite'; | ||
const bugsnagClient = bugsnag('your-bugsnag-api-key') | ||
<ErrorBoundary bugsnagClient={bugsnagClient}> > | ||
<YourApp /> | ||
</ErrorBoundary> | ||
``` | ||
It's written in typescript and the types are published with the package. |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
136559
0.92%33
135.71%751
13.79%38
46.15%5
66.67%16
128.57%1
Infinity%