UNPKG

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