isomorfeus-react 16.13.11 → 16.13.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -1
  3. data/lib/isomorfeus/react/config.rb +189 -189
  4. data/lib/isomorfeus/react/memcached_component_cache.rb +19 -19
  5. data/lib/isomorfeus/react/redis_component_cache.rb +19 -19
  6. data/lib/isomorfeus/react/thread_local_component_cache.rb +15 -15
  7. data/lib/isomorfeus/react_view_helper.rb +231 -231
  8. data/lib/isomorfeus/top_level.rb +103 -103
  9. data/lib/isomorfeus/top_level_ssr.rb +42 -42
  10. data/lib/isomorfeus-react-material-ui.rb +4 -4
  11. data/lib/isomorfeus-react-native.rb +5 -5
  12. data/lib/isomorfeus-react-paper.rb +4 -4
  13. data/lib/isomorfeus-react.rb +120 -120
  14. data/lib/isomorfeus_react/lucid_app/api.rb +26 -26
  15. data/lib/isomorfeus_react/lucid_app/base.rb +7 -7
  16. data/lib/isomorfeus_react/lucid_app/mixin.rb +23 -23
  17. data/lib/isomorfeus_react/lucid_app/native_component_constructor.rb +48 -48
  18. data/lib/isomorfeus_react/lucid_app/native_lucid_component_constructor.rb +94 -95
  19. data/lib/isomorfeus_react/lucid_component/api.rb +75 -75
  20. data/lib/isomorfeus_react/lucid_component/app_store_proxy.rb +37 -37
  21. data/lib/isomorfeus_react/lucid_component/base.rb +7 -7
  22. data/lib/isomorfeus_react/lucid_component/class_store_proxy.rb +44 -44
  23. data/lib/isomorfeus_react/lucid_component/initializer.rb +14 -14
  24. data/lib/isomorfeus_react/lucid_component/instance_store_proxy.rb +44 -44
  25. data/lib/isomorfeus_react/lucid_component/mixin.rb +22 -22
  26. data/lib/isomorfeus_react/lucid_component/native_component_constructor.rb +35 -35
  27. data/lib/isomorfeus_react/lucid_component/native_lucid_component_constructor.rb +82 -83
  28. data/lib/isomorfeus_react/lucid_component/styles_api.rb +34 -34
  29. data/lib/isomorfeus_react/lucid_func/base.rb +7 -7
  30. data/lib/isomorfeus_react/lucid_func/initializer.rb +11 -11
  31. data/lib/isomorfeus_react/lucid_func/mixin.rb +18 -18
  32. data/lib/isomorfeus_react/lucid_func/native_component_constructor.rb +81 -81
  33. data/lib/isomorfeus_react/react/function_component/api.rb +105 -105
  34. data/lib/isomorfeus_react/react/function_component/base.rb +8 -8
  35. data/lib/isomorfeus_react/react/function_component/initializer.rb +10 -10
  36. data/lib/isomorfeus_react/react/function_component/mixin.rb +17 -17
  37. data/lib/isomorfeus_react/react/function_component/native_component_constructor.rb +48 -48
  38. data/lib/isomorfeus_react/react/memo_component/base.rb +8 -8
  39. data/lib/isomorfeus_react/react/memo_component/mixin.rb +17 -17
  40. data/lib/isomorfeus_react/react/memo_component/native_component_constructor.rb +49 -49
  41. data/lib/isomorfeus_react_material/lucid_material/app/base.rb +8 -8
  42. data/lib/isomorfeus_react_material/lucid_material/app/mixin.rb +20 -20
  43. data/lib/isomorfeus_react_material/lucid_material/app/native_component_constructor.rb +50 -50
  44. data/lib/isomorfeus_react_material/lucid_material/component/base.rb +9 -9
  45. data/lib/isomorfeus_react_material/lucid_material/component/mixin.rb +19 -19
  46. data/lib/isomorfeus_react_material/lucid_material/component/native_component_constructor.rb +36 -36
  47. data/lib/isomorfeus_react_material/lucid_material/func/base.rb +9 -9
  48. data/lib/isomorfeus_react_material/lucid_material/func/mixin.rb +15 -15
  49. data/lib/isomorfeus_react_material/lucid_material/func/native_component_constructor.rb +83 -83
  50. data/lib/isomorfeus_react_paper/lucid_paper/app/base.rb +9 -9
  51. data/lib/isomorfeus_react_paper/lucid_paper/app/mixin.rb +19 -19
  52. data/lib/isomorfeus_react_paper/lucid_paper/app/native_component_constructor.rb +32 -32
  53. data/lib/isomorfeus_react_paper/lucid_paper/component/base.rb +9 -9
  54. data/lib/isomorfeus_react_paper/lucid_paper/component/mixin.rb +18 -18
  55. data/lib/isomorfeus_react_paper/lucid_paper/component/native_component_constructor.rb +25 -25
  56. data/lib/isomorfeus_react_paper/lucid_paper/func/base.rb +9 -9
  57. data/lib/isomorfeus_react_paper/lucid_paper/func/mixin.rb +14 -14
  58. data/lib/isomorfeus_react_paper/lucid_paper/func/native_component_constructor.rb +71 -71
  59. data/lib/lucid_app/context.rb +7 -7
  60. data/lib/lucid_prop_declaration/mixin.rb +126 -126
  61. data/lib/react/children.rb +34 -34
  62. data/lib/react/component/api.rb +134 -134
  63. data/lib/react/component/base.rb +8 -8
  64. data/lib/react/component/callbacks.rb +115 -115
  65. data/lib/react/component/elements.rb +60 -60
  66. data/lib/react/component/features.rb +48 -48
  67. data/lib/react/component/history.rb +69 -65
  68. data/lib/react/component/initializer.rb +11 -11
  69. data/lib/react/component/location.rb +19 -15
  70. data/lib/react/component/match.rb +35 -31
  71. data/lib/react/component/mixin.rb +20 -20
  72. data/lib/react/component/native_component_constructor.rb +69 -70
  73. data/lib/react/component/props.rb +83 -83
  74. data/lib/react/component/resolution.rb +97 -97
  75. data/lib/react/component/state.rb +58 -54
  76. data/lib/react/component/styles.rb +66 -66
  77. data/lib/react/context_wrapper.rb +48 -44
  78. data/lib/react/native_constant_wrapper.rb +29 -29
  79. data/lib/react/ref.rb +16 -12
  80. data/lib/react/synthetic_event.rb +52 -52
  81. data/lib/react/version.rb +3 -3
  82. data/lib/react.rb +296 -296
  83. data/lib/react_dom.rb +41 -41
  84. data/lib/react_dom_server.rb +18 -18
  85. data/lib/react_native/component/elements.rb +203 -203
  86. data/lib/react_native/lucid_app/react_native_component_constructor.rb +51 -51
  87. data/lib/react_native/lucid_component/react_native_component_constructor.rb +37 -37
  88. data/lib/react_native/lucid_func/react_native_component_constructor.rb +82 -82
  89. data/lib/react_native/react.rb +120 -120
  90. metadata +23 -17
