index.js 876 B

12345678910111213141516171819202122232425262728293031
  1. module.exports = merge;
  2. /**
  3. * Augments `target` with properties in `options`. Does not override
  4. * target's properties if they are defined and matches expected type in
  5. * options
  6. *
  7. * @returns {Object} merged object
  8. */
  9. function merge(target, options) {
  10. var key;
  11. if (!target) { target = {}; }
  12. if (options) {
  13. for (key in options) {
  14. if (options.hasOwnProperty(key)) {
  15. var targetHasIt = target.hasOwnProperty(key),
  16. optionsValueType = typeof options[key],
  17. shouldReplace = !targetHasIt || (typeof target[key] !== optionsValueType);
  18. if (shouldReplace) {
  19. target[key] = options[key];
  20. } else if (optionsValueType === 'object') {
  21. // go deep, don't care about loops here, we are simple API!:
  22. target[key] = merge(target[key], options[key]);
  23. }
  24. }
  25. }
  26. }
  27. return target;
  28. }