unleash-server
Version:
Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.
144 lines • 5.99 kB
JavaScript
import { mapValues, ensureStringValue } from '../../../util/index.js';
import { sortStrategies } from '../../../util/sortStrategies.js';
export class FeatureToggleRowConverter {
constructor(flagResolver) {
this.isUnseenStrategyRow = (feature, row) => {
return (row.strategy_id &&
!feature.strategies?.find((strategy) => strategy?.id === row.strategy_id));
};
this.isNewTag = (feature, row) => {
return (row.tag_type &&
row.tag_value &&
!feature.tags?.some((tag) => tag?.type === row.tag_type && tag?.value === row.tag_value));
};
this.addSegmentToStrategy = (feature, row) => {
feature.strategies
?.find((strategy) => strategy?.id === row.strategy_id)
?.constraints?.push(...row.segment_constraints);
};
this.addSegmentIdsToStrategy = (feature, row) => {
const strategy = feature.strategies?.find((strategy) => strategy?.id === row.strategy_id);
if (!strategy) {
return;
}
if (!strategy.segments) {
strategy.segments = [];
}
strategy.segments.push(row.segment_id);
};
this.addLastSeenByEnvironment = (feature, row) => {
if (!feature.environments) {
feature.environments = [];
}
const found = feature.environments.find((environment) => environment?.name === row.last_seen_at_env);
if (found) {
return;
}
const newEnvironment = {
name: row.last_seen_at_env,
lastSeenAt: row.env_last_seen_at,
enabled: row.enabled || false,
};
if (!newEnvironment.name || !newEnvironment.lastSeenAt) {
return;
}
feature.environments.push(newEnvironment);
};
this.rowToStrategy = (row) => {
return {
id: row.strategy_id,
name: row.strategy_name,
title: row.strategy_title,
constraints: row.constraints || [],
parameters: mapValues(row.parameters || {}, ensureStringValue),
sortOrder: row.sort_order,
milestoneId: row.milestone_id,
disabled: row.strategy_disabled,
variants: row.strategy_variants || [],
};
};
this.addTag = (feature, row) => {
const tags = feature.tags || [];
const newTag = this.rowToTag(row);
feature.tags = [...tags, newTag];
};
this.rowToTag = (row) => {
return {
value: row.tag_value,
type: row.tag_type,
};
};
this.formatToggles = (result) => Object.values(result).map(({ strategies, ...rest }) => ({
...rest,
strategies: strategies
?.sort(sortStrategies)
.map(({ title, sortOrder, milestoneId, ...strategy }) => ({
...strategy,
...(title ? { title } : {}),
})),
}));
this.createBaseFeature = (row, feature, featureQuery) => {
feature.impressionData = row.impression_data;
feature.enabled = !!row.enabled;
feature.name = row.name;
feature.description = row.description;
feature.project = row.project;
feature.stale = row.stale || false;
feature.type = row.type;
feature.lastSeenAt = row.last_seen_at;
feature.variants = row.variants || [];
feature.project = row.project;
if (this.isUnseenStrategyRow(feature, row)) {
feature.strategies?.push(this.rowToStrategy(row));
}
if (this.isNewTag(feature, row)) {
this.addTag(feature, row);
}
if (featureQuery?.inlineSegmentConstraints && row.segment_id) {
this.addSegmentToStrategy(feature, row);
}
else if (!featureQuery?.inlineSegmentConstraints && row.segment_id) {
this.addSegmentIdsToStrategy(feature, row);
}
return feature;
};
this.buildFeatureToggleListFromRows = (rows, featureQuery, includeDisabledStrategies) => {
const result = rows.reduce((acc, r) => {
let feature = acc[r.name] ?? {
strategies: [],
stale: r.stale || false,
};
feature = this.createBaseFeature(r, feature, featureQuery);
feature.createdAt = r.created_at;
feature.favorite = r.favorite;
this.addLastSeenByEnvironment(feature, r);
acc[r.name] = feature;
return acc;
}, {});
return this.formatToggles(result);
};
this.buildPlaygroundFeaturesFromRows = (rows, featureQuery) => {
const result = rows.reduce((acc, r) => {
let feature = acc[r.name] ?? {
strategies: [],
};
feature = this.createBaseFeature(r, feature, featureQuery);
if (r.parent) {
feature.dependencies = feature.dependencies || [];
feature.dependencies.push({
feature: r.parent,
enabled: r.parent_enabled,
...(r.parent_enabled
? { variants: r.parent_variants }
: {}),
});
}
acc[r.name] = feature;
return acc;
}, {});
return this.formatToggles(result);
};
this.flagResolver = flagResolver;
}
}
//# sourceMappingURL=feature-toggle-row-converter.js.map