@@ -1,54 +1,58 @@
1
- module React
2
- module Component
3
- class State
4
- include ::Native::Wrapper
5
-
6
- def method_missing(key, *args, &block)
7
- if `args.length > 0`
8
- new_state = `{}`
9
- new_state.JS[(`key.endsWith('=')` ? key.chop : key)] = args[0]
10
- if block_given?
11
- @native.JS.setState(new_state, `function() { block.$call(); }`)
12
- else
13
- @native.JS.setState(new_state, `null`)
14
- end
15
- else
16
- %x{
17
- if (typeof #@native.state[key] === 'undefined') { return nil; }
18
- return #@native.state[key];
19
- }
20
- end
21
- end
22
-
23
- def set_state(updater, &block)
24
- new_state = `{}`
25
- updater.each do |key, value|
26
- new_state.JS[key] = value
27
- end
28
- if block_given?
29
- @native.JS.setState(new_state, `function() { block.$call(); }`)
30
- else
31
- @native.JS.setState(new_state, `null`)
32
- end
33
- end
34
-
35
- def size
36
- `Object.keys(#@native.state).length`;
37
- end
38
-
39
- def to_n
40
- %x{
41
- var new_native = {};
42
- for (var key in #@native.state) {
43
- if (typeof #@native.state[key].$to_n !== "undefined") {
44
- new_native[key] = #@native.state[key].$to_n();
45
- } else {
46
- new_native[key] = #@native.state[key];
47
- }
48
- }
49
- return new_native;
50
- }
51
- end
52
- end
53
- end
54
- end
1
+ module React
2
+ module Component
3
+ class State
4
+ include ::Native::Wrapper
5
+
6
+ def initialize(native)
7
+ @native = native
8
+ end
9
+
10
+ def method_missing(key, *args, &block)
11
+ if `args.length > 0`
12
+ new_state = `{}`
13
+ new_state.JS[(`key.endsWith('=')` ? key.chop : key)] = args[0]
14
+ if block_given?
15
+ @native.JS.setState(new_state, `function() { block.$call(); }`)
16
+ else
17
+ @native.JS.setState(new_state, `null`)
18
+ end
19
+ else
20
+ %x{
21
+ if (typeof #@native.state[key] === 'undefined') { return nil; }
22
+ return #@native.state[key];
23
+ }
24
+ end
25
+ end
26
+
27
+ def set_state(updater, &block)
28
+ new_state = `{}`
29
+ updater.each do |key, value|
30
+ new_state.JS[key] = value
31
+ end
32
+ if block_given?
33
+ @native.JS.setState(new_state, `function() { block.$call(); }`)
34
+ else
35
+ @native.JS.setState(new_state, `null`)
36
+ end
37
+ end
38
+
39
+ def size
40
+ `Object.keys(#@native.state).length`;
41
+ end
42
+
43
+ def to_n
44
+ %x{
45
+ var new_native = {};
46
+ for (var key in #@native.state) {
47
+ if (typeof #@native.state[key].$to_n !== "undefined") {
48
+ new_native[key] = #@native.state[key].$to_n();
49
+ } else {
50
+ new_native[key] = #@native.state[key];
51
+ }
52
+ }
53
+ return new_native;
54
+ }
55
+ end
56
+ end
57
+ end
58
+ end
@@ -1,66 +1,66 @@
1
- module React
2
- module Component
3
- class Styles
4
-
5
- def initialize(native, props_prop = false)
6
- @native = native
7
- @props_prop = props_prop
8
- end
9
-
10
- def [](prop)
11
- method_missing(prop)
12
- end
13
-
14
- def []=(prop, val)
15
- method_missing(prop, val)
16
- end
17
-
18
- def deep_merge(a_hash)
19
- native_hash = a_hash.to_n
20
- React::Component::Styles.new(`Opal.React.merge_deep(#@native, native_hash)`)
21
- end
22
-
23
- def deep_merge!(a_hash)
24
- native_hash = a_hash.to_n
25
- `#@native = Opal.React.merge_deep(#@native, native_hash)`
26
- self
27
- end
28
-
29
- def method_missing(prop, *args, &block)
30
- %x{
31
- let value;
32
- if (#@props_prop) {
33
- if (!#@native.props[#@props_prop] || typeof #@native.props[#@props_prop][prop] === 'undefined') {
34
- console.warn("Style/Theme key '" + prop + "' returning nil!");
35
- return #{nil};
36
- }
37
- value = #@native.props[#@props_prop][prop];
38
- } else {
39
- if (!#@native || typeof #@native[prop] === 'undefined') {
40
- console.warn("Style/Theme key '" + prop + "' returning nil!");
41
- return #{nil};
42
- }
43
- value = #@native[prop];
44
- }
45
- if (typeof value === 'string' || typeof value === 'number' || Array.isArray(value)) { return value; }
46
- if (typeof value === 'function') { return value.apply(#@native, args); }
47
- return Opal.React.Component.Styles.$new(value);
48
- }
49
- end
50
-
51
- def to_h
52
- %x{
53
- if (#@props_prop) { return Opal.Hash.$new(#@native.props[#@props_prop]); }
54
- else { return Opal.Hash.$new(#@native); }
55
- }
56
- end
57
-
58
- def to_n
59
- %x{
60
- if (#@props_prop) { return #@native.props[#@props_prop]; }
61
- else { return #@native; }
62
- }
63
- end
64
- end
65
- end
66
- end
1
+ module React
2
+ module Component
3
+ class Styles
4
+
5
+ def initialize(native, props_prop = false)
6
+ @native = native
7
+ @props_prop = props_prop
8
+ end
9
+
10
+ def [](prop)
11
+ method_missing(prop)
12
+ end
13
+
14
+ def []=(prop, val)
15
+ method_missing(prop, val)
16
+ end
17
+
18
+ def deep_merge(a_hash)
19
+ native_hash = a_hash.to_n
20
+ React::Component::Styles.new(`Opal.React.merge_deep(#@native, native_hash)`)
21
+ end
22
+
23
+ def deep_merge!(a_hash)
24
+ native_hash = a_hash.to_n
25
+ `#@native = Opal.React.merge_deep(#@native, native_hash)`
26
+ self
27
+ end
28
+
29
+ def method_missing(prop, *args, &block)
30
+ %x{
31
+ let value;
32
+ if (#@props_prop) {
33
+ if (!#@native.props[#@props_prop] || typeof #@native.props[#@props_prop][prop] === 'undefined') {
34
+ console.warn("Style/Theme key '" + prop + "' returning nil!");
35
+ return #{nil};
36
+ }
37
+ value = #@native.props[#@props_prop][prop];
38
+ } else {
39
+ if (!#@native || typeof #@native[prop] === 'undefined') {
40
+ console.warn("Style/Theme key '" + prop + "' returning nil!");
41
+ return #{nil};
42
+ }
43
+ value = #@native[prop];
44
+ }
45
+ if (typeof value === 'string' || typeof value === 'number' || Array.isArray(value)) { return value; }
46
+ if (typeof value === 'function') { return value.apply(#@native, args); }
47
+ return Opal.React.Component.Styles.$new(value);
48
+ }
49
+ end
50
+
51
+ def to_h
52
+ %x{
53
+ if (#@props_prop) { return Opal.Hash.$new(#@native.props[#@props_prop]); }
54
+ else { return Opal.Hash.$new(#@native); }
55
+ }
56
+ end
57
+
58
+ def to_n
59
+ %x{
60
+ if (#@props_prop) { return #@native.props[#@props_prop]; }
61
+ else { return #@native; }
62
+ }
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,44 +1,48 @@
1
- module React
2
- class ContextWrapper
3
- include ::Native::Wrapper
4
-
5
- def is_wrapped_context
6
- true
7
- end
8
-
9
- def Consumer(*args, &block)
10
- # why not use internal_prepare_args and render?
11
- %x{
12
- let operabu = Opal.React.render_buffer;
13
- let props = null;
14
-
15
- if (args.length > 0) { props = Opal.React.to_native_react_props(args[0]); }
16
-
17
- let react_element = Opal.global.React.createElement(this.native.Consumer, props, function(value) {
18
- let children = null;
19
- if (block !== nil) {
20
- operabu.push([]);
21
- // console.log("consumer pushed", operabu, operabu.toString());
22
- let block_result = block.$call();
23
- if (block_result && block_result !== nil) { Opal.React.render_block_result(block_result); }
24
- // console.log("consumer popping", operabu, operabu.toString());
25
- children = operabu.pop();
26
- if (children.length === 1) { children = children[0]; }
27
- else if (children.length === 0) { children = null; }
28
- }
29
- return children;
30
- });
31
- operabu[operabu.length - 1].push(react_element);
32
- }
33
- end
34
-
35
- def Provider(*args, &block)
36
- # why not use internal_prepare_args and render?
37
- %x{
38
- var props = null;
39
- if (args.length > 0) { props = Opal.React.to_native_react_props(args[0]); }
40
- Opal.React.internal_render(this.native.Provider, props, null, block);
41
- }
42
- end
43
- end
44
- end
1
+ module React
2
+ class ContextWrapper
3
+ include ::Native::Wrapper
4
+
5
+ def initialize(native)
6
+ @native = native
7
+ end
8
+
9
+ def is_wrapped_context
10
+ true
11
+ end
12
+
13
+ def Consumer(*args, &block)
14
+ # why not use internal_prepare_args and render?
15
+ %x{
16
+ let operabu = Opal.React.render_buffer;
17
+ let props = null;
18
+
19
+ if (args.length > 0) { props = Opal.React.to_native_react_props(args[0]); }
20
+
21
+ let react_element = Opal.global.React.createElement(this.native.Consumer, props, function(value) {
22
+ let children = null;
23
+ if (block !== nil) {
24
+ operabu.push([]);
25
+ // console.log("consumer pushed", operabu, operabu.toString());
26
+ let block_result = block.$call();
27
+ if (block_result && block_result !== nil) { Opal.React.render_block_result(block_result); }
28
+ // console.log("consumer popping", operabu, operabu.toString());
29
+ children = operabu.pop();
30
+ if (children.length === 1) { children = children[0]; }
31
+ else if (children.length === 0) { children = null; }
32
+ }
33
+ return children;
34
+ });
35
+ operabu[operabu.length - 1].push(react_element);
36
+ }
37
+ end
38
+
39
+ def Provider(*args, &block)
40
+ # why not use internal_prepare_args and render?
41
+ %x{
42
+ var props = null;
43
+ if (args.length > 0) { props = Opal.React.to_native_react_props(args[0]); }
44
+ Opal.React.internal_render(this.native.Provider, props, null, block);
45
+ }
46
+ end
47
+ end
48
+ end
@@ -1,29 +1,29 @@
1
- module React
2
- class NativeConstantWrapper
3
- include ::Native::Wrapper
4
-
5
- def initialize(native, const_name)
6
- @native = native
7
- @const_name = const_name
8
- end
9
-
10
- def method_missing(name, *args, &block)
11
- %x{
12
- if (name[0] === 'u' && name[1] === 's' && name[2] === 'e') {
13
- if (name.indexOf('_') > 0) { name = Opal.React.lower_camelize(name); }
14
- return #@native[name].call(this, args);
15
- }
16
- var component = null;
17
- var component_type = typeof #@native[name];
18
- if (component_type === "function" || component_type === "object") {
19
- component = #@native[name];
20
- }
21
- if (component) {
22
- return Opal.React.internal_prepare_args_and_render(component, args, block);
23
- } else {
24
- #{Isomorfeus.raise_error(error_class: NameError, message: "No such native Component #@const_name.#{name}")};
25
- }
26
- }
27
- end
28
- end
29
- end
1
+ module React
2
+ class NativeConstantWrapper
3
+ include ::Native::Wrapper
4
+
5
+ def initialize(native, const_name)
6
+ @native = native
7
+ @const_name = const_name
8
+ end
9
+
10
+ def method_missing(name, *args, &block)
11
+ %x{
12
+ if (name[0] === 'u' && name[1] === 's' && name[2] === 'e') {
13
+ if (name.indexOf('_') > 0) { name = Opal.React.lower_camelize(name); }
14
+ return #@native[name].call(this, args);
15
+ }
16
+ var component = null;
17
+ var component_type = typeof #@native[name];
18
+ if (component_type === "function" || component_type === "object") {
19
+ component = #@native[name];
20
+ }
21
+ if (component) {
22
+ return Opal.React.internal_prepare_args_and_render(component, args, block);
23
+ } else {
24
+ #{Isomorfeus.raise_error(error_class: NameError, message: "No such native Component #@const_name.#{name}")};
25
+ }
26
+ }
27
+ end
28
+ end
29
+ end
data/lib/react/ref.rb CHANGED
@@ -1,13 +1,17 @@
1
- module React
2
- class Ref
3
- include ::Native::Wrapper
4
-
5
- def is_wrapped_ref
6
- true
7
- end
8
-
9
- def current
10
- `Opal.React.native_element_or_component_to_ruby(#@native.current)`
11
- end
12
- end
1
+ module React
2
+ class Ref
3
+ include ::Native::Wrapper
4
+
5
+ def initialize(native)
6
+ @native = native
7
+ end
8
+
9
+ def is_wrapped_ref
10
+ true
11
+ end
12
+
13
+ def current
14
+ `Opal.React.native_element_or_component_to_ruby(#@native.current)`
15
+ end
16
+ end
13
17
  end
@@ -1,53 +1,53 @@
1
- module React
2
- class SyntheticEvent
3
- include Native::Wrapper
4
- # helpers
5
- def self.native_accessors(*js_names)
6
- js_names.each do |js_name|
7
- ruby_name = js_name.underscore
8
- define_method(ruby_name) do
9
- @native.JS[js_name]
10
- end
11
- end
12
- end
13
-
14
- def self.native_boolean_accessors(*js_names)
15
- js_names.each do |js_name|
16
- ruby_name = js_name.underscore + '?'
17
- define_method(ruby_name) do
18
- @native.JS[js_name]
19
- end
20
- end
21
- end
22
-
23
- alias_native :get_modifier_state, :getModifierState
24
- alias_native :is_default_prevented?, :isDefaultPrevented
25
- alias_native :is_propagation_stopped?, :isPropagationStopped
26
- alias_native :persist, :persist
27
- alias_native :prevent_default, :preventDefault
28
- alias_native :stop_propagation, :stopPropagation
29
-
30
- native_accessors :animationName, :button, :buttons, :changedTouches, :charCode, :clientX, :clientY, :clipboardData, :data, :deltaMode, :deltaX,
31
- :deltaY, :deltaZ, :detail, :elapsedTime, :eventPhase, :height, :key, :keyCode, :locale, :location, :pageX, :pageY, :pointerId,
32
- :pointerType, :pressure, :propertyName, :pseudoElement, :screenX, :screenY, :tangentialPressure, :targetTouches, :tiltX, :tiltY,
33
- :timestamp, :touches, :twist, :type, :view, :which, :width
34
-
35
- native_boolean_accessors :altKey, :bubbles, :cancelable, :ctrlKey, :defaultPrevented, :isPrimary, :isTrusted, :metaKey, :repeat, :shiftKey
36
-
37
- def current_target
38
- Browser::Element.new(@native.JS[:currentTarget])
39
- end
40
-
41
- def native_event
42
- Browser::Event.new(@native.JS[:nativeEvent])
43
- end
44
-
45
- def related_target
46
- Browser::Element.new(@native.JS[:relatedTarget])
47
- end
48
-
49
- def target
50
- Browser::Element.new(@native.JS[:target])
51
- end
52
- end
1
+ module React
2
+ class SyntheticEvent
3
+ include Native::Wrapper
4
+ # helpers
5
+ def self.native_accessors(*js_names)
6
+ js_names.each do |js_name|
7
+ ruby_name = js_name.underscore
8
+ define_method(ruby_name) do
9
+ @native.JS[js_name]
10
+ end
11
+ end
12
+ end
13
+
14
+ def self.native_boolean_accessors(*js_names)
15
+ js_names.each do |js_name|
16
+ ruby_name = js_name.underscore + '?'
17
+ define_method(ruby_name) do
18
+ @native.JS[js_name]
19
+ end
20
+ end
21
+ end
22
+
23
+ alias_native :get_modifier_state, :getModifierState
24
+ alias_native :is_default_prevented?, :isDefaultPrevented
25
+ alias_native :is_propagation_stopped?, :isPropagationStopped
26
+ alias_native :persist, :persist
27
+ alias_native :prevent_default, :preventDefault
28
+ alias_native :stop_propagation, :stopPropagation
29
+
30
+ native_accessors :animationName, :button, :buttons, :changedTouches, :charCode, :clientX, :clientY, :clipboardData, :data, :deltaMode, :deltaX,
31
+ :deltaY, :deltaZ, :detail, :elapsedTime, :eventPhase, :height, :key, :keyCode, :locale, :location, :pageX, :pageY, :pointerId,
32
+ :pointerType, :pressure, :propertyName, :pseudoElement, :screenX, :screenY, :tangentialPressure, :targetTouches, :tiltX, :tiltY,
33
+ :timestamp, :touches, :twist, :type, :view, :which, :width
34
+
35
+ native_boolean_accessors :altKey, :bubbles, :cancelable, :ctrlKey, :defaultPrevented, :isPrimary, :isTrusted, :metaKey, :repeat, :shiftKey
36
+
37
+ def current_target
38
+ Browser::Element.new(@native.JS[:currentTarget])
39
+ end
40
+
41
+ def native_event
42
+ Browser::Event.new(@native.JS[:nativeEvent])
43
+ end
44
+
45
+ def related_target
46
+ Browser::Element.new(@native.JS[:relatedTarget])
47
+ end
48
+
49
+ def target
50
+ Browser::Element.new(@native.JS[:target])
51
+ end
52
+ end
53
53
  end
data/lib/react/version.rb CHANGED
@@ -1,3 +1,3 @@
1
- module React
2
- VERSION = '16.13.11'
3
- end
1
+ module React
2
+ VERSION = '16.13.12'
3
+ end