react 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/README.md +15 -228
  2. package/ReactJSErrors.js +40 -0
  3. package/addons.js +4 -0
  4. package/lib/$.js +46 -0
  5. package/lib/CSSCore.js +114 -0
  6. package/lib/CSSProperty.js +90 -0
  7. package/lib/CSSPropertyOperations.js +97 -0
  8. package/lib/CallbackRegistry.js +91 -0
  9. package/lib/ChangeEventPlugin.js +365 -0
  10. package/lib/CompositionEventPlugin.js +212 -0
  11. package/lib/DOMChildrenOperations.js +135 -0
  12. package/lib/DOMProperty.js +266 -0
  13. package/lib/DOMPropertyOperations.js +168 -0
  14. package/lib/Danger.js +186 -0
  15. package/lib/DefaultDOMPropertyConfig.js +187 -0
  16. package/lib/DefaultEventPluginOrder.js +44 -0
  17. package/lib/EnterLeaveEventPlugin.js +112 -0
  18. package/lib/EventConstants.js +73 -0
  19. package/lib/EventListener.js +61 -0
  20. package/lib/EventPluginHub.js +190 -0
  21. package/lib/EventPluginRegistry.js +237 -0
  22. package/lib/EventPluginUtils.js +185 -0
  23. package/lib/EventPropagators.js +179 -0
  24. package/lib/ExecutionEnvironment.js +41 -0
  25. package/lib/LinkedStateMixin.js +46 -0
  26. package/lib/LinkedValueMixin.js +68 -0
  27. package/lib/MobileSafariClickEventPlugin.js +63 -0
  28. package/lib/PooledClass.js +113 -0
  29. package/lib/React.js +71 -0
  30. package/lib/ReactChildren.js +132 -0
  31. package/lib/ReactComponent.js +515 -0
  32. package/lib/ReactComponentBrowserEnvironment.js +140 -0
  33. package/lib/ReactComponentEnvironment.js +24 -0
  34. package/lib/ReactCompositeComponent.js +1020 -0
  35. package/lib/ReactCurrentOwner.js +39 -0
  36. package/lib/ReactDOM.js +194 -0
  37. package/lib/ReactDOMButton.js +64 -0
  38. package/lib/ReactDOMComponent.js +374 -0
  39. package/lib/ReactDOMForm.js +52 -0
  40. package/lib/ReactDOMIDOperations.js +173 -0
  41. package/lib/ReactDOMInput.js +169 -0
  42. package/lib/ReactDOMOption.js +50 -0
  43. package/lib/ReactDOMSelect.js +160 -0
  44. package/lib/ReactDOMSelection.js +189 -0
  45. package/lib/ReactDOMTextarea.js +136 -0
  46. package/lib/ReactDefaultBatchingStrategy.js +75 -0
  47. package/lib/ReactDefaultInjection.js +91 -0
  48. package/lib/ReactDefaultPerf.js +407 -0
  49. package/lib/ReactErrorUtils.js +46 -0
  50. package/lib/ReactEventEmitter.js +341 -0
  51. package/lib/ReactEventEmitterMixin.js +89 -0
  52. package/lib/ReactEventTopLevelCallback.js +89 -0
  53. package/lib/ReactInputSelection.js +140 -0
  54. package/lib/ReactInstanceHandles.js +322 -0
  55. package/lib/ReactLink.js +54 -0
  56. package/lib/ReactMarkupChecksum.js +53 -0
  57. package/lib/ReactMount.js +617 -0
  58. package/lib/ReactMountReady.js +95 -0
  59. package/lib/ReactMultiChild.js +441 -0
  60. package/lib/ReactMultiChildUpdateTypes.js +36 -0
  61. package/lib/ReactOwner.js +146 -0
  62. package/lib/ReactPerf.js +88 -0
  63. package/lib/ReactPropTransferer.js +128 -0
  64. package/lib/ReactPropTypes.js +158 -0
  65. package/lib/ReactReconcileTransaction.js +161 -0
  66. package/lib/ReactServerRendering.js +62 -0
  67. package/lib/ReactStateSetters.js +111 -0
  68. package/lib/ReactTextComponent.js +94 -0
  69. package/lib/ReactTransitionEvents.js +97 -0
  70. package/lib/ReactTransitionGroup.js +112 -0
  71. package/lib/ReactTransitionKeySet.js +111 -0
  72. package/lib/ReactTransitionableChild.js +152 -0
  73. package/lib/ReactUpdates.js +145 -0
  74. package/lib/ReactWithAddons.js +41 -0
  75. package/lib/SelectEventPlugin.js +217 -0
  76. package/lib/SimpleEventPlugin.js +365 -0
  77. package/lib/SyntheticClipboardEvent.js +45 -0
  78. package/lib/SyntheticCompositionEvent.js +51 -0
  79. package/lib/SyntheticEvent.js +163 -0
  80. package/lib/SyntheticFocusEvent.js +44 -0
  81. package/lib/SyntheticKeyboardEvent.js +56 -0
  82. package/lib/SyntheticMouseEvent.js +85 -0
  83. package/lib/SyntheticTouchEvent.js +50 -0
  84. package/lib/SyntheticUIEvent.js +45 -0
  85. package/lib/SyntheticWheelEvent.js +63 -0
  86. package/lib/Transaction.js +251 -0
  87. package/lib/ViewportMetrics.js +37 -0
  88. package/lib/accumulate.js +54 -0
  89. package/lib/adler32.js +39 -0
  90. package/lib/containsNode.js +49 -0
  91. package/lib/copyProperties.js +54 -0
  92. package/lib/createArrayFrom.js +94 -0
  93. package/lib/createNodesFromMarkup.js +93 -0
  94. package/lib/createObjectFrom.js +61 -0
  95. package/lib/cx.js +44 -0
  96. package/lib/dangerousStyleValue.js +57 -0
  97. package/lib/emptyFunction.js +43 -0
  98. package/lib/escapeTextForBrowser.js +47 -0
  99. package/lib/ex.js +49 -0
  100. package/lib/filterAttributes.js +45 -0
  101. package/lib/flattenChildren.js +54 -0
  102. package/lib/forEachAccumulated.js +36 -0
  103. package/lib/ge.js +76 -0
  104. package/lib/getActiveElement.js +33 -0
  105. package/lib/getEventTarget.js +36 -0
  106. package/lib/getMarkupWrap.js +108 -0
  107. package/lib/getNodeForCharacterOffset.js +80 -0
  108. package/lib/getReactRootElementInContainer.js +40 -0
  109. package/lib/getTextContentAccessor.js +40 -0
  110. package/lib/getUnboundedScrollPosition.js +45 -0
  111. package/lib/hyphenate.js +35 -0
  112. package/lib/invariant.js +54 -0
  113. package/lib/isEventSupported.js +74 -0
  114. package/lib/isNode.js +33 -0
  115. package/lib/isTextInputElement.js +49 -0
  116. package/lib/isTextNode.js +30 -0
  117. package/lib/joinClasses.js +44 -0
  118. package/lib/keyMirror.js +58 -0
  119. package/lib/keyOf.js +41 -0
  120. package/lib/memoizeStringOnly.js +39 -0
  121. package/lib/merge.js +37 -0
  122. package/lib/mergeHelpers.js +137 -0
  123. package/lib/mergeInto.js +45 -0
  124. package/lib/mixInto.js +34 -0
  125. package/lib/mutateHTMLNodeWithMarkup.js +100 -0
  126. package/lib/objMap.js +47 -0
  127. package/lib/objMapKeyVal.js +47 -0
  128. package/lib/performanceNow.js +42 -0
  129. package/lib/shallowEqual.js +49 -0
  130. package/lib/traverseAllChildren.js +127 -0
  131. package/package.json +33 -31
  132. package/react.js +4 -0
  133. package/.npmignore +0 -7
  134. package/.travis.yml +0 -7
  135. package/Jakefile.js +0 -39
  136. package/LICENSE +0 -19
  137. package/browser-test/dist.html +0 -90
  138. package/browser-test/index.html +0 -86
  139. package/browser-test/min.html +0 -90
  140. package/dist/react.js +0 -3141
  141. package/dist/react.min.js +0 -22
  142. package/doc/advanced.md +0 -175
  143. package/doc/color-def.graffle +0 -938
  144. package/doc/color-def.png +0 -0
  145. package/doc/simple.dot +0 -25
  146. package/doc/simple.png +0 -0
  147. package/examples/longer-example.js +0 -41
  148. package/examples/simple.js +0 -45
  149. package/examples/using-ast-directly.js +0 -30
  150. package/examples/using-events1.js +0 -79
  151. package/examples/using-log-events.js +0 -43
  152. package/lib/base-task.js +0 -120
  153. package/lib/cb-task.js +0 -84
  154. package/lib/core.js +0 -138
  155. package/lib/dsl.js +0 -138
  156. package/lib/error.js +0 -55
  157. package/lib/event-collector.js +0 -81
  158. package/lib/event-manager.js +0 -89
  159. package/lib/eventemitter.js +0 -20
  160. package/lib/finalcb-first-task.js +0 -68
  161. package/lib/finalcb-task.js +0 -65
  162. package/lib/id.js +0 -22
  163. package/lib/input-parser.js +0 -56
  164. package/lib/log-events.js +0 -101
  165. package/lib/parse.js +0 -41
  166. package/lib/promise-resolve.js +0 -50
  167. package/lib/promise-task.js +0 -93
  168. package/lib/react.js +0 -59
  169. package/lib/ret-task.js +0 -71
  170. package/lib/sprintf.js +0 -18
  171. package/lib/status.js +0 -14
  172. package/lib/task.js +0 -251
  173. package/lib/track-tasks.js +0 -74
  174. package/lib/validate.js +0 -159
  175. package/lib/vcon.js +0 -113
  176. package/lib/when-task.js +0 -84
  177. package/src/dist.build.requirejs +0 -20
  178. package/test/ast.mocha.js +0 -136
  179. package/test/cb-task.mocha.js +0 -220
  180. package/test/core-deferred.mocha.js +0 -143
  181. package/test/core-when.mocha.js +0 -96
  182. package/test/core.mocha.js +0 -589
  183. package/test/dsl.mocha.js +0 -352
  184. package/test/event-manager.mocha.js +0 -119
  185. package/test/exec-options.mocha.js +0 -48
  186. package/test/finalcb-task.mocha.js +0 -58
  187. package/test/input-parser.mocha.js +0 -86
  188. package/test/log-events.mocha.js +0 -88
  189. package/test/mocha.opts +0 -2
  190. package/test/module-use.mocha.js +0 -164
  191. package/test/promise-auto-resolve.mocha.js +0 -68
  192. package/test/ret-task.mocha.js +0 -220
  193. package/test/task.mocha.js +0 -42
  194. package/test/validate-cb-task.mocha.js +0 -100
  195. package/test/validate-ret-task.mocha.js +0 -110
  196. package/test/validate.mocha.js +0 -324
  197. package/test/vcon.mocha.js +0 -193
  198. package/vendor/chai/chai.js +0 -4251
  199. package/vendor/jquery/jquery-1.7.1.js +0 -9266
  200. package/vendor/jquery/jquery-1.7.1.min.js +0 -4
  201. package/vendor/node/util.js +0 -531
  202. package/vendor/requirejs/require.js +0 -2045
  203. package/vendor/requirejs/require.min.js +0 -36
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Copyright 2013 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule isEventSupported
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var ExecutionEnvironment = require("./ExecutionEnvironment");
22
+
23
+ var testNode, useHasFeature;
24
+ if (ExecutionEnvironment.canUseDOM) {
25
+ testNode = document.createElement('div');
26
+ useHasFeature =
27
+ document.implementation &&
28
+ document.implementation.hasFeature &&
29
+ // `hasFeature` always returns true in Firefox 19+.
30
+ document.implementation.hasFeature('', '') !== true;
31
+ }
32
+
33
+ /**
34
+ * Checks if an event is supported in the current execution environment.
35
+ *
36
+ * NOTE: This will not work correctly for non-generic events such as `change`,
37
+ * `reset`, `load`, `error`, and `select`.
38
+ *
39
+ * Borrows from Modernizr.
40
+ *
41
+ * @param {string} eventNameSuffix Event name, e.g. "click".
42
+ * @param {?boolean} capture Check if the capture phase is supported.
43
+ * @return {boolean} True if the event is supported.
44
+ * @internal
45
+ * @license Modernizr 3.0.0pre (Custom Build) | MIT
46
+ */
47
+ function isEventSupported(eventNameSuffix, capture) {
48
+ if (!testNode || (capture && !testNode.addEventListener)) {
49
+ return false;
50
+ }
51
+ var element = document.createElement('div');
52
+
53
+ var eventName = 'on' + eventNameSuffix;
54
+ var isSupported = eventName in element;
55
+
56
+ if (!isSupported) {
57
+ element.setAttribute(eventName, 'return;');
58
+ isSupported = typeof element[eventName] === 'function';
59
+ if (typeof element[eventName] !== 'undefined') {
60
+ element[eventName] = undefined;
61
+ }
62
+ element.removeAttribute(eventName);
63
+ }
64
+
65
+ if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {
66
+ // This is the only way to test support for the `wheel` event in IE9+.
67
+ isSupported = document.implementation.hasFeature('Events.wheel', '3.0');
68
+ }
69
+
70
+ element = null;
71
+ return isSupported;
72
+ }
73
+
74
+ module.exports = isEventSupported;
package/lib/isNode.js ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Copyright 2013 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule isNode
17
+ * @typechecks
18
+ */
19
+
20
+ /**
21
+ * @param {*} object The object to check.
22
+ * @return {boolean} Whether or not the object is a DOM node.
23
+ */
24
+ function isNode(object) {
25
+ return !!(object && (
26
+ typeof Node !== 'undefined' ? object instanceof Node :
27
+ typeof object === 'object' &&
28
+ typeof object.nodeType === 'number' &&
29
+ typeof object.nodeName === 'string'
30
+ ));
31
+ }
32
+
33
+ module.exports = isNode;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Copyright 2013 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule isTextInputElement
17
+ */
18
+
19
+ "use strict";
20
+
21
+ /**
22
+ * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
23
+ */
24
+ var supportedInputTypes = {
25
+ 'color': true,
26
+ 'date': true,
27
+ 'datetime': true,
28
+ 'datetime-local': true,
29
+ 'email': true,
30
+ 'month': true,
31
+ 'number': true,
32
+ 'password': true,
33
+ 'range': true,
34
+ 'search': true,
35
+ 'tel': true,
36
+ 'text': true,
37
+ 'time': true,
38
+ 'url': true,
39
+ 'week': true
40
+ };
41
+
42
+ function isTextInputElement(elem) {
43
+ return elem && (
44
+ (elem.nodeName === 'INPUT' && supportedInputTypes[elem.type]) ||
45
+ elem.nodeName === 'TEXTAREA'
46
+ );
47
+ }
48
+
49
+ module.exports = isTextInputElement;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Copyright 2013 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule isTextNode
17
+ * @typechecks
18
+ */
19
+
20
+ var isNode = require("./isNode");
21
+
22
+ /**
23
+ * @param {*} object The object to check.
24
+ * @return {boolean} Whether or not the object is a DOM text node.
25
+ */
26
+ function isTextNode(object) {
27
+ return isNode(object) && object.nodeType == 3;
28
+ }
29
+
30
+ module.exports = isTextNode;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Copyright 2013 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule joinClasses
17
+ * @typechecks static-only
18
+ */
19
+
20
+ "use strict";
21
+
22
+ /**
23
+ * Combines multiple className strings into one.
24
+ * http://jsperf.com/joinclasses-args-vs-array
25
+ *
26
+ * @param {...?string} classes
27
+ * @return {string}
28
+ */
29
+ function joinClasses(className/*, ... */) {
30
+ if (!className) {
31
+ className = '';
32
+ }
33
+ var nextClass;
34
+ var argLength = arguments.length;
35
+ if (argLength > 1) {
36
+ for (var ii = 1; ii < argLength; ii++) {
37
+ nextClass = arguments[ii];
38
+ nextClass && (className += ' ' + nextClass);
39
+ }
40
+ }
41
+ return className;
42
+ }
43
+
44
+ module.exports = joinClasses;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Copyright 2013 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule keyMirror
17
+ * @typechecks static-only
18
+ */
19
+
20
+ "use strict";
21
+
22
+ var invariant = require("./invariant");
23
+
24
+ /**
25
+ * Constructs an enumeration with keys equal to their value.
26
+ *
27
+ * For example:
28
+ *
29
+ * var COLORS = keyMirror({blue: null, red: null});
30
+ * var myColor = COLORS.blue;
31
+ * var isColorValid = !!COLORS[myColor];
32
+ *
33
+ * The last line could not be performed if the values of the generated enum were
34
+ * not equal to their keys.
35
+ *
36
+ * Input: {key1: val1, key2: val2}
37
+ * Output: {key1: key1, key2: key2}
38
+ *
39
+ * @param {object} obj
40
+ * @return {object}
41
+ */
42
+ var keyMirror = function(obj) {
43
+ var ret = {};
44
+ var key;
45
+ ("production" !== process.env.NODE_ENV ? invariant(
46
+ obj instanceof Object && !Array.isArray(obj),
47
+ 'keyMirror(...): Argument must be an object.'
48
+ ) : invariant(obj instanceof Object && !Array.isArray(obj)));
49
+ for (key in obj) {
50
+ if (!obj.hasOwnProperty(key)) {
51
+ continue;
52
+ }
53
+ ret[key] = key;
54
+ }
55
+ return ret;
56
+ };
57
+
58
+ module.exports = keyMirror;
package/lib/keyOf.js ADDED
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Copyright 2013 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule keyOf
17
+ */
18
+
19
+ /**
20
+ * Allows extraction of a minified key. Let's the build system minify keys
21
+ * without loosing the ability to dynamically use key strings as values
22
+ * themselves. Pass in an object with a single key/val pair and it will return
23
+ * you the string key of that single record. Suppose you want to grab the
24
+ * value for a key 'className' inside of an object. Key/val minification may
25
+ * have aliased that key to be 'xa12'. keyOf({className: null}) will return
26
+ * 'xa12' in that case. Resolve keys you want to use once at startup time, then
27
+ * reuse those resolutions.
28
+ */
29
+ var keyOf = function(oneKeyObj) {
30
+ var key;
31
+ for (key in oneKeyObj) {
32
+ if (!oneKeyObj.hasOwnProperty(key)) {
33
+ continue;
34
+ }
35
+ return key;
36
+ }
37
+ return null;
38
+ };
39
+
40
+
41
+ module.exports = keyOf;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Copyright 2013 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule memoizeStringOnly
17
+ * @typechecks static-only
18
+ */
19
+
20
+ "use strict";
21
+
22
+ /**
23
+ * Memoizes the return value of a function that accepts one string argument.
24
+ *
25
+ * @param {function} callback
26
+ * @return {function}
27
+ */
28
+ function memoizeStringOnly(callback) {
29
+ var cache = {};
30
+ return function(string) {
31
+ if (cache.hasOwnProperty(string)) {
32
+ return cache[string];
33
+ } else {
34
+ return cache[string] = callback.call(this, string);
35
+ }
36
+ };
37
+ }
38
+
39
+ module.exports = memoizeStringOnly;
package/lib/merge.js ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Copyright 2013 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule merge
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var mergeInto = require("./mergeInto");
22
+
23
+ /**
24
+ * Shallow merges two structures into a return value, without mutating either.
25
+ *
26
+ * @param {?object} one Optional object with properties to merge from.
27
+ * @param {?object} two Optional object with properties to merge from.
28
+ * @return {object} The shallow extension of one by two.
29
+ */
30
+ var merge = function(one, two) {
31
+ var result = {};
32
+ mergeInto(result, one);
33
+ mergeInto(result, two);
34
+ return result;
35
+ };
36
+
37
+ module.exports = merge;
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Copyright 2013 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule mergeHelpers
17
+ *
18
+ * requiresPolyfills: Array.isArray
19
+ */
20
+
21
+ "use strict";
22
+
23
+ var invariant = require("./invariant");
24
+ var keyMirror = require("./keyMirror");
25
+
26
+ /**
27
+ * Maximum number of levels to traverse. Will catch circular structures.
28
+ * @const
29
+ */
30
+ var MAX_MERGE_DEPTH = 36;
31
+
32
+ /**
33
+ * We won't worry about edge cases like new String('x') or new Boolean(true).
34
+ * Functions are considered terminals, and arrays are not.
35
+ * @param {*} o The item/object/value to test.
36
+ * @return {boolean} true iff the argument is a terminal.
37
+ */
38
+ var isTerminal = function(o) {
39
+ return typeof o !== 'object' || o === null;
40
+ };
41
+
42
+ var mergeHelpers = {
43
+
44
+ MAX_MERGE_DEPTH: MAX_MERGE_DEPTH,
45
+
46
+ isTerminal: isTerminal,
47
+
48
+ /**
49
+ * Converts null/undefined values into empty object.
50
+ *
51
+ * @param {?Object=} arg Argument to be normalized (nullable optional)
52
+ * @return {!Object}
53
+ */
54
+ normalizeMergeArg: function(arg) {
55
+ return arg === undefined || arg === null ? {} : arg;
56
+ },
57
+
58
+ /**
59
+ * If merging Arrays, a merge strategy *must* be supplied. If not, it is
60
+ * likely the caller's fault. If this function is ever called with anything
61
+ * but `one` and `two` being `Array`s, it is the fault of the merge utilities.
62
+ *
63
+ * @param {*} one Array to merge into.
64
+ * @param {*} two Array to merge from.
65
+ */
66
+ checkMergeArrayArgs: function(one, two) {
67
+ ("production" !== process.env.NODE_ENV ? invariant(
68
+ Array.isArray(one) && Array.isArray(two),
69
+ 'Critical assumptions about the merge functions have been violated. ' +
70
+ 'This is the fault of the merge functions themselves, not necessarily ' +
71
+ 'the callers.'
72
+ ) : invariant(Array.isArray(one) && Array.isArray(two)));
73
+ },
74
+
75
+ /**
76
+ * @param {*} one Object to merge into.
77
+ * @param {*} two Object to merge from.
78
+ */
79
+ checkMergeObjectArgs: function(one, two) {
80
+ mergeHelpers.checkMergeObjectArg(one);
81
+ mergeHelpers.checkMergeObjectArg(two);
82
+ },
83
+
84
+ /**
85
+ * @param {*} arg
86
+ */
87
+ checkMergeObjectArg: function(arg) {
88
+ ("production" !== process.env.NODE_ENV ? invariant(
89
+ !isTerminal(arg) && !Array.isArray(arg),
90
+ 'Critical assumptions about the merge functions have been violated. ' +
91
+ 'This is the fault of the merge functions themselves, not necessarily ' +
92
+ 'the callers.'
93
+ ) : invariant(!isTerminal(arg) && !Array.isArray(arg)));
94
+ },
95
+
96
+ /**
97
+ * Checks that a merge was not given a circular object or an object that had
98
+ * too great of depth.
99
+ *
100
+ * @param {number} Level of recursion to validate against maximum.
101
+ */
102
+ checkMergeLevel: function(level) {
103
+ ("production" !== process.env.NODE_ENV ? invariant(
104
+ level < MAX_MERGE_DEPTH,
105
+ 'Maximum deep merge depth exceeded. You may be attempting to merge ' +
106
+ 'circular structures in an unsupported way.'
107
+ ) : invariant(level < MAX_MERGE_DEPTH));
108
+ },
109
+
110
+ /**
111
+ * Checks that the supplied merge strategy is valid.
112
+ *
113
+ * @param {string} Array merge strategy.
114
+ */
115
+ checkArrayStrategy: function(strategy) {
116
+ ("production" !== process.env.NODE_ENV ? invariant(
117
+ strategy === undefined || strategy in mergeHelpers.ArrayStrategies,
118
+ 'You must provide an array strategy to deep merge functions to ' +
119
+ 'instruct the deep merge how to resolve merging two arrays.'
120
+ ) : invariant(strategy === undefined || strategy in mergeHelpers.ArrayStrategies));
121
+ },
122
+
123
+ /**
124
+ * Set of possible behaviors of merge algorithms when encountering two Arrays
125
+ * that must be merged together.
126
+ * - `clobber`: The left `Array` is ignored.
127
+ * - `indexByIndex`: The result is achieved by recursively deep merging at
128
+ * each index. (not yet supported.)
129
+ */
130
+ ArrayStrategies: keyMirror({
131
+ Clobber: true,
132
+ IndexByIndex: true
133
+ })
134
+
135
+ };
136
+
137
+ module.exports = mergeHelpers;