MCPcopy Create free account
hub / github.com/Zoo-Code-Org/Zoo-Code / mergeJson

Function mergeJson

src/integrations/theme/getTheme.ts:94–143  ·  view source on GitHub ↗
(
	first: JsonObject,
	second: JsonObject,
	mergeBehavior?: "merge" | "overwrite",
	mergeKeys?: { [key: string]: (a: any, b: any) => boolean },
)

Source from the content-addressed store, hash-verified

92
93type JsonObject = { [key: string]: any }
94export function mergeJson(
95 first: JsonObject,
96 second: JsonObject,
97 mergeBehavior?: "merge" | "overwrite",
98 mergeKeys?: { [key: string]: (a: any, b: any) => boolean },
99): any {
100 const copyOfFirst = JSON.parse(JSON.stringify(first))
101
102 try {
103 for (const key in second) {
104 const secondValue = second[key]
105
106 if (!(key in copyOfFirst) || mergeBehavior === "overwrite") {
107 // New value
108 copyOfFirst[key] = secondValue
109 continue
110 }
111
112 const firstValue = copyOfFirst[key]
113 if (Array.isArray(secondValue) && Array.isArray(firstValue)) {
114 // Array
115 if (mergeKeys?.[key]) {
116 // Merge keys are used to determine whether an item form the second object should override one from the first
117 const keptFromFirst: any[] = []
118 firstValue.forEach((item: any) => {
119 if (!secondValue.some((item2: any) => mergeKeys[key](item, item2))) {
120 keptFromFirst.push(item)
121 }
122 })
123 copyOfFirst[key] = [...keptFromFirst, ...secondValue]
124 } else {
125 copyOfFirst[key] = [...firstValue, ...secondValue]
126 }
127 } else if (typeof secondValue === "object" && typeof firstValue === "object") {
128 // Object
129 copyOfFirst[key] = mergeJson(firstValue, secondValue, mergeBehavior)
130 } else {
131 // Other (boolean, number, string)
132 copyOfFirst[key] = secondValue
133 }
134 }
135 return copyOfFirst
136 } catch (e) {
137 console.error("Error merging JSON", e, copyOfFirst, second)
138 return {
139 ...copyOfFirst,
140 ...second,
141 }
142 }
143}
144
145function getExtensionUri(): vscode.Uri {
146 return vscode.extensions.getExtension(`${Package.publisher}.${Package.name}`)!.extensionUri

Callers 1

getThemeFunction · 0.85

Calls 3

parseMethod · 0.80
forEachMethod · 0.80
errorMethod · 0.65

Tested by

no test coverage detected