UNPKG

npm-json5

Version:

npm wrapper allowing to use JSON5 instead of standard package.json

96 lines (82 loc) 2.16 kB
var fs = require("fs") , Path = require("path") var orig_readFile = fs.readFile , orig_readFileSync = fs.readFileSync var filters = { 'package.json5': function json2json(data) { var JSON5 = require('jju') return JSON.stringify(JSON5.parse(data.toString('utf8'))) }, 'package.json': function(x) { return x }, } // read_*_callback are used in both sync and async code... // so they should be syncronous function read_alt_callback(filter, orig_cb, err_cb) { return function(err, data) { if (err && err.code === 'ENOENT') { return err_cb(err) } else if (err) { return orig_cb(err) } else { try { data = filter(data) } catch(err) { err = orig_cb(err) } } orig_cb(err, data) } } fs.readFile = function(path) { if (Path.basename(path) === 'package.json' && typeof(arguments[arguments.length-1]) === 'function') { var orig_args = arguments var args = Array.prototype.slice.apply(orig_args) var callback = args[args.length-1] check_override(module.exports.formats.slice(0)) } else { orig_readFile.apply(fs, arguments) } function check_override(list) { var alt_file = list.shift() args[0] = Path.join(Path.dirname(path), alt_file) args[args.length-1] = read_alt_callback( filters[alt_file], callback, // normal cb list.length ? check_override.bind(null, list) : callback ) orig_readFile.apply(fs, args) } } fs.readFileSync = function(path) { if (Path.basename(path) === 'package.json') { var orig_args = arguments var args = Array.prototype.slice.apply(orig_args) var result function callback(err, data) { if (err) throw err result = data } check_override(module.exports.formats.slice(0)) function check_override(list) { var err var alt_file = list.shift() args[0] = Path.join(Path.dirname(path), alt_file) try { var _result = orig_readFileSync.apply(fs, args) } catch(_err) { err = _err } read_alt_callback( filters[alt_file], callback, // normal cb list.length ? check_override.bind(null, list) : callback )(err, _result) } return result } else { return orig_readFileSync.apply(fs, arguments) } }