implement baseFeatureConfigModifier() for ProductFeatures

This commit is contained in:
Gergő Ábrahám 2025-06-20 01:54:22 +02:00
parent bff5fc3748
commit de05a3b167
3 changed files with 64 additions and 3 deletions

View file

@ -35,6 +35,15 @@ export type ProductFeatureKibanaConfig<T extends string = string> =
RecursivePartial<BaseKibanaFeatureConfig> & {
subFeatureIds?: T[];
subFeaturesPrivileges?: SubFeaturesPrivileges[];
/** An option for product features to modify the base kibana feature.
*
* @param baseFeatureConfig
* @returns modified baseFeatureConfig
*/
baseFeatureConfigModifier?: (
baseFeatureConfig: BaseKibanaFeatureConfig
) => BaseKibanaFeatureConfig;
};
export type ProductFeaturesConfig<T extends string = string> = Map<
ProductFeatureKeyType,

View file

@ -352,6 +352,50 @@ describe('ProductFeaturesConfigMerger', () => {
});
});
it('should call baseFeatureConfigModifier() for all product features', () => {
const enabledProductFeaturesConfigs: ProductFeatureKibanaConfig[] = [
{
subFeatureIds: ['subFeature3', 'subFeature1'],
baseFeatureConfigModifier: jest
.fn()
.mockImplementation((baseConfig: KibanaFeatureConfig): KibanaFeatureConfig => {
return { ...baseConfig, name: 'NEW NAME' };
}),
},
{
baseFeatureConfigModifier: jest
.fn()
.mockImplementation((baseConfig: KibanaFeatureConfig): KibanaFeatureConfig => {
return { ...baseConfig, order: 666 };
}),
},
];
const merged = merger.mergeProductFeatureConfigs(
baseKibanaFeature,
[],
enabledProductFeaturesConfigs
);
expect(enabledProductFeaturesConfigs[0].baseFeatureConfigModifier).toBeCalledWith(
baseKibanaFeature
);
expect(enabledProductFeaturesConfigs[1].baseFeatureConfigModifier).toBeCalledWith({
...baseKibanaFeature,
name: 'NEW NAME',
});
expect(merged).toEqual({
...baseKibanaFeature,
// modifications:
name: 'NEW NAME',
order: 666,
subFeatures: [subFeature1, subFeature3],
});
});
it('should merge everything at the same time', () => {
const enabledProductFeaturesConfigs: ProductFeatureKibanaConfig[] = [
{

View file

@ -32,20 +32,28 @@ export class ProductFeaturesConfigMerger<T extends string = string> {
kibanaSubFeatureIds: T[],
productFeaturesConfigs: ProductFeatureKibanaConfig[]
): KibanaFeatureConfig {
const mergedKibanaFeatureConfig = cloneDeep(kibanaFeatureConfig) as KibanaFeatureConfig;
let mergedKibanaFeatureConfig = cloneDeep(kibanaFeatureConfig) as KibanaFeatureConfig;
const subFeaturesPrivilegesToMerge: SubFeaturesPrivileges[] = [];
const enabledSubFeaturesIndexed = Object.fromEntries(
kibanaSubFeatureIds.map((id) => [id, true])
);
productFeaturesConfigs.forEach((productFeatureConfig) => {
const { subFeaturesPrivileges, subFeatureIds, ...productFeatureConfigToMerge } =
cloneDeep(productFeatureConfig);
const {
subFeaturesPrivileges,
subFeatureIds,
baseFeatureConfigModifier,
...productFeatureConfigToMerge
} = cloneDeep(productFeatureConfig);
subFeatureIds?.forEach((subFeatureId) => {
enabledSubFeaturesIndexed[subFeatureId] = true;
});
if (baseFeatureConfigModifier) {
mergedKibanaFeatureConfig = baseFeatureConfigModifier(mergedKibanaFeatureConfig);
}
if (subFeaturesPrivileges) {
subFeaturesPrivilegesToMerge.push(...subFeaturesPrivileges);
}