all files / node-object-hash/ hash2.js

100% Statements 15/15
100% Branches 12/12
100% Functions 3/3
100% Lines 15/15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64                                                                  10× 10×       10×                   32×        
/**
 * Created on 8/23/16.
 */
'use strict';
var crypto = require('crypto');
 
var objectSorter = require('./objectSorter');
 
/**
 * @typedef {Object} API
 * @property {Function} hash Returns object hash
 * @property {Function} sortObject Returns sorted object string
 */
 
/**
 * API constructor
 * @param {Object} [options] Library options
 * @param {boolean} [options.coerce="true"] Performs type coercion
 * @param {boolean} [options.sort="true"] Performs array, object, etc. sorting
 * @param {string} [options.alg="sha256"] Default crypto algorithm to use (can be overridden)
 * @param {string} [options.enc="hex"] Hash string encoding (can be overridden)
 * @returns {API} API object
 */
module.exports = function Hash(options) {
  var api = {},
      defaults;
 
  var sortObjectToString = objectSorter(options);
 
  defaults = options || {};
  defaults.alg = defaults.alg || 'sha256';
  defaults.enc = defaults.enc || 'hex';
 
  /**
   * Creates hash from given object
   * @param {*} obj JS object to hash
   * @param {Object} [opts] Options
   * @param {string} [opts.alg="sha256"] Crypto algorithm to use
   * @param {string} [opts.enc="hex"] Hash string encoding
   * @returns {string} Object hash value
   */
  api.hash = function hash(obj, opts) {
    opts = opts || {};
    var alg = opts.alg || defaults.alg,
        enc = opts.enc || defaults.enc,
        sorted = sortObjectToString(obj);
 
    return crypto.createHash(alg)
      .update(sorted)
      .digest(enc);
  };
 
  /**
   * Creates sorted string from object
   * @param {*} obj JS object to be sorted
   * @returns {string} Sorted object string
   */
  api.sortObject = function sortObject(obj) {
    return sortObjectToString(obj);
  };
 
  return api;
};