| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 | /** * 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;
 |