merge-options 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.js +18 -10
  2. package/license +1 -1
  3. package/package.json +5 -5
package/index.js CHANGED
@@ -3,6 +3,13 @@ const isOptionObject = require('is-plain-obj');
3
3
 
4
4
  const hasOwnProperty = Object.prototype.hasOwnProperty;
5
5
  const propIsEnumerable = Object.propertyIsEnumerable;
6
+ const defineProperty = (obj, name, value) => Object.defineProperty(obj, name, {
7
+ value,
8
+ writable: true,
9
+ enumerable: true,
10
+ configurable: true
11
+ });
12
+
6
13
  const globalThis = this;
7
14
  const defaultMergeOpts = {
8
15
  concatArrays: false
@@ -47,7 +54,7 @@ function cloneArray(array) {
47
54
  const result = array.slice(0, 0);
48
55
 
49
56
  getEnumerableOwnPropertyKeys(array).forEach(key => {
50
- result[key] = clone(array[key]);
57
+ defineProperty(result, key, clone(array[key]));
51
58
  });
52
59
 
53
60
  return result;
@@ -57,7 +64,7 @@ function cloneOptionObject(obj) {
57
64
  const result = Object.getPrototypeOf(obj) === null ? Object.create(null) : {};
58
65
 
59
66
  getEnumerableOwnPropertyKeys(obj).forEach(key => {
60
- result[key] = clone(obj[key]);
67
+ defineProperty(result, key, clone(obj[key]));
61
68
  });
62
69
 
63
70
  return result;
@@ -69,10 +76,11 @@ function cloneOptionObject(obj) {
69
76
  */
70
77
  const mergeKeys = (merged, source, keys, mergeOpts) => {
71
78
  keys.forEach(key => {
72
- if (key in merged) {
73
- merged[key] = merge(merged[key], source[key], mergeOpts);
79
+ // Do not recurse into prototype chain of merged
80
+ if (key in merged && merged[key] !== Object.getPrototypeOf(merged)) {
81
+ defineProperty(merged, key, merge(merged[key], source[key], mergeOpts));
74
82
  } else {
75
- merged[key] = clone(source[key]);
83
+ defineProperty(merged, key, clone(source[key]));
76
84
  }
77
85
  });
78
86
 
@@ -102,9 +110,9 @@ const concatArrays = (merged, source, mergeOpts) => {
102
110
 
103
111
  if (array === merged) {
104
112
  // Already cloned
105
- result[resultIndex++] = array[k];
113
+ defineProperty(result, resultIndex++, array[k]);
106
114
  } else {
107
- result[resultIndex++] = clone(array[k]);
115
+ defineProperty(result, resultIndex++, clone(array[k]));
108
116
  }
109
117
  }
110
118
 
@@ -135,7 +143,7 @@ function merge(merged, source, mergeOpts) {
135
143
 
136
144
  module.exports = function () {
137
145
  const mergeOpts = merge(clone(defaultMergeOpts), (this !== globalThis && this) || {}, defaultMergeOpts);
138
- let merged = {};
146
+ let merged = {foobar: {}};
139
147
 
140
148
  for (let i = 0; i < arguments.length; i++) {
141
149
  const option = arguments[i];
@@ -148,8 +156,8 @@ module.exports = function () {
148
156
  throw new TypeError('`' + option + '` is not an Option Object');
149
157
  }
150
158
 
151
- merged = merge(merged, option, mergeOpts);
159
+ merged = merge(merged, {foobar: option}, mergeOpts);
152
160
  }
153
161
 
154
- return merged;
162
+ return merged.foobar;
155
163
  };
package/license CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2016-2017 Michael Mayer
3
+ Copyright (c) 2016-2018 Michael Mayer
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "merge-options",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Merge Option Objects",
5
5
  "license": "MIT",
6
6
  "repository": "schnittstabil/merge-options",
@@ -30,11 +30,11 @@
30
30
  "clone"
31
31
  ],
32
32
  "devDependencies": {
33
- "ava": "^0.19",
34
- "coveralls": "^2.13",
35
- "nyc": "^10.3",
33
+ "ava": "^0.25",
34
+ "coveralls": "^3.0",
35
+ "nyc": "^11.7",
36
36
  "rimraf": "^2.5",
37
- "xo": "^0.18"
37
+ "xo": "^0.20"
38
38
  },
39
39
  "dependencies": {
40
40
  "is-plain-obj": "^1.1"