render-react 0.0.1

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.
data/js/package.json ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "dist",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "author": "",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "babel-standalone": "^6.12.0",
13
+ "react": "^15.3.0",
14
+ "react-dom": "^15.3.0"
15
+ }
16
+ }
@@ -0,0 +1,50 @@
1
+ module Render
2
+ module React
3
+ module Compiler
4
+ def lookup
5
+ @lookup ||= {}
6
+ end
7
+
8
+ def cxt
9
+ return @cxt if @cxt
10
+ @cxt = Config.new_context
11
+
12
+ js_lib_files = Dir.glob(
13
+ File.join(
14
+ Config.gem_js_path,
15
+ 'compiler',
16
+ '**',
17
+ '*.js'
18
+ )
19
+ )
20
+ js_lib_files.each { |file| @cxt.load(file) }
21
+
22
+ @cxt
23
+ end
24
+
25
+ def load_components
26
+ Config.paths.each do |path|
27
+ files = Dir.glob(File.join(path, '**', '*.js'))
28
+ files.each do |filename|
29
+ name, code = Transpiler.babelify(filename)
30
+ cxt.eval(code)
31
+ lookup[name.to_sym] = true
32
+ end
33
+ end
34
+ end
35
+
36
+ def render(component_class, **props)
37
+ unless lookup[component_class.to_sym]
38
+ raise "#{component_class} component not found."
39
+ end
40
+ cxt.eval <<-EOS
41
+ ReactDOMServer.renderToString(
42
+ React.createElement(#{component_class}, #{JSON.dump(props)})
43
+ );
44
+ EOS
45
+ end
46
+
47
+ module_function :load_components, :render, :cxt, :lookup
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,24 @@
1
+ module Render
2
+ module React
3
+ module Config
4
+ def path(*paths)
5
+ @paths ||= []
6
+ @paths += paths
7
+ end
8
+
9
+ def paths
10
+ @paths
11
+ end
12
+
13
+ def new_context
14
+ MiniRacer::Context.new
15
+ end
16
+
17
+ def gem_js_path
18
+ @gem_js_path ||= File.expand_path('../../../../js/dist', __FILE__)
19
+ end
20
+
21
+ module_function :path, :paths, :new_context, :gem_js_path
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,45 @@
1
+ module Render
2
+ module React
3
+ module Transpiler
4
+ def cxt
5
+ return @cxt if @cxt
6
+ @cxt = Config.new_context
7
+
8
+ js_lib_files = Dir.glob(
9
+ File.join(
10
+ Config.gem_js_path,
11
+ 'transpiler',
12
+ '**',
13
+ '*.js'
14
+ )
15
+ )
16
+ js_lib_files.each { |file| @cxt.load(file) }
17
+
18
+ @cxt
19
+ end
20
+
21
+ def babelify(filepath)
22
+ code = File.read(filepath)
23
+ component_name = code.match(/export default (\w+?);/)[1]
24
+
25
+ code.gsub!(/export[^;]+;/, '')
26
+ code.gsub!(/import[^;]+;/, '')
27
+ code.gsub!(/require[^;]+;/, '')
28
+
29
+ transormation = <<-EOF
30
+ var input = #{JSON.dump(code)};
31
+ Babel.transform(input, {
32
+ "presets": ['stage-0', 'es2015', 'react'],
33
+ "plugins": ["transform-class-properties"]
34
+ }).code;
35
+ EOF
36
+ result = cxt.eval transormation
37
+ result = 'var Component = React.Component;' + result
38
+
39
+ [component_name, result]
40
+ end
41
+
42
+ module_function :babelify, :cxt
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,5 @@
1
+ module Render
2
+ module React
3
+ VERSION = '0.0.1'.freeze
4
+ end
5
+ end
@@ -0,0 +1,23 @@
1
+ require 'json'
2
+ require 'mini_racer'
3
+ require 'active_support/inflector'
4
+
5
+ require 'render/react/config'
6
+ require 'render/react/compiler'
7
+ require 'render/react/transpiler'
8
+ require 'render/react/version'
9
+
10
+ module Render
11
+ module React
12
+ def initialize(*args, **kwargs)
13
+ Compiler.load_components
14
+ super
15
+ end
16
+
17
+ def render_react(component_class, **props)
18
+ <<-EOS
19
+ <span data-react-isomorphic='true' data-react-component='#{component_class}' data-react-props='#{JSON.dump(props)}'>#{Compiler.render(component_class, **props)}</span>
20
+ EOS
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'render/react/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "render-react"
8
+ spec.version = Render::React::VERSION
9
+ spec.authors = ["Alexander Krasnoschekov"]
10
+ spec.email = ["akrasnoschekov@gmail.com"]
11
+
12
+ spec.summary = "Gem that renders react components into views"
13
+ spec.homepage = "https://gitlab.rambler.ru/rnd/render-react"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+
20
+ spec.add_dependency "mini_racer"
21
+ spec.add_dependency "activesupport"
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.12"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "rspec", "~> 3.0"
27
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: render-react
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Krasnoschekov
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-08-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mini_racer
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.12'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.12'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ description:
84
+ email:
85
+ - akrasnoschekov@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - CODE_OF_CONDUCT.md
94
+ - Gemfile
95
+ - LICENSE.txt
96
+ - README.md
97
+ - Rakefile
98
+ - bin/console
99
+ - bin/setup
100
+ - js/dist/compiler/_react.js
101
+ - js/dist/compiler/react-dom-server.js
102
+ - js/dist/compiler/react-dom.js
103
+ - js/dist/transpiler/_react.js
104
+ - js/dist/transpiler/babel.js
105
+ - js/package.json
106
+ - lib/render/react.rb
107
+ - lib/render/react/compiler.rb
108
+ - lib/render/react/config.rb
109
+ - lib/render/react/transpiler.rb
110
+ - lib/render/react/version.rb
111
+ - render-react.gemspec
112
+ homepage: https://gitlab.rambler.ru/rnd/render-react
113
+ licenses:
114
+ - MIT
115
+ metadata: {}
116
+ post_install_message:
117
+ rdoc_options: []
118
+ require_paths:
119
+ - lib
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ requirements: []
131
+ rubyforge_project:
132
+ rubygems_version: 2.5.1
133
+ signing_key:
134
+ specification_version: 4
135
+ summary: Gem that renders react components into views
136
+ test_files: []