reactrb 0.7.42

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 (173) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +6 -0
  3. data/.gitignore +33 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE +19 -0
  7. data/README.md +117 -0
  8. data/Rakefile +28 -0
  9. data/config.ru +16 -0
  10. data/example/examples/Gemfile +7 -0
  11. data/example/examples/app/basics.js.rb +42 -0
  12. data/example/examples/app/items.rb +11 -0
  13. data/example/examples/app/jquery.js +5 -0
  14. data/example/examples/app/nodes.rb +61 -0
  15. data/example/examples/app/react-router.js +6 -0
  16. data/example/examples/app/react_api_demo.rb +29 -0
  17. data/example/examples/app/rerendering.rb +72 -0
  18. data/example/examples/app/reuse.rb +59 -0
  19. data/example/examples/app/show.rb +52 -0
  20. data/example/examples/config.ru +38 -0
  21. data/example/rails-tutorial/.gitignore +17 -0
  22. data/example/rails-tutorial/Gemfile +51 -0
  23. data/example/rails-tutorial/README.rdoc +28 -0
  24. data/example/rails-tutorial/Rakefile +6 -0
  25. data/example/rails-tutorial/app/assets/images/.keep +0 -0
  26. data/example/rails-tutorial/app/assets/javascripts/application.rb +15 -0
  27. data/example/rails-tutorial/app/assets/stylesheets/application.css +15 -0
  28. data/example/rails-tutorial/app/controllers/application_controller.rb +6 -0
  29. data/example/rails-tutorial/app/controllers/concerns/.keep +0 -0
  30. data/example/rails-tutorial/app/controllers/home_controller.rb +6 -0
  31. data/example/rails-tutorial/app/helpers/application_helper.rb +2 -0
  32. data/example/rails-tutorial/app/mailers/.keep +0 -0
  33. data/example/rails-tutorial/app/models/.keep +0 -0
  34. data/example/rails-tutorial/app/models/concerns/.keep +0 -0
  35. data/example/rails-tutorial/app/views/components.rb +3 -0
  36. data/example/rails-tutorial/app/views/components/home/show.rb +47 -0
  37. data/example/rails-tutorial/app/views/layouts/application.html.erb +14 -0
  38. data/example/rails-tutorial/bin/bundle +3 -0
  39. data/example/rails-tutorial/bin/rails +8 -0
  40. data/example/rails-tutorial/bin/rake +8 -0
  41. data/example/rails-tutorial/bin/setup +29 -0
  42. data/example/rails-tutorial/bin/spring +15 -0
  43. data/example/rails-tutorial/config.ru +4 -0
  44. data/example/rails-tutorial/config/application.rb +26 -0
  45. data/example/rails-tutorial/config/boot.rb +3 -0
  46. data/example/rails-tutorial/config/database.yml +25 -0
  47. data/example/rails-tutorial/config/environment.rb +5 -0
  48. data/example/rails-tutorial/config/environments/development.rb +41 -0
  49. data/example/rails-tutorial/config/environments/production.rb +79 -0
  50. data/example/rails-tutorial/config/environments/test.rb +42 -0
  51. data/example/rails-tutorial/config/initializers/assets.rb +11 -0
  52. data/example/rails-tutorial/config/initializers/backtrace_silencers.rb +7 -0
  53. data/example/rails-tutorial/config/initializers/cookies_serializer.rb +3 -0
  54. data/example/rails-tutorial/config/initializers/filter_parameter_logging.rb +4 -0
  55. data/example/rails-tutorial/config/initializers/inflections.rb +16 -0
  56. data/example/rails-tutorial/config/initializers/mime_types.rb +4 -0
  57. data/example/rails-tutorial/config/initializers/session_store.rb +3 -0
  58. data/example/rails-tutorial/config/initializers/wrap_parameters.rb +14 -0
  59. data/example/rails-tutorial/config/locales/en.yml +23 -0
  60. data/example/rails-tutorial/config/routes.rb +59 -0
  61. data/example/rails-tutorial/config/secrets.yml +22 -0
  62. data/example/rails-tutorial/db/seeds.rb +7 -0
  63. data/example/rails-tutorial/lib/assets/.keep +0 -0
  64. data/example/rails-tutorial/lib/tasks/.keep +0 -0
  65. data/example/rails-tutorial/log/.keep +0 -0
  66. data/example/rails-tutorial/public/404.html +67 -0
  67. data/example/rails-tutorial/public/422.html +67 -0
  68. data/example/rails-tutorial/public/500.html +66 -0
  69. data/example/rails-tutorial/public/favicon.ico +0 -0
  70. data/example/rails-tutorial/public/robots.txt +5 -0
  71. data/example/rails-tutorial/test/controllers/.keep +0 -0
  72. data/example/rails-tutorial/test/fixtures/.keep +0 -0
  73. data/example/rails-tutorial/test/helpers/.keep +0 -0
  74. data/example/rails-tutorial/test/integration/.keep +0 -0
  75. data/example/rails-tutorial/test/mailers/.keep +0 -0
  76. data/example/rails-tutorial/test/models/.keep +0 -0
  77. data/example/rails-tutorial/test/test_helper.rb +10 -0
  78. data/example/rails-tutorial/vendor/assets/javascripts/.keep +0 -0
  79. data/example/rails-tutorial/vendor/assets/stylesheets/.keep +0 -0
  80. data/example/sinatra-tutorial/.DS_Store +0 -0
  81. data/example/sinatra-tutorial/Gemfile +5 -0
  82. data/example/sinatra-tutorial/README.md +8 -0
  83. data/example/sinatra-tutorial/_comments.json +42 -0
  84. data/example/sinatra-tutorial/app/example.rb +290 -0
  85. data/example/sinatra-tutorial/app/jquery.js +5 -0
  86. data/example/sinatra-tutorial/config.ru +58 -0
  87. data/example/sinatra-tutorial/public/base.css +62 -0
  88. data/example/todos/Gemfile +11 -0
  89. data/example/todos/README.md +37 -0
  90. data/example/todos/Rakefile +8 -0
  91. data/example/todos/app/application.rb +22 -0
  92. data/example/todos/app/components/app.react.rb +61 -0
  93. data/example/todos/app/components/footer.react.rb +31 -0
  94. data/example/todos/app/components/todo_item.react.rb +46 -0
  95. data/example/todos/app/components/todo_list.react.rb +25 -0
  96. data/example/todos/app/models/todo.rb +19 -0
  97. data/example/todos/config.ru +14 -0
  98. data/example/todos/index.html.haml +16 -0
  99. data/example/todos/spec/todo_spec.rb +28 -0
  100. data/example/todos/vendor/base.css +410 -0
  101. data/example/todos/vendor/bg.png +0 -0
  102. data/example/todos/vendor/jquery.js +4 -0
  103. data/lib/generators/reactive_ruby/test_app/templates/assets/javascripts/components.rb +4 -0
  104. data/lib/generators/reactive_ruby/test_app/templates/assets/javascripts/test_application.rb +2 -0
  105. data/lib/generators/reactive_ruby/test_app/templates/boot.rb.erb +6 -0
  106. data/lib/generators/reactive_ruby/test_app/templates/script/rails +5 -0
  107. data/lib/generators/reactive_ruby/test_app/templates/test_application.rb.erb +13 -0
  108. data/lib/generators/reactive_ruby/test_app/templates/views/components/hello_world.rb +11 -0
  109. data/lib/generators/reactive_ruby/test_app/templates/views/components/todo.rb +14 -0
  110. data/lib/generators/reactive_ruby/test_app/test_app_generator.rb +105 -0
  111. data/lib/rails-helpers/top_level_rails_component.rb +54 -0
  112. data/lib/react/api.rb +127 -0
  113. data/lib/react/callbacks.rb +42 -0
  114. data/lib/react/component.rb +269 -0
  115. data/lib/react/component/api.rb +50 -0
  116. data/lib/react/component/base.rb +9 -0
  117. data/lib/react/component/class_methods.rb +190 -0
  118. data/lib/react/component/props_wrapper.rb +82 -0
  119. data/lib/react/element.rb +77 -0
  120. data/lib/react/event.rb +76 -0
  121. data/lib/react/ext/hash.rb +9 -0
  122. data/lib/react/ext/string.rb +8 -0
  123. data/lib/react/native_library.rb +53 -0
  124. data/lib/react/observable.rb +29 -0
  125. data/lib/react/rendering_context.rb +109 -0
  126. data/lib/react/state.rb +140 -0
  127. data/lib/react/top_level.rb +97 -0
  128. data/lib/react/validator.rb +136 -0
  129. data/lib/reactive-ruby/component_loader.rb +45 -0
  130. data/lib/reactive-ruby/isomorphic_helpers.rb +196 -0
  131. data/lib/reactive-ruby/rails.rb +7 -0
  132. data/lib/reactive-ruby/rails/component_mount.rb +44 -0
  133. data/lib/reactive-ruby/rails/controller_helper.rb +13 -0
  134. data/lib/reactive-ruby/rails/railtie.rb +14 -0
  135. data/lib/reactive-ruby/serializers.rb +15 -0
  136. data/lib/reactive-ruby/server_rendering/contextual_renderer.rb +42 -0
  137. data/lib/reactive-ruby/version.rb +3 -0
  138. data/lib/reactrb.rb +50 -0
  139. data/lib/sources/react-latest.js +21167 -0
  140. data/lib/sources/react-v13.js +21642 -0
  141. data/lib/sources/react-v14.js +20818 -0
  142. data/lib/sources/react-v15.js +21167 -0
  143. data/logo1.png +0 -0
  144. data/logo2.png +0 -0
  145. data/logo3.png +0 -0
  146. data/path_release_steps.md +9 -0
  147. data/reactrb.gemspec +43 -0
  148. data/spec/controller_helper_spec.rb +22 -0
  149. data/spec/index.html.erb +12 -0
  150. data/spec/react/callbacks_spec.rb +106 -0
  151. data/spec/react/component/base_spec.rb +36 -0
  152. data/spec/react/component_spec.rb +721 -0
  153. data/spec/react/dsl_spec.rb +161 -0
  154. data/spec/react/element_spec.rb +47 -0
  155. data/spec/react/event_spec.rb +24 -0
  156. data/spec/react/native_library_spec.rb +10 -0
  157. data/spec/react/observable_spec.rb +7 -0
  158. data/spec/react/param_declaration_spec.rb +286 -0
  159. data/spec/react/react_spec.rb +211 -0
  160. data/spec/react/state_spec.rb +26 -0
  161. data/spec/react/top_level_component_spec.rb +68 -0
  162. data/spec/react/tutorial/tutorial_spec.rb +35 -0
  163. data/spec/react/validator_spec.rb +128 -0
  164. data/spec/reactive-ruby/component_loader_spec.rb +68 -0
  165. data/spec/reactive-ruby/isomorphic_helpers_spec.rb +155 -0
  166. data/spec/reactive-ruby/rails/asset_pipeline_spec.rb +9 -0
  167. data/spec/reactive-ruby/rails/component_mount_spec.rb +66 -0
  168. data/spec/reactive-ruby/server_rendering/contextual_renderer_spec.rb +35 -0
  169. data/spec/spec_helper.rb +109 -0
  170. data/spec/support/react/spec_helpers.rb +57 -0
  171. data/spec/vendor/es5-shim.min.js +6 -0
  172. data/spec/vendor/jquery-2.2.4.min.js +4 -0
  173. metadata +441 -0
