Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
201 lines
4.9 KiB
Text
201 lines
4.9 KiB
Text
import { isParameterizedString, isError, isPlainObject, isErrorEvent } from './is.js';
|
|
import { addExceptionMechanism, addExceptionTypeValue } from './misc.js';
|
|
import { normalizeToSize } from './normalize.js';
|
|
import { extractExceptionKeysForMessage } from './object.js';
|
|
|
|
/**
|
|
* Extracts stack frames from the error.stack string
|
|
*/
|
|
function parseStackFrames(stackParser, error) {
|
|
return stackParser(error.stack || '', 1);
|
|
}
|
|
|
|
/**
|
|
* Extracts stack frames from the error and builds a Sentry Exception
|
|
*/
|
|
function exceptionFromError(stackParser, error) {
|
|
const exception = {
|
|
type: error.name || error.constructor.name,
|
|
value: error.message,
|
|
};
|
|
|
|
const frames = parseStackFrames(stackParser, error);
|
|
if (frames.length) {
|
|
exception.stacktrace = { frames };
|
|
}
|
|
|
|
return exception;
|
|
}
|
|
|
|
/** If a plain object has a property that is an `Error`, return this error. */
|
|
function getErrorPropertyFromObject(obj) {
|
|
for (const prop in obj) {
|
|
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
|
|
const value = obj[prop];
|
|
if (value instanceof Error) {
|
|
return value;
|
|
}
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
function getMessageForObject(exception) {
|
|
if ('name' in exception && typeof exception.name === 'string') {
|
|
let message = `'${exception.name}' captured as exception`;
|
|
|
|
if ('message' in exception && typeof exception.message === 'string') {
|
|
message += ` with message '${exception.message}'`;
|
|
}
|
|
|
|
return message;
|
|
} else if ('message' in exception && typeof exception.message === 'string') {
|
|
return exception.message;
|
|
}
|
|
|
|
const keys = extractExceptionKeysForMessage(exception);
|
|
|
|
// Some ErrorEvent instances do not have an `error` property, which is why they are not handled before
|
|
// We still want to try to get a decent message for these cases
|
|
if (isErrorEvent(exception)) {
|
|
return `Event \`ErrorEvent\` captured as exception with message \`${exception.message}\``;
|
|
}
|
|
|
|
const className = getObjectClassName(exception);
|
|
|
|
return `${
|
|
className && className !== 'Object' ? `'${className}'` : 'Object'
|
|
} captured as exception with keys: ${keys}`;
|
|
}
|
|
|
|
function getObjectClassName(obj) {
|
|
try {
|
|
const prototype = Object.getPrototypeOf(obj);
|
|
return prototype ? prototype.constructor.name : undefined;
|
|
} catch {
|
|
// ignore errors here
|
|
}
|
|
}
|
|
|
|
function getException(
|
|
client,
|
|
mechanism,
|
|
exception,
|
|
hint,
|
|
) {
|
|
if (isError(exception)) {
|
|
return [exception, undefined];
|
|
}
|
|
|
|
// Mutate this!
|
|
mechanism.synthetic = true;
|
|
|
|
if (isPlainObject(exception)) {
|
|
const normalizeDepth = client?.getOptions().normalizeDepth;
|
|
const extras = { ['__serialized__']: normalizeToSize(exception , normalizeDepth) };
|
|
|
|
const errorFromProp = getErrorPropertyFromObject(exception);
|
|
if (errorFromProp) {
|
|
return [errorFromProp, extras];
|
|
}
|
|
|
|
const message = getMessageForObject(exception);
|
|
const ex = hint?.syntheticException || new Error(message);
|
|
ex.message = message;
|
|
|
|
return [ex, extras];
|
|
}
|
|
|
|
// This handles when someone does: `throw "something awesome";`
|
|
// We use synthesized Error here so we can extract a (rough) stack trace.
|
|
const ex = hint?.syntheticException || new Error(exception );
|
|
ex.message = `${exception}`;
|
|
|
|
return [ex, undefined];
|
|
}
|
|
|
|
/**
|
|
* Builds and Event from a Exception
|
|
* @hidden
|
|
*/
|
|
function eventFromUnknownInput(
|
|
client,
|
|
stackParser,
|
|
exception,
|
|
hint,
|
|
) {
|
|
const providedMechanism = hint?.data && (hint.data ).mechanism;
|
|
const mechanism = providedMechanism || {
|
|
handled: true,
|
|
type: 'generic',
|
|
};
|
|
|
|
const [ex, extras] = getException(client, mechanism, exception, hint);
|
|
|
|
const event = {
|
|
exception: {
|
|
values: [exceptionFromError(stackParser, ex)],
|
|
},
|
|
};
|
|
|
|
if (extras) {
|
|
event.extra = extras;
|
|
}
|
|
|
|
addExceptionTypeValue(event, undefined, undefined);
|
|
addExceptionMechanism(event, mechanism);
|
|
|
|
return {
|
|
...event,
|
|
event_id: hint?.event_id,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Builds and Event from a Message
|
|
* @hidden
|
|
*/
|
|
function eventFromMessage(
|
|
stackParser,
|
|
message,
|
|
level = 'info',
|
|
hint,
|
|
attachStacktrace,
|
|
) {
|
|
const event = {
|
|
event_id: hint?.event_id,
|
|
level,
|
|
};
|
|
|
|
if (attachStacktrace && hint?.syntheticException) {
|
|
const frames = parseStackFrames(stackParser, hint.syntheticException);
|
|
if (frames.length) {
|
|
event.exception = {
|
|
values: [
|
|
{
|
|
value: message,
|
|
stacktrace: { frames },
|
|
},
|
|
],
|
|
};
|
|
addExceptionMechanism(event, { synthetic: true });
|
|
}
|
|
}
|
|
|
|
if (isParameterizedString(message)) {
|
|
const { __sentry_template_string__, __sentry_template_values__ } = message;
|
|
|
|
event.logentry = {
|
|
message: __sentry_template_string__,
|
|
params: __sentry_template_values__,
|
|
};
|
|
return event;
|
|
}
|
|
|
|
event.message = message;
|
|
return event;
|
|
}
|
|
|
|
export { eventFromMessage, eventFromUnknownInput, exceptionFromError, parseStackFrames };
|
|
//# sourceMappingURL=eventbuilder.js.map
|