Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion collections/deep_merge.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// Copyright 2018-2026 the Deno authors. MIT license.
// This module is browser compatible.

import { union } from "./union.ts";

/** Default merging options - cached to avoid object allocation on each call */
const DEFAULT_OPTIONS: DeepMergeOptions = {
arrays: "merge",
Expand Down Expand Up @@ -303,6 +305,8 @@ function mergeObjects(
if ((Array.isArray(left)) && (Array.isArray(right))) {
if (options.arrays === "merge") {
return left.concat(right);
} else if (options.arrays === "union") {
return union(left, right);
}

return right;
Expand Down Expand Up @@ -380,14 +384,17 @@ function getKeys<T extends Record<string, unknown>>(record: T): Array<keyof T> {
/** Merging strategy */
export type MergingStrategy = "replace" | "merge";

/** Arrays Merging strategy */
export type ArraysMergingStrategy = MergingStrategy | "union";

/** Options for {@linkcode deepMerge}. */
export type DeepMergeOptions = {
/**
* Merging strategy for arrays
*
* @default {"merge"}
*/
arrays?: MergingStrategy;
arrays?: ArraysMergingStrategy;
/**
* Merging strategy for maps.
*
Expand Down
13 changes: 13 additions & 0 deletions collections/deep_merge_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,19 @@ Deno.test("deepMerge() handles array merge (merge)", () => {
);
});

Deno.test("deepMerge() handles array merge (union)", () => {
assertEquals(
deepMerge({
foo: [1, 2, 3],
}, {
foo: [3, 4, 5],
}, { arrays: "union" }),
{
foo: [1, 2, 3, 4, 5],
},
);
});

Deno.test("deepMerge() handles maps merge (replace)", () => {
assertEquals(
deepMerge({
Expand Down
Loading