/**
 * utilities for hashing config objects.
 * basically iteratively updates hash with a JSON-like format
 */
'use strict'
exports.__esModule = true

const createHash = require('crypto').createHash

const stringify = JSON.stringify

function hashify(value, hash) {
  if (!hash) hash = createHash('sha256')

  if (value instanceof Array) {
    hashArray(value, hash)
  } else if (value instanceof Object) {
    hashObject(value, hash)
  } else {
    hash.update(stringify(value) || 'undefined')
  }

  return hash
}
exports.default = hashify

function hashArray(array, hash) {
  if (!hash) hash = createHash('sha256')

  hash.update('[')
  for (let i = 0; i < array.length; i++) {
    hashify(array[i], hash)
    hash.update(',')
  }
  hash.update(']')

  return hash
}
hashify.array = hashArray
exports.hashArray = hashArray

function hashObject(object, hash) {
  if (!hash) hash = createHash('sha256')

  hash.update('{')
  Object.keys(object).sort().forEach(key => {
    hash.update(stringify(key))
    hash.update(':')
    hashify(object[key], hash)
    hash.update(',')
  })
  hash.update('}')

  return hash
}
hashify.object = hashObject
exports.hashObject = hashObject


