execjs-rails 0.0.5 → 0.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15aa169f6282f399f6ecb0e811d6837ce70173ed
4
- data.tar.gz: a783a4e814d655b2b58ac73ba1bd0e12f55be5dc
3
+ metadata.gz: 20b99d427d6dd48dcb8e08bd8e9fbbd055adb87c
4
+ data.tar.gz: a207fbce620184b1280d37530ace7ead33361a1d
5
5
  SHA512:
6
- metadata.gz: 8199aa2b6d3a26cb15008b19c961213bc5a4d09e7d9c7dce27c3f1b70706a0b3e3dc0c1f552a5d9aa5f20ad7e2dbccbf21925c0f4ceb82df098bd68f9f2efb4d
7
- data.tar.gz: 70cde193cefcd7664b397cca6de3dbd4e5276cdd9c4d58b4103b448141179d8bc2f9209ca0c8b60375970dae166df46e59e6f18877399882375d43abff79fd42
6
+ metadata.gz: 218addd8d037f808de2dfd41ac491dbe6f40541b65dc52fb797760c20d7f77a312c582421f99b758d5439d16949fda86a8bc330f0b4dc13f2f919920532999c6
7
+ data.tar.gz: 77ad4ced87fb69cebc8842ed06846fc131ed9b3f314f869076e1a2b2b31c8dbe182874823a88c38d32ea8beb7c6f7aabf66fa9354f9e0caec0eafa4a4ed6c933
data/README.md ADDED
@@ -0,0 +1,24 @@
1
+ execjs-rails
2
+ ============
3
+
4
+ # JavaScript-based rendering in Rails
5
+
6
+ ## WARNING: Early release. There will be many changes
7
+
8
+ ## How to use it:
9
+
10
+ Include `execjs-rails` in your Gemfile.
11
+
12
+ Create a file named `app/assets/javascripts/server.js` which contains the following:
13
+ ```javascript
14
+ function execjs_rails_handler(path, opts) {
15
+ // `path` looks like "users/show"
16
+ // `opts` is a data object passed in from Rails
17
+ }
18
+ ```
19
+
20
+ Combine this approach with some fancy JavaScript UI frameworks and some smarty pants
21
+ asset bundles, and you'll have shared client and server views for extra DRYness
22
+ without sacrificing SEO.
23
+
24
+ Read the source for configuration options and more info.
@@ -0,0 +1,15 @@
1
+ function execjs_rails_handler(path, opts) {
2
+ var json = JSON.stringify(opts, null, " ");
3
+ var code = "execjs_rails_handler('"+path+"', "+json+");"
4
+ return "" +
5
+ "<h1>Hello, I'm execjs-rails!</h1>" +
6
+ "<h2>There are many ways to configure me.</h2>" +
7
+ "<p>Provide your own <code>server.js</code>.</p>" +
8
+ "<p>Or create an initializer to set<br><code>config.execjs_rails.server_javascripts = ['my_javascript.js']</code>.</p>" +
9
+ "<p>By default, the template handler and helper call the JavaScript function <code>execjs_rails_handler</code>.</p>" +
10
+ "<p>You can override the function name with<br><code>config.execjs_rails.handler_function_name = 'my_handler'</code></p>" +
11
+ "<p>This is the exact JavaScript code being called to generate this page:</p>" +
12
+ "<p><pre><code>"+code+"</code></pre></p>" +
13
+ "<p>For more configuration options, see <code>execjs-rails/lib/execjs/rails/engine.rb</code></p>" +
14
+ "";
15
+ }
@@ -0,0 +1,17 @@
1
+ module ExecJS
2
+ module Rails
3
+ module Concern
4
+ extend ActiveSupport::Concern
5
+ included do
6
+
7
+ append_view_path TemplateResolver.new
8
+ append_before_filter :reset_execjs_renderer
9
+
10
+ def reset_execjs_renderer
11
+ Renderer.reset!
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,44 @@
1
+ module ExecJS
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+
5
+ config.execjs_rails = ActiveSupport::OrderedOptions.new
6
+ config.execjs_rails.memoize_context = ::Rails.env.production?
7
+ config.execjs_rails.on_error = lambda { |error| raise error }
8
+ config.execjs_rails.server_javascripts = ['server.js']
9
+ config.execjs_rails.handler_function_name = 'execjs_rails_handler'
10
+
11
+ config.execjs_rails.view_to_function_options = lambda do |view, options|
12
+ view.assigns.stringify_keys.merge!({
13
+ controller: view.controller_name,
14
+ action: view.action_name,
15
+ csrf_token: view.form_authenticity_token || nil,
16
+ current_user: view.current_user || nil
17
+ }).merge!(options.stringify_keys).as_json
18
+ end
19
+
20
+ initializer "execjs_rails.setup_view_helpers" do
21
+ ActiveSupport.on_load(:action_view) do
22
+ include ViewHelper
23
+ end
24
+ end
25
+
26
+ initializer "execjs_rails.setup_controller_concern" do
27
+ ActiveSupport.on_load(:action_controller) do
28
+ include Concern
29
+ end
30
+ end
31
+
32
+ config.after_initialize do |app|
33
+ app.config.execjs_rails.build_source ||= lambda do
34
+ app.config.execjs_rails.server_javascripts.map do |filename|
35
+ app.assets.resolve(filename)
36
+ app.assets[filename].to_s
37
+ end.join(";")
38
+ end
39
+ Renderer.setup!(app.config.execjs_rails)
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,39 @@
1
+ module ExecJS
2
+ module Rails
3
+ module Renderer
4
+
5
+ @@config = nil
6
+ @@context = nil
7
+
8
+ def self.setup!(config = {})
9
+ @@config = config
10
+ self.reset!
11
+ end
12
+
13
+ def self.config
14
+ @@config
15
+ end
16
+
17
+ def self.reset!
18
+ unless @@config.memoize_context? && !@@context.nil?
19
+ begin
20
+ @@context = ExecJS.compile(@@config.build_source.call())
21
+ rescue V8::Error => error
22
+ @@config.on_error.call(error)
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.call(function, *args)
28
+ @@context.call(function, *args)
29
+ end
30
+
31
+ def self.render(path, opts = {})
32
+ output = self.call(@@config.handler_function_name, path, opts)
33
+ fail "ExecJS call to render function `#{function}` returned null" if output.nil?
34
+ output.html_safe
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,20 @@
1
+ module ExecJS
2
+ module Rails
3
+ class TemplateResolver < ::ActionView::Resolver
4
+
5
+ def find_templates(name, prefix, partial, details)
6
+ path = "#{prefix}/#{name}"
7
+ [::ActionView::Template.new(
8
+ "<%= execjs_render('#{path}') %>",
9
+ "ExecJS - #{path}",
10
+ ActionView::Template.registered_template_handler(:erb),
11
+ {
12
+ format: Mime[:erb],
13
+ virtual_path: path
14
+ }
15
+ )]
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ module ExecJS
2
+ module Rails
3
+ VERSION = '0.0.6'
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ module ExecJS
2
+ module Rails
3
+ module ViewHelper
4
+
5
+ def execjs_call(function, *args)
6
+ Renderer.call(function, *args)
7
+ end
8
+
9
+ def execjs_render(path, opts = {})
10
+ Renderer.render(path, Renderer.config.view_to_function_options.call(self, opts))
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ require 'execjs/rails/engine'
2
+ require 'execjs/rails/renderer'
3
+ require 'execjs/rails/view_helper'
4
+ require 'execjs/rails/concern'
5
+ require 'execjs/rails/template_resolver'
@@ -0,0 +1 @@
1
+ require 'execjs/rails'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: execjs-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Revelry Labs, LLC
@@ -44,7 +44,17 @@ email:
44
44
  executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
- files: []
47
+ files:
48
+ - lib/assets/javascripts/server.js
49
+ - lib/execjs/rails/concern.rb
50
+ - lib/execjs/rails/engine.rb
51
+ - lib/execjs/rails/renderer.rb
52
+ - lib/execjs/rails/template_resolver.rb
53
+ - lib/execjs/rails/version.rb
54
+ - lib/execjs/rails/view_helper.rb
55
+ - lib/execjs/rails.rb
56
+ - lib/execjs-rails.rb
57
+ - README.md
48
58
  homepage: https://github.com/revelrylabs/execjs-rails
49
59
  licenses:
50
60
  - MIT