scout-error 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node.cjs +1 -1
- package/dist/node.cjs.map +2 -2
- package/dist/node.js +1 -1
- package/dist/node.js.map +2 -2
- package/package.json +1 -1
package/dist/node.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var p=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var f=(e,t)=>{for(var
|
|
1
|
+
var p=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var f=(e,t)=>{for(var s in t)p(e,s,{get:t[s],enumerable:!0})},k=(e,t,s,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of m(t))!g.call(e,r)&&r!==s&&p(e,r,{get:()=>t[r],enumerable:!(u=l(t,r))||u.enumerable});return e};var h=e=>k(p({},"__esModule",{value:!0}),e);var j={};f(j,{addBreadcrumb:()=>b,captureError:()=>O,errorHandlingMiddleware:()=>T,initTracker:()=>x,setContext:()=>D,setTag:()=>E,setUser:()=>y});module.exports=h(j);var n={debug:!1,endpoint:"",token:null,sendErrors:!0,captureUserDetails:!1,captureRequestDetails:!0,captureStackTrace:!0},a={environment:process.env.NODE_ENV||"production",project:null,release:null,version:null,sdk:"node",nodeVersion:process.version,platform:process.platform,arch:process.arch},d=null,o={},c=[],S=30;function i(e){if(n.debug&&console.error("[Scout]:",e),d&&(e.user=d),Object.keys(o).length&&(e.context={...o}),e.breadcrumbs=c.slice(),n.endpoint&&n.sendErrors){let t={"Content-Type":"application/json"};n.token&&(t["X-Ingest-Token"]=n.token),fetch(n.endpoint,{method:"POST",headers:t,body:JSON.stringify(e)}).catch(s=>{console.error("[Scout] Failed to send error:",s.message)})}}function x(e={},t={}){a={...a,...e},n={...n,...t},process.on("uncaughtException",s=>{i({type:"uncaughtException",message:s.message,stack:s.stack,errorTrace:s.stack,timestamp:new Date().toISOString(),...a})}),process.on("unhandledRejection",s=>{i({type:"unhandledRejection",message:s?.message||"Unhandled Promise Rejection",stack:s?.stack||"No stack trace",errorTrace:s?.stack||"No stack trace",timestamp:new Date().toISOString(),...a})})}function T(e,t,s,u){let r={type:"expressError",message:e.message,stack:n.captureStackTrace?e.stack:void 0,errorTrace:n.captureStackTrace?e.stack:void 0,path:t.originalUrl,method:t.method,params:t.params,query:t.query,headers:n.captureRequestDetails?t.headers:void 0,timestamp:new Date().toISOString(),...a};n.captureUserDetails&&t.user&&(r.user={id:t.user.id||t.user._id,email:t.user.email,name:t.user.name||t.user.username}),i(r),s.status(500).json({error:"Internal Server Error"})}function y(e){d=e}function D(e){o={...o,...e}}function E(e,t){o[e]=t}function b(e){c.push({timestamp:Date.now(),...e}),c.length>S&&c.shift()}function O(e,t={}){let s={type:"manual",message:e?.message||String(e),stack:e?.stack,errorTrace:e?.stack,timestamp:new Date().toISOString(),...a};Object.keys(t).length&&(s.context={...o,...t}),i(s)}0&&(module.exports={addBreadcrumb,captureError,errorHandlingMiddleware,initTracker,setContext,setTag,setUser});
|
|
2
2
|
//# sourceMappingURL=node.cjs.map
|
package/dist/node.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/node.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Scout.js Node.js SDK\n *\n * Captures uncaught exceptions, unhandled rejections, and Express errors.\n *\n * Usage:\n * import { initTracker, errorHandlingMiddleware } from 'scout-error/node'\n */\n\nlet config = {\n debug: false,\n endpoint: '',\n token: null,\n sendErrors: true,\n captureUserDetails: false,\n captureRequestDetails: true,\n captureStackTrace: true,\n}\n\nlet scope = {\n environment: 'production',\n project: null,\n release: null,\n version: null,\n sdk: 'node',\n}\n\nlet userContext = null\nlet customContext = {}\nconst breadcrumbs = []\nconst MAX_BREADCRUMBS = 30\n\nfunction logError(details) {\n if (config.debug) {\n console.error('[Scout]:', details)\n }\n\n // Attach user, context, breadcrumbs\n if (userContext) details.user = userContext\n if (Object.keys(customContext).length) details.context = { ...customContext }\n details.breadcrumbs = breadcrumbs.slice()\n\n if (config.endpoint && config.sendErrors) {\n const headers = { 'Content-Type': 'application/json' }\n if (config.token) headers['X-Ingest-Token'] = config.token\n\n fetch(config.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(details),\n }).catch(err => {\n console.error('[Scout] Failed to send error:', err.message)\n })\n }\n}\n\n/**\n * Initialize the Node.js error tracker.\n */\nexport function initTracker(customScope = {}, customConfig = {}) {\n scope = { ...scope, ...customScope }\n config = { ...config, ...customConfig }\n\n process.on('uncaughtException', (error) => {\n logError({\n type: 'uncaughtException',\n message: error.message,\n stack: error.stack,\n errorTrace: error.stack,\n timestamp: new Date().toISOString(),\n ...scope,\n })\n })\n\n process.on('unhandledRejection', (reason) => {\n logError({\n type: 'unhandledRejection',\n message: reason?.message || 'Unhandled Promise Rejection',\n stack: reason?.stack || 'No stack trace',\n errorTrace: reason?.stack || 'No stack trace',\n timestamp: new Date().toISOString(),\n ...scope,\n })\n })\n}\n\n/**\n * Express error handling middleware.\n */\nexport function errorHandlingMiddleware(err, req, res, next) {\n const details = {\n type: 'expressError',\n message: err.message,\n stack: config.captureStackTrace ? err.stack : undefined,\n errorTrace: config.captureStackTrace ? err.stack : undefined,\n path: req.originalUrl,\n method: req.method,\n params: req.params,\n query: req.query,\n headers: config.captureRequestDetails ? req.headers : undefined,\n timestamp: new Date().toISOString(),\n ...scope,\n }\n\n // Auto-capture user from req.user if configured\n if (config.captureUserDetails && req.user) {\n details.user = {\n id: req.user.id || req.user._id,\n email: req.user.email,\n name: req.user.name || req.user.username,\n }\n }\n\n logError(details)\n res.status(500).json({ error: 'Internal Server Error' })\n}\n\n/**\n * Set identified user info.\n */\nexport function setUser(user) {\n userContext = user\n}\n\n/**\n * Merge custom key-value context.\n */\nexport function setContext(ctx) {\n customContext = { ...customContext, ...ctx }\n}\n\n/**\n * Set a single context tag.\n */\nexport function setTag(key, value) {\n customContext[key] = value\n}\n\n/**\n * Manually add a breadcrumb.\n */\nexport function addBreadcrumb(crumb) {\n breadcrumbs.push({ timestamp: Date.now(), ...crumb })\n if (breadcrumbs.length > MAX_BREADCRUMBS) breadcrumbs.shift()\n}\n\n/**\n * Manually capture an error.\n */\nexport function captureError(error, extra = {}) {\n
|
|
5
|
-
"mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,EAAA,iBAAAC,EAAA,4BAAAC,EAAA,gBAAAC,EAAA,eAAAC,EAAA,WAAAC,EAAA,YAAAC,IAAA,eAAAC,EAAAT,GASA,IAAIU,EAAS,CACX,MAAO,GACP,SAAU,GACV,MAAO,KACP,WAAY,GACZ,mBAAoB,GACpB,sBAAuB,GACvB,kBAAmB,EACrB,EAEIC,EAAQ,CACV,YAAa,
|
|
4
|
+
"sourcesContent": ["/**\n * Scout.js Node.js SDK\n *\n * Captures uncaught exceptions, unhandled rejections, and Express errors.\n *\n * Usage:\n * import { initTracker, errorHandlingMiddleware } from 'scout-error/node'\n */\n\nlet config = {\n debug: false,\n endpoint: '',\n token: null,\n sendErrors: true,\n captureUserDetails: false,\n captureRequestDetails: true,\n captureStackTrace: true,\n}\n\nlet scope = {\n environment: process.env.NODE_ENV || 'production',\n project: null,\n release: null,\n version: null,\n sdk: 'node',\n nodeVersion: process.version,\n platform: process.platform,\n arch: process.arch,\n}\n\nlet userContext = null\nlet customContext = {}\nconst breadcrumbs = []\nconst MAX_BREADCRUMBS = 30\n\nfunction logError(details) {\n if (config.debug) {\n console.error('[Scout]:', details)\n }\n\n // Attach user, context, breadcrumbs\n if (userContext) details.user = userContext\n if (Object.keys(customContext).length) details.context = { ...customContext }\n details.breadcrumbs = breadcrumbs.slice()\n\n if (config.endpoint && config.sendErrors) {\n const headers = { 'Content-Type': 'application/json' }\n if (config.token) headers['X-Ingest-Token'] = config.token\n\n fetch(config.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(details),\n }).catch(err => {\n console.error('[Scout] Failed to send error:', err.message)\n })\n }\n}\n\n/**\n * Initialize the Node.js error tracker.\n */\nexport function initTracker(customScope = {}, customConfig = {}) {\n scope = { ...scope, ...customScope }\n config = { ...config, ...customConfig }\n\n process.on('uncaughtException', (error) => {\n logError({\n type: 'uncaughtException',\n message: error.message,\n stack: error.stack,\n errorTrace: error.stack,\n timestamp: new Date().toISOString(),\n ...scope,\n })\n })\n\n process.on('unhandledRejection', (reason) => {\n logError({\n type: 'unhandledRejection',\n message: reason?.message || 'Unhandled Promise Rejection',\n stack: reason?.stack || 'No stack trace',\n errorTrace: reason?.stack || 'No stack trace',\n timestamp: new Date().toISOString(),\n ...scope,\n })\n })\n}\n\n/**\n * Express error handling middleware.\n */\nexport function errorHandlingMiddleware(err, req, res, next) {\n const details = {\n type: 'expressError',\n message: err.message,\n stack: config.captureStackTrace ? err.stack : undefined,\n errorTrace: config.captureStackTrace ? err.stack : undefined,\n path: req.originalUrl,\n method: req.method,\n params: req.params,\n query: req.query,\n headers: config.captureRequestDetails ? req.headers : undefined,\n timestamp: new Date().toISOString(),\n ...scope,\n }\n\n // Auto-capture user from req.user if configured\n if (config.captureUserDetails && req.user) {\n details.user = {\n id: req.user.id || req.user._id,\n email: req.user.email,\n name: req.user.name || req.user.username,\n }\n }\n\n logError(details)\n res.status(500).json({ error: 'Internal Server Error' })\n}\n\n/**\n * Set identified user info.\n */\nexport function setUser(user) {\n userContext = user\n}\n\n/**\n * Merge custom key-value context.\n */\nexport function setContext(ctx) {\n customContext = { ...customContext, ...ctx }\n}\n\n/**\n * Set a single context tag.\n */\nexport function setTag(key, value) {\n customContext[key] = value\n}\n\n/**\n * Manually add a breadcrumb.\n */\nexport function addBreadcrumb(crumb) {\n breadcrumbs.push({ timestamp: Date.now(), ...crumb })\n if (breadcrumbs.length > MAX_BREADCRUMBS) breadcrumbs.shift()\n}\n\n/**\n * Manually capture an error.\n */\nexport function captureError(error, extra = {}) {\n const details = {\n type: 'manual',\n message: error?.message || String(error),\n stack: error?.stack,\n errorTrace: error?.stack,\n timestamp: new Date().toISOString(),\n ...scope,\n }\n // Put extra fields into context so they show up in the UI\n if (Object.keys(extra).length) {\n details.context = { ...customContext, ...extra }\n }\n logError(details)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["node_exports", "__export", "addBreadcrumb", "captureError", "errorHandlingMiddleware", "initTracker", "setContext", "setTag", "setUser", "__toCommonJS", "config", "scope", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "logError", "details", "headers", "err", "customScope", "customConfig", "error", "reason", "req", "res", "next", "user", "ctx", "key", "value", "crumb", "extra"]
|
|
7
7
|
}
|
package/dist/node.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var n={debug:!1,endpoint:"",token:null,sendErrors:!0,captureUserDetails:!1,captureRequestDetails:!0,captureStackTrace:!0},
|
|
1
|
+
var n={debug:!1,endpoint:"",token:null,sendErrors:!0,captureUserDetails:!1,captureRequestDetails:!0,captureStackTrace:!0},r={environment:process.env.NODE_ENV||"production",project:null,release:null,version:null,sdk:"node",nodeVersion:process.version,platform:process.platform,arch:process.arch},i=null,a={},o=[],p=30;function c(e){if(n.debug&&console.error("[Scout]:",e),i&&(e.user=i),Object.keys(a).length&&(e.context={...a}),e.breadcrumbs=o.slice(),n.endpoint&&n.sendErrors){let t={"Content-Type":"application/json"};n.token&&(t["X-Ingest-Token"]=n.token),fetch(n.endpoint,{method:"POST",headers:t,body:JSON.stringify(e)}).catch(s=>{console.error("[Scout] Failed to send error:",s.message)})}}function l(e={},t={}){r={...r,...e},n={...n,...t},process.on("uncaughtException",s=>{c({type:"uncaughtException",message:s.message,stack:s.stack,errorTrace:s.stack,timestamp:new Date().toISOString(),...r})}),process.on("unhandledRejection",s=>{c({type:"unhandledRejection",message:s?.message||"Unhandled Promise Rejection",stack:s?.stack||"No stack trace",errorTrace:s?.stack||"No stack trace",timestamp:new Date().toISOString(),...r})})}function m(e,t,s,d){let u={type:"expressError",message:e.message,stack:n.captureStackTrace?e.stack:void 0,errorTrace:n.captureStackTrace?e.stack:void 0,path:t.originalUrl,method:t.method,params:t.params,query:t.query,headers:n.captureRequestDetails?t.headers:void 0,timestamp:new Date().toISOString(),...r};n.captureUserDetails&&t.user&&(u.user={id:t.user.id||t.user._id,email:t.user.email,name:t.user.name||t.user.username}),c(u),s.status(500).json({error:"Internal Server Error"})}function g(e){i=e}function f(e){a={...a,...e}}function k(e,t){a[e]=t}function h(e){o.push({timestamp:Date.now(),...e}),o.length>p&&o.shift()}function S(e,t={}){let s={type:"manual",message:e?.message||String(e),stack:e?.stack,errorTrace:e?.stack,timestamp:new Date().toISOString(),...r};Object.keys(t).length&&(s.context={...a,...t}),c(s)}export{h as addBreadcrumb,S as captureError,m as errorHandlingMiddleware,l as initTracker,f as setContext,k as setTag,g as setUser};
|
|
2
2
|
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/node.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Scout.js Node.js SDK\n *\n * Captures uncaught exceptions, unhandled rejections, and Express errors.\n *\n * Usage:\n * import { initTracker, errorHandlingMiddleware } from 'scout-error/node'\n */\n\nlet config = {\n debug: false,\n endpoint: '',\n token: null,\n sendErrors: true,\n captureUserDetails: false,\n captureRequestDetails: true,\n captureStackTrace: true,\n}\n\nlet scope = {\n environment: 'production',\n project: null,\n release: null,\n version: null,\n sdk: 'node',\n}\n\nlet userContext = null\nlet customContext = {}\nconst breadcrumbs = []\nconst MAX_BREADCRUMBS = 30\n\nfunction logError(details) {\n if (config.debug) {\n console.error('[Scout]:', details)\n }\n\n // Attach user, context, breadcrumbs\n if (userContext) details.user = userContext\n if (Object.keys(customContext).length) details.context = { ...customContext }\n details.breadcrumbs = breadcrumbs.slice()\n\n if (config.endpoint && config.sendErrors) {\n const headers = { 'Content-Type': 'application/json' }\n if (config.token) headers['X-Ingest-Token'] = config.token\n\n fetch(config.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(details),\n }).catch(err => {\n console.error('[Scout] Failed to send error:', err.message)\n })\n }\n}\n\n/**\n * Initialize the Node.js error tracker.\n */\nexport function initTracker(customScope = {}, customConfig = {}) {\n scope = { ...scope, ...customScope }\n config = { ...config, ...customConfig }\n\n process.on('uncaughtException', (error) => {\n logError({\n type: 'uncaughtException',\n message: error.message,\n stack: error.stack,\n errorTrace: error.stack,\n timestamp: new Date().toISOString(),\n ...scope,\n })\n })\n\n process.on('unhandledRejection', (reason) => {\n logError({\n type: 'unhandledRejection',\n message: reason?.message || 'Unhandled Promise Rejection',\n stack: reason?.stack || 'No stack trace',\n errorTrace: reason?.stack || 'No stack trace',\n timestamp: new Date().toISOString(),\n ...scope,\n })\n })\n}\n\n/**\n * Express error handling middleware.\n */\nexport function errorHandlingMiddleware(err, req, res, next) {\n const details = {\n type: 'expressError',\n message: err.message,\n stack: config.captureStackTrace ? err.stack : undefined,\n errorTrace: config.captureStackTrace ? err.stack : undefined,\n path: req.originalUrl,\n method: req.method,\n params: req.params,\n query: req.query,\n headers: config.captureRequestDetails ? req.headers : undefined,\n timestamp: new Date().toISOString(),\n ...scope,\n }\n\n // Auto-capture user from req.user if configured\n if (config.captureUserDetails && req.user) {\n details.user = {\n id: req.user.id || req.user._id,\n email: req.user.email,\n name: req.user.name || req.user.username,\n }\n }\n\n logError(details)\n res.status(500).json({ error: 'Internal Server Error' })\n}\n\n/**\n * Set identified user info.\n */\nexport function setUser(user) {\n userContext = user\n}\n\n/**\n * Merge custom key-value context.\n */\nexport function setContext(ctx) {\n customContext = { ...customContext, ...ctx }\n}\n\n/**\n * Set a single context tag.\n */\nexport function setTag(key, value) {\n customContext[key] = value\n}\n\n/**\n * Manually add a breadcrumb.\n */\nexport function addBreadcrumb(crumb) {\n breadcrumbs.push({ timestamp: Date.now(), ...crumb })\n if (breadcrumbs.length > MAX_BREADCRUMBS) breadcrumbs.shift()\n}\n\n/**\n * Manually capture an error.\n */\nexport function captureError(error, extra = {}) {\n
|
|
5
|
-
"mappings": "AASA,IAAIA,EAAS,CACX,MAAO,GACP,SAAU,GACV,MAAO,KACP,WAAY,GACZ,mBAAoB,GACpB,sBAAuB,GACvB,kBAAmB,EACrB,EAEIC,EAAQ,CACV,YAAa,
|
|
4
|
+
"sourcesContent": ["/**\n * Scout.js Node.js SDK\n *\n * Captures uncaught exceptions, unhandled rejections, and Express errors.\n *\n * Usage:\n * import { initTracker, errorHandlingMiddleware } from 'scout-error/node'\n */\n\nlet config = {\n debug: false,\n endpoint: '',\n token: null,\n sendErrors: true,\n captureUserDetails: false,\n captureRequestDetails: true,\n captureStackTrace: true,\n}\n\nlet scope = {\n environment: process.env.NODE_ENV || 'production',\n project: null,\n release: null,\n version: null,\n sdk: 'node',\n nodeVersion: process.version,\n platform: process.platform,\n arch: process.arch,\n}\n\nlet userContext = null\nlet customContext = {}\nconst breadcrumbs = []\nconst MAX_BREADCRUMBS = 30\n\nfunction logError(details) {\n if (config.debug) {\n console.error('[Scout]:', details)\n }\n\n // Attach user, context, breadcrumbs\n if (userContext) details.user = userContext\n if (Object.keys(customContext).length) details.context = { ...customContext }\n details.breadcrumbs = breadcrumbs.slice()\n\n if (config.endpoint && config.sendErrors) {\n const headers = { 'Content-Type': 'application/json' }\n if (config.token) headers['X-Ingest-Token'] = config.token\n\n fetch(config.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(details),\n }).catch(err => {\n console.error('[Scout] Failed to send error:', err.message)\n })\n }\n}\n\n/**\n * Initialize the Node.js error tracker.\n */\nexport function initTracker(customScope = {}, customConfig = {}) {\n scope = { ...scope, ...customScope }\n config = { ...config, ...customConfig }\n\n process.on('uncaughtException', (error) => {\n logError({\n type: 'uncaughtException',\n message: error.message,\n stack: error.stack,\n errorTrace: error.stack,\n timestamp: new Date().toISOString(),\n ...scope,\n })\n })\n\n process.on('unhandledRejection', (reason) => {\n logError({\n type: 'unhandledRejection',\n message: reason?.message || 'Unhandled Promise Rejection',\n stack: reason?.stack || 'No stack trace',\n errorTrace: reason?.stack || 'No stack trace',\n timestamp: new Date().toISOString(),\n ...scope,\n })\n })\n}\n\n/**\n * Express error handling middleware.\n */\nexport function errorHandlingMiddleware(err, req, res, next) {\n const details = {\n type: 'expressError',\n message: err.message,\n stack: config.captureStackTrace ? err.stack : undefined,\n errorTrace: config.captureStackTrace ? err.stack : undefined,\n path: req.originalUrl,\n method: req.method,\n params: req.params,\n query: req.query,\n headers: config.captureRequestDetails ? req.headers : undefined,\n timestamp: new Date().toISOString(),\n ...scope,\n }\n\n // Auto-capture user from req.user if configured\n if (config.captureUserDetails && req.user) {\n details.user = {\n id: req.user.id || req.user._id,\n email: req.user.email,\n name: req.user.name || req.user.username,\n }\n }\n\n logError(details)\n res.status(500).json({ error: 'Internal Server Error' })\n}\n\n/**\n * Set identified user info.\n */\nexport function setUser(user) {\n userContext = user\n}\n\n/**\n * Merge custom key-value context.\n */\nexport function setContext(ctx) {\n customContext = { ...customContext, ...ctx }\n}\n\n/**\n * Set a single context tag.\n */\nexport function setTag(key, value) {\n customContext[key] = value\n}\n\n/**\n * Manually add a breadcrumb.\n */\nexport function addBreadcrumb(crumb) {\n breadcrumbs.push({ timestamp: Date.now(), ...crumb })\n if (breadcrumbs.length > MAX_BREADCRUMBS) breadcrumbs.shift()\n}\n\n/**\n * Manually capture an error.\n */\nexport function captureError(error, extra = {}) {\n const details = {\n type: 'manual',\n message: error?.message || String(error),\n stack: error?.stack,\n errorTrace: error?.stack,\n timestamp: new Date().toISOString(),\n ...scope,\n }\n // Put extra fields into context so they show up in the UI\n if (Object.keys(extra).length) {\n details.context = { ...customContext, ...extra }\n }\n logError(details)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["config", "scope", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "logError", "details", "headers", "err", "initTracker", "customScope", "customConfig", "error", "reason", "errorHandlingMiddleware", "req", "res", "next", "setUser", "user", "setContext", "ctx", "setTag", "key", "value", "addBreadcrumb", "crumb", "captureError", "extra"]
|
|
7
7
|
}
|