From b10f55f6b0830f11016872159029624cf948f861 Mon Sep 17 00:00:00 2001
From: "Andrew E. Rhyne" <andrew@jobstart.com>
Date: Fri, 11 Nov 2016 12:25:22 -0800
Subject: [PATCH] fix for data serialization

---
 CHANGELOG.md      |  5 +++++
 dist/index.js     | 26 ++++++++++++++------------
 dist/index.js.map |  2 +-
 package.json      |  2 +-
 src/index.js      | 23 +++++++++++------------
 test/spec.js      |  6 +++++-
 6 files changed, 37 insertions(+), 27 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index c6c437f..966d44f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+
+1.0.2 / 2016-11-11
+==================
+  * Fix for data serialization
+
 1.0.1 / 2016-11-10
 ==================
 
diff --git a/dist/index.js b/dist/index.js
index 06bcb74..33bf57d 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -23,22 +23,17 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 
 var errorMap = new Map();
 
-var DELIMITER = ':';
+var DELIMITER = '/::/';
 
 var serializeName = function serializeName() {
   var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
   return arr.reduce(function (str, val) {
-    return '' + (str.length > 0 ? str + DELIMITER : str) + val;
+    return '' + (str.length > 0 ? str + DELIMITER : str) + (val.toString ? val.toString() : val);
   }, '');
 };
 var deserializeName = function deserializeName() {
   var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
-
-  var arr = [];
-  var str = name.split(DELIMITER);
-  arr.push(str.shift());
-  arr.push(str.join(DELIMITER));
-  return arr;
+  return name.split(DELIMITER);
 };
 
 var ApolloError = function (_ExtendableError) {
@@ -56,7 +51,11 @@ var ApolloError = function (_ExtendableError) {
     var t = arguments[2] && arguments[2].thrown_at || time_thrown;
     var d = Object.assign({}, data, arguments[2] && arguments[2].data || {});
 
-    var _this = _possibleConstructorReturn(this, (ApolloError.__proto__ || Object.getPrototypeOf(ApolloError)).call(this, serializeName([name, t])));
+    var _this = _possibleConstructorReturn(this, (ApolloError.__proto__ || Object.getPrototypeOf(ApolloError)).call(this, serializeName([name, t, Object.assign({}, d, {
+      toString: function toString() {
+        return JSON.stringify(d);
+      }
+    })])));
 
     _this._name = name;
     _this._humanized_message = message || '';
@@ -96,15 +95,18 @@ var formatError = exports.formatError = function formatError(originalError) {
   var returnNull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
 
   var _deserializeName = deserializeName(originalError.message),
-      _deserializeName2 = _slicedToArray(_deserializeName, 2),
+      _deserializeName2 = _slicedToArray(_deserializeName, 3),
       name = _deserializeName2[0],
-      thrown_at = _deserializeName2[1];
+      thrown_at = _deserializeName2[1],
+      d = _deserializeName2[2];
 
+  var data = d !== undefined ? JSON.parse(d) : {};
   if (!name) return returnNull ? null : originalError;
   var CustomError = errorMap.get(name);
   if (!CustomError) return returnNull ? null : originalError;
   var error = new CustomError({
-    thrown_at: thrown_at
+    thrown_at: thrown_at,
+    data: data
   });
   return error.serialize();
 };
diff --git a/dist/index.js.map b/dist/index.js.map
index 5c6d1ac..6f1b65b 100644
--- a/dist/index.js.map
+++ b/dist/index.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/index.js"],"names":["errorMap","Map","DELIMITER","serializeName","arr","reduce","str","val","length","deserializeName","name","split","push","shift","join","ApolloError","message","time_thrown","Date","toISOString","data","t","arguments","thrown_at","d","Object","assign","_name","_humanized_message","_time_thrown","_data","createError","e","bind","set","formatError","originalError","returnNull","CustomError","get","error","serialize"],"mappings":";;;;;;;;;;;AAAA;;;;;;;;;;;;AAEA,IAAMA,WAAW,IAAIC,GAAJ,EAAjB;;AAEA,IAAMC,YAAY,GAAlB;;AAEA,IAAMC,gBAAgB,SAAhBA,aAAgB;AAAA,MAACC,GAAD,uEAAO,EAAP;AAAA,SAAcA,IAAIC,MAAJ,CAAW,UAACC,GAAD,EAAMC,GAAN;AAAA,iBAAiBD,IAAIE,MAAJ,GAAa,CAAb,GAAiBF,MAAMJ,SAAvB,GAAmCI,GAApD,IAA0DC,GAA1D;AAAA,GAAX,EAA4E,EAA5E,CAAd;AAAA,CAAtB;AACA,IAAME,kBAAkB,SAAlBA,eAAkB,GAAe;AAAA,MAAdC,IAAc,uEAAP,EAAO;;AACrC,MAAMN,MAAM,EAAZ;AACA,MAAME,MAAMI,KAAKC,KAAL,CAAWT,SAAX,CAAZ;AACAE,MAAIQ,IAAJ,CAASN,IAAIO,KAAJ,EAAT;AACAT,MAAIQ,IAAJ,CAASN,IAAIQ,IAAJ,CAASZ,SAAT,CAAT;AACA,SAAOE,GAAP;AACD,CAND;;IAQMW,W;;;AACJ,uBAAaL,IAAb,QAIG;AAAA,QAHDM,OAGC,QAHDA,OAGC;AAAA,gCAFDC,WAEC;AAAA,QAFDA,WAEC,oCAFc,IAAIC,IAAJ,EAAD,CAAaC,WAAb,EAEb;AAAA,yBADDC,IACC;AAAA,QADDA,IACC,6BADM,EACN;;AAAA;;AACD,QAAMC,IAAKC,UAAU,CAAV,KAAgBA,UAAU,CAAV,EAAaC,SAA9B,IAA4CN,WAAtD;AACA,QAAMO,IAAIC,OAAOC,MAAP,CAAc,EAAd,EAAkBN,IAAlB,EAA0BE,UAAU,CAAV,KAAgBA,UAAU,CAAV,EAAaF,IAA9B,IAAuC,EAAhE,CAAV;;AAFC,0HAIKjB,cAAc,CAClBO,IADkB,EAElBW,CAFkB,CAAd,CAJL;;AASD,UAAKM,KAAL,GAAajB,IAAb;AACA,UAAKkB,kBAAL,GAA0BZ,WAAW,EAArC;AACA,UAAKa,YAAL,GAAoBR,CAApB;AACA,UAAKS,KAAL,GAAaN,CAAb;AAZC;AAaF;;;;gCACY;AACX,UAAMd,OAAO,KAAKiB,KAAlB;AACA,UAAMX,UAAU,KAAKY,kBAArB;AACA,UAAMX,cAAc,KAAKY,YAAzB;AACA,UAAMT,OAAO,KAAKU,KAAlB;AACA,aAAO;AACLd,wBADK;AAELN,kBAFK;AAGLO,gCAHK;AAILG;AAJK,OAAP;AAMD;;;;;;AAGI,IAAMW,oCAAc,SAAdA,WAAc,CAACrB,IAAD,EAAuD;AAAA,MAAhDU,IAAgD,uEAAzC,EAAEJ,SAAS,uBAAX,EAAyC;;AAChF,MAAMgB,IAAIjB,YAAYkB,IAAZ,CAAiB,IAAjB,EAAuBvB,IAAvB,EAA6BU,IAA7B,CAAV;AACApB,WAASkC,GAAT,CAAaxB,IAAb,EAAmBsB,CAAnB;AACA,SAAOA,CAAP;AACD,CAJM;;AAMA,IAAMG,oCAAc,SAAdA,WAAc,CAACC,aAAD,EAAuC;AAAA,MAAvBC,UAAuB,uEAAV,KAAU;;AAAA,yBACpC5B,gBAAgB2B,cAAcpB,OAA9B,CADoC;AAAA;AAAA,MACxDN,IADwD;AAAA,MAClDa,SADkD;;AAEhE,MAAI,CAACb,IAAL,EAAW,OAAO2B,aAAa,IAAb,GAAoBD,aAA3B;AACX,MAAME,cAActC,SAASuC,GAAT,CAAa7B,IAAb,CAApB;AACA,MAAI,CAAC4B,WAAL,EAAkB,OAAOD,aAAa,IAAb,GAAoBD,aAA3B;AAClB,MAAMI,QAAQ,IAAIF,WAAJ,CAAgB;AAC5Bf;AAD4B,GAAhB,CAAd;AAGA,SAAOiB,MAAMC,SAAN,EAAP;AACD,CATM","file":"index.js","sourcesContent":["import ExtendableError from 'es6-error';\n\nconst errorMap = new Map();\n\nconst DELIMITER = ':';\n\nconst serializeName = (arr = []) => arr.reduce((str, val) => `${str.length > 0 ? str + DELIMITER : str}${val}`, '');\nconst deserializeName = (name = '') => {\n  const arr = [];\n  const str = name.split(DELIMITER);\n  arr.push(str.shift());\n  arr.push(str.join(DELIMITER));\n  return arr;\n};\n\nclass ApolloError extends ExtendableError {\n  constructor (name, {\n    message,\n    time_thrown = (new Date()).toISOString(),\n    data = {}\n  }) {\n    const t = (arguments[2] && arguments[2].thrown_at) || time_thrown;\n    const d = Object.assign({}, data, ((arguments[2] && arguments[2].data) || {}));\n\n    super(serializeName([\n      name,\n      t\n    ]));\n\n    this._name = name;\n    this._humanized_message = message || '';\n    this._time_thrown = t;\n    this._data = d;\n  }\n  serialize () {\n    const name = this._name;\n    const message = this._humanized_message;\n    const time_thrown = this._time_thrown;\n    const data = this._data;\n    return {\n      message,\n      name,\n      time_thrown,\n      data\n    };\n  }\n}\n\nexport const createError = (name, data = { message: 'An error has occurred' }) => {\n  const e = ApolloError.bind(null, name, data);\n  errorMap.set(name, e);\n  return e;\n};\n\nexport const formatError = (originalError, returnNull = false) => {\n  const [ name, thrown_at ] = deserializeName(originalError.message);\n  if (!name) return returnNull ? null : originalError;\n  const CustomError = errorMap.get(name);\n  if (!CustomError) return returnNull ? null : originalError;\n  const error = new CustomError({\n    thrown_at\n  });\n  return error.serialize();\n};\n"]}
\ No newline at end of file
+{"version":3,"sources":["../src/index.js"],"names":["errorMap","Map","DELIMITER","serializeName","arr","reduce","str","val","length","toString","deserializeName","name","split","ApolloError","message","time_thrown","Date","toISOString","data","t","arguments","thrown_at","d","Object","assign","JSON","stringify","_name","_humanized_message","_time_thrown","_data","createError","e","bind","set","formatError","originalError","returnNull","undefined","parse","CustomError","get","error","serialize"],"mappings":"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","file":"index.js","sourcesContent":["import ExtendableError from 'es6-error';\n\nconst errorMap = new Map();\n\nconst DELIMITER = '/::/';\n\nconst serializeName = (arr = []) => arr.reduce((str, val) => `${str.length > 0 ? str + DELIMITER : str}${val.toString ? val.toString() : val}`, '');\nconst deserializeName = (name = '') => name.split(DELIMITER);\n\nclass ApolloError extends ExtendableError {\n  constructor (name, {\n    message,\n    time_thrown = (new Date()).toISOString(),\n    data = {}\n  }) {\n    const t = (arguments[2] && arguments[2].thrown_at) || time_thrown;\n    const d = Object.assign({}, data, ((arguments[2] && arguments[2].data) || {}));\n\n    super(serializeName([\n      name,\n      t,\n      Object.assign({}, d, {\n        toString: () => JSON.stringify(d)\n      })\n    ]));\n\n    this._name = name;\n    this._humanized_message = message || '';\n    this._time_thrown = t;\n    this._data = d;\n  }\n  serialize () {\n    const name = this._name;\n    const message = this._humanized_message;\n    const time_thrown = this._time_thrown;\n    const data = this._data;\n    return {\n      message,\n      name,\n      time_thrown,\n      data\n    };\n  }\n}\n\nexport const createError = (name, data = { message: 'An error has occurred' }) => {\n  const e = ApolloError.bind(null, name, data);\n  errorMap.set(name, e);\n  return e;\n};\n\nexport const formatError = (originalError, returnNull = false) => {\n  const [ name, thrown_at, d ] = deserializeName(originalError.message);\n  const data = d !== undefined ? JSON.parse(d) : {};\n  if (!name) return returnNull ? null : originalError;\n  const CustomError = errorMap.get(name);\n  if (!CustomError) return returnNull ? null : originalError;\n  const error = new CustomError({\n    thrown_at,\n    data\n  });\n  return error.serialize();\n};\n"]}
\ No newline at end of file
diff --git a/package.json b/package.json
index 6f251ee..816ab3a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "apollo-errors",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "description": "Machine-readable custom errors for Apollostack's GraphQL server",
   "main": "dist/index.js",
   "scripts": {
diff --git a/src/index.js b/src/index.js
index 8c69338..775d8dc 100644
--- a/src/index.js
+++ b/src/index.js
@@ -2,16 +2,10 @@ import ExtendableError from 'es6-error';
 
 const errorMap = new Map();
 
-const DELIMITER = ':';
+const DELIMITER = '/::/';
 
-const serializeName = (arr = []) => arr.reduce((str, val) => `${str.length > 0 ? str + DELIMITER : str}${val}`, '');
-const deserializeName = (name = '') => {
-  const arr = [];
-  const str = name.split(DELIMITER);
-  arr.push(str.shift());
-  arr.push(str.join(DELIMITER));
-  return arr;
-};
+const serializeName = (arr = []) => arr.reduce((str, val) => `${str.length > 0 ? str + DELIMITER : str}${val.toString ? val.toString() : val}`, '');
+const deserializeName = (name = '') => name.split(DELIMITER);
 
 class ApolloError extends ExtendableError {
   constructor (name, {
@@ -24,7 +18,10 @@ class ApolloError extends ExtendableError {
 
     super(serializeName([
       name,
-      t
+      t,
+      Object.assign({}, d, {
+        toString: () => JSON.stringify(d)
+      })
     ]));
 
     this._name = name;
@@ -53,12 +50,14 @@ export const createError = (name, data = { message: 'An error has occurred' }) =
 };
 
 export const formatError = (originalError, returnNull = false) => {
-  const [ name, thrown_at ] = deserializeName(originalError.message);
+  const [ name, thrown_at, d ] = deserializeName(originalError.message);
+  const data = d !== undefined ? JSON.parse(d) : {};
   if (!name) return returnNull ? null : originalError;
   const CustomError = errorMap.get(name);
   if (!CustomError) return returnNull ? null : originalError;
   const error = new CustomError({
-    thrown_at
+    thrown_at,
+    data
   });
   return error.serialize();
 };
diff --git a/test/spec.js b/test/spec.js
index 86d5488..5fc0dce 100644
--- a/test/spec.js
+++ b/test/spec.js
@@ -45,7 +45,11 @@ describe('formatError', () => {
           message: 'A foo error has occurred'
         });
 
-        const e = new FooError();
+        const e = new FooError({
+          data: {
+            oh: 'shit'
+          }
+        });
 
         const s = formatError({
           message: e.message