| /** |
| * 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 (Array.isArray(value)) { |
| 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; |
| |
| |