rails-dynamic-rendering 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 84bf44be445bc30c98214fed86b9d7d81414b4eae2ca0c0a5cfd94ed60ace248
4
+ data.tar.gz: baa1f5f209d87fe864303a6e4acd3afc360e0174abe45c0269848297b0c412af
5
+ SHA512:
6
+ metadata.gz: 9582d0e2dfc1c66c3895cbe52bb10608c6428e28cae0c1eb7eb2649f04de4322243707a2a4c72cce381a8c6b060b82b73e03a81b0636654963d38539452ad9e5
7
+ data.tar.gz: c5695606971ef4eb1a00234c4438ecf0545bd37c2ae88a1f25995748933f837cdde545897b4c8512f576e16a549e419c7e80212585809d6109838e83295f5407
@@ -0,0 +1,35 @@
1
+ name: RSpec Test Suite
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - name: Checkout branch
10
+ uses: actions/checkout@v1
11
+ - name: Set up Ruby
12
+ uses: actions/setup-ruby@v1
13
+ with:
14
+ ruby-version: 2.6.6
15
+ - name: Set up Node
16
+ uses: actions/setup-node@v1
17
+ with:
18
+ node-version: 12.18.3
19
+ - name: Cache node modules
20
+ uses: actions/cache@v2
21
+ with:
22
+ path: node_modules
23
+ key: ${{ runner.OS }}-yarn-cache-${{ hashFiles('**/yarn.lock') }}${{ hashFiles('**/package.json')
24
+ }}"
25
+ restore-keys: "${{ runner.OS }}-yarn-cache-\n"
26
+ - name: Install system packages
27
+ run: |
28
+ sudo apt-get install libsqlite3-dev
29
+ command -v bundler || gem install bundler
30
+ - name: Install gems
31
+ run: bundle install --jobs $(nproc) --retry 3
32
+ - name: Install Yarn packages
33
+ run: yarn install
34
+ - name: Run RSpec test suite
35
+ run: bundle exec rspec spec
@@ -0,0 +1,22 @@
1
+ /Gemfile.lock
2
+ /.bundle/
3
+ /.yardoc
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /vendor
11
+ /node_modules
12
+
13
+ # rspec failure tracking
14
+ .rspec_status
15
+
16
+ /shell.nix
17
+ /tags
18
+
19
+ *.log
20
+ .DS_Store
21
+
22
+ .ruby-gemset
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1 @@
1
+ 2.6.6
@@ -0,0 +1,3 @@
1
+ 1.0.0
2
+
3
+ * Initial release
data/Gemfile ADDED
@@ -0,0 +1,26 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rails-dynamic-rendering.gemspec
4
+ gemspec
5
+
6
+ group :development, :test do
7
+ gem 'guard-livereload', require: false
8
+ gem 'guard-rspec'
9
+ gem 'pry-byebug'
10
+ gem 'rb-fsevent', require: false
11
+ gem 'rb-readline'
12
+ gem 'reek'
13
+ gem 'rails', '>= 6.0.0'
14
+ gem 'rspec'
15
+ gem 'rubocop-rspec'
16
+ gem 'rubocop'
17
+ gem 'shoulda-matchers', require: false
18
+ gem 'sqlite3'
19
+ gem 'stackprof'
20
+ gem 'timecop'
21
+ end
22
+
23
+ group :test do
24
+ gem 'ffaker'
25
+ gem 'simplecov'
26
+ end
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 Samuel Giles
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,53 @@
1
+ ![dynamic-rendering-logo](https://user-images.githubusercontent.com/2643026/94681334-28e48f80-031b-11eb-8dd5-010e6e23500c.png)
2
+
3
+ # Dynamic Rendering ![CI Badge](https://github.com/tricycle/rails-dynamic-rendering/workflows/RSpec%20Test%20Suite/badge.svg)
4
+
5
+ Is your SEO performance being held hostage by frontend JavaScript UI frameworks? Dynamic rendering is a "workaround solution" (in the words of Google) to help make difficult to index JavaScript based content easier for search engine crawlers to understand by presenting them with a pre-rendered HTML snapshot of your page.
6
+
7
+ This gem implements dynamic rendering for Rails applications using [Puppeteer](https://github.com/puppeteer/puppeteer) via the [Grover](https://github.com/Studiosity/grover) gem.
8
+
9
+ You can find out more about dynamic rendering in Google's article:
10
+ https://developers.google.com/search/docs/guides/dynamic-rendering
11
+
12
+ ## Is this server-side rendering / SSR?
13
+
14
+ Kind of - Server-side rendering typically involves pre-rendering JavaScript elements of the page on the server within some isolated NodeJS environment and then having the client "re-hydrate" the DOM after loading. Dynamic rendering differs in that it's targeted specifically at crawler user agents and doesn't involve any "re-hydration" of the DOM, rather it's a static representation of the DOM, a snapshot of how the page looked in a headless Chrome instance.
15
+
16
+ ## How does this work?
17
+
18
+ ![diagram](https://user-images.githubusercontent.com/2643026/94683948-39970480-031f-11eb-9ea7-e90a03b0529b.jpg)
19
+
20
+ ## Install
21
+
22
+ `gem 'rails-dynamic-rendering'`
23
+
24
+ ## Usage
25
+
26
+ Include the concern and then use `enable_dynamic_rendering`. Any controller action covered by the `enable_dynamic_rendering` call (which accepts all the same arguments as `after_action`) will based on the user agent choose to either just return the HTML with JS or choose to render the page in a headless Chrome instance & render back the serialized HTML with all JS removed.
27
+
28
+ ```ruby
29
+ class ApplicationController
30
+ include DynamicRendering::ActsAsDynamicallyRenderable
31
+
32
+ enable_dynamic_rendering only: :index, if: -> { some_condition_is_met? }
33
+
34
+ def index
35
+ @my_code = 'Does fancy stuff'
36
+ end
37
+
38
+ private
39
+
40
+ def some_condition_is_met?
41
+ true
42
+ end
43
+ end
44
+
45
+ ```
46
+
47
+ You can override the built in decision making thats used to determine whether a snapshot of the page should be returned by defining your own `#request_suitable_for_dynamic_rendering?` method. You might want to do this if you'd like to target other user agents:
48
+
49
+ ```ruby
50
+ def request_suitable_for_dynamic_rendering?
51
+ request.user_agent.include? 'My Problematic Bot That Does Not Render JS Content'
52
+ end
53
+ ```
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'rspec/sorbet'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,149 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module DynamicRendering
5
+ module ActsAsDynamicallyRenderable
6
+ extend ActiveSupport::Concern
7
+
8
+ USE_DYNAMIC_RENDERING_FOR_USER_AGENTS = /(googlebot|google-structured-data-testing-tool|bingbot)/i
9
+ MOBILE_USER_AGENT = /mobile/i
10
+ MOBILE_VIEWPORT = { width: 410, height: 730 }
11
+ DESKTOP_VIEWPORT = { width: 1400, height: 950 }
12
+
13
+ included do
14
+ def render_dynamically(log_level: :info)
15
+ return unless request_suitable_for_dynamic_rendering? && response_suitable_for_dynamic_rendering?
16
+
17
+ Rails.logger.public_send(
18
+ log_level,
19
+ <<~TEXT
20
+ [Dynamic rendering 🔍 ]:
21
+ • URL: #{request.original_url}"
22
+ • User-Agent: #{request.user_agent}
23
+ • Viewport: #{dynamic_rendering_viewport.inspect}
24
+ TEXT
25
+ )
26
+
27
+ response.body = HtmlRenderer.new(
28
+ response.body,
29
+ dynamic_rendering_viewport,
30
+ request.original_url
31
+ ).to_s
32
+ end
33
+ end
34
+
35
+ class_methods do
36
+ def enable_dynamic_rendering(arguments = {})
37
+ append_after_action(:render_dynamically, **arguments)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def request_suitable_for_dynamic_rendering?
44
+ request.user_agent.match?(USE_DYNAMIC_RENDERING_FOR_USER_AGENTS)
45
+ end
46
+
47
+ def dynamic_rendering_viewport
48
+ return MOBILE_VIEWPORT if dynamic_rendering_request_from_mobile_crawler?
49
+
50
+ DESKTOP_VIEWPORT
51
+ end
52
+
53
+ def dynamic_rendering_request_from_mobile_crawler?
54
+ request.user_agent.match?(MOBILE_USER_AGENT)
55
+ end
56
+
57
+ def response_suitable_for_dynamic_rendering?
58
+ response.ok? &&
59
+ Mime::Type.lookup(response.media_type).html?
60
+ end
61
+
62
+ class HtmlRenderer
63
+ DEFAULT_OPTIONS = { 'waitUntil' => 'networkidle2' }
64
+
65
+ def initialize(original_response_body, viewport, original_url, options = DEFAULT_OPTIONS)
66
+ @original_response_body = original_response_body
67
+ @viewport = viewport
68
+ @original_url = original_url
69
+ @options = options
70
+ end
71
+
72
+ def to_s
73
+ HtmlPostProcessor.new(rendered_html).to_s
74
+ end
75
+
76
+ private
77
+
78
+ def rendered_html
79
+ processor.convert(
80
+ 'content',
81
+ response_body_for_processor,
82
+ @options.merge(
83
+ 'displayUrl' => @original_url,
84
+ viewport: @viewport
85
+ )
86
+ )
87
+ end
88
+
89
+ def processor
90
+ HtmlProcessor.new(Dir.pwd)
91
+ end
92
+
93
+ def response_body_for_processor
94
+ HtmlPreprocessor.new(@original_response_body).to_s
95
+ end
96
+ end
97
+
98
+ class HtmlPreprocessor
99
+ def initialize(html_as_string)
100
+ @html_as_string = html_as_string
101
+ end
102
+
103
+ def to_s
104
+ append_dynamic_rendering_variable!
105
+ @html_as_string
106
+ end
107
+
108
+ private
109
+
110
+ PRERENDER_VARIABLE = "<script type=\"text/javascript\">window.dynamicRendering = true;</script>"
111
+
112
+ def append_dynamic_rendering_variable!
113
+ @html_as_string.sub!(/<head[^>]*>/, "\\0#{PRERENDER_VARIABLE}")
114
+ end
115
+ end
116
+
117
+ class HtmlPostProcessor
118
+ def initialize(html_as_string)
119
+ @html = Nokogiri::HTML(html_as_string)
120
+ end
121
+
122
+ def to_s
123
+ remove_javascript!
124
+ @html.to_s
125
+ end
126
+
127
+ private
128
+
129
+ JAVASCRIPT_SELECTOR = 'script:not([type]), script[type="text/javascript"]'
130
+
131
+ def remove_javascript!
132
+ @html.css(JAVASCRIPT_SELECTOR).remove
133
+ end
134
+ end
135
+
136
+ class HtmlProcessor < ::Grover::Processor
137
+ def convert(method, url_or_html, options)
138
+ spawn_process
139
+ ensure_packages_are_initiated
140
+ result = call_js_method method, url_or_html, options
141
+ return unless result
142
+
143
+ result
144
+ ensure
145
+ cleanup_process if stdin
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DynamicRendering
4
+ VERSION = '1.0.0'
5
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dynamic_rendering/version'
4
+ require 'grover'
5
+ require 'nokogiri'
6
+ require 'dynamic_rendering/acts_as_dynamically_renderable'
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "puppeteer": "^5.3.1"
4
+ }
5
+ }
@@ -0,0 +1,34 @@
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require 'dynamic_rendering/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'rails-dynamic-rendering'
8
+ spec.version = DynamicRendering::VERSION
9
+ spec.authors = ['Samuel Giles']
10
+ spec.email = ['samuel.giles@bellroy.com']
11
+
12
+ spec.summary = 'Puppeteer based dynamic rendering for Rails applications'
13
+ spec.homepage = 'https://github.com/tricycle/rails-dynamic-rendering'
14
+ spec.license = 'MIT'
15
+
16
+ # Specify which files should be added to the gem when it is released.
17
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
18
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
+ f.match(%r{^spec/}) && !f.match(%r{^spec/support/factories/})
20
+ end
21
+ spec.bindir = 'exe'
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_dependency 'grover'
26
+ spec.add_dependency 'rails'
27
+ spec.add_dependency 'nokogiri'
28
+
29
+ spec.add_development_dependency 'bundler'
30
+ spec.add_development_dependency 'pry'
31
+ spec.add_development_dependency 'rake', '~> 10.0'
32
+ spec.add_development_dependency 'rspec', '~> 3.0'
33
+ spec.add_development_dependency 'rspec-rails'
34
+ end
@@ -0,0 +1,362 @@
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ "@types/node@*":
6
+ version "14.11.2"
7
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256"
8
+ integrity sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==
9
+
10
+ "@types/yauzl@^2.9.1":
11
+ version "2.9.1"
12
+ resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af"
13
+ integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==
14
+ dependencies:
15
+ "@types/node" "*"
16
+
17
+ agent-base@5:
18
+ version "5.1.1"
19
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c"
20
+ integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==
21
+
22
+ balanced-match@^1.0.0:
23
+ version "1.0.0"
24
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
25
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
26
+
27
+ base64-js@^1.0.2:
28
+ version "1.3.1"
29
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
30
+ integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
31
+
32
+ bl@^4.0.3:
33
+ version "4.0.3"
34
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489"
35
+ integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==
36
+ dependencies:
37
+ buffer "^5.5.0"
38
+ inherits "^2.0.4"
39
+ readable-stream "^3.4.0"
40
+
41
+ brace-expansion@^1.1.7:
42
+ version "1.1.11"
43
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
44
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
45
+ dependencies:
46
+ balanced-match "^1.0.0"
47
+ concat-map "0.0.1"
48
+
49
+ buffer-crc32@~0.2.3:
50
+ version "0.2.13"
51
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
52
+ integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
53
+
54
+ buffer@^5.2.1, buffer@^5.5.0:
55
+ version "5.6.0"
56
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786"
57
+ integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==
58
+ dependencies:
59
+ base64-js "^1.0.2"
60
+ ieee754 "^1.1.4"
61
+
62
+ chownr@^1.1.1:
63
+ version "1.1.4"
64
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
65
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
66
+
67
+ concat-map@0.0.1:
68
+ version "0.0.1"
69
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
70
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
71
+
72
+ debug@4, debug@^4.1.0, debug@^4.1.1:
73
+ version "4.2.0"
74
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
75
+ integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
76
+ dependencies:
77
+ ms "2.1.2"
78
+
79
+ devtools-protocol@0.0.799653:
80
+ version "0.0.799653"
81
+ resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.799653.tgz#86fc95ce5bf4fdf4b77a58047ba9d2301078f119"
82
+ integrity sha512-t1CcaZbvm8pOlikqrsIM9GOa7Ipp07+4h/q9u0JXBWjPCjHdBl9KkddX87Vv9vBHoBGtwV79sYQNGnQM6iS5gg==
83
+
84
+ end-of-stream@^1.1.0, end-of-stream@^1.4.1:
85
+ version "1.4.4"
86
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
87
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
88
+ dependencies:
89
+ once "^1.4.0"
90
+
91
+ extract-zip@^2.0.0:
92
+ version "2.0.1"
93
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
94
+ integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
95
+ dependencies:
96
+ debug "^4.1.1"
97
+ get-stream "^5.1.0"
98
+ yauzl "^2.10.0"
99
+ optionalDependencies:
100
+ "@types/yauzl" "^2.9.1"
101
+
102
+ fd-slicer@~1.1.0:
103
+ version "1.1.0"
104
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
105
+ integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
106
+ dependencies:
107
+ pend "~1.2.0"
108
+
109
+ find-up@^4.0.0:
110
+ version "4.1.0"
111
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
112
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
113
+ dependencies:
114
+ locate-path "^5.0.0"
115
+ path-exists "^4.0.0"
116
+
117
+ fs-constants@^1.0.0:
118
+ version "1.0.0"
119
+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
120
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
121
+
122
+ fs.realpath@^1.0.0:
123
+ version "1.0.0"
124
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
125
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
126
+
127
+ get-stream@^5.1.0:
128
+ version "5.2.0"
129
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
130
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
131
+ dependencies:
132
+ pump "^3.0.0"
133
+
134
+ glob@^7.1.3:
135
+ version "7.1.6"
136
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
137
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
138
+ dependencies:
139
+ fs.realpath "^1.0.0"
140
+ inflight "^1.0.4"
141
+ inherits "2"
142
+ minimatch "^3.0.4"
143
+ once "^1.3.0"
144
+ path-is-absolute "^1.0.0"
145
+
146
+ https-proxy-agent@^4.0.0:
147
+ version "4.0.0"
148
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b"
149
+ integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==
150
+ dependencies:
151
+ agent-base "5"
152
+ debug "4"
153
+
154
+ ieee754@^1.1.4:
155
+ version "1.1.13"
156
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
157
+ integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
158
+
159
+ inflight@^1.0.4:
160
+ version "1.0.6"
161
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
162
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
163
+ dependencies:
164
+ once "^1.3.0"
165
+ wrappy "1"
166
+
167
+ inherits@2, inherits@^2.0.3, inherits@^2.0.4:
168
+ version "2.0.4"
169
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
170
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
171
+
172
+ locate-path@^5.0.0:
173
+ version "5.0.0"
174
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
175
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
176
+ dependencies:
177
+ p-locate "^4.1.0"
178
+
179
+ minimatch@^3.0.4:
180
+ version "3.0.4"
181
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
182
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
183
+ dependencies:
184
+ brace-expansion "^1.1.7"
185
+
186
+ mkdirp-classic@^0.5.2:
187
+ version "0.5.3"
188
+ resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
189
+ integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
190
+
191
+ ms@2.1.2:
192
+ version "2.1.2"
193
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
194
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
195
+
196
+ once@^1.3.0, once@^1.3.1, once@^1.4.0:
197
+ version "1.4.0"
198
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
199
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
200
+ dependencies:
201
+ wrappy "1"
202
+
203
+ p-limit@^2.2.0:
204
+ version "2.3.0"
205
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
206
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
207
+ dependencies:
208
+ p-try "^2.0.0"
209
+
210
+ p-locate@^4.1.0:
211
+ version "4.1.0"
212
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
213
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
214
+ dependencies:
215
+ p-limit "^2.2.0"
216
+
217
+ p-try@^2.0.0:
218
+ version "2.2.0"
219
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
220
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
221
+
222
+ path-exists@^4.0.0:
223
+ version "4.0.0"
224
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
225
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
226
+
227
+ path-is-absolute@^1.0.0:
228
+ version "1.0.1"
229
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
230
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
231
+
232
+ pend@~1.2.0:
233
+ version "1.2.0"
234
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
235
+ integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
236
+
237
+ pkg-dir@^4.2.0:
238
+ version "4.2.0"
239
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
240
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
241
+ dependencies:
242
+ find-up "^4.0.0"
243
+
244
+ progress@^2.0.1:
245
+ version "2.0.3"
246
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
247
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
248
+
249
+ proxy-from-env@^1.0.0:
250
+ version "1.1.0"
251
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
252
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
253
+
254
+ pump@^3.0.0:
255
+ version "3.0.0"
256
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
257
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
258
+ dependencies:
259
+ end-of-stream "^1.1.0"
260
+ once "^1.3.1"
261
+
262
+ puppeteer@^5.3.1:
263
+ version "5.3.1"
264
+ resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-5.3.1.tgz#324e190d89f25ac33dba539f57b82a18553f8646"
265
+ integrity sha512-YTM1RaBeYrj6n7IlRXRYLqJHF+GM7tasbvrNFx6w1S16G76NrPq7oYFKLDO+BQsXNtS8kW2GxWCXjIMPvfDyaQ==
266
+ dependencies:
267
+ debug "^4.1.0"
268
+ devtools-protocol "0.0.799653"
269
+ extract-zip "^2.0.0"
270
+ https-proxy-agent "^4.0.0"
271
+ pkg-dir "^4.2.0"
272
+ progress "^2.0.1"
273
+ proxy-from-env "^1.0.0"
274
+ rimraf "^3.0.2"
275
+ tar-fs "^2.0.0"
276
+ unbzip2-stream "^1.3.3"
277
+ ws "^7.2.3"
278
+
279
+ readable-stream@^3.1.1, readable-stream@^3.4.0:
280
+ version "3.6.0"
281
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
282
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
283
+ dependencies:
284
+ inherits "^2.0.3"
285
+ string_decoder "^1.1.1"
286
+ util-deprecate "^1.0.1"
287
+
288
+ rimraf@^3.0.2:
289
+ version "3.0.2"
290
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
291
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
292
+ dependencies:
293
+ glob "^7.1.3"
294
+
295
+ safe-buffer@~5.2.0:
296
+ version "5.2.1"
297
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
298
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
299
+
300
+ string_decoder@^1.1.1:
301
+ version "1.3.0"
302
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
303
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
304
+ dependencies:
305
+ safe-buffer "~5.2.0"
306
+
307
+ tar-fs@^2.0.0:
308
+ version "2.1.0"
309
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5"
310
+ integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==
311
+ dependencies:
312
+ chownr "^1.1.1"
313
+ mkdirp-classic "^0.5.2"
314
+ pump "^3.0.0"
315
+ tar-stream "^2.0.0"
316
+
317
+ tar-stream@^2.0.0:
318
+ version "2.1.4"
319
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa"
320
+ integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==
321
+ dependencies:
322
+ bl "^4.0.3"
323
+ end-of-stream "^1.4.1"
324
+ fs-constants "^1.0.0"
325
+ inherits "^2.0.3"
326
+ readable-stream "^3.1.1"
327
+
328
+ through@^2.3.8:
329
+ version "2.3.8"
330
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
331
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
332
+
333
+ unbzip2-stream@^1.3.3:
334
+ version "1.4.3"
335
+ resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
336
+ integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==
337
+ dependencies:
338
+ buffer "^5.2.1"
339
+ through "^2.3.8"
340
+
341
+ util-deprecate@^1.0.1:
342
+ version "1.0.2"
343
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
344
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
345
+
346
+ wrappy@1:
347
+ version "1.0.2"
348
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
349
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
350
+
351
+ ws@^7.2.3:
352
+ version "7.3.1"
353
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8"
354
+ integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==
355
+
356
+ yauzl@^2.10.0:
357
+ version "2.10.0"
358
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
359
+ integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
360
+ dependencies:
361
+ buffer-crc32 "~0.2.3"
362
+ fd-slicer "~1.1.0"
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails-dynamic-rendering
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Samuel Giles
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-10-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: grover
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: rails
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: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description:
126
+ email:
127
+ - samuel.giles@bellroy.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".github/workflows/rspec.yml"
133
+ - ".gitignore"
134
+ - ".rspec"
135
+ - ".ruby-version"
136
+ - CHANGELOG.md
137
+ - Gemfile
138
+ - LICENSE.txt
139
+ - README.md
140
+ - Rakefile
141
+ - bin/console
142
+ - bin/setup
143
+ - lib/dynamic_rendering/acts_as_dynamically_renderable.rb
144
+ - lib/dynamic_rendering/version.rb
145
+ - lib/rails-dynamic-rendering.rb
146
+ - package.json
147
+ - rails-dynamic-rendering.gemspec
148
+ - yarn.lock
149
+ homepage: https://github.com/tricycle/rails-dynamic-rendering
150
+ licenses:
151
+ - MIT
152
+ metadata: {}
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubygems_version: 3.0.3
169
+ signing_key:
170
+ specification_version: 4
171
+ summary: Puppeteer based dynamic rendering for Rails applications
172
+ test_files: []