lanes 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/client/lanes/Config.coffee +1 -1
- data/client/lanes/access/LoginDialog.cjsx +1 -1
- data/client/lanes/access/Roles.coffee +1 -1
- data/client/lanes/access/User.coffee +2 -2
- data/client/lanes/access/screens/user-management/UserManagement.cjsx +1 -1
- data/client/lanes/components/calendar/styles.scss +1 -1
- data/client/lanes/components/grid/Body.cjsx +5 -2
- data/client/lanes/components/grid/EditingMixin.cjsx +3 -0
- data/client/lanes/components/grid/Editor.cjsx +3 -11
- data/client/lanes/components/grid/Grid.cjsx +22 -12
- data/client/lanes/components/grid/Selections.cjsx +4 -1
- data/client/lanes/components/grid/Toolbar.cjsx +1 -1
- data/client/lanes/components/record-finder/RecordFinder.cjsx +2 -2
- data/client/lanes/components/select-field/SelectField.cjsx +19 -16
- data/client/lanes/components/select-field/styles.scss +1 -1
- data/client/lanes/components/shared/FieldMixin.cjsx +2 -2
- data/client/lanes/components/shared/Input.cjsx +2 -13
- data/client/lanes/components/shared/InputFieldMixin.cjsx +15 -8
- data/client/lanes/components/shared/NetworkActivityOverlay.cjsx +1 -1
- data/client/lanes/components/shared/NumberInput.cjsx +4 -12
- data/client/lanes/components/shared/ToggleField.cjsx +0 -2
- data/client/lanes/components/shared/fields.scss +9 -0
- data/client/lanes/components/shared/styles.scss +2 -1
- data/client/lanes/components/toolbar/Toolbar.cjsx +1 -1
- data/client/lanes/lib/HotReload.coffee +2 -2
- data/client/lanes/lib/development.coffee +1 -1
- data/client/lanes/lib/loader.coffee +3 -3
- data/client/lanes/models/AssociationMap.coffee +1 -1
- data/client/lanes/models/AssociationProxy.coffee +1 -0
- data/client/lanes/models/Base.coffee +7 -10
- data/client/lanes/models/Collection.coffee +3 -6
- data/client/lanes/models/JobStatus.coffee +1 -1
- data/client/lanes/models/PubSub.coffee +51 -33
- data/client/lanes/models/Query.coffee +1 -1
- data/client/lanes/models/Sync.coffee +1 -1
- data/client/lanes/models/User.coffee +3 -3
- data/client/lanes/models/mixins/FileSupport.coffee +3 -3
- data/client/lanes/models/query/ArrayResult.coffee +3 -6
- data/client/lanes/models/query/CollectionResult.coffee +5 -3
- data/client/lanes/react/Component.coffee +2 -2
- data/client/lanes/react/DefaultComponentNotFound.cjsx +2 -2
- data/client/lanes/react/Screen.coffee +1 -1
- data/client/lanes/react/Viewport.coffee +1 -1
- data/client/lanes/react/mixins/Access.coffee +1 -1
- data/client/lanes/react/mixins/Data.coffee +9 -5
- data/client/lanes/screens/Commands.coffee +1 -1
- data/client/lanes/screens/UserPreferences.cjsx +1 -1
- data/client/lanes/testing/BeforeEach.coffee +7 -0
- data/client/lanes/vendor/base.js.erb +5 -0
- data/client/lanes/vendor/calendar.js.erb +5 -0
- data/client/lanes/vendor/commons.js.erb +5 -0
- data/client/lanes/vendor/{base.js → development/base.js} +37776 -40850
- data/client/lanes/vendor/development/calendar.js +1667 -0
- data/client/lanes/vendor/development/commons.js +39085 -0
- data/client/lanes/vendor/development/helpers.js +578 -0
- data/client/lanes/vendor/{toggle.js → development/toggle.js} +22 -82
- data/client/lanes/vendor/development/widgets.js +8975 -0
- data/client/lanes/vendor/production/base.js +63239 -0
- data/client/lanes/vendor/production/calendar.js +1667 -0
- data/client/lanes/vendor/production/commons.js +38505 -0
- data/client/lanes/vendor/production/toggle.js +285 -0
- data/client/lanes/vendor/production/widgets.js +8975 -0
- data/client/lanes/vendor/{calendar.scss → styles/calendar.scss} +6 -0
- data/client/lanes/vendor/{toggle.scss → styles/toggle.scss} +0 -0
- data/client/lanes/vendor/{widgets.scss → styles/widgets.scss} +2 -2
- data/client/lanes/vendor/toggle.js.erb +5 -0
- data/client/lanes/vendor/widgets.js.erb +5 -0
- data/lib/lanes/api/default_routes.rb +3 -3
- data/lib/lanes/api/routing.rb +1 -1
- data/lib/lanes/configuration.rb +8 -14
- data/lib/lanes/environment.rb +3 -0
- data/lib/lanes/extension/definition.rb +4 -0
- data/lib/lanes/system_settings.rb +21 -6
- data/lib/lanes/version.rb +1 -1
- data/npm-build/base.js +9 -4
- data/npm-build/build +9 -0
- data/npm-build/development.js +3 -1
- data/npm-build/package.json +34 -34
- data/npm-build/update-dayz +1 -1
- data/npm-build/webpack.config.js +36 -20
- data/spec/command-reference-files/initial/Gemfile +1 -1
- data/spec/command-reference-files/screen/config/screens.rb +1 -1
- data/spec/lanes/components/grid/RowEditorSpec.coffee +3 -1
- data/spec/lanes/components/select-field/SelectFieldSpec.coffee +33 -28
- data/spec/lanes/models/AssociationProxySpec.coffee +36 -37
- data/spec/lanes/models/BaseSpec.coffee +0 -32
- data/spec/lanes/models/CollectionSpec.coffee +0 -10
- data/spec/lanes/models/PubSubSpec.coffee +63 -13
- data/spec/lanes/screens/DefinitionsSpec.coffee +2 -2
- metadata +23 -20
- data/client/lanes/vendor/calendar.js +0 -17301
- data/client/lanes/vendor/commons.js +0 -19722
- data/client/lanes/vendor/development.js +0 -5471
- data/client/lanes/vendor/grid.js +0 -15384
- data/client/lanes/vendor/grid.scss +0 -928
- data/client/lanes/vendor/rw-widgets.eot +0 -0
- data/client/lanes/vendor/rw-widgets.svg +0 -18
- data/client/lanes/vendor/rw-widgets.ttf +0 -0
- data/client/lanes/vendor/rw-widgets.woff +0 -0
- data/client/lanes/vendor/widgets.js +0 -23204
- data/npm-build/compile.coffee +0 -19
- data/spec/lanes/models/ServerCacheSpec.coffee +0 -65
@@ -0,0 +1,578 @@
|
|
1
|
+
webpackJsonp([2],{
|
2
|
+
|
3
|
+
/***/ 0:
|
4
|
+
/***/ function(module, exports, __webpack_require__) {
|
5
|
+
|
6
|
+
/* WEBPACK VAR INJECTION */(function(global) {var Lanes = ( global.Lanes || (global.Lanes = {}) );
|
7
|
+
Lanes.Vendor = ( Lanes.Vendor || {} );
|
8
|
+
|
9
|
+
// "react-proxy": "git@github.com:gaearon/react-proxy.git#react-0.15",
|
10
|
+
// Lanes.Vendor.ReactProxy = require("react-proxy");
|
11
|
+
|
12
|
+
Lanes.Vendor.ReactTestUtils = __webpack_require__(926);
|
13
|
+
Lanes.Vendor.deepForceUpdate = __webpack_require__(928);
|
14
|
+
|
15
|
+
/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
|
16
|
+
|
17
|
+
/***/ },
|
18
|
+
|
19
|
+
/***/ 926:
|
20
|
+
/***/ function(module, exports, __webpack_require__) {
|
21
|
+
|
22
|
+
module.exports = __webpack_require__(927);
|
23
|
+
|
24
|
+
/***/ },
|
25
|
+
|
26
|
+
/***/ 927:
|
27
|
+
/***/ function(module, exports, __webpack_require__) {
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Copyright 2013-present, Facebook, Inc.
|
31
|
+
* All rights reserved.
|
32
|
+
*
|
33
|
+
* This source code is licensed under the BSD-style license found in the
|
34
|
+
* LICENSE file in the root directory of this source tree. An additional grant
|
35
|
+
* of patent rights can be found in the PATENTS file in the same directory.
|
36
|
+
*
|
37
|
+
* @providesModule ReactTestUtils
|
38
|
+
*/
|
39
|
+
|
40
|
+
'use strict';
|
41
|
+
|
42
|
+
var _assign = __webpack_require__(68);
|
43
|
+
|
44
|
+
var EventConstants = __webpack_require__(103);
|
45
|
+
var EventPluginHub = __webpack_require__(105);
|
46
|
+
var EventPluginRegistry = __webpack_require__(106);
|
47
|
+
var EventPropagators = __webpack_require__(104);
|
48
|
+
var React = __webpack_require__(67);
|
49
|
+
var ReactDefaultInjection = __webpack_require__(101);
|
50
|
+
var ReactDOM = __webpack_require__(97);
|
51
|
+
var ReactDOMComponentTree = __webpack_require__(98);
|
52
|
+
var ReactElement = __webpack_require__(72);
|
53
|
+
var ReactBrowserEventEmitter = __webpack_require__(166);
|
54
|
+
var ReactCompositeComponent = __webpack_require__(179);
|
55
|
+
var ReactInstanceMap = __webpack_require__(180);
|
56
|
+
var ReactUpdates = __webpack_require__(118);
|
57
|
+
var SyntheticEvent = __webpack_require__(115);
|
58
|
+
|
59
|
+
var emptyObject = __webpack_require__(84);
|
60
|
+
var findDOMNode = __webpack_require__(227);
|
61
|
+
var invariant = __webpack_require__(71);
|
62
|
+
|
63
|
+
var topLevelTypes = EventConstants.topLevelTypes;
|
64
|
+
|
65
|
+
function Event(suffix) {}
|
66
|
+
|
67
|
+
/**
|
68
|
+
* @class ReactTestUtils
|
69
|
+
*/
|
70
|
+
|
71
|
+
function findAllInRenderedTreeInternal(inst, test) {
|
72
|
+
if (!inst || !inst.getPublicInstance) {
|
73
|
+
return [];
|
74
|
+
}
|
75
|
+
var publicInst = inst.getPublicInstance();
|
76
|
+
var ret = test(publicInst) ? [publicInst] : [];
|
77
|
+
var currentElement = inst._currentElement;
|
78
|
+
if (ReactTestUtils.isDOMComponent(publicInst)) {
|
79
|
+
var renderedChildren = inst._renderedChildren;
|
80
|
+
var key;
|
81
|
+
for (key in renderedChildren) {
|
82
|
+
if (!renderedChildren.hasOwnProperty(key)) {
|
83
|
+
continue;
|
84
|
+
}
|
85
|
+
ret = ret.concat(findAllInRenderedTreeInternal(renderedChildren[key], test));
|
86
|
+
}
|
87
|
+
} else if (ReactElement.isValidElement(currentElement) && typeof currentElement.type === 'function') {
|
88
|
+
ret = ret.concat(findAllInRenderedTreeInternal(inst._renderedComponent, test));
|
89
|
+
}
|
90
|
+
return ret;
|
91
|
+
}
|
92
|
+
|
93
|
+
/**
|
94
|
+
* Todo: Support the entire DOM.scry query syntax. For now, these simple
|
95
|
+
* utilities will suffice for testing purposes.
|
96
|
+
* @lends ReactTestUtils
|
97
|
+
*/
|
98
|
+
var ReactTestUtils = {
|
99
|
+
renderIntoDocument: function (instance) {
|
100
|
+
var div = document.createElement('div');
|
101
|
+
// None of our tests actually require attaching the container to the
|
102
|
+
// DOM, and doing so creates a mess that we rely on test isolation to
|
103
|
+
// clean up, so we're going to stop honoring the name of this method
|
104
|
+
// (and probably rename it eventually) if no problems arise.
|
105
|
+
// document.documentElement.appendChild(div);
|
106
|
+
return ReactDOM.render(instance, div);
|
107
|
+
},
|
108
|
+
|
109
|
+
isElement: function (element) {
|
110
|
+
return ReactElement.isValidElement(element);
|
111
|
+
},
|
112
|
+
|
113
|
+
isElementOfType: function (inst, convenienceConstructor) {
|
114
|
+
return ReactElement.isValidElement(inst) && inst.type === convenienceConstructor;
|
115
|
+
},
|
116
|
+
|
117
|
+
isDOMComponent: function (inst) {
|
118
|
+
return !!(inst && inst.nodeType === 1 && inst.tagName);
|
119
|
+
},
|
120
|
+
|
121
|
+
isDOMComponentElement: function (inst) {
|
122
|
+
return !!(inst && ReactElement.isValidElement(inst) && !!inst.tagName);
|
123
|
+
},
|
124
|
+
|
125
|
+
isCompositeComponent: function (inst) {
|
126
|
+
if (ReactTestUtils.isDOMComponent(inst)) {
|
127
|
+
// Accessing inst.setState warns; just return false as that'll be what
|
128
|
+
// this returns when we have DOM nodes as refs directly
|
129
|
+
return false;
|
130
|
+
}
|
131
|
+
return inst != null && typeof inst.render === 'function' && typeof inst.setState === 'function';
|
132
|
+
},
|
133
|
+
|
134
|
+
isCompositeComponentWithType: function (inst, type) {
|
135
|
+
if (!ReactTestUtils.isCompositeComponent(inst)) {
|
136
|
+
return false;
|
137
|
+
}
|
138
|
+
var internalInstance = ReactInstanceMap.get(inst);
|
139
|
+
var constructor = internalInstance._currentElement.type;
|
140
|
+
|
141
|
+
return constructor === type;
|
142
|
+
},
|
143
|
+
|
144
|
+
isCompositeComponentElement: function (inst) {
|
145
|
+
if (!ReactElement.isValidElement(inst)) {
|
146
|
+
return false;
|
147
|
+
}
|
148
|
+
// We check the prototype of the type that will get mounted, not the
|
149
|
+
// instance itself. This is a future proof way of duck typing.
|
150
|
+
var prototype = inst.type.prototype;
|
151
|
+
return typeof prototype.render === 'function' && typeof prototype.setState === 'function';
|
152
|
+
},
|
153
|
+
|
154
|
+
isCompositeComponentElementWithType: function (inst, type) {
|
155
|
+
var internalInstance = ReactInstanceMap.get(inst);
|
156
|
+
var constructor = internalInstance._currentElement.type;
|
157
|
+
|
158
|
+
return !!(ReactTestUtils.isCompositeComponentElement(inst) && constructor === type);
|
159
|
+
},
|
160
|
+
|
161
|
+
getRenderedChildOfCompositeComponent: function (inst) {
|
162
|
+
if (!ReactTestUtils.isCompositeComponent(inst)) {
|
163
|
+
return null;
|
164
|
+
}
|
165
|
+
var internalInstance = ReactInstanceMap.get(inst);
|
166
|
+
return internalInstance._renderedComponent.getPublicInstance();
|
167
|
+
},
|
168
|
+
|
169
|
+
findAllInRenderedTree: function (inst, test) {
|
170
|
+
if (!inst) {
|
171
|
+
return [];
|
172
|
+
}
|
173
|
+
!ReactTestUtils.isCompositeComponent(inst) ? true ? invariant(false, 'findAllInRenderedTree(...): instance must be a composite component') : invariant(false) : void 0;
|
174
|
+
return findAllInRenderedTreeInternal(ReactInstanceMap.get(inst), test);
|
175
|
+
},
|
176
|
+
|
177
|
+
/**
|
178
|
+
* Finds all instance of components in the rendered tree that are DOM
|
179
|
+
* components with the class name matching `className`.
|
180
|
+
* @return {array} an array of all the matches.
|
181
|
+
*/
|
182
|
+
scryRenderedDOMComponentsWithClass: function (root, classNames) {
|
183
|
+
if (!Array.isArray(classNames)) {
|
184
|
+
classNames = classNames.split(/\s+/);
|
185
|
+
}
|
186
|
+
return ReactTestUtils.findAllInRenderedTree(root, function (inst) {
|
187
|
+
if (ReactTestUtils.isDOMComponent(inst)) {
|
188
|
+
var className = inst.className;
|
189
|
+
if (typeof className !== 'string') {
|
190
|
+
// SVG, probably.
|
191
|
+
className = inst.getAttribute('class') || '';
|
192
|
+
}
|
193
|
+
var classList = className.split(/\s+/);
|
194
|
+
return classNames.every(function (name) {
|
195
|
+
return classList.indexOf(name) !== -1;
|
196
|
+
});
|
197
|
+
}
|
198
|
+
return false;
|
199
|
+
});
|
200
|
+
},
|
201
|
+
|
202
|
+
/**
|
203
|
+
* Like scryRenderedDOMComponentsWithClass but expects there to be one result,
|
204
|
+
* and returns that one result, or throws exception if there is any other
|
205
|
+
* number of matches besides one.
|
206
|
+
* @return {!ReactDOMComponent} The one match.
|
207
|
+
*/
|
208
|
+
findRenderedDOMComponentWithClass: function (root, className) {
|
209
|
+
var all = ReactTestUtils.scryRenderedDOMComponentsWithClass(root, className);
|
210
|
+
if (all.length !== 1) {
|
211
|
+
throw new Error('Did not find exactly one match (found: ' + all.length + ') ' + 'for class:' + className);
|
212
|
+
}
|
213
|
+
return all[0];
|
214
|
+
},
|
215
|
+
|
216
|
+
/**
|
217
|
+
* Finds all instance of components in the rendered tree that are DOM
|
218
|
+
* components with the tag name matching `tagName`.
|
219
|
+
* @return {array} an array of all the matches.
|
220
|
+
*/
|
221
|
+
scryRenderedDOMComponentsWithTag: function (root, tagName) {
|
222
|
+
return ReactTestUtils.findAllInRenderedTree(root, function (inst) {
|
223
|
+
return ReactTestUtils.isDOMComponent(inst) && inst.tagName.toUpperCase() === tagName.toUpperCase();
|
224
|
+
});
|
225
|
+
},
|
226
|
+
|
227
|
+
/**
|
228
|
+
* Like scryRenderedDOMComponentsWithTag but expects there to be one result,
|
229
|
+
* and returns that one result, or throws exception if there is any other
|
230
|
+
* number of matches besides one.
|
231
|
+
* @return {!ReactDOMComponent} The one match.
|
232
|
+
*/
|
233
|
+
findRenderedDOMComponentWithTag: function (root, tagName) {
|
234
|
+
var all = ReactTestUtils.scryRenderedDOMComponentsWithTag(root, tagName);
|
235
|
+
if (all.length !== 1) {
|
236
|
+
throw new Error('Did not find exactly one match (found: ' + all.length + ') ' + 'for tag:' + tagName);
|
237
|
+
}
|
238
|
+
return all[0];
|
239
|
+
},
|
240
|
+
|
241
|
+
/**
|
242
|
+
* Finds all instances of components with type equal to `componentType`.
|
243
|
+
* @return {array} an array of all the matches.
|
244
|
+
*/
|
245
|
+
scryRenderedComponentsWithType: function (root, componentType) {
|
246
|
+
return ReactTestUtils.findAllInRenderedTree(root, function (inst) {
|
247
|
+
return ReactTestUtils.isCompositeComponentWithType(inst, componentType);
|
248
|
+
});
|
249
|
+
},
|
250
|
+
|
251
|
+
/**
|
252
|
+
* Same as `scryRenderedComponentsWithType` but expects there to be one result
|
253
|
+
* and returns that one result, or throws exception if there is any other
|
254
|
+
* number of matches besides one.
|
255
|
+
* @return {!ReactComponent} The one match.
|
256
|
+
*/
|
257
|
+
findRenderedComponentWithType: function (root, componentType) {
|
258
|
+
var all = ReactTestUtils.scryRenderedComponentsWithType(root, componentType);
|
259
|
+
if (all.length !== 1) {
|
260
|
+
throw new Error('Did not find exactly one match (found: ' + all.length + ') ' + 'for componentType:' + componentType);
|
261
|
+
}
|
262
|
+
return all[0];
|
263
|
+
},
|
264
|
+
|
265
|
+
/**
|
266
|
+
* Pass a mocked component module to this method to augment it with
|
267
|
+
* useful methods that allow it to be used as a dummy React component.
|
268
|
+
* Instead of rendering as usual, the component will become a simple
|
269
|
+
* <div> containing any provided children.
|
270
|
+
*
|
271
|
+
* @param {object} module the mock function object exported from a
|
272
|
+
* module that defines the component to be mocked
|
273
|
+
* @param {?string} mockTagName optional dummy root tag name to return
|
274
|
+
* from render method (overrides
|
275
|
+
* module.mockTagName if provided)
|
276
|
+
* @return {object} the ReactTestUtils object (for chaining)
|
277
|
+
*/
|
278
|
+
mockComponent: function (module, mockTagName) {
|
279
|
+
mockTagName = mockTagName || module.mockTagName || 'div';
|
280
|
+
|
281
|
+
module.prototype.render.mockImplementation(function () {
|
282
|
+
return React.createElement(mockTagName, null, this.props.children);
|
283
|
+
});
|
284
|
+
|
285
|
+
return this;
|
286
|
+
},
|
287
|
+
|
288
|
+
/**
|
289
|
+
* Simulates a top level event being dispatched from a raw event that occurred
|
290
|
+
* on an `Element` node.
|
291
|
+
* @param {Object} topLevelType A type from `EventConstants.topLevelTypes`
|
292
|
+
* @param {!Element} node The dom to simulate an event occurring on.
|
293
|
+
* @param {?Event} fakeNativeEvent Fake native event to use in SyntheticEvent.
|
294
|
+
*/
|
295
|
+
simulateNativeEventOnNode: function (topLevelType, node, fakeNativeEvent) {
|
296
|
+
fakeNativeEvent.target = node;
|
297
|
+
ReactBrowserEventEmitter.ReactEventListener.dispatchEvent(topLevelType, fakeNativeEvent);
|
298
|
+
},
|
299
|
+
|
300
|
+
/**
|
301
|
+
* Simulates a top level event being dispatched from a raw event that occurred
|
302
|
+
* on the `ReactDOMComponent` `comp`.
|
303
|
+
* @param {Object} topLevelType A type from `EventConstants.topLevelTypes`.
|
304
|
+
* @param {!ReactDOMComponent} comp
|
305
|
+
* @param {?Event} fakeNativeEvent Fake native event to use in SyntheticEvent.
|
306
|
+
*/
|
307
|
+
simulateNativeEventOnDOMComponent: function (topLevelType, comp, fakeNativeEvent) {
|
308
|
+
ReactTestUtils.simulateNativeEventOnNode(topLevelType, findDOMNode(comp), fakeNativeEvent);
|
309
|
+
},
|
310
|
+
|
311
|
+
nativeTouchData: function (x, y) {
|
312
|
+
return {
|
313
|
+
touches: [{ pageX: x, pageY: y }]
|
314
|
+
};
|
315
|
+
},
|
316
|
+
|
317
|
+
createRenderer: function () {
|
318
|
+
return new ReactShallowRenderer();
|
319
|
+
},
|
320
|
+
|
321
|
+
Simulate: null,
|
322
|
+
SimulateNative: {}
|
323
|
+
};
|
324
|
+
|
325
|
+
/**
|
326
|
+
* @class ReactShallowRenderer
|
327
|
+
*/
|
328
|
+
var ReactShallowRenderer = function () {
|
329
|
+
this._instance = null;
|
330
|
+
};
|
331
|
+
|
332
|
+
ReactShallowRenderer.prototype.getMountedInstance = function () {
|
333
|
+
return this._instance ? this._instance._instance : null;
|
334
|
+
};
|
335
|
+
|
336
|
+
var NoopInternalComponent = function (element) {
|
337
|
+
this._renderedOutput = element;
|
338
|
+
this._currentElement = element;
|
339
|
+
};
|
340
|
+
|
341
|
+
NoopInternalComponent.prototype = {
|
342
|
+
|
343
|
+
mountComponent: function () {},
|
344
|
+
|
345
|
+
receiveComponent: function (element) {
|
346
|
+
this._renderedOutput = element;
|
347
|
+
this._currentElement = element;
|
348
|
+
},
|
349
|
+
|
350
|
+
getNativeNode: function () {
|
351
|
+
return undefined;
|
352
|
+
},
|
353
|
+
|
354
|
+
unmountComponent: function () {},
|
355
|
+
|
356
|
+
getPublicInstance: function () {
|
357
|
+
return null;
|
358
|
+
}
|
359
|
+
};
|
360
|
+
|
361
|
+
var ShallowComponentWrapper = function (element) {
|
362
|
+
this.construct(element);
|
363
|
+
};
|
364
|
+
_assign(ShallowComponentWrapper.prototype, ReactCompositeComponent.Mixin, {
|
365
|
+
_instantiateReactComponent: function (element) {
|
366
|
+
return new NoopInternalComponent(element);
|
367
|
+
},
|
368
|
+
_replaceNodeWithMarkup: function () {},
|
369
|
+
_renderValidatedComponent: ReactCompositeComponent.Mixin._renderValidatedComponentWithoutOwnerOrContext
|
370
|
+
});
|
371
|
+
|
372
|
+
ReactShallowRenderer.prototype.render = function (element, context) {
|
373
|
+
// Ensure we've done the default injections. This might not be true in the
|
374
|
+
// case of a simple test that only requires React and the TestUtils in
|
375
|
+
// conjunction with an inline-requires transform.
|
376
|
+
ReactDefaultInjection.inject();
|
377
|
+
|
378
|
+
!ReactElement.isValidElement(element) ? true ? invariant(false, 'ReactShallowRenderer render(): Invalid component element.%s', typeof element === 'function' ? ' Instead of passing a component class, make sure to instantiate ' + 'it by passing it to React.createElement.' : '') : invariant(false) : void 0;
|
379
|
+
!(typeof element.type !== 'string') ? true ? invariant(false, 'ReactShallowRenderer render(): Shallow rendering works only with custom ' + 'components, not primitives (%s). Instead of calling `.render(el)` and ' + 'inspecting the rendered output, look at `el.props` directly instead.', element.type) : invariant(false) : void 0;
|
380
|
+
|
381
|
+
if (!context) {
|
382
|
+
context = emptyObject;
|
383
|
+
}
|
384
|
+
ReactUpdates.batchedUpdates(_batchedRender, this, element, context);
|
385
|
+
|
386
|
+
return this.getRenderOutput();
|
387
|
+
};
|
388
|
+
|
389
|
+
function _batchedRender(renderer, element, context) {
|
390
|
+
var transaction = ReactUpdates.ReactReconcileTransaction.getPooled(true);
|
391
|
+
renderer._render(element, transaction, context);
|
392
|
+
ReactUpdates.ReactReconcileTransaction.release(transaction);
|
393
|
+
}
|
394
|
+
|
395
|
+
ReactShallowRenderer.prototype.getRenderOutput = function () {
|
396
|
+
return this._instance && this._instance._renderedComponent && this._instance._renderedComponent._renderedOutput || null;
|
397
|
+
};
|
398
|
+
|
399
|
+
ReactShallowRenderer.prototype.unmount = function () {
|
400
|
+
if (this._instance) {
|
401
|
+
this._instance.unmountComponent(false);
|
402
|
+
}
|
403
|
+
};
|
404
|
+
|
405
|
+
ReactShallowRenderer.prototype._render = function (element, transaction, context) {
|
406
|
+
if (this._instance) {
|
407
|
+
this._instance.receiveComponent(element, transaction, context);
|
408
|
+
} else {
|
409
|
+
var instance = new ShallowComponentWrapper(element);
|
410
|
+
instance.mountComponent(transaction, null, null, context);
|
411
|
+
this._instance = instance;
|
412
|
+
}
|
413
|
+
};
|
414
|
+
|
415
|
+
/**
|
416
|
+
* Exports:
|
417
|
+
*
|
418
|
+
* - `ReactTestUtils.Simulate.click(Element/ReactDOMComponent)`
|
419
|
+
* - `ReactTestUtils.Simulate.mouseMove(Element/ReactDOMComponent)`
|
420
|
+
* - `ReactTestUtils.Simulate.change(Element/ReactDOMComponent)`
|
421
|
+
* - ... (All keys from event plugin `eventTypes` objects)
|
422
|
+
*/
|
423
|
+
function makeSimulator(eventType) {
|
424
|
+
return function (domComponentOrNode, eventData) {
|
425
|
+
var node;
|
426
|
+
!!React.isValidElement(domComponentOrNode) ? true ? invariant(false, 'TestUtils.Simulate expects a component instance and not a ReactElement.' + 'TestUtils.Simulate will not work if you are using shallow rendering.') : invariant(false) : void 0;
|
427
|
+
if (ReactTestUtils.isDOMComponent(domComponentOrNode)) {
|
428
|
+
node = findDOMNode(domComponentOrNode);
|
429
|
+
} else if (domComponentOrNode.tagName) {
|
430
|
+
node = domComponentOrNode;
|
431
|
+
}
|
432
|
+
|
433
|
+
var dispatchConfig = EventPluginRegistry.eventNameDispatchConfigs[eventType];
|
434
|
+
|
435
|
+
var fakeNativeEvent = new Event();
|
436
|
+
fakeNativeEvent.target = node;
|
437
|
+
// We don't use SyntheticEvent.getPooled in order to not have to worry about
|
438
|
+
// properly destroying any properties assigned from `eventData` upon release
|
439
|
+
var event = new SyntheticEvent(dispatchConfig, ReactDOMComponentTree.getInstanceFromNode(node), fakeNativeEvent, node);
|
440
|
+
// Since we aren't using pooling, always persist the event. This will make
|
441
|
+
// sure it's marked and won't warn when setting additional properties.
|
442
|
+
event.persist();
|
443
|
+
_assign(event, eventData);
|
444
|
+
|
445
|
+
if (dispatchConfig.phasedRegistrationNames) {
|
446
|
+
EventPropagators.accumulateTwoPhaseDispatches(event);
|
447
|
+
} else {
|
448
|
+
EventPropagators.accumulateDirectDispatches(event);
|
449
|
+
}
|
450
|
+
|
451
|
+
ReactUpdates.batchedUpdates(function () {
|
452
|
+
EventPluginHub.enqueueEvents(event);
|
453
|
+
EventPluginHub.processEventQueue(true);
|
454
|
+
});
|
455
|
+
};
|
456
|
+
}
|
457
|
+
|
458
|
+
function buildSimulators() {
|
459
|
+
ReactTestUtils.Simulate = {};
|
460
|
+
|
461
|
+
var eventType;
|
462
|
+
for (eventType in EventPluginRegistry.eventNameDispatchConfigs) {
|
463
|
+
/**
|
464
|
+
* @param {!Element|ReactDOMComponent} domComponentOrNode
|
465
|
+
* @param {?object} eventData Fake event data to use in SyntheticEvent.
|
466
|
+
*/
|
467
|
+
ReactTestUtils.Simulate[eventType] = makeSimulator(eventType);
|
468
|
+
}
|
469
|
+
}
|
470
|
+
|
471
|
+
// Rebuild ReactTestUtils.Simulate whenever event plugins are injected
|
472
|
+
var oldInjectEventPluginOrder = EventPluginHub.injection.injectEventPluginOrder;
|
473
|
+
EventPluginHub.injection.injectEventPluginOrder = function () {
|
474
|
+
oldInjectEventPluginOrder.apply(this, arguments);
|
475
|
+
buildSimulators();
|
476
|
+
};
|
477
|
+
var oldInjectEventPlugins = EventPluginHub.injection.injectEventPluginsByName;
|
478
|
+
EventPluginHub.injection.injectEventPluginsByName = function () {
|
479
|
+
oldInjectEventPlugins.apply(this, arguments);
|
480
|
+
buildSimulators();
|
481
|
+
};
|
482
|
+
|
483
|
+
buildSimulators();
|
484
|
+
|
485
|
+
/**
|
486
|
+
* Exports:
|
487
|
+
*
|
488
|
+
* - `ReactTestUtils.SimulateNative.click(Element/ReactDOMComponent)`
|
489
|
+
* - `ReactTestUtils.SimulateNative.mouseMove(Element/ReactDOMComponent)`
|
490
|
+
* - `ReactTestUtils.SimulateNative.mouseIn/ReactDOMComponent)`
|
491
|
+
* - `ReactTestUtils.SimulateNative.mouseOut(Element/ReactDOMComponent)`
|
492
|
+
* - ... (All keys from `EventConstants.topLevelTypes`)
|
493
|
+
*
|
494
|
+
* Note: Top level event types are a subset of the entire set of handler types
|
495
|
+
* (which include a broader set of "synthetic" events). For example, onDragDone
|
496
|
+
* is a synthetic event. Except when testing an event plugin or React's event
|
497
|
+
* handling code specifically, you probably want to use ReactTestUtils.Simulate
|
498
|
+
* to dispatch synthetic events.
|
499
|
+
*/
|
500
|
+
|
501
|
+
function makeNativeSimulator(eventType) {
|
502
|
+
return function (domComponentOrNode, nativeEventData) {
|
503
|
+
var fakeNativeEvent = new Event(eventType);
|
504
|
+
_assign(fakeNativeEvent, nativeEventData);
|
505
|
+
if (ReactTestUtils.isDOMComponent(domComponentOrNode)) {
|
506
|
+
ReactTestUtils.simulateNativeEventOnDOMComponent(eventType, domComponentOrNode, fakeNativeEvent);
|
507
|
+
} else if (domComponentOrNode.tagName) {
|
508
|
+
// Will allow on actual dom nodes.
|
509
|
+
ReactTestUtils.simulateNativeEventOnNode(eventType, domComponentOrNode, fakeNativeEvent);
|
510
|
+
}
|
511
|
+
};
|
512
|
+
}
|
513
|
+
|
514
|
+
Object.keys(topLevelTypes).forEach(function (eventType) {
|
515
|
+
// Event type is stored as 'topClick' - we transform that to 'click'
|
516
|
+
var convenienceName = eventType.indexOf('top') === 0 ? eventType.charAt(3).toLowerCase() + eventType.substr(4) : eventType;
|
517
|
+
/**
|
518
|
+
* @param {!Element|ReactDOMComponent} domComponentOrNode
|
519
|
+
* @param {?Event} nativeEventData Fake native event to use in SyntheticEvent.
|
520
|
+
*/
|
521
|
+
ReactTestUtils.SimulateNative[convenienceName] = makeNativeSimulator(eventType);
|
522
|
+
});
|
523
|
+
|
524
|
+
module.exports = ReactTestUtils;
|
525
|
+
|
526
|
+
/***/ },
|
527
|
+
|
528
|
+
/***/ 928:
|
529
|
+
/***/ function(module, exports) {
|
530
|
+
|
531
|
+
'use strict';
|
532
|
+
|
533
|
+
exports.__esModule = true;
|
534
|
+
exports['default'] = deepForceUpdate;
|
535
|
+
function traverseRenderedChildren(internalInstance, callback, argument) {
|
536
|
+
callback(internalInstance, argument);
|
537
|
+
|
538
|
+
if (internalInstance._renderedComponent) {
|
539
|
+
traverseRenderedChildren(internalInstance._renderedComponent, callback, argument);
|
540
|
+
} else {
|
541
|
+
for (var key in internalInstance._renderedChildren) {
|
542
|
+
if (internalInstance._renderedChildren.hasOwnProperty(key)) {
|
543
|
+
traverseRenderedChildren(internalInstance._renderedChildren[key], callback, argument);
|
544
|
+
}
|
545
|
+
}
|
546
|
+
}
|
547
|
+
}
|
548
|
+
|
549
|
+
function setPendingForceUpdate(internalInstance) {
|
550
|
+
if (internalInstance._pendingForceUpdate === false) {
|
551
|
+
internalInstance._pendingForceUpdate = true;
|
552
|
+
}
|
553
|
+
}
|
554
|
+
|
555
|
+
function forceUpdateIfPending(internalInstance) {
|
556
|
+
if (internalInstance._pendingForceUpdate === true) {
|
557
|
+
var publicInstance = internalInstance._instance;
|
558
|
+
var updater = publicInstance.updater;
|
559
|
+
|
560
|
+
if (typeof publicInstance.forceUpdate === 'function') {
|
561
|
+
publicInstance.forceUpdate();
|
562
|
+
} else if (updater && typeof updater.enqueueForceUpdate === 'function') {
|
563
|
+
updater.enqueueForceUpdate(publicInstance);
|
564
|
+
}
|
565
|
+
}
|
566
|
+
}
|
567
|
+
|
568
|
+
function deepForceUpdate(instance) {
|
569
|
+
var internalInstance = instance._reactInternalInstance;
|
570
|
+
traverseRenderedChildren(internalInstance, setPendingForceUpdate);
|
571
|
+
traverseRenderedChildren(internalInstance, forceUpdateIfPending);
|
572
|
+
}
|
573
|
+
|
574
|
+
module.exports = exports['default'];
|
575
|
+
|
576
|
+
/***/ }
|
577
|
+
|
578
|
+
});
|