Raise an error when a malformed package.json file is found.
authorBen Leslie <benno@benno.id.au>
Fri, 23 Sep 2011 13:25:20 +0000 (09:25 -0400)
committerisaacs <i@izs.me>
Fri, 23 Sep 2011 19:00:26 +0000 (12:00 -0700)
The current behaviour will silently ignore any parsing errors
that may occur when loading a package.json file. This makes
debugging errors in the package.json file very difficult.

This changes the behaviour that that errors opening and reading
the file package.json file continue to be ignored, but errors
in parsing will throw an exception.

lib/module.js

index 08e8ba1..a596354 100644 (file)
@@ -103,11 +103,18 @@ function readPackage(requestPath) {
   try {
     var jsonPath = path.resolve(requestPath, 'package.json');
     var json = fs.readFileSync(jsonPath, 'utf8');
-    var pkg = packageCache[requestPath] = JSON.parse(json);
-    return pkg;
-  } catch (e) {}
+  } catch (e) {
+    return false;
+  }
 
-  return false;
+  try {
+    var pkg = packageCache[requestPath] = JSON.parse(json);
+  } catch (e) {
+    e.path = jsonPath;
+    e.message = 'Error parsing ' + jsonPath + ': ' + e.message;
+    throw e;
+  }
+  return pkg;
 }
 
 function tryPackage(requestPath, exts) {
@@ -123,7 +130,7 @@ function tryPackage(requestPath, exts) {
 // In order to minimize unnecessary lstat() calls,
 // this cache is a list of known-real paths.
 // Set to an empty object to reset.
-Module._realpathCache = {}
+Module._realpathCache = {};
 
 // check if the file exists and is not a directory
 function tryFile(requestPath) {
@@ -209,7 +216,7 @@ Module._nodeModulePaths = function(from) {
   var paths = [];
   var parts = from.split(splitRe);
 
-  for (var tip = parts.length - 1; tip >= 0; tip --) {
+  for (var tip = parts.length - 1; tip >= 0; tip--) {
     // don't search in .../node_modules/node_modules
     if (parts[tip] === 'node_modules') continue;
     var dir = parts.slice(0, tip + 1).concat('node_modules').join(joiner);
@@ -217,7 +224,7 @@ Module._nodeModulePaths = function(from) {
   }
 
   return paths;
-}
+};
 
 
 Module._resolveLookupPaths = function(request, parent) {
@@ -367,7 +374,7 @@ Module.prototype._compile = function(content, filename) {
 
   Object.defineProperty(require, 'paths', { get: function() {
     throw new Error('require.paths is removed. Use ' +
-                    'node_modules folders, or the NODE_PATH '+
+                    'node_modules folders, or the NODE_PATH ' +
                     'environment variable instead.');
   }});
 
@@ -445,7 +452,7 @@ Module._extensions['.js'] = function(module, filename) {
 
 
 // Native extension for .json
-Module._extensions['.json'] = function (module, filename) {
+Module._extensions['.json'] = function(module, filename) {
   var content = NativeModule.require('fs').readFileSync(filename, 'utf8');
   module.exports = JSON.parse(stripBOM(content));
 };