@critters/next
Version:
Secure bug reporting library for Next.js applications
313 lines (218 loc) • 9.37 kB
Markdown
# @critters/next
A lightweight error tracking library for Next.js applications that helps you understand and fix bugs faster. Critters automatically captures errors from both client and server-side code, providing clear, actionable insights without the complexity of traditional error monitoring tools.
## Features
- 🔒 Secure bug reporting with HMAC SHA-256 signatures
- 🌐 Works on both client and server-side
- 🚀 Easy integration with Next.js applications
- 🛡️ Rate limiting to prevent spam
- 📊 Structured error reports with metadata
- 📱 Browser information and device context
- 🔍 Network request capture
- 📝 Console log collection
- 👤 User interaction tracking
## Installation
```bash
pnpm add @critters/next
# or
npm install @critters/next
# or
yarn add @critters/next
```
## Setup
### 1. Initialize the Bug Tracker
Add the following code to your application's entry point (e.g., `app/layout.tsx` or `pages/_app.tsx`):
```tsx
import { startCritters } from "@critters/next";
// Initialize the bug tracker
startCritters({
apiKey: process.env.NEXT_PUBLIC_BUG_TRACKER_API_KEY!,
// Optional parameters:
// endpoint: "https://your-custom-endpoint.com/api/bugs"
// environment: process.env.NODE_ENV,
// debug: process.env.NODE_ENV !== "production",
// captureConsole: true,
// captureNetworkRequests: true,
// captureUserInteractions: true,
// captureApplicationState: true,
});
```
The library will automatically fetch the necessary configuration (secretKey, projectId, etc.) from the server using your API key.
### 2. Set Up Your Project in Critters Dashboard
1. Create an account at [bugtrack.critters.dev](https://bugtrack.critters.dev)
2. Create a new project and get your API key
3. Add the API key to your environment variables as `NEXT_PUBLIC_BUG_TRACKER_API_KEY`
## Usage
### Manual Error Reporting
```tsx
import { catch_ } from "@critters/next";
try {
// Your code that might throw an error
throw new Error("Something went wrong!");
} catch (error) {
catch_(error, { userId: "123", route: "/dashboard" });
}
```
### React Error Boundary
```tsx
import { ErrorBoundary } from "@critters/next";
function MyComponent() {
return (
<ErrorBoundary
fallback={<div>Something went wrong</div>}
captureProps={true} // Optional: include component props in the error report
>
<ComponentThatMightThrow />
</ErrorBoundary>
);
}
```
### Higher-Order Component for Error Boundaries
```tsx
import { withErrorBoundary } from "@critters/next";
const SafeComponent = withErrorBoundary(UnsafeComponent, {
fallback: <div>Something went wrong</div>,
captureProps: true, // Optional: include component props in the error report
captureState: false, // Optional: include component state in the error report
});
```
### React Hook for Error Reporting
```tsx
import { useErrorReporting } from "@critters/next";
function MyComponent() {
const { reportError } = useErrorReporting();
const handleRiskyOperation = () => {
try {
// Risky operation
} catch (error) {
reportError(error, { context: "handleRiskyOperation" });
}
};
return <button onClick={handleRiskyOperation}>Do Risky Thing</button>;
}
```
### API Route Error Handling
```tsx
import { withErrorReporting } from "@critters/next";
export default withErrorReporting(
async function handler(req, res) {
// Your API route logic
},
{
captureRequest: true, // Optional: include request data in error report
}
);
```
### Next.js App Router and Pages Router Integration
```tsx
import { withPageErrorReporting, withAppErrorReporting } from "@critters/next";
// For Pages Router
export default withPageErrorReporting()(MyPage);
// For App Router
export default withAppErrorReporting()(MyAppComponent);
```
## API Reference
### `initBugTracker(config)`
Initializes the bug tracker with configuration.
**Parameters:**
- `config`: Configuration object
- `apiKey`: Public API key for identifying your application
- `endpoint`: (Optional) URL of your custom endpoint (defaults to Critters API)
- `secretKey`: (Optional) Secret key for signing requests (automatically fetched if not provided)
- `projectId`: (Optional) Project ID for grouping bugs (automatically fetched if not provided)
- `environment`: (Optional) Environment name (e.g., 'development', 'production')
- `enabled`: (Optional) Whether the bug tracker is enabled (default: `true`)
- `debug`: (Optional) Whether to log debug information (default: `false`)
- `captureConsole`: (Optional) Whether to capture console logs (default: `true`)
- `captureNetworkRequests`: (Optional) Whether to capture network requests (default: `true`)
- `captureUserInteractions`: (Optional) Whether to capture user interactions (default: `true`)
- `captureApplicationState`: (Optional) Whether to capture application state (default: `true`)
- `onBeforeReport`: (Optional) Function called before sending a report
- `onAfterReport`: (Optional) Function called after sending a report
### `catch_(error, metadata)`
Reports an error to the configured endpoint.
**Parameters:**
- `error`: Error object or any value that can be converted to a string
- `metadata`: (Optional) Additional information about the error
**Returns:**
- Promise that resolves to `{ success: boolean, message: string, reportId?: string, timestamp?: string }`
### `reportBug(error, metadata)` (Deprecated)
Legacy method for reporting errors. Use `catch_()` instead.
### `ErrorBoundary`
React component that catches errors in its children and reports them.
**Props:**
- `children`: React nodes to render
- `fallback`: (Optional) React node to render when an error occurs
- `onError`: (Optional) Function to call when an error is caught
- `captureProps`: (Optional) Whether to include component props in the error report
- `captureState`: (Optional) Whether to include component state in the error report
### `withErrorBoundary(Component, options)`
Higher-order component that wraps a component with an error boundary.
**Parameters:**
- `Component`: React component to wrap
- `options`: (Optional) Configuration object
- `fallback`: React node to render when an error occurs
- `onError`: Function to call when an error is caught
- `captureProps`: Whether to include component props in the error report
- `captureState`: Whether to include component state in the error report
**Returns:**
- Wrapped component with error boundary
### `useErrorReporting()`
React hook for reporting errors.
**Returns:**
- Object with `reportError` method for reporting errors
### `withErrorReporting(handler, options)`
Middleware for Next.js API routes that catches and reports errors.
**Parameters:**
- `handler`: Next.js API route handler
- `options`: (Optional) Configuration object
- `captureRequest`: Whether to include request data in the error report
- `captureResponse`: Whether to include response data in the error report
- `onError`: Function to call when an error is caught
**Returns:**
- Wrapped handler with error reporting
### `withPageErrorReporting(options)`
Higher-order component for Next.js Pages that catches and reports errors.
**Parameters:**
- `options`: (Optional) Configuration object
- `captureProps`: Whether to include page props in the error report
- `captureInitialProps`: Whether to include getInitialProps data in the error report
- `onError`: Function to call when an error is caught
**Returns:**
- Function that takes a Page component and returns a wrapped component with error reporting
### `withAppErrorReporting(options)`
Higher-order component for Next.js App Router components that catches and reports errors.
**Parameters:**
- `options`: (Optional) Configuration object
- `captureParams`: Whether to include route params in the error report
- `captureSearchParams`: Whether to include search params in the error report
- `onError`: Function to call when an error is caught
**Returns:**
- Function that takes an App component and returns a wrapped component with error reporting
## Security Considerations
- The API key is used to fetch the necessary configuration from the server.
- The secretKey is never exposed to the client and is securely stored in the database.
- HMAC SHA-256 signatures verify the authenticity of error reports.
- Rate limiting prevents abuse of the reporting endpoint.
- Sensitive data is automatically sanitized from error reports.
## Contributing
### Commit Message Convention
We use [Conventional Commits](https://www.conventionalcommits.org/) for automated versioning and changelog generation. Please follow these conventions for your commit messages:
- `feat`: A new feature (minor version bump)
- `fix`: A bug fix (patch version bump)
- `docs`: Documentation changes
- `style`: Changes that don't affect the code's meaning
- `refactor`: Code changes that neither fix bugs nor add features
- `perf`: Performance improvements
- `test`: Adding or updating tests
- `build`: Changes to the build process or dependencies
- `ci`: Changes to CI configuration
**For breaking changes**, use one of these formats:
```
feat!: introduce a breaking change
# OR
feat: introduce a new feature
BREAKING CHANGE: description of the breaking change
```
Breaking changes will trigger a major version bump.
## License
MIT