tilt-react 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,97 @@
1
+ require 'tilt/react/version'
2
+ require 'tilt'
3
+ require 'fileutils'
4
+ require 'commonjs'
5
+ require 'commonjs/require_string'
6
+ require 'json'
7
+ require 'v8'
8
+
9
+ module Tilt
10
+ class ReactTemplate < Template
11
+ def initialize(file=nil, line=1, options={}, &block)
12
+ file = File.expand_path(file)
13
+ @bundle = @@bundle_lookup[file]
14
+ raise "The requested component has not be loaded, or does not exist: #{file}" unless @bundle
15
+ @component_class = File.basename(file, '.jsx').split('_').map(&:capitalize).join
16
+ end
17
+
18
+ def evaluate(scope, props, &block)
19
+ @output ||= begin
20
+ component = @@tilt_react_js.render(@component_class, props)
21
+ %{<div data-react-class="#{@component_class}">#{component}</div><script data-react-class="#{@component_class}" type="application/json">#{props.to_json}</script>}
22
+ end
23
+ end
24
+
25
+ def self.context
26
+ @@context
27
+ end
28
+
29
+ def self.js_libs=(js_dirs)
30
+ # Expand the js_libs to be the root and all folders in it, because CommonJS.rb doesn't do this
31
+ @js_libs = [*js_dirs].map { |dir|
32
+ [
33
+ dir,
34
+ Dir.glob("#{dir}/*").select { |f| File.directory? f }
35
+ ]
36
+ }.flatten.compact
37
+ end
38
+
39
+ def self.load_context
40
+ # Include the tilt-react bootstrap JS
41
+ all_libs = @js_libs + [File.expand_path('../../ext/', __dir__)]
42
+
43
+ @@context = CommonJS::Environment.new(
44
+ V8::Context.new,
45
+ path: all_libs
46
+ ).tap { |env|
47
+ env.runtime[:process] = { 'env' => ENV }
48
+ @@tilt_react_js = env.require('tilt-react')
49
+ }
50
+ end
51
+
52
+ def self.compile_bundles(bundles)
53
+ bundles.each do |selector, target|
54
+ files = case selector
55
+ when Enumerable then selector
56
+ when String then Dir.glob(selector)
57
+ else raise "Cannot coerce into list of files: #{selector}"
58
+ end
59
+
60
+ if files.any?
61
+ FileUtils.mkdir_p(File.dirname(target))
62
+
63
+ compile(files).each do |file, es5|
64
+ @@bundle_lookup[file] = target
65
+ end
66
+
67
+ # FIXME: Browserify the es5
68
+ File.open(target, 'w') {}
69
+ end
70
+ end
71
+ end
72
+
73
+ def self.compile(files)
74
+ @@bundle_lookup ||= {}
75
+
76
+ [*files].map do |file|
77
+ file = File.expand_path(file)
78
+ next if @@bundle_lookup[file]
79
+
80
+ export_as = file_to_class_name(file)
81
+ template = Tilt::BabelTemplate.new(file)
82
+ es5 = template.render
83
+ @@tilt_react_js.components[export_as] = context.require_string(export_as, es5)
84
+ @@bundle_lookup[file] = true
85
+ [file, es5]
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ def self.file_to_class_name(file)
92
+ File.basename(file, '.jsx').split('_').map(&:capitalize).join
93
+ end
94
+ end
95
+ end
96
+
97
+ Tilt.register(Tilt::ReactTemplate, 'jsx')
@@ -0,0 +1,5 @@
1
+ module Tilt
2
+ module React
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'tilt/react/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "tilt-react"
8
+ spec.version = Tilt::React::VERSION
9
+ spec.authors = ["JP Hastings-Spital"]
10
+ spec.email = ["jphastings@gmail.com"]
11
+
12
+ spec.summary = %q{Use React.js JSX files as view templates in Sinatra and other Tilt powered frameworks.}
13
+ spec.description = %q{Render React.js JSX files with the Tilt templating system.}
14
+ spec.homepage = "https://github.com/jphastings/tilt-react"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency 'babel-transpiler', '~> 0.7'
23
+ spec.add_dependency 'commonjs', '~> 0.2'
24
+ spec.add_dependency 'therubyracer', '~> 0.12'
25
+
26
+ spec.add_development_dependency 'bundler', '~> 1.9'
27
+ spec.add_development_dependency 'rake', '~> 10.0'
28
+ spec.add_development_dependency 'nokogiri', '~> 1.6'
29
+ spec.add_development_dependency 'capybara', '~> 2.6'
30
+ spec.add_development_dependency 'rspec-as_fixture', '~> 0.1'
31
+ end
metadata ADDED
@@ -0,0 +1,194 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tilt-react
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - JP Hastings-Spital
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-04-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: babel-transpiler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: commonjs
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: therubyracer
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.12'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.12'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: nokogiri
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: capybara
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.6'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.6'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-as_fixture
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.1'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.1'
125
+ description: Render React.js JSX files with the Tilt templating system.
126
+ email:
127
+ - jphastings@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".codeclimate.yml"
133
+ - ".eslintignore"
134
+ - ".eslintrc"
135
+ - ".gitignore"
136
+ - ".rspec"
137
+ - ".rubocop.yml"
138
+ - ".travis.yml"
139
+ - CODE_OF_CONDUCT.md
140
+ - Gemfile
141
+ - LICENSE.txt
142
+ - README.md
143
+ - Rakefile
144
+ - bin/console
145
+ - bin/setup
146
+ - examples/sinatra/.gitignore
147
+ - examples/sinatra/.rspec
148
+ - examples/sinatra/Gemfile
149
+ - examples/sinatra/Gemfile.lock
150
+ - examples/sinatra/README.md
151
+ - examples/sinatra/app.rb
152
+ - examples/sinatra/components/home_page.jsx
153
+ - examples/sinatra/config.ru
154
+ - examples/sinatra/package.json
155
+ - examples/sinatra/spec/fixtures/home_page.yml
156
+ - examples/sinatra/spec/home_page_spec.rb
157
+ - examples/sinatra/spec/spec_helper.rb
158
+ - examples/sinatra/views/layout.erb
159
+ - ext/tilt-react-client.js
160
+ - ext/tilt-react.js
161
+ - lib/commonjs/require_string.rb
162
+ - lib/rspec/react.rb
163
+ - lib/rspec/react/component_helpers.rb
164
+ - lib/sinatra/react.rb
165
+ - lib/tilt/react.rb
166
+ - lib/tilt/react/version.rb
167
+ - tilt-react.gemspec
168
+ homepage: https://github.com/jphastings/tilt-react
169
+ licenses:
170
+ - MIT
171
+ metadata: {}
172
+ post_install_message:
173
+ rdoc_options: []
174
+ require_paths:
175
+ - lib
176
+ required_ruby_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ required_rubygems_version: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ requirements: []
187
+ rubyforge_project:
188
+ rubygems_version: 2.4.5.1
189
+ signing_key:
190
+ specification_version: 4
191
+ summary: Use React.js JSX files as view templates in Sinatra and other Tilt powered
192
+ frameworks.
193
+ test_files: []
194
+ has_rdoc: