UNPKG

13 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.ITERATOR_SYMBOL = undefined;
7
8var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
9
10var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); /* eslint no-use-before-define: 0 */
11
12
13exports.getAdapter = getAdapter;
14exports.makeOptions = makeOptions;
15exports.isCustomComponentElement = isCustomComponentElement;
16exports.propsOfNode = propsOfNode;
17exports.typeOfNode = typeOfNode;
18exports.nodeHasType = nodeHasType;
19exports.nodeMatches = nodeMatches;
20exports.nodeEqual = nodeEqual;
21exports.containsChildrenSubArray = containsChildrenSubArray;
22exports.childrenToSimplifiedArray = childrenToSimplifiedArray;
23exports.isReactElementAlike = isReactElementAlike;
24exports.withSetStateAllowed = withSetStateAllowed;
25exports.AND = AND;
26exports.displayNameOfNode = displayNameOfNode;
27exports.sym = sym;
28exports.privateSet = privateSet;
29exports.cloneElement = cloneElement;
30exports.spyMethod = spyMethod;
31
32var _object = require('object.assign');
33
34var _object2 = _interopRequireDefault(_object);
35
36var _lodash = require('lodash.isequal');
37
38var _lodash2 = _interopRequireDefault(_lodash);
39
40var _objectIs = require('object-is');
41
42var _objectIs2 = _interopRequireDefault(_objectIs);
43
44var _object3 = require('object.entries');
45
46var _object4 = _interopRequireDefault(_object3);
47
48var _functionPrototype = require('function.prototype.name');
49
50var _functionPrototype2 = _interopRequireDefault(_functionPrototype);
51
52var _has = require('has');
53
54var _has2 = _interopRequireDefault(_has);
55
56var _arrayPrototype = require('array.prototype.flat');
57
58var _arrayPrototype2 = _interopRequireDefault(_arrayPrototype);
59
60var _stringPrototype = require('string.prototype.trim');
61
62var _stringPrototype2 = _interopRequireDefault(_stringPrototype);
63
64var _configuration = require('./configuration');
65
66var _RSTTraversal = require('./RSTTraversal');
67
68var _getAdapter = require('./getAdapter');
69
70var _getAdapter2 = _interopRequireDefault(_getAdapter);
71
72function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
73
74function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
75
76var ITERATOR_SYMBOL = exports.ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
77
78function getAdapter() {
79 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
80
81 console.warn('getAdapter from Utils is deprecated; please use ./getAdapter instead');
82 return (0, _getAdapter2['default'])(options);
83}
84
85function makeOptions(options) {
86 var attachTo = options.attachTo,
87 hydrateIn = options.hydrateIn;
88
89
90 if (attachTo && hydrateIn && attachTo !== hydrateIn) {
91 throw new TypeError('If both the `attachTo` and `hydrateIn` options are provided, they must be === (for backwards compatibility)');
92 }
93
94 // neither present: both undefined
95 // only attachTo present: attachTo set, hydrateIn undefined
96 // only hydrateIn present: both set to hydrateIn
97 // both present (and ===, per above): both set to hydrateIn
98 var mountTargets = {
99 attachTo: hydrateIn || attachTo || undefined,
100 hydrateIn: hydrateIn || undefined
101 };
102
103 return (0, _object2['default'])({}, (0, _configuration.get)(), options, mountTargets);
104}
105
106function isCustomComponentElement(inst, adapter) {
107 return !!inst && adapter.isValidElement(inst) && typeof inst.type === 'function';
108}
109
110function propsOfNode(node) {
111 return (0, _object4['default'])(node && node.props || {}).filter(function (_ref) {
112 var _ref2 = _slicedToArray(_ref, 2),
113 value = _ref2[1];
114
115 return typeof value !== 'undefined';
116 }).reduce(function (acc, _ref3) {
117 var _ref4 = _slicedToArray(_ref3, 2),
118 key = _ref4[0],
119 value = _ref4[1];
120
121 return (0, _object2['default'])(acc, _defineProperty({}, key, value));
122 }, {});
123}
124
125function typeOfNode(node) {
126 return node ? node.type : null;
127}
128
129function nodeHasType(node, type) {
130 if (!type || !node) return false;
131
132 var adapter = (0, _getAdapter2['default'])();
133 if (adapter.displayNameOfNode) {
134 var displayName = adapter.displayNameOfNode(node);
135 return displayName === type;
136 }
137
138 if (!node.type) return false;
139 if (typeof node.type === 'string') return node.type === type;
140 return (typeof node.type === 'function' ? (0, _functionPrototype2['default'])(node.type) === type : node.type.name === type) || node.type.displayName === type;
141}
142
143function internalChildrenCompare(a, b, lenComp, isLoose) {
144 var nodeCompare = isLoose ? nodeMatches : nodeEqual;
145
146 if (a === b) return true;
147 if (!Array.isArray(a) && !Array.isArray(b)) {
148 return nodeCompare(a, b, lenComp);
149 }
150 var flatA = (0, _arrayPrototype2['default'])(a, Infinity);
151 var flatB = (0, _arrayPrototype2['default'])(b, Infinity);
152 if (flatA.length !== flatB.length) return false;
153 if (flatA.length === 0 && flatB.length === 0) return true;
154 for (var i = 0; i < flatA.length; i += 1) {
155 if (!nodeCompare(flatA[i], flatB[i], lenComp)) return false;
156 }
157 return true;
158}
159
160function childrenMatch(a, b, lenComp) {
161 return internalChildrenCompare(a, b, lenComp, true);
162}
163
164function childrenEqual(a, b, lenComp) {
165 return internalChildrenCompare(a, b, lenComp, false);
166}
167
168function removeNullaryReducer(acc, _ref5) {
169 var _ref6 = _slicedToArray(_ref5, 2),
170 key = _ref6[0],
171 value = _ref6[1];
172
173 var addition = value == null ? {} : _defineProperty({}, key, value);
174 return (0, _object2['default'])({}, acc, addition);
175}
176
177function internalNodeCompare(a, b, lenComp, isLoose) {
178 if (a === b) return true;
179 if (!a || !b) return false;
180 if (a.type !== b.type) return false;
181
182 var left = propsOfNode(a);
183 var right = propsOfNode(b);
184 if (isLoose) {
185 left = (0, _object4['default'])(left).reduce(removeNullaryReducer, {});
186 right = (0, _object4['default'])(right).reduce(removeNullaryReducer, {});
187 }
188
189 var leftKeys = Object.keys(left);
190 for (var i = 0; i < leftKeys.length; i += 1) {
191 var prop = leftKeys[i];
192 // we will check children later
193 if (prop === 'children') {
194 // continue;
195 } else if (!(prop in right)) {
196 return false;
197 } else if (right[prop] === left[prop]) {
198 // continue;
199 } else if (_typeof(right[prop]) === _typeof(left[prop]) && _typeof(left[prop]) === 'object') {
200 if (!(0, _lodash2['default'])(left[prop], right[prop])) return false;
201 } else {
202 return false;
203 }
204 }
205
206 var leftHasChildren = 'children' in left;
207 var rightHasChildren = 'children' in right;
208 var childCompare = isLoose ? childrenMatch : childrenEqual;
209 if (leftHasChildren || rightHasChildren) {
210 if (!childCompare(childrenToSimplifiedArray(left.children, isLoose), childrenToSimplifiedArray(right.children, isLoose), lenComp)) {
211 return false;
212 }
213 }
214
215 if (!isTextualNode(a)) {
216 var rightKeys = Object.keys(right);
217 return lenComp(leftKeys.length - leftHasChildren, rightKeys.length - rightHasChildren);
218 }
219
220 return false;
221}
222
223function nodeMatches(a, b) {
224 var lenComp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _objectIs2['default'];
225
226 return internalNodeCompare(a, b, lenComp, true);
227}
228
229function nodeEqual(a, b) {
230 var lenComp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _objectIs2['default'];
231
232 return internalNodeCompare(a, b, lenComp, false);
233}
234
235function containsChildrenSubArray(match, node, subArray) {
236 var children = (0, _RSTTraversal.childrenOfNode)(node);
237 var checker = function checker(_, i) {
238 return arraysEqual(match, children.slice(i, i + subArray.length), subArray);
239 };
240 return children.some(checker);
241}
242
243function arraysEqual(match, left, right) {
244 return left.length === right.length && left.every(function (el, i) {
245 return match(el, right[i]);
246 });
247}
248
249function childrenToArray(children) {
250 var result = [];
251
252 var push = function push(el) {
253 if (el === null || el === false || typeof el === 'undefined') return;
254 result.push(el);
255 };
256
257 if (Array.isArray(children)) {
258 children.forEach(push);
259 } else {
260 push(children);
261 }
262 return result;
263}
264
265function childrenToSimplifiedArray(nodeChildren) {
266 var isLoose = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
267
268 var childrenArray = childrenToArray(nodeChildren);
269 var simplifiedArray = [];
270
271 for (var i = 0; i < childrenArray.length; i += 1) {
272 var child = childrenArray[i];
273 var previousChild = simplifiedArray.pop();
274
275 if (typeof previousChild === 'undefined') {
276 simplifiedArray.push(child);
277 } else if (isTextualNode(child) && isTextualNode(previousChild)) {
278 simplifiedArray.push(previousChild + child);
279 } else {
280 simplifiedArray.push(previousChild);
281 simplifiedArray.push(child);
282 }
283 }
284
285 if (isLoose) {
286 return simplifiedArray.map(function (x) {
287 return typeof x === 'string' ? (0, _stringPrototype2['default'])(x) : x;
288 });
289 }
290
291 return simplifiedArray;
292}
293
294function isTextualNode(node) {
295 return typeof node === 'string' || typeof node === 'number';
296}
297
298function isReactElementAlike(arg, adapter) {
299 return adapter.isValidElement(arg) || isTextualNode(arg) || Array.isArray(arg);
300}
301
302// TODO(lmr): can we get rid of this outside of the adapter?
303function withSetStateAllowed(fn) {
304 // NOTE(lmr):
305 // this is currently here to circumvent a React bug where `setState()` is
306 // not allowed without global being defined.
307 var cleanup = false;
308 if (typeof global.document === 'undefined') {
309 cleanup = true;
310 global.document = {};
311 }
312 fn();
313 if (cleanup) {
314 // This works around a bug in node/jest in that developers aren't able to
315 // delete things from global when running in a node vm.
316 global.document = undefined;
317 delete global.document;
318 }
319}
320
321function AND(fns) {
322 var fnsReversed = fns.slice().reverse();
323 return function (x) {
324 return fnsReversed.every(function (fn) {
325 return fn(x);
326 });
327 };
328}
329
330function displayNameOfNode(node) {
331 if (!node) return null;
332
333 var type = node.type;
334
335
336 if (!type) return null;
337
338 return type.displayName || (typeof type === 'function' ? (0, _functionPrototype2['default'])(type) : type.name || type);
339}
340
341function sym(s) {
342 return typeof Symbol === 'function' ? Symbol['for']('enzyme.' + String(s)) : s;
343}
344
345function privateSet(obj, prop, value) {
346 Object.defineProperty(obj, prop, {
347 value: value,
348 enumerable: false,
349 writable: true
350 });
351}
352
353function cloneElement(adapter, el, props) {
354 return adapter.createElement(el.type, (0, _object2['default'])({}, el.props, props));
355}
356
357function spyMethod(instance, methodName) {
358 var lastReturnValue = void 0;
359 var originalMethod = instance[methodName];
360 var hasOwn = (0, _has2['default'])(instance, methodName);
361 var descriptor = void 0;
362 if (hasOwn) {
363 descriptor = Object.getOwnPropertyDescriptor(instance, methodName);
364 }
365 Object.defineProperty(instance, methodName, {
366 configurable: true,
367 enumerable: !descriptor || !!descriptor.enumerable,
368 value: function () {
369 function value() {
370 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
371 args[_key] = arguments[_key];
372 }
373
374 var result = originalMethod.apply(this, args);
375 lastReturnValue = result;
376 return result;
377 }
378
379 return value;
380 }()
381 });
382 return {
383 restore: function () {
384 function restore() {
385 if (hasOwn) {
386 if (descriptor) {
387 Object.defineProperty(instance, methodName, descriptor);
388 } else {
389 /* eslint-disable no-param-reassign */
390 instance[methodName] = originalMethod;
391 /* eslint-enable no-param-reassign */
392 }
393 } else {
394 /* eslint-disable no-param-reassign */
395 delete instance[methodName];
396 /* eslint-enable no-param-reassign */
397 }
398 }
399
400 return restore;
401 }(),
402 getLastReturnValue: function () {
403 function getLastReturnValue() {
404 return lastReturnValue;
405 }
406
407 return getLastReturnValue;
408 }()
409 };
410}
\No newline at end of file