| /** | |
| * 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; | |
| /** @type {import('./hash').default} */ | |
| function hashify(value, hash) { | |
| if (!hash) { hash = createHash('sha256'); } | |
| if (Array.isArray(value)) { | |
| hashArray(value, hash); | |
| } else if (typeof value === 'function') { | |
| hash.update(String(value)); | |
| } else if (value instanceof Object) { | |
| hashObject(value, hash); | |
| } else { | |
| hash.update(stringify(value) || 'undefined'); | |
| } | |
| return hash; | |
| } | |
| exports.default = hashify; | |
| /** @type {import('./hash').hashArray} */ | |
| 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; | |
| /** @type {import('./hash').hashObject} */ | |
| function hashObject(object, optionalHash) { | |
| const hash = optionalHash || createHash('sha256'); | |
| hash.update('{'); | |
| Object.keys(object).sort().forEach((key) => { | |
| hash.update(stringify(key)); | |
| hash.update(':'); | |
| // @ts-expect-error the key is guaranteed to exist on the object here | |
| hashify(object[key], hash); | |
| hash.update(','); | |
| }); | |
| hash.update('}'); | |
| return hash; | |
| } | |
| hashify.object = hashObject; | |
| exports.hashObject = hashObject; | |