isomorfeus-react 16.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +1 -0
  3. data/README.md +620 -0
  4. data/isomorfeus-react.gemspec +23 -0
  5. data/lib/isomorfeus-react.rb +131 -0
  6. data/lib/isomorfeus/config.rb +84 -0
  7. data/lib/isomorfeus/top_level.rb +48 -0
  8. data/lib/isomorfeus/view_helpers.rb +38 -0
  9. data/lib/lucid_app/api.rb +22 -0
  10. data/lib/lucid_app/base.rb +7 -0
  11. data/lib/lucid_app/context.rb +7 -0
  12. data/lib/lucid_app/mixin.rb +17 -0
  13. data/lib/lucid_app/native_component_constructor.rb +70 -0
  14. data/lib/lucid_component/api.rb +97 -0
  15. data/lib/lucid_component/base.rb +7 -0
  16. data/lib/lucid_component/event_handler.rb +17 -0
  17. data/lib/lucid_component/initializer.rb +12 -0
  18. data/lib/lucid_component/mixin.rb +17 -0
  19. data/lib/lucid_component/native_component_constructor.rb +131 -0
  20. data/lib/react.rb +147 -0
  21. data/lib/react/active_support_support.rb +13 -0
  22. data/lib/react/component/api.rb +226 -0
  23. data/lib/react/component/base.rb +9 -0
  24. data/lib/react/component/elements.rb +78 -0
  25. data/lib/react/component/event_handler.rb +19 -0
  26. data/lib/react/component/features.rb +47 -0
  27. data/lib/react/component/history.rb +36 -0
  28. data/lib/react/component/initializer.rb +11 -0
  29. data/lib/react/component/location.rb +15 -0
  30. data/lib/react/component/match.rb +31 -0
  31. data/lib/react/component/mixin.rb +19 -0
  32. data/lib/react/component/native_component_constructor.rb +76 -0
  33. data/lib/react/component/native_component_validate_prop.rb +37 -0
  34. data/lib/react/component/props.rb +49 -0
  35. data/lib/react/component/resolution.rb +71 -0
  36. data/lib/react/component/should_component_update.rb +14 -0
  37. data/lib/react/component/state.rb +52 -0
  38. data/lib/react/component/unsafe_api.rb +33 -0
  39. data/lib/react/context_wrapper.rb +47 -0
  40. data/lib/react/function_component/creator.rb +47 -0
  41. data/lib/react/function_component/resolution.rb +61 -0
  42. data/lib/react/function_component/runner.rb +19 -0
  43. data/lib/react/native_constant_wrapper.rb +34 -0
  44. data/lib/react/pure_component/base.rb +9 -0
  45. data/lib/react/pure_component/mixin.rb +17 -0
  46. data/lib/react/redux_component/api.rb +132 -0
  47. data/lib/react/redux_component/app_store_defaults.rb +38 -0
  48. data/lib/react/redux_component/app_store_proxy.rb +46 -0
  49. data/lib/react/redux_component/base.rb +9 -0
  50. data/lib/react/redux_component/class_store_proxy.rb +50 -0
  51. data/lib/react/redux_component/component_class_store_defaults.rb +40 -0
  52. data/lib/react/redux_component/component_instance_store_defaults.rb +41 -0
  53. data/lib/react/redux_component/initializer.rb +14 -0
  54. data/lib/react/redux_component/instance_store_proxy.rb +50 -0
  55. data/lib/react/redux_component/mixin.rb +18 -0
  56. data/lib/react/redux_component/native_component_constructor.rb +119 -0
  57. data/lib/react/redux_component/reducers.rb +53 -0
  58. data/lib/react/ref.rb +19 -0
  59. data/lib/react/synthetic_event.rb +53 -0
  60. data/lib/react/version.rb +3 -0
  61. data/lib/react_dom.rb +31 -0
  62. data/lib/react_dom_server.rb +17 -0
  63. metadata +167 -0
