json-dry
Advanced tools
Comparing version 1.0.7 to 1.0.8
@@ -0,1 +1,6 @@ | ||
## 1.0.8 (2018-11-09) | ||
* Fix reviving nested undried classes | ||
* The `unDry` static method will receive a second argument: false if used for regular unserializing or true/custom_method_name if used for cloning. | ||
## 1.0.7 (2018-07-11) | ||
@@ -2,0 +7,0 @@ |
@@ -395,3 +395,3 @@ "use strict"; | ||
* @since 1.0.0 | ||
* @version 1.0.0 | ||
* @version 1.0.8 | ||
* | ||
@@ -490,3 +490,3 @@ * @param {Object} obj | ||
if (entry.constructor.unDry) { | ||
target[keys[i]] = entry.constructor.unDry(temp); | ||
target[keys[i]] = entry.constructor.unDry(temp, custom_method || true); | ||
} else { | ||
@@ -672,9 +672,10 @@ // If there is no undry function, the clone will be a simple object | ||
* @since 0.1.4 | ||
* @version 1.0.4 | ||
* @version 1.0.8 | ||
* | ||
* @return {Array} | ||
*/ | ||
function regenerateArray(root, holder, current, seen, retrieve, undry_paths, old) { | ||
function regenerateArray(root, holder, current, seen, retrieve, undry_paths, old, current_path) { | ||
var length = current.length, | ||
temp, | ||
i; | ||
@@ -685,3 +686,7 @@ | ||
if (!seen.get(current[i])) { | ||
current[i] = regenerate(root, current, current[i], seen, retrieve, undry_paths, old); | ||
temp = current_path.slice(0); | ||
temp.push(i); | ||
current[i] = regenerate(root, current, current[i], seen, retrieve, undry_paths, old, temp); | ||
} | ||
@@ -698,9 +703,10 @@ } | ||
* @since 0.1.4 | ||
* @version 1.0.4 | ||
* @version 1.0.8 | ||
* | ||
* @return {Object} | ||
*/ | ||
function regenerateObject(root, holder, current, seen, retrieve, undry_paths, old) { | ||
function regenerateObject(root, holder, current, seen, retrieve, undry_paths, old, current_path) { | ||
var key; | ||
var temp, | ||
key; | ||
@@ -711,3 +717,6 @@ for (key in current) { | ||
if (!seen.get(current[key])) { | ||
current[key] = regenerate(root, current, current[key], seen, retrieve, undry_paths, old); | ||
temp = current_path.slice(0); | ||
temp.push(key); | ||
current[key] = regenerate(root, current, current[key], seen, retrieve, undry_paths, old, temp); | ||
} | ||
@@ -725,7 +734,7 @@ } | ||
* @since 0.1.4 | ||
* @version 1.0.5 | ||
* @version 1.0.8 | ||
* | ||
* @return {Mixed} | ||
*/ | ||
function regenerate(root, holder, current, seen, retrieve, undry_paths, old) { | ||
function regenerate(root, holder, current, seen, retrieve, undry_paths, old, current_path) { | ||
@@ -739,3 +748,3 @@ var temp; | ||
if (current instanceof Array) { | ||
return regenerateArray(root, holder, current, seen, retrieve, undry_paths, old); | ||
return regenerateArray(root, holder, current, seen, retrieve, undry_paths, old, current_path); | ||
} | ||
@@ -745,3 +754,3 @@ | ||
if (current.length) { | ||
if (current.length > -1) { | ||
current = current.toString(); | ||
@@ -758,3 +767,3 @@ | ||
undry_paths.extra_pass.push([holder, temp]); | ||
undry_paths.extra_pass.push([holder, temp, current_path]); | ||
@@ -783,3 +792,3 @@ return temp; | ||
// (We have to create a new instance, because it's already been "seen") | ||
temp = retrieve[current] = regenerate(root, holder, new String(temp), seen, retrieve, undry_paths, old); | ||
temp = retrieve[current] = regenerate(root, holder, new String(temp), seen, retrieve, undry_paths, old, current_path); | ||
} | ||
@@ -793,3 +802,3 @@ | ||
return regenerateObject(root, holder, current, seen, retrieve, undry_paths, old); | ||
return regenerateObject(root, holder, current, seen, retrieve, undry_paths, old, current_path); | ||
} | ||
@@ -806,3 +815,3 @@ | ||
* @since 0.1.4 | ||
* @version 1.0.0 | ||
* @version 1.0.8 | ||
* | ||
@@ -822,2 +831,7 @@ * @param {Object} current The object to look in | ||
// Keys [''] always means the root | ||
if (length == 1 && keys[0] === '') { | ||
return current; | ||
} | ||
for (i = 0; i < length; i++) { | ||
@@ -1072,6 +1086,6 @@ key = keys[i]; | ||
// Regenerate this replacement wrapper first | ||
regenerate(result, null, entry, seen, retrieve, undry_paths, old); | ||
regenerate(result, null, entry, seen, retrieve, undry_paths, old, path_array.slice(0)); | ||
if (entry.unDryConstructor) { | ||
entry.undried = entry.unDryConstructor.unDry(entry.value); | ||
entry.undried = entry.unDryConstructor.unDry(entry.value, false); | ||
} else if (entry.unDryFunction) { | ||
@@ -1096,2 +1110,3 @@ entry.undried = entry.unDryFunction(entry, null, entry.value); | ||
temp = entry[1]; | ||
path = entry[2]; | ||
@@ -1104,6 +1119,25 @@ for (key in holder) { | ||
} | ||
path.pop(); | ||
// Annoying workaround for some circular references | ||
if (path.length && path[path.length - 1] == 'value') { | ||
path.pop(); | ||
} | ||
if (path.length) { | ||
// Get the other holder | ||
holder = retrieveFromPath(result, path); | ||
for (key in holder) { | ||
if (holder[key] == temp) { | ||
holder[key] = temp.undried; | ||
break; | ||
} | ||
} | ||
} | ||
} | ||
// Only now we can resolve paths | ||
result = regenerate(result, result, result, seen, retrieve, undry_paths, old); | ||
result = regenerate(result, result, result, seen, retrieve, undry_paths, old, []); | ||
@@ -1110,0 +1144,0 @@ if (result.undried != null && result.dry) { |
{ | ||
"name": "json-dry", | ||
"description": "Don't repeat yourself, JSON: Add support for (circular) references, class instances, ...", | ||
"version": "1.0.7", | ||
"version": "1.0.8", | ||
"author": "Jelle De Loecker <jelle@develry.be>", | ||
@@ -6,0 +6,0 @@ "keywords": [ |
37605
936