diff --git a/std/merge.js b/std/merge.js index 9604fe4b..1598aee5 100644 --- a/std/merge.js +++ b/std/merge.js @@ -121,6 +121,46 @@ export function deep(rules) { return (a, b) => objectMerge2(a, b, rules); } +/** + * Merge strategy merging two values by selecting the first value. + * + * **Example**: + * + * ```js + * let a = { + * k0: 1, + * o: { + * o0: 'a string', + * }, + * }; + * + * let b = { + * k0: 2, + * k1: true, + * o: { + * o0: 'another string', + * }, + * }; + * + * mergeFull(a, b, { o: first() }); + * ``` + * + * Will give the result: + * + * ```js + * { + * k0: 2, + * k1: true, + * o: { + * o0: 'a string', + * }, + * } + * ``` + */ +export function first() { + return (a, _) => a; +} + /** * Merge strategy merging two values by selecting the second value. * diff --git a/std/merge.test.js b/std/merge.test.js index 8e2b6d9f..35eedf45 100644 --- a/std/merge.test.js +++ b/std/merge.test.js @@ -1,5 +1,5 @@ import { - mix, patch, merge, mergeFull, deep, replace, deepWithKey, + mix, patch, merge, mergeFull, deep, first, replace, deepWithKey, } from './merge'; test('mix objects', () => { @@ -200,6 +200,18 @@ test('mergeFull: pick the deep merge strategy when encountering an object as rul expect(result.spec.containers[1].image).toEqual('sidecar:v2'); }); +test('first: basic', () => { + const result = mergeFull(pod, sidecarImage, { + spec: { + containers: first(), + }, + }); + + expect(result.spec.containers.length).toEqual(2); + expect(result.spec.containers[0].name).toEqual('my-app'); + expect(result.spec.containers[1].image).toEqual('sidecar:v1'); +}); + test('replace: basic', () => { const result = mergeFull(pod, sidecarImage, { spec: {