aws-cdk
Version:
CDK Toolkit, the command line tool for CDK apps
44 lines • 4.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.contentHashAny = exports.contentHash = void 0;
const crypto = require("crypto");
function contentHash(data) {
return crypto.createHash('sha256').update(data).digest('hex');
}
exports.contentHash = contentHash;
/**
* A stably sorted hash of an arbitrary JS object
*/
function contentHashAny(value) {
const ret = crypto.createHash('sha256');
recurse(value);
return ret.digest('hex');
function recurse(x) {
if (typeof x === 'string') {
ret.update(x);
return;
}
if (Array.isArray(x)) {
ret.update('[');
for (const e of x) {
recurse(e);
ret.update('||');
}
ret.update(']');
return;
}
if (x && typeof x === 'object') {
ret.update('{');
for (const key of Object.keys(x).sort()) {
ret.update(key);
ret.update(':');
recurse(x[key]);
}
ret.update('}');
return;
}
ret.update(`${x}${typeof x}`); // typeof to make sure hash('123') !== hash(123)
}
}
exports.contentHashAny = contentHashAny;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1oYXNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29udGVudC1oYXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUFpQztBQUVqQyxTQUFnQixXQUFXLENBQUMsSUFBZ0M7SUFDMUQsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUZELGtDQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQUMsS0FBYztJQUMzQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNmLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV6QixTQUFTLE9BQU8sQ0FBQyxDQUFVO1FBQ3pCLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZCxPQUFPO1NBQ1I7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDakIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNYLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbEI7WUFDRCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUM5QixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDdkMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsT0FBTyxDQUFFLENBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzFCO1lBQ0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQixPQUFPO1NBQ1I7UUFFRCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGdEQUFnRDtJQUNqRixDQUFDO0FBQ0gsQ0FBQztBQWxDRCx3Q0FrQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRlbnRIYXNoKGRhdGE6IHN0cmluZyB8IEJ1ZmZlciB8IERhdGFWaWV3KSB7XG4gIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGRhdGEpLmRpZ2VzdCgnaGV4Jyk7XG59XG5cbi8qKlxuICogQSBzdGFibHkgc29ydGVkIGhhc2ggb2YgYW4gYXJiaXRyYXJ5IEpTIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGVudEhhc2hBbnkodmFsdWU6IHVua25vd24pIHtcbiAgY29uc3QgcmV0ID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICByZWN1cnNlKHZhbHVlKTtcbiAgcmV0dXJuIHJldC5kaWdlc3QoJ2hleCcpO1xuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UoeDogdW5rbm93bikge1xuICAgIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldC51cGRhdGUoeCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIHJldC51cGRhdGUoJ1snKTtcbiAgICAgIGZvciAoY29uc3QgZSBvZiB4KSB7XG4gICAgICAgIHJlY3Vyc2UoZSk7XG4gICAgICAgIHJldC51cGRhdGUoJ3x8Jyk7XG4gICAgICB9XG4gICAgICByZXQudXBkYXRlKCddJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnKSB7XG4gICAgICByZXQudXBkYXRlKCd7Jyk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh4KS5zb3J0KCkpIHtcbiAgICAgICAgcmV0LnVwZGF0ZShrZXkpO1xuICAgICAgICByZXQudXBkYXRlKCc6Jyk7XG4gICAgICAgIHJlY3Vyc2UoKHggYXMgYW55KVtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldC51cGRhdGUoJ30nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXQudXBkYXRlKGAke3h9JHt0eXBlb2YgeH1gKTsgLy8gdHlwZW9mIHRvIG1ha2Ugc3VyZSBoYXNoKCcxMjMnKSAhPT0gaGFzaCgxMjMpXG4gIH1cbn0iXX0=