Skip to content

Instantly share code, notes, and snippets.

@aereal
Created February 19, 2019 09:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aereal/f36714be3d29edc91c8d45a5b351d3f8 to your computer and use it in GitHub Desktop.
Save aereal/f36714be3d29edc91c8d45a5b351d3f8 to your computer and use it in GitHub Desktop.
#!/usr/bin/env node
const isScalar = (v) => {
return !(v === null || v === undefined || typeof v === 'object');
};
const mergeObject = (a, b) => {
const keys = new Set([...Object.keys(a), ...Object.keys(b)]);
const accum = {};
for (const k of keys) {
const va = a[k];
const vb = b[k];
if (va !== undefined && vb !== undefined) {
if (isScalar(va)) {
accum[k] = vb;
} else {
accum[k] = merge(va, vb);
}
} else {
accum[k] = [va, vb].find(e => e !== undefined);
}
}
return accum;
};
const mergeArray = (a, b) => {
return [...a, ...b];
};
const merge = (a, b) => {
if (Array.isArray(a)) {
return mergeArray(a, b);
} else {
return mergeObject(a, b);
}
};
const tsconfigPaths = process.argv.slice(2);
const tsconfigs = tsconfigPaths.map(path => require(`./${path}`));
const merged = tsconfigs.reduce((accum, config) => {
return merge(accum, config);
}, {});
console.log(JSON.stringify(merged));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment