bugsnag.js

// cf https://docs.bugsnag.com/platforms/javascript/
import Bugsnag from '@bugsnag/js'

// ces constantes seront mise par webpack lorsqu'il va générer _private/bugsnag.js
const apiKey = ''
const appVersion = ''
const releaseStage = ''

/**
 * Appelé avant d'envoyer le rapport, pour filtrer
 * @param event
 * @return {boolean}
 */
function onError (event) {
  // cf https://docs.bugsnag.com/platforms/browsers/js/customizing-error-reports/
  if (/^file:\/\//.test(event.request.url)) return false
  // on étudie la 1re erreur de cet event
  const { errorClass, /* errorMessage, */ stacktrace } = event.errors[0]
  // on ignore tous les plantages qui concernent une extension firefox
  if (stacktrace.some(stackFrame => /^moz-extension:\/\//.test(stackFrame.file))) return false
  // ou un pb réseau
  if (stacktrace.some(stackFrame => /NS_ERROR_FAILURE/.test(stackFrame.errorClass))) return false

  if (/ChunkLoadError/.test(errorClass)) {
    alert('Il y a un problème de chargement de l’application, vous devriez essayer de vider le cache de votre navigateur pour le resoudre (ctrl+maj+suppr en général, puis cocher « fichier en cache »).')
    return false
  }
}

// cf https://docs.bugsnag.com/platforms/javascript/configuration-options/
Bugsnag.start({
  apiKey,
  onError,
  appVersion,
  releaseStage
  // on pourrait virer l'ip avant envoi à bugsnag, mais faudrait ajouter un fingerprint pour différencier les clients
  // (sinon bugsnag ne voit qu'un seul user, cf https://docs.bugsnag.com/platforms/javascript/customizing-error-reports/#preventing-ip-address-collection)
  // collectUserIp: false
})

// et on l'exporte en global au cas où du code voudrait s'en servir, avec par ex
// if (window.Bugsnag) {
//   Bugsnag.addMetadata('foo', unObjetDeContexte) // => ça crée un onglet foo dans le rapport bugsnag avec l'objet passé en argument
//   window.Bugsnag.notify(Error('y’a eu tel pb'))
// }
window.Bugsnag = Bugsnag