kubricate
Version:
A TypeScript framework for building reusable, type-safe Kubernetes infrastructure — without the YAML mess.
42 lines (34 loc) • 1.25 kB
text/typescript
import type { PreparedEffect } from '@kubricate/core';
/**
* Creates a reusable handler to merge multiple Raw Secret effects.
* Will group by Secret `storeName` and merge `.data`.
* Throws error if duplicate keys are found within the same store.
*/
export function createMergeHandler(): (effects: PreparedEffect[]) => PreparedEffect[] {
return function mergeKubeSecrets(effects: PreparedEffect[]): PreparedEffect[] {
const grouped: Record<string, PreparedEffect> = {};
for (const effect of effects) {
if (effect.type !== 'custom') continue;
const name = effect.value.storeName;
const key = name;
if (!grouped[key]) {
grouped[key] = {
...effect,
value: {
...effect.value,
rawData: { ...effect.value.rawData },
},
};
continue;
}
const existing = grouped[key];
for (const [key, value] of Object.entries(effect.value.rawData ?? {})) {
if (existing.value.rawData?.[key]) {
throw new Error(`[conflict:in-memory] Conflict detected: key "${key}" already exists in Secret "${name}"`);
}
existing.value.rawData[key] = value;
}
}
return Object.values(grouped);
};
}