diff --git a/packages/errors/lib/index.js b/packages/errors/lib/index.js index fc4076751..f4deedd38 100644 --- a/packages/errors/lib/index.js +++ b/packages/errors/lib/index.js @@ -1,5 +1,7 @@ 'use strict'; +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); Object.defineProperty(exports, "__esModule", { @@ -69,6 +71,7 @@ var FeathersError = (function (_extendableBuiltin2) { var errors = undefined; var message = undefined; + var newData = undefined; if (msg instanceof Error) { message = msg.message || 'Error'; @@ -88,9 +91,16 @@ var FeathersError = (function (_extendableBuiltin2) { message = msg; } - if (data && data.errors) { - errors = data.errors; - delete data.errors; + if (data) { + // NOTE(EK): To make sure that we are not messing + // with immutable data, just make a copy. + // https://github.com/feathersjs/feathers-errors/issues/19 + newData = _extends({}, data); + + if (newData.errors) { + errors = newData.errors; + delete newData.errors; + } } // NOTE (EK): Babel doesn't support this so @@ -103,11 +113,9 @@ var FeathersError = (function (_extendableBuiltin2) { _this.message = message; _this.code = code; _this.className = className; - _this.data = data; + _this.data = newData; _this.errors = errors || {}; - // Error.captureStackTrace(this, this.name); - debug(_this.name + '(' + _this.code + '): ' + _this.message); return _this; } diff --git a/packages/errors/src/index.js b/packages/errors/src/index.js index 73323c9fb..b6cb222f8 100644 --- a/packages/errors/src/index.js +++ b/packages/errors/src/index.js @@ -17,6 +17,7 @@ class FeathersError extends Error { let errors; let message; + let newData; if (msg instanceof Error) { message = msg.message || 'Error'; @@ -36,9 +37,16 @@ class FeathersError extends Error { message = msg; } - if (data && data.errors) { - errors = data.errors; - delete data.errors; + if (data) { + // NOTE(EK): To make sure that we are not messing + // with immutable data, just make a copy. + // https://github.com/feathersjs/feathers-errors/issues/19 + newData = Object.assign({}, data); + + if (newData.errors) { + errors = newData.errors; + delete newData.errors; + } } super(message); @@ -50,7 +58,7 @@ class FeathersError extends Error { this.message = message; this.code = code; this.className = className; - this.data = data; + this.data = newData; this.errors = errors || {}; debug(`${this.name}(${this.code}): ${this.message}`); diff --git a/packages/errors/test/index.test.js b/packages/errors/test/index.test.js index 7a12a3b41..b187da5d6 100644 --- a/packages/errors/test/index.test.js +++ b/packages/errors/test/index.test.js @@ -107,7 +107,7 @@ describe('feathers-errors', () => { var error = new errors.GeneralError(data); assert.equal(error.code, 500); assert.equal(error.message, 'Error'); - assert.equal(error.data, data); + assert.deepEqual(error.data, data); }); }); @@ -133,7 +133,7 @@ describe('feathers-errors', () => { var error = new errors.GeneralError('Custom Error', data); assert.equal(error.code, 500); assert.equal(error.message, 'Custom Error'); - assert.equal(error.data, data); + assert.deepEqual(error.data, data); }); it('with multiple errors', () => { @@ -167,5 +167,19 @@ describe('feathers-errors', () => { var error = new errors.GeneralError('Custom Error', data); assert.equal(JSON.stringify(error), expected); }); + + it('can handle immutable data', () => { + var data = { + errors: { + email: 'Email Taken', + password: 'Invalid Password' + }, + foo: 'bar' + }; + + var error = new errors.GeneralError('Custom Error', Object.freeze(data)); + assert.equal(error.data.errors, undefined); + assert.deepEqual(error.data, {foo: 'bar'}); + }); }); });