UNPKG

@featurevisor/core

Version:

Core package of Featurevisor for Node.js usage

70 lines 2.68 kB
"use strict"; 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