@featurevisor/core
Version:
Core package of Featurevisor for Node.js usage
70 lines • 2.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSegmentHashes = getSegmentHashes;
exports.generateHashForFeature = generateHashForFeature;
exports.generateHashForDatafile = generateHashForDatafile;
const crypto = require("crypto");
const utils_1 = require("../utils");
const base62chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
function generateHashFromString(str, length = 10) {
const hashBuffer = crypto.createHash("sha256").update(str).digest();
// Convert buffer to base62 (alphanumeric)
let num = BigInt("0x" + hashBuffer.toString("hex"));
let base62 = "";
while (num > 0) {
// Convert the remainder to a number for indexing
const remainder = Number(num % 62n);
base62 = base62chars[remainder] + base62;
num = num / 62n;
}
// Return first 10 chars for a short hash (adjust length as needed)
return base62.slice(0, length);
}
function getSegmentHashes(segments) {
const result = {};
for (const segmentKey of Object.keys(segments)) {
const segment = segments[segmentKey];
result[segmentKey] = generateHashFromString(JSON.stringify({
conditions: segment.conditions,
}));
}
return result;
}
function generateHashForFeature(featureKey, features, segmentHashes) {
const feature = features[featureKey];
if (!feature) {
return "";
}
const requiredFeatureKeys = [];
if (feature.required) {
for (const r of feature.required) {
if (typeof r === "string") {
requiredFeatureKeys.push(r);
}
if (typeof r === "object" && r.key) {
requiredFeatureKeys.push(r.key);
}
}
}
const requiredFeatureHashes = requiredFeatureKeys.map((key) => generateHashForFeature(key, features, segmentHashes));
const usedSegments = (0, utils_1.extractSegmentsFromFeature)(feature);
const usedSegmentHashes = Object.keys(usedSegments).map((segmentKey) => segmentHashes[segmentKey]);
return generateHashFromString(JSON.stringify({
featureKey,
feature,
requiredFeatureHashes,
usedSegmentHashes,
}));
}
function generateHashForDatafile(datafileContent) {
const featureHashes = Object.keys(datafileContent.features).reduce((acc, featureKey) => {
acc[featureKey] = datafileContent.features[featureKey].hash || "";
return acc;
}, {});
const hash = generateHashFromString(JSON.stringify({
schemaVersion: datafileContent.schemaVersion,
featureHashes,
}));
return hash;
}
//# sourceMappingURL=hashes.js.map