js_render 0.1.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.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/CODE_OF_CONDUCT.md +49 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +145 -0
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/examples/vanilla_js/.gitignore +17 -0
  13. data/examples/vanilla_js/Gemfile +49 -0
  14. data/examples/vanilla_js/Gemfile.lock +167 -0
  15. data/examples/vanilla_js/README.rdoc +28 -0
  16. data/examples/vanilla_js/Rakefile +6 -0
  17. data/examples/vanilla_js/app/assets/images/.keep +0 -0
  18. data/examples/vanilla_js/app/assets/javascripts/application.js +16 -0
  19. data/examples/vanilla_js/app/assets/javascripts/components/Counter/index.js +32 -0
  20. data/examples/vanilla_js/app/assets/javascripts/components/Counter/renderClient.js +4 -0
  21. data/examples/vanilla_js/app/assets/javascripts/components/Counter/renderServer.js +4 -0
  22. data/examples/vanilla_js/app/assets/stylesheets/application.css +15 -0
  23. data/examples/vanilla_js/app/assets/stylesheets/components/Counter.scss +10 -0
  24. data/examples/vanilla_js/app/controllers/application_controller.rb +8 -0
  25. data/examples/vanilla_js/app/controllers/concerns/.keep +0 -0
  26. data/examples/vanilla_js/app/helpers/application_helper.rb +2 -0
  27. data/examples/vanilla_js/app/mailers/.keep +0 -0
  28. data/examples/vanilla_js/app/models/.keep +0 -0
  29. data/examples/vanilla_js/app/models/concerns/.keep +0 -0
  30. data/examples/vanilla_js/app/views/application/index.html.erb +9 -0
  31. data/examples/vanilla_js/app/views/layouts/application.html.erb +14 -0
  32. data/examples/vanilla_js/bin/bundle +3 -0
  33. data/examples/vanilla_js/bin/rails +9 -0
  34. data/examples/vanilla_js/bin/rake +9 -0
  35. data/examples/vanilla_js/bin/setup +29 -0
  36. data/examples/vanilla_js/bin/spring +15 -0
  37. data/examples/vanilla_js/config/application.rb +26 -0
  38. data/examples/vanilla_js/config/boot.rb +3 -0
  39. data/examples/vanilla_js/config/database.yml +25 -0
  40. data/examples/vanilla_js/config/environment.rb +5 -0
  41. data/examples/vanilla_js/config/environments/development.rb +41 -0
  42. data/examples/vanilla_js/config/environments/production.rb +79 -0
  43. data/examples/vanilla_js/config/environments/test.rb +42 -0
  44. data/examples/vanilla_js/config/initializers/assets.rb +11 -0
  45. data/examples/vanilla_js/config/initializers/backtrace_silencers.rb +7 -0
  46. data/examples/vanilla_js/config/initializers/cookies_serializer.rb +3 -0
  47. data/examples/vanilla_js/config/initializers/filter_parameter_logging.rb +4 -0
  48. data/examples/vanilla_js/config/initializers/inflections.rb +16 -0
  49. data/examples/vanilla_js/config/initializers/js_render.rb +5 -0
  50. data/examples/vanilla_js/config/initializers/mime_types.rb +4 -0
  51. data/examples/vanilla_js/config/initializers/session_store.rb +3 -0
  52. data/examples/vanilla_js/config/initializers/wrap_parameters.rb +14 -0
  53. data/examples/vanilla_js/config/locales/en.yml +23 -0
  54. data/examples/vanilla_js/config/routes.rb +3 -0
  55. data/examples/vanilla_js/config/secrets.yml +22 -0
  56. data/examples/vanilla_js/config.ru +4 -0
  57. data/examples/vanilla_js/db/seeds.rb +7 -0
  58. data/examples/vanilla_js/lib/assets/.keep +0 -0
  59. data/examples/vanilla_js/lib/tasks/.keep +0 -0
  60. data/examples/vanilla_js/log/.keep +0 -0
  61. data/examples/vanilla_js/public/404.html +67 -0
  62. data/examples/vanilla_js/public/422.html +67 -0
  63. data/examples/vanilla_js/public/500.html +66 -0
  64. data/examples/vanilla_js/public/favicon.ico +0 -0
  65. data/examples/vanilla_js/public/robots.txt +5 -0
  66. data/examples/vanilla_js/test/controllers/.keep +0 -0
  67. data/examples/vanilla_js/test/fixtures/.keep +0 -0
  68. data/examples/vanilla_js/test/helpers/.keep +0 -0
  69. data/examples/vanilla_js/test/integration/.keep +0 -0
  70. data/examples/vanilla_js/test/mailers/.keep +0 -0
  71. data/examples/vanilla_js/test/models/.keep +0 -0
  72. data/examples/vanilla_js/test/test_helper.rb +10 -0
  73. data/examples/vanilla_js/vendor/assets/javascripts/.keep +0 -0
  74. data/examples/vanilla_js/vendor/assets/stylesheets/.keep +0 -0
  75. data/js_render.gemspec +26 -0
  76. data/lib/js_render/configuration.rb +35 -0
  77. data/lib/js_render/rails/railtie.rb +11 -0
  78. data/lib/js_render/rails/view_helpers.rb +12 -0
  79. data/lib/js_render/rails.rb +2 -0
  80. data/lib/js_render/renderer.rb +87 -0
  81. data/lib/js_render/version.rb +3 -0
  82. data/lib/js_render.rb +8 -0
  83. metadata +181 -0
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/500.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>We're sorry, but something went wrong.</h1>
62
+ </div>
63
+ <p>If you are the application owner check the logs for more information.</p>
64
+ </div>
65
+ </body>
66
+ </html>
File without changes
@@ -0,0 +1,5 @@
1
+ # See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
2
+ #
3
+ # To ban all spiders from the entire site uncomment the next two lines:
4
+ # User-agent: *
5
+ # Disallow: /
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,10 @@
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
7
+ fixtures :all
8
+
9
+ # Add more helper methods to be used by all tests here...
10
+ end
data/js_render.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'js_render/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "js_render"
8
+ spec.version = JsRender::VERSION
9
+ spec.authors = ["Jonathan Lehman"]
10
+ spec.email = ["jonathan.lehman91@gmail.com"]
11
+
12
+ spec.summary = %q{Render JavaScript components on the server side with Ruby.}
13
+ spec.description = %q{Render JavaScript components on the server side with Ruby.}
14
+ spec.homepage = "http://github.com/jdlehman/js_render"
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_development_dependency "bundler", "~> 1.12"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "rspec", "~> 3.0"
25
+ spec.add_dependency "execjs"
26
+ end
@@ -0,0 +1,35 @@
1
+ module JsRender
2
+ class << self
3
+ attr_accessor :config
4
+ end
5
+
6
+ def self.config
7
+ @config ||= Configuration.new
8
+ end
9
+
10
+ def self.reset
11
+ @config = Configuration.new
12
+ end
13
+
14
+ def self.configure
15
+ yield(config)
16
+ end
17
+
18
+ class Configuration
19
+ attr_accessor :component_paths,
20
+ :base_path,
21
+ :component_suffix,
22
+ :server_render_function,
23
+ :client_render_function,
24
+ :use_asset_pipeline
25
+
26
+ def initialize
27
+ @base_path = 'app/assets/javascripts'
28
+ @component_paths = ['/**/*']
29
+ @component_suffix = '.js'
30
+ @server_render_function = 'window.render*Server'
31
+ @client_render_function = 'window.render*Client'
32
+ @use_asset_pipeline = false
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails'
2
+
3
+ module JsRender
4
+ module Rails
5
+ class Railtie < ::Rails::Railtie
6
+ initializer 'js_render.view_helpers' do
7
+ ActionView::Base.send :include, ViewHelpers
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ require 'js_render/renderer'
2
+
3
+ module JsRender
4
+ module Rails
5
+ module ViewHelpers
6
+ def render_component(component_name, data = 'undefined')
7
+ renderer = JsRender::Renderer.new(component_name, data)
8
+ renderer.render_component
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,2 @@
1
+ require 'js_render/rails/view_helpers'
2
+ require 'js_render/rails/railtie'
@@ -0,0 +1,87 @@
1
+ require 'execjs'
2
+
3
+ module JsRender
4
+ class Renderer
5
+ attr_accessor :component_name, :json_data, :uuid
6
+
7
+ GLOBAL_CONTEXT = <<-JS
8
+ var global = global || this;
9
+ var self = self || this;
10
+ var window = window || this;
11
+ JS
12
+
13
+ def initialize(component_name, data)
14
+ @component_name = component_name
15
+ data = data.to_json if !data.is_a?(String)
16
+ @json_data = data
17
+ @uuid = SecureRandom.uuid
18
+ end
19
+
20
+ def render_component
21
+ server_html = generate_html
22
+ client_script = generate_client_script
23
+ component = (server_html + client_script)
24
+ component.respond_to?(:html_safe) ? component.html_safe : component
25
+ end
26
+
27
+ def generate_html
28
+ func_name = JsRender.config.server_render_function.gsub('*', @component_name)
29
+ server_code = <<-JS
30
+ (function () {
31
+ var serverStr = typeof #{func_name} === 'function' ? #{func_name}(#{@json_data}) : '';
32
+ return '<span id="#{@uuid}">' + serverStr + '</span>';
33
+ })()
34
+ JS
35
+ renderer_code = js_context(find_renderer)
36
+ context = ::ExecJS.compile(GLOBAL_CONTEXT + renderer_code)
37
+ context.eval(server_code)
38
+ rescue ExecJS::RuntimeError, ExecJS::ProgramError => error
39
+ raise JsRender::ServerRenderError::new(@component_name, @json_data, error)
40
+ end
41
+
42
+ def generate_client_script
43
+ func_name = JsRender.config.client_render_function.gsub('*', @component_name)
44
+ <<-HTML
45
+ <script>
46
+ typeof #{func_name} === 'function' && #{func_name}('#{@uuid}', #{@json_data});
47
+ </script>
48
+ HTML
49
+ end
50
+
51
+
52
+ private
53
+
54
+ def find_renderer
55
+ base_path = JsRender.config.base_path
56
+ paths = JsRender.config.component_paths
57
+ suffix = JsRender.config.component_suffix
58
+
59
+ paths.map do |path|
60
+ Dir[File.join(base_path, path)].select do |full_path|
61
+ full_path.match Regexp.new("/#{@component_name}#{suffix}")
62
+ end
63
+ end.compact.flatten.uniq
64
+ end
65
+
66
+ def js_context(paths)
67
+ if defined?(::Rails) && JsRender.config.use_asset_pipeline
68
+ ::Rails.application.assets.each_file.select do |abs_path|
69
+ regex = ::Regexp.new(paths.join('|'))
70
+ abs_path.match(regex)
71
+ end.map do |abs_path|
72
+ ::Rails.application.assets[abs_path].to_s
73
+ end.join('')
74
+ else
75
+ paths.map { |path| File.read(path) }.join('')
76
+ end
77
+ end
78
+ end
79
+
80
+ class ServerRenderError < ::StandardError
81
+ def initialize(component_name, data, message)
82
+ message = ["Error \"#{message}\" when server rendering component, \"#{component_name}\", with data: \"#{data}\"",
83
+ message.backtrace.join("\n")].join("\n")
84
+ super(message)
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,3 @@
1
+ module JsRender
2
+ VERSION = "0.1.1"
3
+ end
data/lib/js_render.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'js_render/version'
2
+ require 'js_render/configuration'
3
+ require 'js_render/renderer'
4
+
5
+ module JsRender
6
+ end
7
+
8
+ require 'js_render/rails' if defined?(Rails)
metadata ADDED
@@ -0,0 +1,181 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: js_render
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Jonathan Lehman
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-05-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: execjs
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Render JavaScript components on the server side with Ruby.
70
+ email:
71
+ - jonathan.lehman91@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".rspec"
78
+ - ".travis.yml"
79
+ - CODE_OF_CONDUCT.md
80
+ - Gemfile
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - bin/console
85
+ - bin/setup
86
+ - examples/vanilla_js/.gitignore
87
+ - examples/vanilla_js/Gemfile
88
+ - examples/vanilla_js/Gemfile.lock
89
+ - examples/vanilla_js/README.rdoc
90
+ - examples/vanilla_js/Rakefile
91
+ - examples/vanilla_js/app/assets/images/.keep
92
+ - examples/vanilla_js/app/assets/javascripts/application.js
93
+ - examples/vanilla_js/app/assets/javascripts/components/Counter/index.js
94
+ - examples/vanilla_js/app/assets/javascripts/components/Counter/renderClient.js
95
+ - examples/vanilla_js/app/assets/javascripts/components/Counter/renderServer.js
96
+ - examples/vanilla_js/app/assets/stylesheets/application.css
97
+ - examples/vanilla_js/app/assets/stylesheets/components/Counter.scss
98
+ - examples/vanilla_js/app/controllers/application_controller.rb
99
+ - examples/vanilla_js/app/controllers/concerns/.keep
100
+ - examples/vanilla_js/app/helpers/application_helper.rb
101
+ - examples/vanilla_js/app/mailers/.keep
102
+ - examples/vanilla_js/app/models/.keep
103
+ - examples/vanilla_js/app/models/concerns/.keep
104
+ - examples/vanilla_js/app/views/application/index.html.erb
105
+ - examples/vanilla_js/app/views/layouts/application.html.erb
106
+ - examples/vanilla_js/bin/bundle
107
+ - examples/vanilla_js/bin/rails
108
+ - examples/vanilla_js/bin/rake
109
+ - examples/vanilla_js/bin/setup
110
+ - examples/vanilla_js/bin/spring
111
+ - examples/vanilla_js/config.ru
112
+ - examples/vanilla_js/config/application.rb
113
+ - examples/vanilla_js/config/boot.rb
114
+ - examples/vanilla_js/config/database.yml
115
+ - examples/vanilla_js/config/environment.rb
116
+ - examples/vanilla_js/config/environments/development.rb
117
+ - examples/vanilla_js/config/environments/production.rb
118
+ - examples/vanilla_js/config/environments/test.rb
119
+ - examples/vanilla_js/config/initializers/assets.rb
120
+ - examples/vanilla_js/config/initializers/backtrace_silencers.rb
121
+ - examples/vanilla_js/config/initializers/cookies_serializer.rb
122
+ - examples/vanilla_js/config/initializers/filter_parameter_logging.rb
123
+ - examples/vanilla_js/config/initializers/inflections.rb
124
+ - examples/vanilla_js/config/initializers/js_render.rb
125
+ - examples/vanilla_js/config/initializers/mime_types.rb
126
+ - examples/vanilla_js/config/initializers/session_store.rb
127
+ - examples/vanilla_js/config/initializers/wrap_parameters.rb
128
+ - examples/vanilla_js/config/locales/en.yml
129
+ - examples/vanilla_js/config/routes.rb
130
+ - examples/vanilla_js/config/secrets.yml
131
+ - examples/vanilla_js/db/seeds.rb
132
+ - examples/vanilla_js/lib/assets/.keep
133
+ - examples/vanilla_js/lib/tasks/.keep
134
+ - examples/vanilla_js/log/.keep
135
+ - examples/vanilla_js/public/404.html
136
+ - examples/vanilla_js/public/422.html
137
+ - examples/vanilla_js/public/500.html
138
+ - examples/vanilla_js/public/favicon.ico
139
+ - examples/vanilla_js/public/robots.txt
140
+ - examples/vanilla_js/test/controllers/.keep
141
+ - examples/vanilla_js/test/fixtures/.keep
142
+ - examples/vanilla_js/test/helpers/.keep
143
+ - examples/vanilla_js/test/integration/.keep
144
+ - examples/vanilla_js/test/mailers/.keep
145
+ - examples/vanilla_js/test/models/.keep
146
+ - examples/vanilla_js/test/test_helper.rb
147
+ - examples/vanilla_js/vendor/assets/javascripts/.keep
148
+ - examples/vanilla_js/vendor/assets/stylesheets/.keep
149
+ - js_render.gemspec
150
+ - lib/js_render.rb
151
+ - lib/js_render/configuration.rb
152
+ - lib/js_render/rails.rb
153
+ - lib/js_render/rails/railtie.rb
154
+ - lib/js_render/rails/view_helpers.rb
155
+ - lib/js_render/renderer.rb
156
+ - lib/js_render/version.rb
157
+ homepage: http://github.com/jdlehman/js_render
158
+ licenses:
159
+ - MIT
160
+ metadata: {}
161
+ post_install_message:
162
+ rdoc_options: []
163
+ require_paths:
164
+ - lib
165
+ required_ruby_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ requirements: []
176
+ rubyforge_project:
177
+ rubygems_version: 2.4.5.1
178
+ signing_key:
179
+ specification_version: 4
180
+ summary: Render JavaScript components on the server side with Ruby.
181
+ test_files: []