From ecacdfaf499792c56491cac325482324665f5620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Cruz?= Date: Fri, 24 May 2013 00:58:43 +0100 Subject: [PATCH] Avoid having to deal with circular references when outputting json. --- lib/core/Manager.js | 23 ++++++++++++++--------- lib/core/PackageRepository.js | 20 +++++++++----------- lib/renderers/json.js | 4 ++-- package.json | 3 +-- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/lib/core/Manager.js b/lib/core/Manager.js index 6449b20a..25e71790 100644 --- a/lib/core/Manager.js +++ b/lib/core/Manager.js @@ -104,8 +104,6 @@ Manager.prototype.install = function () { tag: 'install', data: name + (release ? '#' + release : ''), pkgMeta: decEndpoint.pkgMeta, - origin: name, - endpoint: decEndpoint }); // Remove existent and copy canonical package @@ -125,7 +123,9 @@ Manager.prototype.install = function () { return decEndpoint.pkgMeta; }); }) - .then(deferred.resolve, deferred.reject, deferred.notify); + .then(deferred.resolve, deferred.reject, function (notification) { + return that._extendNotification(notification); + }); // Unset working flag when done return deferred.promise @@ -199,15 +199,13 @@ Manager.prototype._fetch = function (decEndpoint) { .spread(this._onFetch.bind(this, deferred, decEndpoint)) // If it fails, we make the whole process to error out .fail(function (err) { - err.origin = that._getOrigin(decEndpoint); - err.endpoint = decEndpoint; + that._extendNotification(err, decEndpoint); deferred.reject(err); }) // Listen to progress to proxy them to the resolve deferred // Note that we also mark where the notification is coming from .progress(function (notification) { - notification.origin = that._getOrigin(decEndpoint); - notification.endpoint = decEndpoint; + that._extendNotification(notification, decEndpoint); deferred.notify(notification); }); @@ -389,8 +387,15 @@ Manager.prototype._dissect = function () { this._deferred.resolve(pkgMetas); }; -Manager.prototype._getOrigin = function (decEndpoint) { - return decEndpoint.name || decEndpoint.registryName || decEndpoint.resolverName; +Manager.prototype._extendNotification = function (notification, decEndpoint) { + notification.origin = decEndpoint.name || decEndpoint.registryName || decEndpoint.resolverName; + notification.endpoint = { + name: decEndpoint.name, + source: decEndpoint.source, + target: decEndpoint.target + }; + + return notification; }; Manager.prototype._findHighestVersion = function (comparators) { diff --git a/lib/core/PackageRepository.js b/lib/core/PackageRepository.js index a6c18f60..03763238 100644 --- a/lib/core/PackageRepository.js +++ b/lib/core/PackageRepository.js @@ -44,7 +44,6 @@ PackageRepository.prototype.fetch = function (decEndpoint) { deferred.notify({ level: 'action', tag: 'resolve', - resolver: resolver, data: resolver.getSource() + '#' + resolver.getTarget() }); return that._resolve(resolver); @@ -84,7 +83,6 @@ PackageRepository.prototype.fetch = function (decEndpoint) { level: 'info', tag: 'cached', data: 'Got cached ' + resolver.getSource() + (pkgMeta._release ? '#' + pkgMeta._release: '') + ' entry', - canonicalPkg: canonicalPkg, pkgMeta: pkgMeta }); @@ -99,9 +97,7 @@ PackageRepository.prototype.fetch = function (decEndpoint) { level: 'action', tag: 'check', data: 'Checking ' + resolver.getSource() + '#' + resolver.getTarget() + ' for newer version', - canonicalPkg: canonicalPkg, - pkgMeta: pkgMeta, - resolver: resolver + pkgMeta: pkgMeta }); }); @@ -117,13 +113,10 @@ PackageRepository.prototype.fetch = function (decEndpoint) { deferred.notify({ type: 'info', data: 'There\'s a new version for ' + resolver.getSource() + '#' + resolver.getTarget(), - canonicalPkg: canonicalPkg, - pkgMeta: pkgMeta, - resolver: resolver + pkgMeta: pkgMeta }); deferred.notify({ type: 'resolve', - resolver: resolver, data: 'Resolving ' + resolver.getSource() + '#' + resolver.getTarget() }); @@ -132,8 +125,13 @@ PackageRepository.prototype.fetch = function (decEndpoint) { }); }) .then(deferred.resolve, deferred.reject, function (notification) { - // Store the resolver for each notification - notification.resolver = res; + // Store the resolver info for each notification + notification.resolver = { + name: res.getName(), + source: res.getSource(), + target: res.getTarget() + }; + deferred.notify(notification); }); diff --git a/lib/renderers/json.js b/lib/renderers/json.js index 9bed501e..10fcea58 100644 --- a/lib/renderers/json.js +++ b/lib/renderers/json.js @@ -1,4 +1,4 @@ -var circularJson = require('circular-json'); +// TODO: take care of trailing , function renderHead() { return '['; @@ -27,7 +27,7 @@ function uncolor(str) { } function stringify(data) { - return uncolor(circularJson.stringify(data, null, ' ')); + return uncolor(JSON.stringify(data, null, ' ')); } // ------------------------- diff --git a/package.json b/package.json index c11cbfe6..599cd957 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,7 @@ "junk": "~0.2.0", "glob": "~3.2.1", "colors": "~0.6.0-1", - "ncp": "~0.4.2", - "circular-json": "~0.1.2" + "ncp": "~0.4.2" }, "devDependencies": { "mocha": "~1.8.2",