@featurevisor/core
Version:
Core package of Featurevisor for Node.js usage
195 lines • 9.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateSiteSearchIndex = generateSiteSearchIndex;
const utils_1 = require("../utils");
const getRelativePaths_1 = require("./getRelativePaths");
const getLastModifiedFromHistory_1 = require("./getLastModifiedFromHistory");
async function generateSiteSearchIndex(deps, fullHistory, repoDetails) {
const { rootDirectoryPath, projectConfig, datasource } = deps;
const result = {
links: undefined,
projectConfig: {
tags: projectConfig.tags,
environments: projectConfig.environments,
},
entities: {
attributes: [],
segments: [],
features: [],
},
};
/**
* Links
*/
if (repoDetails) {
const { relativeAttributesPath, relativeSegmentsPath, relativeFeaturesPath } = (0, getRelativePaths_1.getRelativePaths)(rootDirectoryPath, projectConfig);
let prefix = "";
if (repoDetails.topLevelPath !== rootDirectoryPath) {
prefix = rootDirectoryPath.replace(repoDetails.topLevelPath + "/", "") + "/";
}
result.links = {
attribute: repoDetails.blobUrl.replace("{{blobPath}}", prefix + relativeAttributesPath + "/{{key}}." + datasource.getExtension()),
segment: repoDetails.blobUrl.replace("{{blobPath}}", prefix + relativeSegmentsPath + "/{{key}}." + datasource.getExtension()),
feature: repoDetails.blobUrl.replace("{{blobPath}}", prefix + relativeFeaturesPath + "/{{key}}." + datasource.getExtension()),
commit: repoDetails.commitUrl,
};
}
/**
* Entities
*/
// usage
const attributesUsedInFeatures = {};
const attributesUsedInSegments = {};
const segmentsUsedInFeatures = {};
// features
const featureFiles = await datasource.listFeatures();
for (const entityName of featureFiles) {
const parsed = await datasource.readFeature(entityName);
if (Array.isArray(parsed.variations)) {
parsed.variations.forEach((variation) => {
if (!variation.variableOverrides) {
return;
}
Object.keys(variation.variableOverrides).forEach((variableKey) => {
const overrides = variation.variableOverrides?.[variableKey];
if (overrides) {
overrides.forEach((o) => {
if (o.conditions) {
(0, utils_1.extractAttributeKeysFromConditions)(o.conditions).forEach((attributeKey) => {
if (!attributesUsedInFeatures[attributeKey]) {
attributesUsedInFeatures[attributeKey] = new Set();
}
attributesUsedInFeatures[attributeKey].add(entityName);
});
}
if (o.segments && o.segments !== "*") {
(0, utils_1.extractSegmentKeysFromGroupSegments)(o.segments).forEach((segmentKey) => {
if (!segmentsUsedInFeatures[segmentKey]) {
segmentsUsedInFeatures[segmentKey] = new Set();
}
segmentsUsedInFeatures[segmentKey].add(entityName);
});
}
});
}
});
});
}
// rules
if (parsed.rules) {
if (!Array.isArray(parsed.rules)) {
// with environments
Object.keys(parsed.rules).forEach((environmentKey) => {
const rules = parsed.rules?.[environmentKey];
rules.forEach((rule) => {
if (rule.segments && rule.segments !== "*") {
(0, utils_1.extractSegmentKeysFromGroupSegments)(rule.segments).forEach((segmentKey) => {
if (!segmentsUsedInFeatures[segmentKey]) {
segmentsUsedInFeatures[segmentKey] = new Set();
}
segmentsUsedInFeatures[segmentKey].add(entityName);
});
}
});
});
}
else {
// no environments
parsed.rules.forEach((rule) => {
if (rule.segments && rule.segments !== "*") {
(0, utils_1.extractSegmentKeysFromGroupSegments)(rule.segments).forEach((segmentKey) => {
if (!segmentsUsedInFeatures[segmentKey]) {
segmentsUsedInFeatures[segmentKey] = new Set();
}
segmentsUsedInFeatures[segmentKey].add(entityName);
});
}
});
}
}
// force
if (parsed.force) {
if (!Array.isArray(parsed.force)) {
// with environments
Object.keys(parsed.force).forEach((environmentKey) => {
parsed.force?.[environmentKey].forEach((force) => {
if (force.segments && force.segments !== "*") {
(0, utils_1.extractSegmentKeysFromGroupSegments)(force.segments).forEach((segmentKey) => {
if (!segmentsUsedInFeatures[segmentKey]) {
segmentsUsedInFeatures[segmentKey] = new Set();
}
segmentsUsedInFeatures[segmentKey].add(entityName);
});
}
if (force.conditions) {
(0, utils_1.extractAttributeKeysFromConditions)(force.conditions).forEach((attributeKey) => {
if (!attributesUsedInFeatures[attributeKey]) {
attributesUsedInFeatures[attributeKey] = new Set();
}
attributesUsedInFeatures[attributeKey].add(entityName);
});
}
});
});
}
else {
// no environments
parsed.force.forEach((force) => {
if (force.segments && force.segments !== "*") {
(0, utils_1.extractSegmentKeysFromGroupSegments)(force.segments).forEach((segmentKey) => {
if (!segmentsUsedInFeatures[segmentKey]) {
segmentsUsedInFeatures[segmentKey] = new Set();
}
segmentsUsedInFeatures[segmentKey].add(entityName);
});
}
if (force.conditions) {
(0, utils_1.extractAttributeKeysFromConditions)(force.conditions).forEach((attributeKey) => {
if (!attributesUsedInFeatures[attributeKey]) {
attributesUsedInFeatures[attributeKey] = new Set();
}
attributesUsedInFeatures[attributeKey].add(entityName);
});
}
});
}
}
// push
result.entities.features.push({
...parsed,
key: entityName,
lastModified: (0, getLastModifiedFromHistory_1.getLastModifiedFromHistory)(fullHistory, "feature", entityName),
});
}
// segments
const segmentFiles = await datasource.listSegments();
for (const entityName of segmentFiles) {
const parsed = await datasource.readSegment(entityName);
(0, utils_1.extractAttributeKeysFromConditions)(parsed.conditions).forEach((attributeKey) => {
if (!attributesUsedInSegments[attributeKey]) {
attributesUsedInSegments[attributeKey] = new Set();
}
attributesUsedInSegments[attributeKey].add(entityName);
});
result.entities.segments.push({
...parsed,
key: entityName,
lastModified: (0, getLastModifiedFromHistory_1.getLastModifiedFromHistory)(fullHistory, "segment", entityName),
usedInFeatures: Array.from(segmentsUsedInFeatures[entityName] || []),
});
}
// attributes
const attributeFiles = await datasource.listAttributes();
for (const entityName of attributeFiles) {
const parsed = await datasource.readAttribute(entityName);
result.entities.attributes.push({
...parsed,
key: entityName,
lastModified: (0, getLastModifiedFromHistory_1.getLastModifiedFromHistory)(fullHistory, "attribute", entityName),
usedInFeatures: Array.from(attributesUsedInFeatures[entityName] || []),
usedInSegments: Array.from(attributesUsedInSegments[entityName] || []),
});
}
return result;
}
//# sourceMappingURL=generateSiteSearchIndex.js.map