gg-json-hash
Version:
Add hashes to nested json objects.
111 lines (90 loc) • 3.12 kB
text/typescript
#!/usr/bin/env node
// @license
// Copyright (c) 2019 - 2024 Dr. Gabriel Gatzsche. All Rights Reserved.
//
// Use of this source code is governed by terms that can be
// found in the LICENSE file in the root of this package.
import { ApplyJsonHashConfig, JsonHash } from 'gg-json-hash';
const print = console.log;
const assert = console.assert;
let jh = new JsonHash();
// .............................................................................
print('Create a json structure');
let json: any = {
a: '0',
b: '1',
child: {
d: 3,
e: 4,
},
};
// .............................................................................
print('Add hashes to the json structure.');
json = jh.apply(json);
print(JSON.stringify(json, null, 2));
// {
// "a": "0",
// "b": "1",
// "child": {
// "d": 3,
// "e": 4,
// "_hash": "nfTEHYDoqVPb3ieJSmBxft"
// },
// "_hash": "k-3v5I-Q6Q9vPdVJxsMYUk"
// }
// .............................................................................
print('Set a maximum floating point precision.');
jh.config.numberConfig.precision = 0.001;
try {
jh.apply({
a: 1.000001,
});
} catch (e: any) {
print(e.message); // Number 1.000001 has a higher precision than 0.001
}
// .............................................................................
print('Use the "inPlace" option to modify the input object directly.');
json = { a: 1, b: 2 };
let ac = new ApplyJsonHashConfig();
ac.inPlace = true;
jh.apply(json, ac);
assert(json._hash, 'QyWM_3g_5wNtikMDP4MK38');
// .............................................................................
print(
'Set "upateExistingHashes: false" to create missing hashes but ' +
'without touching existing ones.',
);
json = { a: 1, b: 2, child: { c: 3 }, child2: { _hash: 'ABC123', d: 4 } };
ac = new ApplyJsonHashConfig();
ac.updateExistingHashes = false;
json = jh.apply(json, ac);
assert(json._hash === 'pos6bn6mON0sirhEaXq41-');
assert(json.child._hash === 'yrqcsGrHfad4G4u9fgcAxY');
assert(json.child2._hash === 'ABC123');
// .............................................................................
print('If existing hashes do not match new ones, an error is thrown.');
ac.throwIfOnWrongHashes = true;
try {
jh.apply({ a: 1, _hash: 'invalid' });
} catch (e: any) {
print(e.message);
// 'Hash "invalid" does not match the newly calculated one "AVq9f1zFei3ZS3WQ8ErYCE".
// Please make sure that all systems are producing the same hashes.'
}
// .............................................................................
print('Set "throwIfOnWrongHashes" to false to replace invalid hashes.');
ac.throwIfOnWrongHashes = false;
ac.updateExistingHashes = true;
json = jh.apply({ a: 1, _hash: 'invalid' }, ac);
print(json._hash); // AVq9f1zFei3ZS3WQ8ErYCE
// .............................................................................
print('Use validate to check if the hashes are correct');
json = { a: 1, b: 2 };
json = jh.apply(json);
jh.validate(json); // true
try {
json.a = 3;
jh.validate({ a: 3, _hash: 'invalid' });
} catch (e: any) {
print(e.message);
}