UNPKG

14.8 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 legacyContextMode: 'parent',
114 lifecycles: (0, _object2['default'])({}, lifecycles, {
115 componentDidUpdate: {
116 prevContext: true
117 },
118 getChildContext: {
119 calledByRenderer: true
120 }
121 })
122 });
123 return _this;
124 }
125
126 _createClass(ReactFourteenAdapter, [{
127 key: 'createMountRenderer',
128 value: function () {
129 function createMountRenderer(options) {
130 (0, _enzymeAdapterUtils.assertDomAvailable)('mount');
131 var domNode = options.attachTo || global.document.createElement('div');
132 var instance = null;
133 var adapter = this;
134 return {
135 render: function () {
136 function render(el, context, callback) {
137 if (instance === null) {
138 var type = el.type,
139 props = el.props,
140 ref = el.ref;
141
142 var wrapperProps = (0, _object2['default'])({
143 Component: type,
144 props: props,
145 context: context
146 }, ref && { ref: ref });
147 var ReactWrapperComponent = (0, _enzymeAdapterUtils.createMountWrapper)(el, (0, _object2['default'])({}, options, { adapter: adapter }));
148 var wrappedEl = _react2['default'].createElement(ReactWrapperComponent, wrapperProps);
149 instance = _reactDom2['default'].render(wrappedEl, domNode);
150 if (typeof callback === 'function') {
151 callback();
152 }
153 } else {
154 instance.setChildProps(el.props, context, callback);
155 }
156 }
157
158 return render;
159 }(),
160 unmount: function () {
161 function unmount() {
162 _reactDom2['default'].unmountComponentAtNode(domNode);
163 instance = null;
164 }
165
166 return unmount;
167 }(),
168 getNode: function () {
169 function getNode() {
170 return instance ? instanceToTree(instance._reactInternalInstance).rendered : null;
171 }
172
173 return getNode;
174 }(),
175 simulateEvent: function () {
176 function simulateEvent(node, event, mock) {
177 var mappedEvent = (0, _enzymeAdapterUtils.mapNativeEventNames)(event);
178 var eventFn = _reactAddonsTestUtils2['default'].Simulate[mappedEvent];
179 if (!eventFn) {
180 throw new TypeError('ReactWrapper::simulate() event \'' + String(event) + '\' does not exist');
181 }
182 // eslint-disable-next-line react/no-find-dom-node
183 eventFn(_reactDom2['default'].findDOMNode(node.instance), mock);
184 }
185
186 return simulateEvent;
187 }(),
188 batchedUpdates: function () {
189 function batchedUpdates(fn) {
190 return _reactDom2['default'].unstable_batchedUpdates(fn);
191 }
192
193 return batchedUpdates;
194 }()
195 };
196 }
197
198 return createMountRenderer;
199 }()
200 }, {
201 key: 'createShallowRenderer',
202 value: function () {
203 function createShallowRenderer() /* options */{
204 var renderer = _reactAddonsTestUtils2['default'].createRenderer();
205 var isDOM = false;
206 var cachedNode = null;
207 return {
208 render: function () {
209 function render(el, context) {
210 cachedNode = el;
211 /* eslint consistent-return: 0 */
212 if (typeof el.type === 'string') {
213 isDOM = true;
214 } else {
215 isDOM = false;
216 return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
217 return renderer.render(el, context);
218 });
219 }
220 }
221
222 return render;
223 }(),
224 unmount: function () {
225 function unmount() {
226 renderer.unmount();
227 }
228
229 return unmount;
230 }(),
231 getNode: function () {
232 function getNode() {
233 if (isDOM) {
234 return (0, _enzymeAdapterUtils.elementToTree)(cachedNode);
235 }
236 var output = renderer.getRenderOutput();
237 return {
238 nodeType: typeToNodeType(cachedNode.type),
239 type: cachedNode.type,
240 props: cachedNode.props,
241 key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(cachedNode.key),
242 ref: cachedNode.ref,
243 instance: renderer._instance._instance,
244 rendered: (0, _enzymeAdapterUtils.elementToTree)(output)
245 };
246 }
247
248 return getNode;
249 }(),
250 simulateEvent: function () {
251 function simulateEvent(node, event) {
252 for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
253 args[_key - 2] = arguments[_key];
254 }
255
256 var handler = node.props[(0, _enzymeAdapterUtils.propFromEvent)(event)];
257 if (handler) {
258 (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
259 // TODO(lmr): create/use synthetic events
260 // TODO(lmr): emulate React's event propagation
261 _reactDom2['default'].unstable_batchedUpdates(function () {
262 handler.apply(undefined, _toConsumableArray(args));
263 });
264 });
265 }
266 }
267
268 return simulateEvent;
269 }(),
270 batchedUpdates: function () {
271 function batchedUpdates(fn) {
272 return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
273 return _reactDom2['default'].unstable_batchedUpdates(fn);
274 });
275 }
276
277 return batchedUpdates;
278 }()
279 };
280 }
281
282 return createShallowRenderer;
283 }()
284 }, {
285 key: 'createStringRenderer',
286 value: function () {
287 function createStringRenderer(options) {
288 return {
289 render: function () {
290 function render(el, context) {
291 if (options.context && (el.type.contextTypes || options.childContextTypes)) {
292 var childContextTypes = (0, _object2['default'])({}, el.type.contextTypes || {}, options.childContextTypes);
293 var ContextWrapper = (0, _enzymeAdapterUtils.createRenderWrapper)(el, context, childContextTypes);
294 return _server2['default'].renderToStaticMarkup(_react2['default'].createElement(ContextWrapper));
295 }
296 return _server2['default'].renderToStaticMarkup(el);
297 }
298
299 return render;
300 }()
301 };
302 }
303
304 return createStringRenderer;
305 }()
306
307 // Provided a bag of options, return an `EnzymeRenderer`. Some options can be implementation
308 // specific, like `attach` etc. for React, but not part of this interface explicitly.
309 // eslint-disable-next-line class-methods-use-this, no-unused-vars
310
311 }, {
312 key: 'createRenderer',
313 value: function () {
314 function createRenderer(options) {
315 switch (options.mode) {
316 case _enzyme.EnzymeAdapter.MODES.MOUNT:
317 return this.createMountRenderer(options);
318 case _enzyme.EnzymeAdapter.MODES.SHALLOW:
319 return this.createShallowRenderer(options);
320 case _enzyme.EnzymeAdapter.MODES.STRING:
321 return this.createStringRenderer(options);
322 default:
323 throw new Error('Enzyme Internal Error: Unrecognized mode: ' + String(options.mode));
324 }
325 }
326
327 return createRenderer;
328 }()
329 }, {
330 key: 'wrap',
331 value: function () {
332 function wrap(element) {
333 return (0, _enzymeAdapterUtils.wrap)(element);
334 }
335
336 return wrap;
337 }()
338
339 // converts an RSTNode to the corresponding JSX Pragma Element. This will be needed
340 // in order to implement the `Wrapper.mount()` and `Wrapper.shallow()` methods, but should
341 // be pretty straightforward for people to implement.
342 // eslint-disable-next-line class-methods-use-this, no-unused-vars
343
344 }, {
345 key: 'nodeToElement',
346 value: function () {
347 function nodeToElement(node) {
348 if (!node || (typeof node === 'undefined' ? 'undefined' : _typeof(node)) !== 'object') return null;
349 return _react2['default'].createElement(node.type, (0, _enzymeAdapterUtils.propsWithKeysAndRef)(node));
350 }
351
352 return nodeToElement;
353 }()
354 }, {
355 key: 'elementToNode',
356 value: function () {
357 function elementToNode(element) {
358 return (0, _enzymeAdapterUtils.elementToTree)(element);
359 }
360
361 return elementToNode;
362 }()
363 }, {
364 key: 'nodeToHostNode',
365 value: function () {
366 function nodeToHostNode(node) {
367 return _reactDom2['default'].findDOMNode(node.instance);
368 }
369
370 return nodeToHostNode;
371 }()
372 }, {
373 key: 'displayNameOfNode',
374 value: function () {
375 function displayNameOfNode(node) {
376 return (0, _enzymeAdapterUtils.displayNameOfNode)(node);
377 }
378
379 return displayNameOfNode;
380 }()
381 }, {
382 key: 'isValidElement',
383 value: function () {
384 function isValidElement(element) {
385 return (0, _reactIs.isElement)(element);
386 }
387
388 return isValidElement;
389 }()
390 }, {
391 key: 'isValidElementType',
392 value: function () {
393 function isValidElementType(object) {
394 return (0, _reactIs.isValidElementType)(object);
395 }
396
397 return isValidElementType;
398 }()
399 }, {
400 key: 'createElement',
401 value: function () {
402 function createElement() {
403 return _react2['default'].createElement.apply(_react2['default'], arguments);
404 }
405
406 return createElement;
407 }()
408 }]);
409
410 return ReactFourteenAdapter;
411}(_enzyme.EnzymeAdapter);
412
413module.exports = ReactFourteenAdapter;
\No newline at end of file