12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- Object.defineProperty(exports, '__esModule', { value: true });
- const core = require('@sentry/core');
- const responseEnd = require('./utils/responseEnd.js');
- /**
- * Capture the exception passed by nextjs to the `_error` page, adding context data as appropriate.
- *
- * @param contextOrProps The data passed to either `getInitialProps` or `render` by nextjs
- */
- async function captureUnderscoreErrorException(contextOrProps) {
- const { req, res, err } = contextOrProps;
- // 404s (and other 400-y friends) can trigger `_error`, but we don't want to send them to Sentry
- const statusCode = (res && res.statusCode) || contextOrProps.statusCode;
- if (statusCode && statusCode < 500) {
- return Promise.resolve();
- }
- // In previous versions of the suggested `_error.js` page in which this function is meant to be used, there was a
- // workaround for https://github.com/vercel/next.js/issues/8592 which involved an extra call to this function, in the
- // custom error component's `render` method, just in case it hadn't been called by `getInitialProps`. Now that that
- // issue has been fixed, the second call is unnecessary, but since it lives in user code rather than our code, users
- // have to be the ones to get rid of it, and guaraneteedly, not all of them will. So, rather than capture the error
- // twice, we just bail if we sense we're in that now-extraneous second call. (We can tell which function we're in
- // because Nextjs passes `pathname` to `getInitialProps` but not to `render`.)
- if (!contextOrProps.pathname) {
- return Promise.resolve();
- }
- core.withScope(scope => {
- if (req) {
- scope.setSDKProcessingMetadata({ request: req });
- }
- // If third-party libraries (or users themselves) throw something falsy, we want to capture it as a message (which
- // is what passing a string to `captureException` will wind up doing)
- core.captureException(err || `_error.js called with falsy error (${err})`, {
- mechanism: {
- type: 'instrument',
- handled: false,
- data: {
- function: '_error.getInitialProps',
- },
- },
- });
- });
- // In case this is being run as part of a serverless function (as is the case with the server half of nextjs apps
- // deployed to vercel), make sure the error gets sent to Sentry before the lambda exits.
- await responseEnd.flushQueue();
- }
- exports.captureUnderscoreErrorException = captureUnderscoreErrorException;
- //# sourceMappingURL=_error.js.map
|