@@ -0,0 +1,50 @@
1
+ module React
2
+ module Component
3
+ module API
4
+ def dom_node
5
+ if !(`typeof ReactDOM === 'undefined' || typeof ReactDOM.findDOMNode === 'undefined'`)
6
+ `ReactDOM.findDOMNode(#{self}.native)` # v0.14.0
7
+ elsif !(`typeof React.findDOMNode === 'undefined'`)
8
+ `React.findDOMNode(#{self}.native)` # v0.13.0
9
+ else
10
+ `#{self}.native.getDOMNode` # v0.12.0
11
+ end
12
+ end
13
+
14
+ def mounted?
15
+ `#{self}.native.isMounted()`
16
+ end
17
+
18
+ def force_update!
19
+ `#{self}.native.forceUpdate()`
20
+ end
21
+
22
+ def set_props(prop, &block)
23
+ set_or_replace_state_or_prop(prop, 'setProps', &block)
24
+ end
25
+
26
+ def set_props!(prop, &block)
27
+ set_or_replace_state_or_prop(prop, 'replaceProps', &block)
28
+ end
29
+
30
+ def set_state(state, &block)
31
+ set_or_replace_state_or_prop(state, 'setState', &block)
32
+ end
33
+
34
+ def set_state!(state, &block)
35
+ set_or_replace_state_or_prop(state, 'replaceState', &block)
36
+ end
37
+
38
+ private
39
+
40
+ def set_or_replace_state_or_prop(state_or_prop, method, &block)
41
+ raise "No native ReactComponent associated" unless @native
42
+ %x{
43
+ #{@native}[#{method}](#{state_or_prop.shallow_to_n}, function(){
44
+ #{block.call if block}
45
+ });
46
+ }
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,9 @@
1
+ module React
2
+ module Component
3
+ class Base
4
+ def self.inherited(child)
5
+ child.include(Component)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,190 @@
1
+ module React
2
+ module Component
3
+ module ClassMethods
4
+ def backtrace(*args)
5
+ @backtrace_off = (args[0] == :off)
6
+ end
7
+
8
+ def process_exception(e, component, reraise = nil)
9
+ message = ["Exception raised while rendering #{component}"]
10
+ if e.backtrace && e.backtrace.length > 1 && !@backtrace_off # seems like e.backtrace is empty in safari???
11
+ message << " #{e.backtrace[0]}"
12
+ message += e.backtrace[1..-1].collect { |line| line }
13
+ else
14
+ message[0] += ": #{e.message}"
15
+ end
16
+ message = message.join("\n")
17
+ `console.error(message)`
18
+ raise e if reraise
19
+ end
20
+
21
+ def deprecation_warning(message)
22
+ @deprecation_messages ||= []
23
+ message = "Warning: Deprecated feature used in #{self.name}. #{message}"
24
+ unless @deprecation_messages.include? message
25
+ @deprecation_messages << message
26
+ IsomorphicHelpers.log message, :warning
27
+ end
28
+ end
29
+
30
+ def validator
31
+ @validator ||= Validator.new(self)
32
+ end
33
+
34
+ def prop_types
35
+ if self.validator
36
+ {
37
+ _componentValidator: %x{
38
+ function(props, propName, componentName) {
39
+ var errors = #{validator.validate(Hash.new(`props`))};
40
+ var error = new Error(#{"In component `" + self.name + "`\n" + `errors`.join("\n")});
41
+ return #{`errors`.count > 0 ? `error` : `undefined`};
42
+ }
43
+ }
44
+ }
45
+ else
46
+ {}
47
+ end
48
+ end
49
+
50
+ def default_props
51
+ validator.default_props
52
+ end
53
+
54
+ def params(&block)
55
+ validator.build(&block)
56
+ end
57
+
58
+ def props_wrapper
59
+ @props_wrapper ||= Class.new(PropsWrapper)
60
+ end
61
+
62
+ def define_param(name, param_type)
63
+ props_wrapper.define_param(name, param_type, self)
64
+ end
65
+
66
+ def param(*args)
67
+ if args[0].is_a? Hash
68
+ options = args[0]
69
+ name = options.first[0]
70
+ default = options.first[1]
71
+ options.delete(name)
72
+ options.merge!({default: default})
73
+ else
74
+ name = args[0]
75
+ options = args[1] || {}
76
+ end
77
+ if options[:default]
78
+ validator.optional(name, options)
79
+ else
80
+ validator.requires(name, options)
81
+ end
82
+ end
83
+
84
+ def required_param(name, options = {})
85
+ deprecation_warning "`required_param` is deprecated, use `param` instead."
86
+ validator.requires(name, options)
87
+ end
88
+
89
+ alias_method :require_param, :required_param
90
+
91
+ def optional_param(name, options = {})
92
+ deprecation_warning "`optional_param` is deprecated, use `param param_name: default_value` instead."
93
+ validator.optional(name, options)
94
+ end
95
+
96
+ def collect_other_params_as(name)
97
+ validator.allow_undefined_props = true
98
+ define_method(name) do
99
+ @_all_others ||= self.class.validator.undefined_props(props)
100
+ end
101
+
102
+ validator_in_lexial_scope = validator
103
+ props_wrapper.define_method(name) do
104
+ @_all_others ||= validator_in_lexial_scope.undefined_props(props)
105
+ end
106
+ end
107
+
108
+ def define_state(*states, &block)
109
+ default_initial_value = (block && block.arity == 0) ? yield : nil
110
+ states_hash = (states.last.is_a?(Hash)) ? states.pop : {}
111
+ states.each { |name| states_hash[name] = default_initial_value }
112
+ (self.initial_state ||= {}).merge! states_hash
113
+ states_hash.each do |name, initial_value|
114
+ define_state_methods(self, name, &block)
115
+ end
116
+ end
117
+
118
+ def export_state(*states, &block)
119
+ default_initial_value = (block && block.arity == 0) ? yield : nil
120
+ states_hash = (states.last.is_a?(Hash)) ? states.pop : {}
121
+ states.each { |name| states_hash[name] = default_initial_value }
122
+ State.initialize_states(self, states_hash)
123
+ states_hash.each do |name, initial_value|
124
+ define_state_methods(self, name, self, &block)
125
+ define_state_methods(singleton_class, name, self, &block)
126
+ end
127
+ end
128
+
129
+ def define_state_methods(this, name, from = nil, &block)
130
+ this.define_method("#{name}") do
131
+ self.class.deprecation_warning "Direct access to state `#{name}`. Use `state.#{name}` instead." if from.nil? || from == this
132
+ State.get_state(from || self, name)
133
+ end
134
+ this.define_method("#{name}=") do |new_state|
135
+ self.class.deprecation_warning "Direct assignment to state `#{name}`. Use `#{(from && from != this) ? from : 'state'}.#{name}!` instead."
136
+ yield name, State.get_state(from || self, name), new_state if block && block.arity > 0
137
+ State.set_state(from || self, name, new_state)
138
+ end
139
+ this.define_method("#{name}!") do |*args|
140
+ self.class.deprecation_warning "Direct access to state `#{name}`. Use `state.#{name}` instead." if from.nil? or from == this
141
+ if args.count > 0
142
+ yield name, State.get_state(from || self, name), args[0] if block && block.arity > 0
143
+ current_value = State.get_state(from || self, name)
144
+ State.set_state(from || self, name, args[0])
145
+ current_value
146
+ else
147
+ current_state = State.get_state(from || self, name)
148
+ yield name, State.get_state(from || self, name), current_state if block && block.arity > 0
149
+ State.set_state(from || self, name, current_state)
150
+ Observable.new(current_state) do |update|
151
+ yield name, State.get_state(from || self, name), update if block && block.arity > 0
152
+ State.set_state(from || self, name, update)
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ def native_mixin(item)
159
+ native_mixins << item
160
+ end
161
+
162
+ def native_mixins
163
+ @native_mixins ||= []
164
+ end
165
+
166
+ def static_call_back(name, &block)
167
+ static_call_backs[name] = block
168
+ end
169
+
170
+ def static_call_backs
171
+ @static_call_backs ||= {}
172
+ end
173
+
174
+ def export_component(opts = {})
175
+ export_name = (opts[:as] || name).split("::")
176
+ first_name = export_name.first
177
+ Native(`window`)[first_name] = add_item_to_tree(Native(`window`)[first_name], [React::API.create_native_react_class(self)] + export_name[1..-1].reverse).to_n
178
+ end
179
+
180
+ def add_item_to_tree(current_tree, new_item)
181
+ if Native(current_tree).class != Native::Object || new_item.length == 1
182
+ new_item.inject { |memo, sub_name| { sub_name => memo } }
183
+ else
184
+ Native(current_tree)[new_item.last] = add_item_to_tree(Native(current_tree)[new_item.last], new_item[0..-2])
185
+ current_tree
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,82 @@
1
+ module React
2
+ module Component
3
+ class PropsWrapper
4
+ attr_reader :props
5
+
6
+ def self.define_param(name, param_type, owner)
7
+ owner.define_method("#{name}") do |*args, &block|
8
+ deprecated_params_method("#{name}", *args, &block)
9
+ end
10
+ if param_type == Observable
11
+ owner.define_method("#{name}!") do |*args|
12
+ deprecated_params_method("#{name}!", *args)
13
+ end
14
+ define_method("#{name}") do
15
+ value_for(name)
16
+ end
17
+ define_method("#{name}!") do |*args|
18
+ current_value = value_for(name)
19
+ if args.count > 0
20
+ props[name].call args[0]
21
+ current_value
22
+ else
23
+ # rescue in case we in middle of render... What happens during a
24
+ # render that causes exception?
25
+ # Where does `dont_update_state` come from?
26
+ props[name].call current_value unless @dont_update_state rescue nil
27
+ props[name]
28
+ end
29
+ end
30
+ elsif param_type == Proc
31
+ define_method("#{name}") do |*args, &block|
32
+ props[name].call(*args, &block) if props[name]
33
+ end
34
+ else
35
+ define_method("#{name}") do
36
+ if @processed_params.has_key? name
37
+ @processed_params[name]
38
+ else
39
+ @processed_params[name] = if param_type.respond_to? :_react_param_conversion
40
+ param_type._react_param_conversion props[name]
41
+ elsif param_type.is_a?(Array) &&
42
+ param_type[0].respond_to?(:_react_param_conversion)
43
+ props[name].collect do |param|
44
+ param_type[0]._react_param_conversion param
45
+ end
46
+ else
47
+ props[name]
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def unchanged_processed_params(new_props)
55
+ Hash[
56
+ *@processed_params.collect do |key, value|
57
+ [key, value] if @props[key].equal? new_props[key] # `#{@props[key]} == #{new_props[key]}`
58
+ end.compact.flatten(1)
59
+ ]
60
+ end
61
+
62
+ def initialize(props, current_props_wrapper=nil)
63
+ @props = props || {}
64
+ @processed_params = if current_props_wrapper
65
+ current_props_wrapper.unchanged_processed_params(props)
66
+ else
67
+ {}
68
+ end
69
+ end
70
+
71
+ def [](prop)
72
+ props[prop]
73
+ end
74
+
75
+ private
76
+
77
+ def value_for(name)
78
+ self[name].instance_variable_get("@value") if self[name]
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,77 @@
1
+ require 'react/ext/string'
2
+
3
+ module React
4
+ class Element
5
+ include Native
6
+
7
+ alias_native :element_type, :type
8
+ alias_native :props, :props
9
+
10
+ attr_reader :type
11
+ attr_reader :properties
12
+ attr_reader :block
13
+
14
+ attr_accessor :waiting_on_resources
15
+
16
+ def initialize(native_element, type, properties, block)
17
+ @type = type
18
+ @properties = (`typeof #{properties} === 'undefined'` ? nil : properties) || {}
19
+ @block = block
20
+ @native = native_element
21
+ end
22
+
23
+ def on(event_name)
24
+ name = event_name.to_s.event_camelize
25
+ props = if React::Event::BUILT_IN_EVENTS.include?("on#{name}")
26
+ {"on#{name}" => %x{
27
+ function(event){
28
+ #{yield React::Event.new(`event`)}
29
+ }
30
+ }}
31
+ else
32
+ {"_on#{name}" => %x{
33
+ function(){
34
+ #{yield *Array(`arguments`)}
35
+ }
36
+ }}
37
+ end
38
+ @native = `React.cloneElement(#{self.to_n}, #{props.to_n})`
39
+ @properties.merge! props
40
+ self
41
+ end
42
+
43
+ def render(props = {}) # for rendering children
44
+ if props.empty?
45
+ React::RenderingContext.render(self)
46
+ else
47
+ React::RenderingContext.render(
48
+ Element.new(
49
+ `React.cloneElement(#{self.to_n}, #{API.convert_props(props)})`,
50
+ type,
51
+ properties.merge(props),
52
+ block
53
+ )
54
+ )
55
+ end
56
+ end
57
+
58
+ def method_missing(class_name, args = {}, &new_block)
59
+ class_name = class_name.split("__").collect { |s| s.gsub("_", "-") }.join("_")
60
+ new_props = properties.dup
61
+ new_props["class"] = "#{new_props['class']} #{class_name} #{args.delete("class")} #{args.delete('className')}".split(" ").uniq.join(" ")
62
+ new_props.merge! args
63
+ React::RenderingContext.replace(
64
+ self,
65
+ React::RenderingContext.build { React::RenderingContext.render(type, new_props, &new_block) }
66
+ )
67
+ end
68
+
69
+ def as_node
70
+ React::RenderingContext.as_node(self)
71
+ end
72
+
73
+ def delete
74
+ React::RenderingContext.delete(self)
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,76 @@
1
+ module React
2
+ class Event
3
+ include Native
4
+ alias_native :bubbles, :bubbles
5
+ alias_native :cancelable, :cancelable
6
+ alias_native :current_target, :currentTarget
7
+ alias_native :default_prevented, :defaultPrevented
8
+ alias_native :event_phase, :eventPhase
9
+ alias_native :is_trusted?, :isTrusted
10
+ alias_native :native_event, :nativeEvent
11
+ alias_native :target, :target
12
+ alias_native :timestamp, :timeStamp
13
+ alias_native :event_type, :type
14
+ alias_native :prevent_default, :preventDefault
15
+ alias_native :stop_propagation, :stopPropagation
16
+ # Clipboard
17
+ alias_native :clipboard_data, :clipboardData
18
+ # Keyboard
19
+ alias_native :alt_key, :altKey
20
+ alias_native :char_code, :charCode
21
+ alias_native :ctrl_key, :ctrlKey
22
+ alias_native :get_modifier_state, :getModifierState
23
+ alias_native :key, :key
24
+ alias_native :key_code, :keyCode
25
+ alias_native :locale, :locale
26
+ alias_native :location, :location
27
+ alias_native :meta_key, :metaKey
28
+ alias_native :repeat, :repeat
29
+ alias_native :shift_key, :shiftKey
30
+ alias_native :which, :which
31
+ # Focus
32
+ alias_native :related_target, :relatedTarget
33
+ # Mouse
34
+ alias_native :alt_key, :altKey
35
+ alias_native :button, :button
36
+ alias_native :buttons, :buttons
37
+ alias_native :client_x, :clientX
38
+ alias_native :client_y, :clientY
39
+ alias_native :ctrl_key, :ctrlKey
40
+ alias_native :get_modifier_state, :getModifierState
41
+ alias_native :meta_key, :metaKey
42
+ alias_native :page_x, :pageX
43
+ alias_native :page_y, :pageY
44
+ alias_native :related_target, :relatedTarget
45
+ alias_native :screen_x, :screen_x
46
+ alias_native :screen_y, :screen_y
47
+ alias_native :shift_key, :shift_key
48
+ # Touch
49
+ alias_native :alt_key, :altKey
50
+ alias_native :changed_touches, :changedTouches
51
+ alias_native :ctrl_key, :ctrlKey
52
+ alias_native :get_modifier_state, :getModifierState
53
+ alias_native :meta_key, :metaKey
54
+ alias_native :shift_key, :shiftKey
55
+ alias_native :target_touches, :targetTouches
56
+ alias_native :touches, :touches
57
+ # UI
58
+ alias_native :detail, :detail
59
+ alias_native :view, :view
60
+ # Wheel
61
+ alias_native :delta_mode, :deltaMode
62
+ alias_native :delta_x, :deltaX
63
+ alias_native :delta_y, :deltaY
64
+ alias_native :delta_z, :deltaZ
65
+
66
+ BUILT_IN_EVENTS = %w{onCopy onCut onPaste onKeyDown onKeyPress onKeyUp
67
+ onFocus onBlur onChange onInput onSubmit onClick onDoubleClick onDrag
68
+ onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop
69
+ onMouseDown onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver
70
+ onMouseUp onTouchCancel onTouchEnd onTouchMove onTouchStart onScroll}
71
+
72
+ def initialize(native_element)
73
+ @native = native_element
74
+ end
75
+ end
76
+ end