isomorfeus-react 16.13.10 → 16.13.11
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.
- checksums.yaml +4 -4
- data/README.md +2 -10
- data/lib/isomorfeus-react-native.rb +5 -0
- data/lib/isomorfeus-react-paper.rb +4 -0
- data/lib/isomorfeus-react.rb +6 -4
- data/lib/isomorfeus/props/validator.rb +2 -2
- data/lib/isomorfeus/{react_config.rb → react/config.rb} +0 -0
- data/lib/isomorfeus/react/memcached_component_cache.rb +19 -0
- data/lib/isomorfeus/react/redis_component_cache.rb +19 -0
- data/lib/isomorfeus/{thread_local_component_cache.rb → react/thread_local_component_cache.rb} +0 -0
- data/lib/isomorfeus_react/lucid_app/mixin.rb +1 -0
- data/lib/isomorfeus_react/lucid_app/native_component_constructor.rb +0 -1
- data/lib/isomorfeus_react/lucid_component/api.rb +0 -27
- data/lib/isomorfeus_react/lucid_component/mixin.rb +1 -0
- data/lib/isomorfeus_react/lucid_component/styles_api.rb +34 -0
- data/lib/isomorfeus_react/lucid_func/mixin.rb +1 -0
- data/lib/isomorfeus_react/react/function_component/api.rb +7 -6
- data/lib/isomorfeus_react_material/lucid_material/app/mixin.rb +1 -0
- data/lib/isomorfeus_react_material/lucid_material/app/native_component_constructor.rb +0 -1
- data/lib/isomorfeus_react_material/lucid_material/component/mixin.rb +1 -0
- data/lib/isomorfeus_react_material/lucid_material/func/mixin.rb +1 -0
- data/lib/isomorfeus_react_paper/lucid_paper/app/base.rb +9 -0
- data/lib/isomorfeus_react_paper/lucid_paper/app/mixin.rb +19 -0
- data/lib/isomorfeus_react_paper/lucid_paper/app/native_component_constructor.rb +32 -0
- data/lib/isomorfeus_react_paper/lucid_paper/component/base.rb +9 -0
- data/lib/isomorfeus_react_paper/lucid_paper/component/mixin.rb +18 -0
- data/lib/isomorfeus_react_paper/lucid_paper/component/native_component_constructor.rb +25 -0
- data/lib/isomorfeus_react_paper/lucid_paper/func/base.rb +9 -0
- data/lib/isomorfeus_react_paper/lucid_paper/func/mixin.rb +14 -0
- data/lib/isomorfeus_react_paper/lucid_paper/func/native_component_constructor.rb +71 -0
- data/lib/react.rb +6 -5
- data/lib/react/component/api.rb +5 -4
- data/lib/react/version.rb +1 -1
- data/lib/react_native/component/elements.rb +203 -0
- data/lib/react_native/lucid_app/react_native_component_constructor.rb +51 -0
- data/lib/react_native/lucid_component/react_native_component_constructor.rb +37 -0
- data/lib/react_native/lucid_func/react_native_component_constructor.rb +82 -0
- data/lib/react_native/react.rb +120 -0
- metadata +69 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02a760c7e31fcd4fc03396b90831133ff8bfc02bf7602bd337ebe554b3778150
|
4
|
+
data.tar.gz: a87209a7b20d8b88b5d9ea4f2a1306edcec75a090ecc38578ee697ad2e3139bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4fa758232d69952fffa9f6c0e586cb96ae537232d788018cc13c6e64f636945566fae50d9cfc4befb83a69d7d3adfd74c8ced3b452b256ad8f64d5e24285538
|
7
|
+
data.tar.gz: 836d76d4dd5522925cbae401283757d59969c512e71e7992602c98e4ed69918047addf7ebc6e661c5ac6153bcfae3747fc03b1533140f29244ea243bdfe61c55
|
data/README.md
CHANGED
@@ -3,21 +3,13 @@
|
|
3
3
|
Develop React components for Opal Ruby along with very easy to use and advanced React-Redux Components.
|
4
4
|
|
5
5
|
## Community and Support
|
6
|
-
At the [Isomorfeus Framework Project](http://isomorfeus.com)
|
6
|
+
At the [Isomorfeus Framework Project](http://isomorfeus.com)
|
7
7
|
|
8
8
|
## Versioning and Compatibility
|
9
9
|
isomorfeus-react version follows the React version which features and API it implements.
|
10
10
|
|
11
11
|
### React
|
12
|
-
Isomorfeus-react 16.
|
13
|
-
|
14
|
-
### Preact
|
15
|
-
isomorfeus-react works with preact version 10.1.x.
|
16
|
-
|
17
|
-
### Nerv
|
18
|
-
isomorfeus-react works in general with nervjs 1.5.x. with some issues:
|
19
|
-
- Server Side Rendering does currently not work at all.
|
20
|
-
- Some specs with respect to callbacks (component_will_unmount) and styles fail.
|
12
|
+
Isomorfeus-react 16.13.x implements features and the API of React 16.13 and should be used with React 16.13
|
21
13
|
|
22
14
|
## Documentation
|
23
15
|
|
@@ -0,0 +1,5 @@
|
|
1
|
+
require 'react_native/react'
|
2
|
+
require 'react_native/component/elements'
|
3
|
+
require 'react_native/lucid_app/react_native_component_constructor'
|
4
|
+
require 'react_native/lucid_component/react_native_component_constructor'
|
5
|
+
require 'react_native/lucid_func/react_native_component_constructor'
|
data/lib/isomorfeus-react.rb
CHANGED
@@ -10,7 +10,7 @@ if RUBY_ENGINE == 'opal'
|
|
10
10
|
require 'browser/element'
|
11
11
|
end
|
12
12
|
|
13
|
-
require 'isomorfeus/
|
13
|
+
require 'isomorfeus/react/config'
|
14
14
|
|
15
15
|
# allow mounting of components
|
16
16
|
if on_browser?
|
@@ -83,7 +83,7 @@ else
|
|
83
83
|
require 'isomorfeus-redux'
|
84
84
|
require 'isomorfeus-speednode'
|
85
85
|
require 'react/version'
|
86
|
-
require 'isomorfeus/
|
86
|
+
require 'isomorfeus/react/config'
|
87
87
|
|
88
88
|
# props
|
89
89
|
require 'isomorfeus/props/validate_hash_proxy'
|
@@ -99,8 +99,10 @@ else
|
|
99
99
|
|
100
100
|
Isomorfeus.server_side_rendering = true
|
101
101
|
|
102
|
-
#
|
103
|
-
require 'isomorfeus/thread_local_component_cache'
|
102
|
+
# caches
|
103
|
+
require 'isomorfeus/react/thread_local_component_cache'
|
104
|
+
require 'isomorfeus/react/memcached_component_cache'
|
105
|
+
require 'isomorfeus/react/redis_component_cache'
|
104
106
|
require 'isomorfeus/react_view_helper'
|
105
107
|
|
106
108
|
Isomorfeus.component_cache_init do
|
@@ -139,7 +139,7 @@ module Isomorfeus
|
|
139
139
|
Isomorfeus.raise_error(message: "#{@c}: #{@p} must be a String") unless @v.class == String
|
140
140
|
case @o[:type]
|
141
141
|
when :email
|
142
|
-
Isomorfeus.raise_error(message: "#{@c}: #{@p} is not a valid email address") unless @v.match?
|
142
|
+
Isomorfeus.raise_error(message: "#{@c}: #{@p} is not a valid email address") unless @v.match?(/\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/)
|
143
143
|
when :uri
|
144
144
|
if RUBY_ENGINE == 'opal'
|
145
145
|
%x{
|
@@ -150,7 +150,7 @@ module Isomorfeus
|
|
150
150
|
}
|
151
151
|
}
|
152
152
|
else
|
153
|
-
Isomorfeus.raise_error(message: "#{@c}: #{@p} is not a valid uri") unless @v.match?
|
153
|
+
Isomorfeus.raise_error(message: "#{@c}: #{@p} is not a valid uri") unless @v.match?(/\A#{URI.regexp}\z/)
|
154
154
|
end
|
155
155
|
end
|
156
156
|
end
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
module Professional
|
3
|
+
class MemcachedComponentCache
|
4
|
+
def initialize(*args)
|
5
|
+
@dalli_client = Dalli::Client.new(*args)
|
6
|
+
end
|
7
|
+
|
8
|
+
def fetch(key)
|
9
|
+
json = @dalli_client.get(key)
|
10
|
+
Oj.load(json, mode: :strict)
|
11
|
+
end
|
12
|
+
|
13
|
+
def store(key, rendered_tree, response_status, styles)
|
14
|
+
json = Oj.dump([rendered_tree, response_status, styles], mode: :strict)
|
15
|
+
@dalli_client.set(key, json)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
module Professional
|
3
|
+
class RedisComponentCache
|
4
|
+
def initialize(*args)
|
5
|
+
@redis_client = Redis.new(@args)
|
6
|
+
end
|
7
|
+
|
8
|
+
def fetch(key)
|
9
|
+
json = @redis_client.get(key)
|
10
|
+
Oj.load(json, mode: :strict)
|
11
|
+
end
|
12
|
+
|
13
|
+
def store(key, rendered_tree, response_status, styles)
|
14
|
+
json = Oj.dump([rendered_tree, response_status, styles], mode: :strict)
|
15
|
+
@redis_client.set(key, json)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/isomorfeus/{thread_local_component_cache.rb → react/thread_local_component_cache.rb}
RENAMED
File without changes
|
@@ -14,6 +14,7 @@ module LucidApp
|
|
14
14
|
base.include(::React::Component::Api)
|
15
15
|
base.include(::React::Component::Callbacks)
|
16
16
|
base.include(::LucidComponent::Api)
|
17
|
+
base.include(::LucidComponent::StylesApi)
|
17
18
|
base.include(::LucidApp::Api)
|
18
19
|
base.include(::LucidComponent::Initializer)
|
19
20
|
base.include(::React::Component::Features)
|
@@ -4,7 +4,6 @@ module LucidApp
|
|
4
4
|
# to do so, we convert the props to ruby hashes and then compare
|
5
5
|
# this makes sure, that for example rubys Nil object gets handled properly
|
6
6
|
def self.extended(base)
|
7
|
-
component_name = base.to_s + 'Wrapper'
|
8
7
|
theme_component_name = base.to_s + 'ThemeWrapper'
|
9
8
|
# language=JS
|
10
9
|
%x{
|
@@ -18,28 +18,6 @@ module LucidComponent
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
# styles
|
22
|
-
def styles(styles_hash = nil, &block)
|
23
|
-
if block_given?
|
24
|
-
%x{
|
25
|
-
base.jss_styles = function(theme) {
|
26
|
-
let wrapped_theme = Opal.React.Component.Styles.$new(theme);
|
27
|
-
var result = block.$call(wrapped_theme);
|
28
|
-
return result.$to_n();
|
29
|
-
}
|
30
|
-
}
|
31
|
-
nil
|
32
|
-
elsif styles_hash
|
33
|
-
`base.jss_styles = #{styles_hash.to_n}` if styles_hash
|
34
|
-
styles_hash
|
35
|
-
elsif `typeof base.jss_styles === 'object'`
|
36
|
-
`Opal.Hash.$new(base.jss_styles)`
|
37
|
-
else
|
38
|
-
nil
|
39
|
-
end
|
40
|
-
end
|
41
|
-
alias_method :styles=, :styles
|
42
|
-
|
43
21
|
# preloading
|
44
22
|
def preload(&block)
|
45
23
|
`base.preload_block = block`
|
@@ -74,11 +52,6 @@ module LucidComponent
|
|
74
52
|
SessionStore
|
75
53
|
end
|
76
54
|
|
77
|
-
# styles
|
78
|
-
def styles
|
79
|
-
props.classes
|
80
|
-
end
|
81
|
-
|
82
55
|
def theme
|
83
56
|
props.theme
|
84
57
|
end
|
@@ -14,6 +14,7 @@ module LucidComponent
|
|
14
14
|
base.include(::React::Component::Api)
|
15
15
|
base.include(::React::Component::Callbacks)
|
16
16
|
base.include(::LucidComponent::Api)
|
17
|
+
base.include(::LucidComponent::StylesApi)
|
17
18
|
base.include(::LucidComponent::Initializer)
|
18
19
|
base.include(::React::Component::Features)
|
19
20
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module LucidComponent
|
2
|
+
module StylesApi
|
3
|
+
def self.included(base)
|
4
|
+
base.instance_exec do
|
5
|
+
# styles
|
6
|
+
def styles(styles_hash = nil, &block)
|
7
|
+
if block_given?
|
8
|
+
%x{
|
9
|
+
base.jss_styles = function(theme) {
|
10
|
+
let wrapped_theme = Opal.React.Component.Styles.$new(theme);
|
11
|
+
var result = block.$call(wrapped_theme);
|
12
|
+
return result.$to_n();
|
13
|
+
}
|
14
|
+
}
|
15
|
+
nil
|
16
|
+
elsif styles_hash
|
17
|
+
`base.jss_styles = #{styles_hash.to_n}` if styles_hash
|
18
|
+
styles_hash
|
19
|
+
elsif `typeof base.jss_styles === 'object'`
|
20
|
+
`Opal.Hash.$new(base.jss_styles)`
|
21
|
+
else
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
alias_method :styles=, :styles
|
26
|
+
end
|
27
|
+
|
28
|
+
# styles
|
29
|
+
def styles
|
30
|
+
props.classes
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -18,8 +18,8 @@ module React
|
|
18
18
|
`Opal.global.React.useDebugValue(value)`
|
19
19
|
end
|
20
20
|
|
21
|
-
def use_effect(&block)
|
22
|
-
`Opal.global.React.useEffect(function() { #{block.call} })`
|
21
|
+
def use_effect(*args, &block)
|
22
|
+
`Opal.global.React.useEffect(function() { #{block.call} }, args)`
|
23
23
|
end
|
24
24
|
|
25
25
|
def use_imperative_handle(ref, *deps, &block)
|
@@ -86,12 +86,13 @@ module React
|
|
86
86
|
end
|
87
87
|
alias rre render_react_element
|
88
88
|
|
89
|
-
def method_ref(method_symbol)
|
89
|
+
def method_ref(method_symbol, *args)
|
90
|
+
method_key = "#{method_symbol}#{args}"
|
90
91
|
%x{
|
91
|
-
if (#{self}.method_refs && #{self}.method_refs[#{
|
92
|
+
if (#{self}.method_refs && #{self}.method_refs[#{method_key}]) { return #{self}.method_refs[#{method_key}]; }
|
92
93
|
if (!#{self}.method_refs) { #{self}.method_refs = {}; }
|
93
|
-
#{self}.method_refs[#{
|
94
|
-
return #{self}.method_refs[#{
|
94
|
+
#{self}.method_refs[#{method_key}] = { m: #{method(method_symbol)}, a: args };
|
95
|
+
return #{self}.method_refs[#{method_key}];
|
95
96
|
}
|
96
97
|
end
|
97
98
|
alias m_ref method_ref
|
@@ -10,6 +10,7 @@ module LucidMaterial
|
|
10
10
|
base.include(::React::Component::Api)
|
11
11
|
base.include(::React::Component::Callbacks)
|
12
12
|
base.include(::LucidComponent::Api)
|
13
|
+
base.include(::LucidComponent::StylesApi)
|
13
14
|
base.include(::LucidApp::Api)
|
14
15
|
base.include(::LucidComponent::Initializer)
|
15
16
|
base.include(::React::Component::Features)
|
@@ -5,7 +5,6 @@ module LucidMaterial
|
|
5
5
|
# to do so, we convert the props to ruby hashes and then compare
|
6
6
|
# this makes sure, that for example rubys Nil object gets handled properly
|
7
7
|
def self.extended(base)
|
8
|
-
component_name = base.to_s + 'Wrapper'
|
9
8
|
theme_component_name = base.to_s + 'ThemeWrapper'
|
10
9
|
# language=JS
|
11
10
|
%x{
|
@@ -10,6 +10,7 @@ module LucidMaterial
|
|
10
10
|
base.include(::React::Component::Api)
|
11
11
|
base.include(::React::Component::Callbacks)
|
12
12
|
base.include(::LucidComponent::Api)
|
13
|
+
base.include(::LucidComponent::StylesApi)
|
13
14
|
base.include(::LucidComponent::Initializer)
|
14
15
|
base.include(::React::Component::Features)
|
15
16
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module LucidPaper
|
2
|
+
module App
|
3
|
+
module Mixin
|
4
|
+
def self.included(base)
|
5
|
+
base.include(::Native::Wrapper)
|
6
|
+
base.extend(::LucidApp::NativeLucidComponentConstructor)
|
7
|
+
base.extend(::LucidPaper::App::NativeComponentConstructor)
|
8
|
+
base.extend(::LucidPropDeclaration::Mixin)
|
9
|
+
base.include(::React::Component::Elements)
|
10
|
+
base.include(::React::Component::Api)
|
11
|
+
base.include(::React::Component::Callbacks)
|
12
|
+
base.include(::LucidComponent::Api)
|
13
|
+
base.include(::LucidApp::Api)
|
14
|
+
base.include(::LucidComponent::Initializer)
|
15
|
+
base.include(::React::Component::Features)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module LucidPaper
|
2
|
+
module App
|
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
|
+
%x{
|
9
|
+
base.jss_theme = Opal.global.Paper.DefaultTheme;
|
10
|
+
base.themed_component = Opal.global.Paper.withTheme(base.lucid_react_component);
|
11
|
+
base.react_component = class extends Opal.global.React.Component {
|
12
|
+
constructor(props) {
|
13
|
+
super(props);
|
14
|
+
if (Opal.Isomorfeus.$top_component() == nil) { Opal.Isomorfeus['$top_component='](this); }
|
15
|
+
}
|
16
|
+
static get displayName() {
|
17
|
+
return "IsomorfeusTopLevelComponent";
|
18
|
+
}
|
19
|
+
static set displayName(new_name) {
|
20
|
+
// dont do anything here except returning the set value
|
21
|
+
return new_name;
|
22
|
+
}
|
23
|
+
render() {
|
24
|
+
let themed_component = Opal.global.React.createElement(base.themed_component, this.props);
|
25
|
+
return Opal.global.React.createElement(Opal.global.Paper.Provider, { theme: base.jss_theme }, themed_component);
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module LucidPaper
|
2
|
+
module Component
|
3
|
+
module Mixin
|
4
|
+
def self.included(base)
|
5
|
+
base.include(::Native::Wrapper)
|
6
|
+
base.extend(::LucidComponent::NativeLucidComponentConstructor)
|
7
|
+
base.extend(::LucidPaper::Component::NativeComponentConstructor)
|
8
|
+
base.extend(::LucidPropDeclaration::Mixin)
|
9
|
+
base.include(::React::Component::Elements)
|
10
|
+
base.include(::React::Component::Api)
|
11
|
+
base.include(::React::Component::Callbacks)
|
12
|
+
base.include(::LucidComponent::Api)
|
13
|
+
base.include(::LucidComponent::Initializer)
|
14
|
+
base.include(::React::Component::Features)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module LucidPaper
|
2
|
+
module Component
|
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 + 'Wrapper'
|
9
|
+
# language=JS
|
10
|
+
%x{
|
11
|
+
base.react_component = Opal.global.React.memo(function(props) {
|
12
|
+
let classes = null;
|
13
|
+
let store;
|
14
|
+
if (base.store_updates) { store = Opal.global.React.useContext(Opal.global.LucidApplicationContext); }
|
15
|
+
let new_props = Object.assign({}, props)
|
16
|
+
new_props.store = store;
|
17
|
+
new_props.theme = Opal.global.Paper.useTheme();
|
18
|
+
return Opal.global.React.createElement(base.lucid_react_component, new_props);
|
19
|
+
}, Opal.React.props_are_equal);
|
20
|
+
base.react_component.displayName = #{component_name};
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|