extend.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. 'use strict';
  2. /*!
  3. * node.extend
  4. * Copyright 2011, John Resig
  5. * Dual licensed under the MIT or GPL Version 2 licenses.
  6. * http://jquery.org/license
  7. *
  8. * @fileoverview
  9. * Port of jQuery.extend that actually works on node.js
  10. */
  11. var is = require('is');
  12. var extend = function extend() {
  13. var target = arguments[0] || {};
  14. var i = 1;
  15. var length = arguments.length;
  16. var deep = false;
  17. var options, name, src, copy, copyIsArray, clone;
  18. // Handle a deep copy situation
  19. if (typeof target === 'boolean') {
  20. deep = target;
  21. target = arguments[1] || {};
  22. // skip the boolean and the target
  23. i = 2;
  24. }
  25. // Handle case when target is a string or something (possible in deep copy)
  26. if (typeof target !== 'object' && !is.fn(target)) {
  27. target = {};
  28. }
  29. for (; i < length; i++) {
  30. // Only deal with non-null/undefined values
  31. options = arguments[i];
  32. if (options != null) {
  33. if (typeof options === 'string') {
  34. options = options.split('');
  35. }
  36. // Extend the base object
  37. for (name in options) {
  38. src = target[name];
  39. copy = options[name];
  40. // Prevent never-ending loop
  41. if (target === copy) {
  42. continue;
  43. }
  44. // Recurse if we're merging plain objects or arrays
  45. if (deep && copy && (is.hash(copy) || (copyIsArray = is.array(copy)))) {
  46. if (copyIsArray) {
  47. copyIsArray = false;
  48. clone = src && is.array(src) ? src : [];
  49. } else {
  50. clone = src && is.hash(src) ? src : {};
  51. }
  52. // Never move original objects, clone them
  53. target[name] = extend(deep, clone, copy);
  54. // Don't bring in undefined values
  55. } else if (typeof copy !== 'undefined') {
  56. target[name] = copy;
  57. }
  58. }
  59. }
  60. }
  61. // Return the modified object
  62. return target;
  63. };
  64. /**
  65. * @public
  66. */
  67. extend.version = '1.1.3';
  68. /**
  69. * Exports module.
  70. */
  71. module.exports = extend;