{"library":"raven-for-redux","title":"Sentry Raven Middleware for Redux","description":"raven-for-redux is a Redux middleware designed to integrate Redux state and actions with Sentry's error tracking platform through the legacy raven-js client. It intercepts dispatched actions, logging their types as breadcrumbs and attaching the last action and current Redux state as additional context to all errors, not just reducer exceptions. As of version 1.4.0, it requires raven-js version 3.9.0 or higher, with a known bug triggered by raven-js 3.14.0. The library differentiates itself by allowing the Sentry Raven client to be injected, providing flexible configuration, and offering options to filter action breadcrumbs and define user context mappings from the Redux state. Its release cadence has been infrequent, and its primary dependency, raven-js, is officially deprecated in favor of `@sentry/browser`, making this package suitable only for projects using older Sentry integrations.","language":"javascript","status":"deprecated","last_verified":"Thu Apr 23","install":{"commands":["npm install raven-for-redux"],"cli":null},"imports":["import createRavenMiddleware from 'raven-for-redux';","import * as createRavenMiddleware from 'raven-for-redux';","import Raven from 'raven-js';"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import Raven from \"raven-js\";\nimport { createStore, applyMiddleware, combineReducers } from \"redux\";\nimport createRavenMiddleware from \"raven-for-redux\";\n\n// Mock reducer for demonstration\nconst initialState = { count: 0, user: { id: 1, name: 'Guest' } };\nfunction reducer(state = initialState, action) {\n  switch (action.type) {\n    case 'INCREMENT':\n      return { ...state, count: state.count + 1 };\n    case 'LOGIN':\n      return { ...state, user: action.payload };\n    default:\n      return state;\n  }\n}\n\n// Initialize Raven (or mock it for local development without a DSN)\nconst SENTRY_DSN = process.env.SENTRY_DSN ?? \"https://examplePublicKey@o0.ingest.sentry.io/0\";\n// In a real application, you would always provide a valid DSN.\nRaven.config(SENTRY_DSN).install();\n\nconst store = createStore(\n    reducer,\n    applyMiddleware(\n        // Middlewares that intercept or emit actions should generally precede raven-for-redux.\n        createRavenMiddleware(Raven, {\n            breadcrumbMessageFromAction: action => action.type,\n            breadcrumbDataFromAction: action => ({ actionPayload: action.payload }),\n            stateContext: state => ({ user: state.user }),\n            actionFilter: action => action.type !== 'IGNORE_THIS_ACTION'\n        })\n    )\n);\n\n// Dispatch some actions to generate breadcrumbs\nstore.dispatch({ type: 'INCREMENT' });\nstore.dispatch({ type: 'LOGIN', payload: { id: 123, name: 'Alice' } });\nstore.dispatch({ type: 'INCREMENT' });\nstore.dispatch({ type: 'IGNORE_THIS_ACTION' }); // This action will be filtered out\n\n// Simulate an error to capture state and breadcrumbs\ntry {\n  throw new Error(\"Simulated error during user interaction!\");\n} catch (e) {\n  Raven.captureException(e);\n}\n\nconsole.log('Final State:', store.getState());\n// In a real app, console.logs would typically be replaced by actual Sentry reports.\n","lang":"javascript","description":"This example demonstrates how to integrate `raven-for-redux` with a Redux store, capturing actions as Sentry breadcrumbs and attaching state context to errors. It includes a mock reducer, Raven initialization, and an example of error capturing with custom options.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":null}