// like Object.assign() but different
function mergeWithoutOverride(target, ...sources) {
for (let source of sources) {
// doesn't handle Symbol properties
for (let key of Object.keys(source)) {
// doesn't override existing properties
if (!(key in target)) target[key] = source[key];
}
}
return target;
}