Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Module dependencies.
*/

const { cloneDeep, cloneDeepWith, escapeRegExp, get, set } = require('lodash');
const { cloneDeep, cloneDeepWith, escapeRegExp, get, isPlainObject, set } = require('lodash');
const { serializeError: errorSerializer } = require('serialize-error');
const stringify = require('json-stringify-safe');
const traverse = require('traverse');
Expand Down Expand Up @@ -214,6 +214,13 @@ module.exports.anonymizer = (
*/

function datadogErrorSerializer(error) {
if (!isPlainObject(error)) {
Copy link

Copilot AI Aug 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider using a more explicit type check. isPlainObject from lodash excludes many valid Error instances since Error objects are not plain objects. This could incorrectly wrap actual Error instances. Consider checking typeof error !== 'object' || error === null || Array.isArray(error) instead.

Suggested change
if (!isPlainObject(error)) {
if (typeof error !== 'object' || error === null || Array.isArray(error)) {

Copilot uses AI. Check for mistakes.
return {
details: error,
kind: 'Error'
};
}

return {
...error,
kind: error.name || 'Error'
Expand Down
26 changes: 24 additions & 2 deletions test/src/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -832,26 +832,48 @@ describe('Anonymizer', () => {
const serializer = jest.fn(builtinSerializers.datadogError);
const serializers = [
{ path: 'err', serializer },
{ path: 'errArr', serializer },
{ path: 'errStr', serializer },
{ path: 'error', serializer }
];
const whitelist = ['error.foo', 'error.kind', 'error.message', 'error.name', 'error.stack'];
const whitelist = [
'errArr.details.*',
'errArr.kind',
'errStr.details',
'errStr.kind',
'error.foo',
'error.kind',
'error.message',
'error.name',
'error.stack'
];
const anonymize = anonymizer({ whitelist }, { serializers });

const result = anonymize({
e: error,
err: {
statusCode: 400
},
errArr: ['foo', 'bar'],
errStr: 'foobar',
error,
error2: error,
foo: 'bar'
});

expect(serializer).toHaveBeenCalledTimes(2);
expect(serializer).toHaveBeenCalledTimes(4);
expect(result.err).toEqual({
kind: '--REDACTED--',
statusCode: '--REDACTED--'
});
expect(result.errArr).toEqual({
details: ['foo', 'bar'],
kind: 'Error'
});
expect(result.errStr).toEqual({
details: 'foobar',
kind: 'Error'
});
expect(result.error).toEqual({
kind: 'Error',
message: 'foobar',
Expand Down