UNPKG

14.5 kBJavaScriptView Raw
1'use strict';
2
3var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
4
5var _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; };
6// eslint-disable-next-line import/no-unresolved, import/extensions
7
8// eslint-disable-next-line import/no-unresolved, import/extensions
9
10
11var _object = require('object.assign');
12
13var _object2 = _interopRequireDefault(_object);
14
15var _react = require('react');
16
17var _react2 = _interopRequireDefault(_react);
18
19var _reactDom = require('react-dom');
20
21var _reactDom2 = _interopRequireDefault(_reactDom);
22
23var _server = require('react-dom/server');
24
25var _server2 = _interopRequireDefault(_server);
26
27var _reactAddonsTestUtils = require('react-addons-test-utils');
28
29var _reactAddonsTestUtils2 = _interopRequireDefault(_reactAddonsTestUtils);
30
31var _object3 = require('object.values');
32
33var _object4 = _interopRequireDefault(_object3);
34
35var _reactIs = require('react-is');
36
37var _enzyme = require('enzyme');
38
39var _enzymeAdapterUtils = require('enzyme-adapter-utils');
40
41function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
42
43function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
44
45function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
46
47function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
48
49function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
50
51function typeToNodeType(type) {
52 if (typeof type === 'function') {
53 if (type.prototype && typeof type.prototype.render === 'function') {
54 return 'class';
55 }
56 return 'function';
57 }
58 return 'host';
59}
60
61function instanceToTree(inst) {
62 if (!inst || (typeof inst === 'undefined' ? 'undefined' : _typeof(inst)) !== 'object') {
63 return inst;
64 }
65 var el = inst._currentElement;
66 if (!el) {
67 return null;
68 }
69 if ((typeof el === 'undefined' ? 'undefined' : _typeof(el)) !== 'object') {
70 return el;
71 }
72 if (inst._tag) {
73 if ((typeof el === 'undefined' ? 'undefined' : _typeof(el)) !== 'object') {
74 return el;
75 }
76 var children = inst._renderedChildren || { '.0': el.props.children };
77 return {
78 nodeType: 'host',
79 type: el.type,
80 props: el.props,
81 key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(el.key),
82 ref: el.ref,
83 instance: _reactDom2['default'].findDOMNode(inst.getPublicInstance()) || null,
84 rendered: (0, _object4['default'])(children).map(instanceToTree)
85 };
86 }
87 if (inst._renderedComponent) {
88 return {
89 nodeType: typeToNodeType(el.type),
90 type: el.type,
91 props: el.props,
92 key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(el.key),
93 ref: el.ref,
94 instance: inst._instance || null,
95 rendered: instanceToTree(inst._renderedComponent)
96 };
97 }
98 throw new Error('Enzyme Internal Error: unknown instance encountered');
99}
100
101var ReactFourteenAdapter = function (_EnzymeAdapter) {
102 _inherits(ReactFourteenAdapter, _EnzymeAdapter);
103
104 function ReactFourteenAdapter() {
105 _classCallCheck(this, ReactFourteenAdapter);
106
107 var _this = _possibleConstructorReturn(this, (ReactFourteenAdapter.__proto__ || Object.getPrototypeOf(ReactFourteenAdapter)).call(this));
108
109 var lifecycles = _this.options.lifecycles;
110
111 _this.options = (0, _object2['default'])({}, _this.options, {
112 supportPrevContextArgumentOfComponentDidUpdate: true, // TODO: remove, semver-major
113 lifecycles: (0, _object2['default'])({}, lifecycles, {
114 componentDidUpdate: {
115 prevContext: true
116 }
117 })
118 });
119 return _this;
120 }
121
122 _createClass(ReactFourteenAdapter, [{
123 key: 'createMountRenderer',
124 value: function () {
125 function createMountRenderer(options) {
126 (0, _enzymeAdapterUtils.assertDomAvailable)('mount');
127 var domNode = options.attachTo || global.document.createElement('div');
128 var instance = null;
129 var adapter = this;
130 return {
131 render: function () {
132 function render(el, context, callback) {
133 if (instance === null) {
134 var type = el.type,
135 props = el.props,
136 ref = el.ref;
137
138 var wrapperProps = (0, _object2['default'])({
139 Component: type,
140 props: props,
141 context: context
142 }, ref && { ref: ref });
143 var ReactWrapperComponent = (0, _enzymeAdapterUtils.createMountWrapper)(el, (0, _object2['default'])({}, options, { adapter: adapter }));
144 var wrappedEl = _react2['default'].createElement(ReactWrapperComponent, wrapperProps);
145 instance = _reactDom2['default'].render(wrappedEl, domNode);
146 if (typeof callback === 'function') {
147 callback();
148 }
149 } else {
150 instance.setChildProps(el.props, context, callback);
151 }
152 }
153
154 return render;
155 }(),
156 unmount: function () {
157 function unmount() {
158 _reactDom2['default'].unmountComponentAtNode(domNode);
159 instance = null;
160 }
161
162 return unmount;
163 }(),
164 getNode: function () {
165 function getNode() {
166 return instance ? instanceToTree(instance._reactInternalInstance).rendered : null;
167 }
168
169 return getNode;
170 }(),
171 simulateEvent: function () {
172 function simulateEvent(node, event, mock) {
173 var mappedEvent = (0, _enzymeAdapterUtils.mapNativeEventNames)(event);
174 var eventFn = _reactAddonsTestUtils2['default'].Simulate[mappedEvent];
175 if (!eventFn) {
176 throw new TypeError('ReactWrapper::simulate() event \'' + String(event) + '\' does not exist');
177 }
178 // eslint-disable-next-line react/no-find-dom-node
179 eventFn(_reactDom2['default'].findDOMNode(node.instance), mock);
180 }
181
182 return simulateEvent;
183 }(),
184 batchedUpdates: function () {
185 function batchedUpdates(fn) {
186 return _reactDom2['default'].unstable_batchedUpdates(fn);
187 }
188
189 return batchedUpdates;
190 }()
191 };
192 }
193
194 return createMountRenderer;
195 }()
196 }, {
197 key: 'createShallowRenderer',
198 value: function () {
199 function createShallowRenderer() /* options */{
200 var renderer = _reactAddonsTestUtils2['default'].createRenderer();
201 var isDOM = false;
202 var cachedNode = null;
203 return {
204 render: function () {
205 function render(el, context) {
206 cachedNode = el;
207 /* eslint consistent-return: 0 */
208 if (typeof el.type === 'string') {
209 isDOM = true;
210 } else {
211 isDOM = false;
212 return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
213 return renderer.render(el, context);
214 });
215 }
216 }
217
218 return render;
219 }(),
220 unmount: function () {
221 function unmount() {
222 renderer.unmount();
223 }
224
225 return unmount;
226 }(),
227 getNode: function () {
228 function getNode() {
229 if (isDOM) {
230 return (0, _enzymeAdapterUtils.elementToTree)(cachedNode);
231 }
232 var output = renderer.getRenderOutput();
233 return {
234 nodeType: typeToNodeType(cachedNode.type),
235 type: cachedNode.type,
236 props: cachedNode.props,
237 key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(cachedNode.key),
238 ref: cachedNode.ref,
239 instance: renderer._instance._instance,
240 rendered: (0, _enzymeAdapterUtils.elementToTree)(output)
241 };
242 }
243
244 return getNode;
245 }(),
246 simulateEvent: function () {
247 function simulateEvent(node, event) {
248 for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
249 args[_key - 2] = arguments[_key];
250 }
251
252 var handler = node.props[(0, _enzymeAdapterUtils.propFromEvent)(event)];
253 if (handler) {
254 (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
255 // TODO(lmr): create/use synthetic events
256 // TODO(lmr): emulate React's event propagation
257 _reactDom2['default'].unstable_batchedUpdates(function () {
258 handler.apply(undefined, _toConsumableArray(args));
259 });
260 });
261 }
262 }
263
264 return simulateEvent;
265 }(),
266 batchedUpdates: function () {
267 function batchedUpdates(fn) {
268 return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
269 return _reactDom2['default'].unstable_batchedUpdates(fn);
270 });
271 }
272
273 return batchedUpdates;
274 }()
275 };
276 }
277
278 return createShallowRenderer;
279 }()
280 }, {
281 key: 'createStringRenderer',
282 value: function () {
283 function createStringRenderer(options) {
284 return {
285 render: function () {
286 function render(el, context) {
287 if (options.context && (el.type.contextTypes || options.childContextTypes)) {
288 var childContextTypes = (0, _object2['default'])({}, el.type.contextTypes || {}, options.childContextTypes);
289 var ContextWrapper = (0, _enzymeAdapterUtils.createRenderWrapper)(el, context, childContextTypes);
290 return _server2['default'].renderToStaticMarkup(_react2['default'].createElement(ContextWrapper));
291 }
292 return _server2['default'].renderToStaticMarkup(el);
293 }
294
295 return render;
296 }()
297 };
298 }
299
300 return createStringRenderer;
301 }()
302
303 // Provided a bag of options, return an `EnzymeRenderer`. Some options can be implementation
304 // specific, like `attach` etc. for React, but not part of this interface explicitly.
305 // eslint-disable-next-line class-methods-use-this, no-unused-vars
306
307 }, {
308 key: 'createRenderer',
309 value: function () {
310 function createRenderer(options) {
311 switch (options.mode) {
312 case _enzyme.EnzymeAdapter.MODES.MOUNT:
313 return this.createMountRenderer(options);
314 case _enzyme.EnzymeAdapter.MODES.SHALLOW:
315 return this.createShallowRenderer(options);
316 case _enzyme.EnzymeAdapter.MODES.STRING:
317 return this.createStringRenderer(options);
318 default:
319 throw new Error('Enzyme Internal Error: Unrecognized mode: ' + String(options.mode));
320 }
321 }
322
323 return createRenderer;
324 }()
325
326 // converts an RSTNode to the corresponding JSX Pragma Element. This will be needed
327 // in order to implement the `Wrapper.mount()` and `Wrapper.shallow()` methods, but should
328 // be pretty straightforward for people to implement.
329 // eslint-disable-next-line class-methods-use-this, no-unused-vars
330
331 }, {
332 key: 'nodeToElement',
333 value: function () {
334 function nodeToElement(node) {
335 if (!node || (typeof node === 'undefined' ? 'undefined' : _typeof(node)) !== 'object') return null;
336 return _react2['default'].createElement(node.type, (0, _enzymeAdapterUtils.propsWithKeysAndRef)(node));
337 }
338
339 return nodeToElement;
340 }()
341 }, {
342 key: 'elementToNode',
343 value: function () {
344 function elementToNode(element) {
345 return (0, _enzymeAdapterUtils.elementToTree)(element);
346 }
347
348 return elementToNode;
349 }()
350 }, {
351 key: 'nodeToHostNode',
352 value: function () {
353 function nodeToHostNode(node) {
354 return _reactDom2['default'].findDOMNode(node.instance);
355 }
356
357 return nodeToHostNode;
358 }()
359 }, {
360 key: 'displayNameOfNode',
361 value: function () {
362 function displayNameOfNode(node) {
363 return (0, _enzymeAdapterUtils.displayNameOfNode)(node);
364 }
365
366 return displayNameOfNode;
367 }()
368 }, {
369 key: 'isValidElement',
370 value: function () {
371 function isValidElement(element) {
372 return (0, _reactIs.isElement)(element);
373 }
374
375 return isValidElement;
376 }()
377 }, {
378 key: 'isValidElementType',
379 value: function () {
380 function isValidElementType(object) {
381 return (0, _reactIs.isValidElementType)(object);
382 }
383
384 return isValidElementType;
385 }()
386 }, {
387 key: 'createElement',
388 value: function () {
389 function createElement() {
390 return _react2['default'].createElement.apply(_react2['default'], arguments);
391 }
392
393 return createElement;
394 }()
395 }]);
396
397 return ReactFourteenAdapter;
398}(_enzyme.EnzymeAdapter);
399
400module.exports = ReactFourteenAdapter;
\No newline at end of file