raven-for-redux
Version:
Middleware for propagating Redux state/actions to Sentry via Raven.
71 lines (63 loc) • 2.53 kB
JavaScript
;
var identity = function identity(x) {
return x;
};
var getUndefined = function getUndefined() {};
var getType = function getType(action) {
return action.type;
};
var filter = function filter() {
return true;
};
function createRavenMiddleware(Raven) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
// TODO: Validate options.
var _options$breadcrumbDa = options.breadcrumbDataFromAction,
breadcrumbDataFromAction = _options$breadcrumbDa === undefined ? getUndefined : _options$breadcrumbDa,
_options$breadcrumbMe = options.breadcrumbMessageFromAction,
breadcrumbMessageFromAction = _options$breadcrumbMe === undefined ? getType : _options$breadcrumbMe,
_options$actionTransf = options.actionTransformer,
actionTransformer = _options$actionTransf === undefined ? identity : _options$actionTransf,
_options$stateTransfo = options.stateTransformer,
stateTransformer = _options$stateTransfo === undefined ? identity : _options$stateTransfo,
_options$breadcrumbCa = options.breadcrumbCategory,
breadcrumbCategory = _options$breadcrumbCa === undefined ? "redux-action" : _options$breadcrumbCa,
_options$filterBreadc = options.filterBreadcrumbActions,
filterBreadcrumbActions = _options$filterBreadc === undefined ? filter : _options$filterBreadc,
getUserContext = options.getUserContext,
getTags = options.getTags;
return function (store) {
var lastAction = void 0;
Raven.setDataCallback(function (data, original) {
var state = store.getState();
var reduxExtra = {
lastAction: actionTransformer(lastAction),
state: stateTransformer(state)
};
data.extra = Object.assign(reduxExtra, data.extra);
if (getUserContext) {
data.user = getUserContext(state);
}
if (getTags) {
data.tags = getTags(state);
}
return original ? original(data) : data;
});
return function (next) {
return function (action) {
// Log the action taken to Raven so that we have narrative context in our
// error report.
if (filterBreadcrumbActions(action)) {
Raven.captureBreadcrumb({
category: breadcrumbCategory,
message: breadcrumbMessageFromAction(action),
data: breadcrumbDataFromAction(action)
});
}
lastAction = action;
return next(action);
};
};
};
}
module.exports = createRavenMiddleware;