@@ -0,0 +1,41 @@
1
+ module React
2
+ module ReduxComponent
3
+ class ComponentInstanceStoreDefaults
4
+ def initialize(state, component_name)
5
+ @state = {}
6
+ @component_name = component_name
7
+ end
8
+
9
+ def method_missing(key, *args, &block)
10
+ if `args.length > 0`
11
+ # set initial class state
12
+ key = key.chop if `key.endsWith('=')`
13
+ @state[key] = args[0]
14
+ current_state = Isomorfeus.store.get_state
15
+ if !(current_state[:component_class_state].has_key?(@component_name) &&
16
+ current_state[:component_class_state][@component_name].has_key?(:instance_defaults) &&
17
+ current_state[:component_class_state][@component_name][:instance_defaults].has_key?(key))
18
+ Isomorfeus.store.dispatch(type: 'COMPONENT_CLASS_STATE', class: @component_name, name: :instance_defaults, value: { key => args[0]})
19
+ end
20
+ else
21
+ # get class state
22
+
23
+ # check if we have a component local state value
24
+
25
+ if @state.has_key?(key)
26
+ return @state[key]
27
+ end
28
+ end
29
+ nil
30
+ end
31
+
32
+ def to_h
33
+ @state
34
+ end
35
+
36
+ def to_n
37
+ @state.to_n
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,14 @@
1
+ module React
2
+ module ReduxComponent
3
+ module Initializer
4
+ def initialize(native_component)
5
+ @native = native_component
6
+ @app_store = ::React::ReduxComponent::AppStoreProxy.new(self)
7
+ @class_store = ::React::ReduxComponent::ClassStoreProxy.new(self)
8
+ @props = ::React::Component::Props.new(@native.JS[:props])
9
+ @state = ::React::Component::State.new(@native)
10
+ @store = ::React::ReduxComponent::InstanceStoreProxy.new(self)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,50 @@
1
+ module React
2
+ module ReduxComponent
3
+ class InstanceStoreProxy
4
+
5
+ def initialize(component_instance, access_key = 'state')
6
+ @native_component_instance = component_instance.to_n
7
+ @component_instance = component_instance
8
+ @component_object_id = component_instance.object_id.to_s
9
+ @access_key = access_key
10
+ end
11
+
12
+ def method_missing(key, *args, &block)
13
+ @native_component_instance.JS.register_used_store_path(['component_state', @component_object_id, key])
14
+ if `args.length > 0`
15
+ # set instance state, simply a dispatch
16
+
17
+ action = { type: 'COMPONENT_STATE', object_id: @component_object_id, name: (`key.endsWith('=')` ? key.chop : key), value: args[0] }
18
+ Isomorfeus.store.dispatch(action)
19
+
20
+ else
21
+ # get instance state
22
+
23
+ if @native_component_instance.JS[@access_key].JS[:isomorfeus_store].JS[:component_state].JS[@component_object_id] &&
24
+ @native_component_instance.JS[@access_key].JS[:isomorfeus_store].JS[:component_state].JS[@component_object_id].JS.hasOwnProperty(key)
25
+ # check if we have a component local state value
26
+ return @native_component_instance.JS[@access_key].JS[:isomorfeus_store].JS[:component_state].JS[@component_object_id].JS[key]
27
+ elsif @component_instance.class.default_instance_store_defined && @component_instance.class.store.to_h.has_key?(key)
28
+ # check if a default value was given
29
+ return @component_instance.class.store.to_h[key]
30
+ end
31
+
32
+ # otherwise return nil
33
+ return nil
34
+ end
35
+ end
36
+
37
+ def dispatch(action)
38
+ Isomorfeus.store.dispatch(action)
39
+ end
40
+
41
+ def subscribe(&block)
42
+ Isomorfeus.store.subscribe(&block)
43
+ end
44
+
45
+ def unsubscribe(unsubscriber)
46
+ `unsubscriber()`
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,18 @@
1
+ module React
2
+ module ReduxComponent
3
+ module Mixin
4
+ def self.included(base)
5
+ base.include(::Native::Wrapper)
6
+ base.extend(::React::ReduxComponent::NativeComponentConstructor)
7
+ base.extend(::React::Component::NativeComponentValidateProp)
8
+ base.extend(::React::Component::EventHandler)
9
+ base.include(::React::Component::Elements)
10
+ base.include(::React::Component::API)
11
+ base.include(::React::ReduxComponent::API)
12
+ base.include(::React::ReduxComponent::Initializer)
13
+ base.include(::React::Component::Features)
14
+ base.include(::React::Component::Resolution)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,119 @@
1
+ module React
2
+ module ReduxComponent
3
+ module NativeComponentConstructor
4
+ # for should_component_update we apply ruby semantics for comparing props
5
+ # to do so, we convert the props to ruby hashes and then compare
6
+ # this makes sure, that for example rubys Nil object gets handled properly
7
+ def self.extended(base)
8
+ component_name = base.to_s
9
+ # language=JS
10
+ %x{
11
+ base.react_component = class extends React.Component {
12
+ constructor(props) {
13
+ super(props);
14
+ if (base.$default_state_defined()) {
15
+ this.state = Object.assign({}, base.$state().$to_n(), { isomorfeus_store: Opal.Isomorfeus.store.native.getState() });
16
+ } else {
17
+ this.state = { isomorfeus_store: Opal.Isomorfeus.store.native.getState() };
18
+ };
19
+ if (typeof this.state.isomorfeus_store.component_class_state[#{component_name}] === "undefined") {
20
+ this.state.isomorfeus_store.component_class_state[#{component_name}] = {};
21
+ };
22
+ this.__ruby_instance = base.$new(this);
23
+ this.__object_id = this.__ruby_instance.$object_id().$to_s();
24
+ if (!this.state.isomorfeus_store.component_state) {
25
+ this.state.isomorfeus_store.component_state = {};
26
+ if (base.$default_instance_store_defined()) {
27
+ this.state.isomorfeus_store.component_state[this.__object_id] = base.$store.$to_n();
28
+ } else {
29
+ this.state.isomorfeus_store.component_state[this.__object_id] = {};
30
+ }
31
+ };
32
+ var event_handlers = #{base.event_handlers};
33
+ for (var i = 0; i < event_handlers.length; i++) {
34
+ this[event_handlers[i]] = this[event_handlers[i]].bind(this);
35
+ }
36
+ var defined_refs = #{base.defined_refs};
37
+ for (var ref in defined_refs) {
38
+ if (defined_refs[ref] != null) {
39
+ this[ref] = function(element) {
40
+ #{`this.__ruby_instance`.instance_exec(React::Ref.new(`element`), `defined_refs[ref]`)}
41
+ }
42
+ this[ref] = this[ref].bind(this);
43
+ } else {
44
+ this[ref] = React.createRef();
45
+ }
46
+ }
47
+ this.listener = this.listener.bind(this);
48
+ this.unsubscriber = Opal.Isomorfeus.store.native.subscribe(this.listener);
49
+ }
50
+ data_access() {
51
+ return this.state.isomorfeus_store
52
+ }
53
+ static get displayName() {
54
+ return #{component_name};
55
+ }
56
+ listener() {
57
+ var next_state = Object.assign({}, this.state, { isomorfeus_store: Opal.Isomorfeus.store.native.getState() });
58
+ if (this.scu_for_used_store_paths(this, this.state.isomorfeus_store, next_state.isomorfeus_store)) { this.setState(next_state); }
59
+ }
60
+ register_used_store_path(path) {
61
+ this.used_store_paths.push(path);
62
+ }
63
+ componentWillUnmount() {
64
+ if (typeof this.unsubscriber === "function") { this.unsubscriber(); };
65
+ }
66
+ shouldComponentUpdate(next_props, next_state) {
67
+ var next_props_keys = Object.keys(next_props);
68
+ var this_props_keys = Object.keys(this.props);
69
+ if (next_props_keys.length !== this_props_keys.length) { return true; }
70
+
71
+ var next_state_keys = Object.keys(next_state);
72
+ var this_state_keys = Object.keys(this.state);
73
+ if (next_state_keys.length !== this_state_keys.length) { return true; }
74
+
75
+ for (var property in next_props) {
76
+ if (next_props.hasOwnProperty(property)) {
77
+ if (!this.props.hasOwnProperty(property)) { return true; };
78
+ if (property == "children") { if (next_props.children !== this.props.children) { return true; }}
79
+ else if (typeof next_props[property] !== "undefined" && typeof next_props[property]['$!='] !== "undefined" && typeof this.props[property] !== "undefined" && typeof this.props[property]['$!='] !== "undefined") {
80
+ if (#{ !! (`next_props[property]` != `this.props[property]`) }) { return true; };
81
+ } else if (next_props[property] !== this.props[property]) { return true; };
82
+ }
83
+ }
84
+ for (var property in next_state) {
85
+ if (property === "isomorfeus_store") {
86
+ var res = this.scu_for_used_store_paths(this, this.state.isomorfeus_store, next_state.isomorfeus_store);
87
+ if (res) { return true; }
88
+ }
89
+ if (next_state.hasOwnProperty(property)) {
90
+ if (!this.state.hasOwnProperty(property)) { return true; };
91
+ if (typeof next_state[property]['$!='] !== "undefined" && typeof this.state[property]['$!='] !== "undefined") {
92
+ if (#{ !! (`next_state[property]` != `this.state[property]`) }) { return true };
93
+ } else if (next_state[property] !== this.state[property]) { return true };
94
+ }
95
+ }
96
+ return false;
97
+ }
98
+ scu_for_used_store_paths(self, current_state, next_state) {
99
+ var unique_used_store_paths = self.used_store_paths.filter(function(elem, pos) {
100
+ return (self.used_store_paths.indexOf(elem) === pos);
101
+ });
102
+ var used_length = unique_used_store_paths.length;
103
+ var store_path;
104
+ var current_value;
105
+ var next_value;
106
+ for (var i = 0; i < used_length; i++) {
107
+ store_path = unique_used_store_paths[i];
108
+ current_value = store_path.reduce(function(prev, curr) { return prev && prev[curr]; }, current_state);
109
+ next_value = store_path.reduce(function(prev, curr) { return prev && prev[curr]; }, next_state);
110
+ if (current_value !== next_value) { return true; };
111
+ }
112
+ return false;
113
+ }
114
+ }
115
+ }
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,53 @@
1
+ module React
2
+ module ReduxComponent
3
+ module Reducers
4
+ def self.add_component_reducers_to_store
5
+ component_reducer = Redux.create_reducer do |prev_state, action|
6
+ case action[:type]
7
+ when 'COMPONENT_STATE'
8
+ new_state = {}.merge!(prev_state) # make a copy of state
9
+ new_state[action[:object_id]] = {} unless new_state.has_key?(action[:object_id])
10
+ new_state[action[:object_id]].merge!(action[:name] => action[:value])
11
+ new_state
12
+ when 'INIT'
13
+ new_state = {}
14
+ new_state
15
+ else
16
+ prev_state
17
+ end
18
+ end
19
+
20
+ component_class_reducer = Redux.create_reducer do |prev_state, action|
21
+ case action[:type]
22
+ when 'COMPONENT_CLASS_STATE'
23
+ new_state = {}.merge!(prev_state) # make a copy of state
24
+ new_state[action[:class]] = {} unless new_state.has_key?(action[:class])
25
+ new_state[action[:class]].merge!(action[:name] => action[:value])
26
+ new_state
27
+ when 'INIT'
28
+ new_state = {}
29
+ new_state
30
+ else
31
+ prev_state
32
+ end
33
+ end
34
+
35
+ app_reducer = Redux.create_reducer do |prev_state, action|
36
+ case action[:type]
37
+ when 'APPLICATION_STATE'
38
+ new_state = {}.merge!(prev_state) # make a copy of state
39
+ new_state.merge!(action[:name] => action[:value])
40
+ new_state
41
+ when 'INIT'
42
+ new_state = {}
43
+ new_state
44
+ else
45
+ prev_state
46
+ end
47
+ end
48
+
49
+ Redux::Store.add_reducers(component_state: component_reducer, component_class_state: component_class_reducer, application_state: app_reducer)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,19 @@
1
+ module React
2
+ class Ref
3
+ include ::Native::Wrapper
4
+
5
+ def initialize(native_ref)
6
+ @native = native_ref
7
+ end
8
+
9
+ def current
10
+ %x{
11
+ if (typeof #@native.current.__ruby_instance != undefined) {
12
+ return #@native.current.__ruby_instance;
13
+ } else {
14
+ #@native.current;
15
+ }
16
+ }
17
+ end
18
+ end
19
+ end
@@ -0,0 +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::Event::Target.convert(@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::Event::Target.convert(@native.JS[:relatedTarget])
47
+ end
48
+
49
+ def target
50
+ Browser::Event::Target.convert(@native.JS[:target])
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,3 @@
1
+ module React
2
+ VERSION = '16.5.1'
3
+ end
@@ -0,0 +1,31 @@
1
+ module ReactDOM
2
+ def create_portal
3
+
4
+ end
5
+
6
+ def find_dom_node
7
+
8
+ end
9
+
10
+ def hydrate
11
+
12
+ end
13
+
14
+ def self.render(native_element, container, &block)
15
+ `Opal.React.render_buffer.push([]);`
16
+
17
+ result = if block_given?
18
+ `ReactDOM.render(native_element, container, function() { block.$call() })`
19
+ else
20
+ `ReactDOM.render(native_element, container)`
21
+ end
22
+
23
+ `Opal.React.render_buffer.pop([])`
24
+
25
+ result
26
+ end
27
+
28
+ def unmount_component_at_node
29
+
30
+ end
31
+ end
@@ -0,0 +1,17 @@
1
+ module ReactDOMServer
2
+ def render_to_string
3
+
4
+ end
5
+
6
+ def render_to_static_markup
7
+
8
+ end
9
+
10
+ def render_to_node_stream
11
+
12
+ end
13
+
14
+ def render_to_static_node_stream
15
+
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: isomorfeus-react
3
+ version: !ruby/object:Gem::Version
4
+ version: 16.5.1
5
+ platform: ruby
6
+ authors:
7
+ - Jan Biedermann
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-10-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: opal
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.11.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 0.12.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.11.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 0.12.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: opal-activesupport
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 0.3.1
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.3.1
47
+ - !ruby/object:Gem::Dependency
48
+ name: opal-browser
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 0.2.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 0.2.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: isomorfeus-redux
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 4.0.0
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 4.0.0
75
+ description: Write React Components in Ruby.
76
+ email:
77
+ - jan@kursator.com
78
+ executables: []
79
+ extensions: []
80
+ extra_rdoc_files: []
81
+ files:
82
+ - Gemfile
83
+ - README.md
84
+ - isomorfeus-react.gemspec
85
+ - lib/isomorfeus-react.rb
86
+ - lib/isomorfeus/config.rb
87
+ - lib/isomorfeus/top_level.rb
88
+ - lib/isomorfeus/view_helpers.rb
89
+ - lib/lucid_app/api.rb
90
+ - lib/lucid_app/base.rb
91
+ - lib/lucid_app/context.rb
92
+ - lib/lucid_app/mixin.rb
93
+ - lib/lucid_app/native_component_constructor.rb
94
+ - lib/lucid_component/api.rb
95
+ - lib/lucid_component/base.rb
96
+ - lib/lucid_component/event_handler.rb
97
+ - lib/lucid_component/initializer.rb
98
+ - lib/lucid_component/mixin.rb
99
+ - lib/lucid_component/native_component_constructor.rb
100
+ - lib/react.rb
101
+ - lib/react/active_support_support.rb
102
+ - lib/react/component/api.rb
103
+ - lib/react/component/base.rb
104
+ - lib/react/component/elements.rb
105
+ - lib/react/component/event_handler.rb
106
+ - lib/react/component/features.rb
107
+ - lib/react/component/history.rb
108
+ - lib/react/component/initializer.rb
109
+ - lib/react/component/location.rb
110
+ - lib/react/component/match.rb
111
+ - lib/react/component/mixin.rb
112
+ - lib/react/component/native_component_constructor.rb
113
+ - lib/react/component/native_component_validate_prop.rb
114
+ - lib/react/component/props.rb
115
+ - lib/react/component/resolution.rb
116
+ - lib/react/component/should_component_update.rb
117
+ - lib/react/component/state.rb
118
+ - lib/react/component/unsafe_api.rb
119
+ - lib/react/context_wrapper.rb
120
+ - lib/react/function_component/creator.rb
121
+ - lib/react/function_component/resolution.rb
122
+ - lib/react/function_component/runner.rb
123
+ - lib/react/native_constant_wrapper.rb
124
+ - lib/react/pure_component/base.rb
125
+ - lib/react/pure_component/mixin.rb
126
+ - lib/react/redux_component/api.rb
127
+ - lib/react/redux_component/app_store_defaults.rb
128
+ - lib/react/redux_component/app_store_proxy.rb
129
+ - lib/react/redux_component/base.rb
130
+ - lib/react/redux_component/class_store_proxy.rb
131
+ - lib/react/redux_component/component_class_store_defaults.rb
132
+ - lib/react/redux_component/component_instance_store_defaults.rb
133
+ - lib/react/redux_component/initializer.rb
134
+ - lib/react/redux_component/instance_store_proxy.rb
135
+ - lib/react/redux_component/mixin.rb
136
+ - lib/react/redux_component/native_component_constructor.rb
137
+ - lib/react/redux_component/reducers.rb
138
+ - lib/react/ref.rb
139
+ - lib/react/synthetic_event.rb
140
+ - lib/react/version.rb
141
+ - lib/react_dom.rb
142
+ - lib/react_dom_server.rb
143
+ homepage: http://isomorfeus.com
144
+ licenses:
145
+ - MIT
146
+ metadata: {}
147
+ post_install_message:
148
+ rdoc_options: []
149
+ require_paths:
150
+ - lib
151
+ required_ruby_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ required_rubygems_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ requirements: []
162
+ rubyforge_project:
163
+ rubygems_version: 2.7.6
164
+ signing_key:
165
+ specification_version: 4
166
+ summary: React for Opal Ruby.
167
+ test_files: []