blob: fcf00de38c6c4d1d6dd9e368b34e112869b0bd7e [file] [log] [blame]
Tim van der Lippefdbd42e2020-04-07 15:14:36 +01001/**
2 * utilities for hashing config objects.
3 * basically iteratively updates hash with a JSON-like format
4 */
Tim van der Lippe2c891972021-07-29 16:22:50 +01005'use strict';
6exports.__esModule = true;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +01007
Tim van der Lippe2c891972021-07-29 16:22:50 +01008const createHash = require('crypto').createHash;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +01009
Tim van der Lippe2c891972021-07-29 16:22:50 +010010const stringify = JSON.stringify;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010011
12function hashify(value, hash) {
Tim van der Lippe2c891972021-07-29 16:22:50 +010013 if (!hash) hash = createHash('sha256');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010014
Tim van der Lippe2c891972021-07-29 16:22:50 +010015 if (Array.isArray(value)) {
16 hashArray(value, hash);
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010017 } else if (value instanceof Object) {
Tim van der Lippe2c891972021-07-29 16:22:50 +010018 hashObject(value, hash);
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010019 } else {
Tim van der Lippe2c891972021-07-29 16:22:50 +010020 hash.update(stringify(value) || 'undefined');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010021 }
22
Tim van der Lippe2c891972021-07-29 16:22:50 +010023 return hash;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010024}
Tim van der Lippe2c891972021-07-29 16:22:50 +010025exports.default = hashify;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010026
27function hashArray(array, hash) {
Tim van der Lippe2c891972021-07-29 16:22:50 +010028 if (!hash) hash = createHash('sha256');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010029
Tim van der Lippe2c891972021-07-29 16:22:50 +010030 hash.update('[');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010031 for (let i = 0; i < array.length; i++) {
Tim van der Lippe2c891972021-07-29 16:22:50 +010032 hashify(array[i], hash);
33 hash.update(',');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010034 }
Tim van der Lippe2c891972021-07-29 16:22:50 +010035 hash.update(']');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010036
Tim van der Lippe2c891972021-07-29 16:22:50 +010037 return hash;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010038}
Tim van der Lippe2c891972021-07-29 16:22:50 +010039hashify.array = hashArray;
40exports.hashArray = hashArray;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010041
42function hashObject(object, hash) {
Tim van der Lippe2c891972021-07-29 16:22:50 +010043 if (!hash) hash = createHash('sha256');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010044
Tim van der Lippe2c891972021-07-29 16:22:50 +010045 hash.update('{');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010046 Object.keys(object).sort().forEach(key => {
Tim van der Lippe2c891972021-07-29 16:22:50 +010047 hash.update(stringify(key));
48 hash.update(':');
49 hashify(object[key], hash);
50 hash.update(',');
51 });
52 hash.update('}');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010053
Tim van der Lippe2c891972021-07-29 16:22:50 +010054 return hash;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010055}
Tim van der Lippe2c891972021-07-29 16:22:50 +010056hashify.object = hashObject;
57exports.hashObject = hashObject;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010058
59