isomorfeus-react 16.10.0 → 16.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +64 -0
- data/lib/browser/delegate_native.rb +70 -0
- data/lib/browser/element.rb +176 -0
- data/lib/browser/element/canvas.rb +17 -0
- data/lib/browser/element/media.rb +78 -0
- data/lib/browser/event.rb +92 -0
- data/lib/browser/event_target.rb +39 -0
- data/lib/browser/file_list.rb +125 -0
- data/lib/browser/iterable.rb +15 -0
- data/lib/isomorfeus-react-material-ui.rb +10 -0
- data/lib/isomorfeus-react.rb +145 -0
- data/lib/isomorfeus/config.rb +130 -0
- data/lib/isomorfeus/props/validate_hash_proxy.rb +178 -0
- data/lib/isomorfeus/props/validator.rb +131 -0
- data/lib/isomorfeus/react_view_helper.rb +130 -0
- data/lib/isomorfeus/top_level.rb +86 -0
- data/lib/isomorfeus/top_level_ssr.rb +28 -0
- data/lib/lucid_app/api.rb +30 -0
- data/lib/lucid_app/base.rb +7 -0
- data/lib/lucid_app/context.rb +7 -0
- data/lib/lucid_app/mixin.rb +20 -0
- data/lib/lucid_app/native_component_constructor.rb +105 -0
- data/lib/lucid_component/app_store_defaults.rb +36 -0
- data/lib/lucid_component/app_store_proxy.rb +38 -0
- data/lib/lucid_component/base.rb +7 -0
- data/lib/lucid_component/class_store_proxy.rb +41 -0
- data/lib/lucid_component/component_class_store_defaults.rb +38 -0
- data/lib/lucid_component/component_instance_store_defaults.rb +35 -0
- data/lib/lucid_component/event_handler.rb +17 -0
- data/lib/lucid_component/initializer.rb +12 -0
- data/lib/lucid_component/instance_store_proxy.rb +45 -0
- data/lib/lucid_component/mixin.rb +18 -0
- data/lib/lucid_component/native_component_constructor.rb +116 -0
- data/lib/lucid_component/reducers.rb +48 -0
- data/lib/lucid_component/store_api.rb +38 -0
- data/lib/lucid_component/styles_support.rb +37 -0
- data/lib/lucid_material/app/base.rb +9 -0
- data/lib/lucid_material/app/mixin.rb +22 -0
- data/lib/lucid_material/app/native_component_constructor.rb +107 -0
- data/lib/lucid_material/component/base.rb +9 -0
- data/lib/lucid_material/component/mixin.rb +20 -0
- data/lib/lucid_material/component/native_component_constructor.rb +118 -0
- data/lib/lucid_prop_declaration/mixin.rb +91 -0
- data/lib/react.rb +195 -0
- data/lib/react/active_support_support.rb +13 -0
- data/lib/react/children.rb +35 -0
- data/lib/react/component/api.rb +80 -0
- data/lib/react/component/base.rb +9 -0
- data/lib/react/component/callbacks.rb +106 -0
- data/lib/react/component/elements.rb +60 -0
- data/lib/react/component/event_handler.rb +19 -0
- data/lib/react/component/features.rb +47 -0
- data/lib/react/component/history.rb +36 -0
- data/lib/react/component/initializer.rb +11 -0
- data/lib/react/component/location.rb +15 -0
- data/lib/react/component/match.rb +31 -0
- data/lib/react/component/mixin.rb +19 -0
- data/lib/react/component/native_component_constructor.rb +93 -0
- data/lib/react/component/props.rb +59 -0
- data/lib/react/component/resolution.rb +70 -0
- data/lib/react/component/should_component_update.rb +14 -0
- data/lib/react/component/state.rb +52 -0
- data/lib/react/component/styles.rb +27 -0
- data/lib/react/component/unsafe_api.rb +33 -0
- data/lib/react/context_wrapper.rb +46 -0
- data/lib/react/function_component/api.rb +63 -0
- data/lib/react/function_component/base.rb +9 -0
- data/lib/react/function_component/creator.rb +32 -0
- data/lib/react/function_component/event_handler.rb +13 -0
- data/lib/react/function_component/mixin.rb +14 -0
- data/lib/react/function_component/resolution.rb +62 -0
- data/lib/react/memo_component/base.rb +9 -0
- data/lib/react/memo_component/creator.rb +32 -0
- data/lib/react/memo_component/mixin.rb +14 -0
- data/lib/react/native_constant_wrapper.rb +26 -0
- data/lib/react/pure_component/base.rb +9 -0
- data/lib/react/pure_component/mixin.rb +18 -0
- data/lib/react/ref.rb +13 -0
- data/lib/react/synthetic_event.rb +53 -0
- data/lib/react/version.rb +3 -0
- data/lib/react_dom.rb +47 -0
- data/lib/react_dom_server.rb +19 -0
- metadata +84 -2
@@ -0,0 +1,39 @@
|
|
1
|
+
module Browser
|
2
|
+
module EventTarget
|
3
|
+
# Add the block as a handler for the specified event name. Will use either
|
4
|
+
# `addEventListener` or `addListener` if they exist.
|
5
|
+
#
|
6
|
+
# @param event_name [String] the name of the event
|
7
|
+
# @return [Proc] the block to pass to `off` to remove this handler
|
8
|
+
# @yieldparam event [Browser::Event] the event object
|
9
|
+
def on event_name, &block
|
10
|
+
wrapper = proc { |event| block.call Event.new(event) }
|
11
|
+
|
12
|
+
if `#@native.addEventListener !== undefined`
|
13
|
+
`#@native.addEventListener(event_name, wrapper)`
|
14
|
+
elsif `#@native.addListener !== undefined`
|
15
|
+
`#@native.addListener(event_name, wrapper)`
|
16
|
+
else
|
17
|
+
warn "[Browser] Not entirely sure how to add an event listener to #{self}"
|
18
|
+
end
|
19
|
+
|
20
|
+
wrapper
|
21
|
+
end
|
22
|
+
|
23
|
+
# Remove an event handler
|
24
|
+
#
|
25
|
+
# @param event_name [String] the name of the event
|
26
|
+
# @block the handler to remove, as returned from `on`
|
27
|
+
def off event_name, &block
|
28
|
+
if `#@native.removeEventListener !== undefined`
|
29
|
+
`#@native.removeEventListener(event_name, block)`
|
30
|
+
elsif `#@native.removeListener !== undefined`
|
31
|
+
`#@native.removeListener(event_name, block)`
|
32
|
+
else
|
33
|
+
warn "[Browser] Not entirely sure how to remove an event listener from #{self}"
|
34
|
+
end
|
35
|
+
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
module Browser
|
2
|
+
class FileList
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
# @param native [JS] the native FileList object to wrap
|
6
|
+
def initialize native
|
7
|
+
@native = `#{native} || []`
|
8
|
+
@files = length.times.each_with_object([]) { |index, array|
|
9
|
+
array[index] = File.new(`#@native[index]`)
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param index [Integer] the index of the file in the list
|
14
|
+
# @return [Browser::FileList::File] the file at the specified index
|
15
|
+
def [] index
|
16
|
+
@files[index]
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Integer] the number of files in this list
|
20
|
+
def length
|
21
|
+
`#@native.length`
|
22
|
+
end
|
23
|
+
alias size length
|
24
|
+
|
25
|
+
# Call the given block for each file in the list
|
26
|
+
#
|
27
|
+
# @yieldparam file [Browser::FileList::File]
|
28
|
+
def each &block
|
29
|
+
@files.each do |file|
|
30
|
+
block.call file
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Convert this FileList into an array
|
35
|
+
def to_a
|
36
|
+
@files.dup # Don't return a value that can mutate our internal state
|
37
|
+
end
|
38
|
+
alias to_ary to_a
|
39
|
+
|
40
|
+
# @return [String] a string representation of this FileList
|
41
|
+
def to_s
|
42
|
+
@files.to_s
|
43
|
+
end
|
44
|
+
|
45
|
+
# An individual item in a FileList
|
46
|
+
class File
|
47
|
+
attr_reader :data
|
48
|
+
|
49
|
+
# @param native [JS] the native File object to wrap
|
50
|
+
def initialize native
|
51
|
+
@native = native
|
52
|
+
@data = nil
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [String] the filename
|
56
|
+
def name
|
57
|
+
`#@native.name`
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return [Integer] the size of this file on disk
|
61
|
+
def size
|
62
|
+
`#@native.size`
|
63
|
+
end
|
64
|
+
|
65
|
+
# @return [String] the MIME type of the file, detected by the browser
|
66
|
+
def type
|
67
|
+
`#@native.type`
|
68
|
+
end
|
69
|
+
|
70
|
+
# @return [Time] the timestamp of the file
|
71
|
+
def last_modified
|
72
|
+
`#@native.lastModifiedDate`
|
73
|
+
end
|
74
|
+
|
75
|
+
# Read the file from disk into memory
|
76
|
+
#
|
77
|
+
# @return [Promise] a promise that resolves when finished loading and
|
78
|
+
# rejects if an error occurs while loading.
|
79
|
+
def read
|
80
|
+
promise = Promise.new
|
81
|
+
reader = FileReader.new
|
82
|
+
reader.on :load do
|
83
|
+
result = reader.result
|
84
|
+
|
85
|
+
@data = result
|
86
|
+
promise.resolve result
|
87
|
+
end
|
88
|
+
|
89
|
+
reader.on :error do
|
90
|
+
promise.reject reader.result
|
91
|
+
end
|
92
|
+
|
93
|
+
reader.read_as_binary_string self
|
94
|
+
|
95
|
+
promise
|
96
|
+
end
|
97
|
+
|
98
|
+
# Convert to the native object
|
99
|
+
#
|
100
|
+
# @return [JS.HTMLElement] the underlying native element
|
101
|
+
def to_n
|
102
|
+
@native
|
103
|
+
end
|
104
|
+
|
105
|
+
# The object that reads the file from disk.
|
106
|
+
#
|
107
|
+
# @api private
|
108
|
+
class FileReader
|
109
|
+
include EventTarget
|
110
|
+
|
111
|
+
def initialize
|
112
|
+
@native = `new FileReader()`
|
113
|
+
end
|
114
|
+
|
115
|
+
def result
|
116
|
+
`#@native.result`
|
117
|
+
end
|
118
|
+
|
119
|
+
def read_as_binary_string file
|
120
|
+
`#@native.readAsBinaryString(#{file.to_n})`
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'isomorfeus-react'
|
2
|
+
|
3
|
+
# LucidMaterial::Component
|
4
|
+
require 'lucid_material/component/native_component_constructor'
|
5
|
+
require 'lucid_material/component/mixin'
|
6
|
+
require 'lucid_material/component/base'
|
7
|
+
# LucidMaterial::App
|
8
|
+
require 'lucid_material/app/native_component_constructor'
|
9
|
+
require 'lucid_material/app/mixin'
|
10
|
+
require 'lucid_material/app/base'
|
@@ -0,0 +1,145 @@
|
|
1
|
+
if RUBY_ENGINE == 'opal'
|
2
|
+
require 'opal'
|
3
|
+
require 'opal-autoloader'
|
4
|
+
require 'native'
|
5
|
+
require 'promise'
|
6
|
+
require 'active_support/core_ext/string'
|
7
|
+
require 'react/active_support_support'
|
8
|
+
require 'isomorfeus-redux'
|
9
|
+
|
10
|
+
if Isomorfeus.on_browser?
|
11
|
+
require 'browser/event'
|
12
|
+
require 'browser/event_target'
|
13
|
+
require 'browser/delegate_native'
|
14
|
+
require 'browser/element'
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'isomorfeus/config'
|
18
|
+
|
19
|
+
# allow mounting of components
|
20
|
+
if Isomorfeus.on_browser?
|
21
|
+
require 'isomorfeus/top_level'
|
22
|
+
else
|
23
|
+
require 'isomorfeus/top_level_ssr'
|
24
|
+
end
|
25
|
+
|
26
|
+
# react
|
27
|
+
require 'react/version'
|
28
|
+
require 'react'
|
29
|
+
require 'react/synthetic_event'
|
30
|
+
require 'react/ref'
|
31
|
+
require 'react/children'
|
32
|
+
if Isomorfeus.on_browser?
|
33
|
+
require 'react_dom'
|
34
|
+
else
|
35
|
+
require 'react_dom_server'
|
36
|
+
end
|
37
|
+
|
38
|
+
# props
|
39
|
+
require 'isomorfeus/props/validate_hash_proxy'
|
40
|
+
require 'isomorfeus/props/validator'
|
41
|
+
require 'lucid_prop_declaration/mixin'
|
42
|
+
require 'react/component/props'
|
43
|
+
|
44
|
+
# HTML Elements support
|
45
|
+
require 'react/component/elements'
|
46
|
+
|
47
|
+
# React Features
|
48
|
+
require 'react/component/features'
|
49
|
+
require 'react/context_wrapper'
|
50
|
+
require 'react/native_constant_wrapper'
|
51
|
+
|
52
|
+
# Function Component
|
53
|
+
require 'react/function_component/resolution'
|
54
|
+
require 'react/function_component/api'
|
55
|
+
require 'react/function_component/event_handler'
|
56
|
+
require 'react/function_component/creator'
|
57
|
+
require 'react/function_component/mixin'
|
58
|
+
require 'react/function_component/base'
|
59
|
+
require 'react/memo_component/creator'
|
60
|
+
require 'react/memo_component/mixin'
|
61
|
+
require 'react/memo_component/base'
|
62
|
+
|
63
|
+
# React::Component
|
64
|
+
require 'react/component/api'
|
65
|
+
require 'react/component/callbacks'
|
66
|
+
# require 'react/component/unsafe_api'
|
67
|
+
require 'react/component/initializer'
|
68
|
+
require 'react/component/native_component_constructor'
|
69
|
+
require 'react/component/state'
|
70
|
+
require 'react/component/match'
|
71
|
+
require 'react/component/location'
|
72
|
+
require 'react/component/history'
|
73
|
+
require 'react/component/resolution'
|
74
|
+
require 'react/component/should_component_update'
|
75
|
+
require 'react/component/event_handler'
|
76
|
+
require 'react/component/styles'
|
77
|
+
require 'react/component/mixin'
|
78
|
+
require 'react/component/base'
|
79
|
+
|
80
|
+
# React::PureComponent
|
81
|
+
require 'react/pure_component/mixin'
|
82
|
+
require 'react/pure_component/base'
|
83
|
+
|
84
|
+
# init component reducers
|
85
|
+
require 'lucid_component/reducers'
|
86
|
+
LucidComponent::Reducers.add_component_reducers_to_store
|
87
|
+
|
88
|
+
# init LucidApplicationContext (Store Provider and Consumer)
|
89
|
+
require 'lucid_app/context'
|
90
|
+
LucidApp::Context.create_application_context
|
91
|
+
|
92
|
+
# LucidComponent
|
93
|
+
require 'lucid_component/styles_support'
|
94
|
+
require 'lucid_component/store_api'
|
95
|
+
require 'lucid_component/app_store_defaults'
|
96
|
+
require 'lucid_component/component_class_store_defaults'
|
97
|
+
require 'lucid_component/component_instance_store_defaults'
|
98
|
+
require 'lucid_component/app_store_proxy'
|
99
|
+
require 'lucid_component/class_store_proxy'
|
100
|
+
require 'lucid_component/instance_store_proxy'
|
101
|
+
require 'lucid_component/initializer'
|
102
|
+
require 'lucid_component/native_component_constructor'
|
103
|
+
require 'lucid_component/event_handler'
|
104
|
+
require 'lucid_component/mixin'
|
105
|
+
require 'lucid_component/base'
|
106
|
+
|
107
|
+
# LucidApp
|
108
|
+
require 'lucid_app/api'
|
109
|
+
require 'lucid_app/native_component_constructor'
|
110
|
+
require 'lucid_app/mixin'
|
111
|
+
require 'lucid_app/base'
|
112
|
+
|
113
|
+
Opal::Autoloader.add_load_path('components')
|
114
|
+
else
|
115
|
+
require 'oj'
|
116
|
+
require 'opal'
|
117
|
+
require 'opal-activesupport'
|
118
|
+
require 'opal-autoloader'
|
119
|
+
require 'isomorfeus-redux'
|
120
|
+
require 'isomorfeus-speednode'
|
121
|
+
require 'react/version'
|
122
|
+
require 'isomorfeus/config'
|
123
|
+
|
124
|
+
# props
|
125
|
+
require 'isomorfeus/props/validate_hash_proxy'
|
126
|
+
require 'isomorfeus/props/validator'
|
127
|
+
require 'lucid_prop_declaration/mixin'
|
128
|
+
|
129
|
+
Isomorfeus.env = ENV['RACK_ENV']
|
130
|
+
|
131
|
+
if Isomorfeus.production? || Isomorfeus.test?
|
132
|
+
Isomorfeus.server_side_rendering = true
|
133
|
+
else
|
134
|
+
Isomorfeus.server_side_rendering = false
|
135
|
+
end
|
136
|
+
|
137
|
+
require 'isomorfeus/execution_environment'
|
138
|
+
require 'isomorfeus/react_view_helper'
|
139
|
+
|
140
|
+
Opal.append_path(__dir__.untaint)
|
141
|
+
|
142
|
+
if Dir.exist?('isomorfeus')
|
143
|
+
Opal.append_path(File.expand_path('isomorfeus')) unless Opal.paths.include?(File.expand_path('isomorfeus'))
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
if RUBY_ENGINE == 'opal'
|
3
|
+
class << self
|
4
|
+
attr_accessor :initial_state_fetched
|
5
|
+
attr_accessor :top_component
|
6
|
+
attr_accessor :ssr_response_status
|
7
|
+
attr_reader :initialized
|
8
|
+
attr_reader :env
|
9
|
+
|
10
|
+
def init
|
11
|
+
return if initialized
|
12
|
+
@initialized = true
|
13
|
+
Isomorfeus.init_store
|
14
|
+
execute_init_classes
|
15
|
+
end
|
16
|
+
|
17
|
+
def force_init!
|
18
|
+
unless Isomorfeus.initial_state_fetched
|
19
|
+
Isomorfeus.initial_state_fetched = true
|
20
|
+
Redux::Store.preloaded_state = Isomorfeus.store.get_state
|
21
|
+
end
|
22
|
+
Isomorfeus.force_init_store!
|
23
|
+
execute_init_classes
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_client_init_class_name(init_class_name)
|
27
|
+
client_init_class_names << init_class_name
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_client_option(key, value = nil)
|
31
|
+
self.class.attr_accessor(key)
|
32
|
+
self.send("#{key}=", value)
|
33
|
+
end
|
34
|
+
|
35
|
+
# only used for SSR
|
36
|
+
def cached_component_classes
|
37
|
+
@cached_component_classes ||= {}
|
38
|
+
end
|
39
|
+
|
40
|
+
# only used for SSR
|
41
|
+
def cached_component_class(class_name)
|
42
|
+
return cached_component_classes[class_name] if cached_component_classes.key?(class_name)
|
43
|
+
cached_component_classes[class_name] = "::#{class_name}".constantize
|
44
|
+
end
|
45
|
+
|
46
|
+
def execute_init_classes
|
47
|
+
client_init_class_names.each do |constant|
|
48
|
+
constant.constantize.send(:init)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def env=(env_string)
|
53
|
+
@env = env_string ? env_string.to_s : 'development'
|
54
|
+
@development = (@env == 'development') ? true : false
|
55
|
+
@production = (@env == 'production') ? true : false
|
56
|
+
@test = (@env == 'test') ? true : false
|
57
|
+
end
|
58
|
+
|
59
|
+
def development?
|
60
|
+
@development
|
61
|
+
end
|
62
|
+
|
63
|
+
def production?
|
64
|
+
@production
|
65
|
+
end
|
66
|
+
|
67
|
+
def test?
|
68
|
+
@test
|
69
|
+
end
|
70
|
+
|
71
|
+
def start_app!
|
72
|
+
Isomorfeus::TopLevel.mount!
|
73
|
+
end
|
74
|
+
|
75
|
+
def force_render
|
76
|
+
begin
|
77
|
+
if Isomorfeus.top_component
|
78
|
+
ReactDOM.find_dom_node(Isomorfeus.top_component) # if not mounted will raise
|
79
|
+
if `typeof Opal.global.deepForceUpdate === 'undefined'`
|
80
|
+
Isomorfeus.top_component.JS.forceUpdate()
|
81
|
+
else
|
82
|
+
`Opal.global.deepForceUpdate(#{Isomorfeus.top_component})`
|
83
|
+
end
|
84
|
+
end
|
85
|
+
rescue
|
86
|
+
`location.reload()` if on_browser?
|
87
|
+
end
|
88
|
+
nil
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
self.add_client_option(:client_init_class_names, [])
|
93
|
+
else
|
94
|
+
class << self
|
95
|
+
attr_accessor :server_side_rendering
|
96
|
+
attr_reader :env
|
97
|
+
|
98
|
+
def configuration(&block)
|
99
|
+
block.call(self)
|
100
|
+
end
|
101
|
+
|
102
|
+
def env=(env_string)
|
103
|
+
@env = env_string ? env_string.to_s : 'development'
|
104
|
+
@development = (@env == 'development') ? true : false
|
105
|
+
@production = (@env == 'production') ? true : false
|
106
|
+
@test = (@env == 'test') ? true : false
|
107
|
+
end
|
108
|
+
|
109
|
+
def development?
|
110
|
+
@development
|
111
|
+
end
|
112
|
+
|
113
|
+
def production?
|
114
|
+
@production
|
115
|
+
end
|
116
|
+
|
117
|
+
def test?
|
118
|
+
@test
|
119
|
+
end
|
120
|
+
|
121
|
+
def ssr_contexts
|
122
|
+
@ssr_contexts ||= {}
|
123
|
+
end
|
124
|
+
|
125
|
+
def version
|
126
|
+
Isomorfeus::VERSION
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|