serviceworker-rails 0.5.5 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +4 -1
- data/.rubocop.yml +23 -11
- data/.travis.yml +25 -7
- data/Appraisals +17 -3
- data/CHANGELOG.md +7 -0
- data/Gemfile +2 -0
- data/Guardfile +2 -0
- data/README.md +5 -2
- data/Rakefile +21 -2
- data/bin/_guard-core +2 -1
- data/bin/appraisal +2 -1
- data/bin/console +1 -0
- data/bin/guard +2 -1
- data/bin/rake +3 -1
- data/bin/rubocop +3 -1
- data/gemfiles/{rails_3.gemfile → rails_3.2.gemfile} +0 -0
- data/gemfiles/{rails_4.gemfile → rails_4.2.gemfile} +1 -0
- data/gemfiles/{rails_5.gemfile → rails_5.0.gemfile} +1 -0
- data/gemfiles/rails_5.1.gemfile +15 -0
- data/gemfiles/rails_5.2.gemfile +15 -0
- data/lib/assets/images/convert.rb +4 -0
- data/lib/generators/serviceworker/install_generator.rb +4 -1
- data/lib/generators/serviceworker/templates/serviceworker.rb +2 -0
- data/lib/service_worker.rb +2 -0
- data/lib/serviceworker-rails.rb +2 -1
- data/lib/serviceworker.rb +2 -0
- data/lib/serviceworker/engine.rb +2 -1
- data/lib/serviceworker/handlers.rb +74 -0
- data/lib/serviceworker/handlers/rack_handler.rb +25 -0
- data/lib/serviceworker/{rails/handler.rb → handlers/sprockets_handler.rb} +4 -3
- data/lib/serviceworker/handlers/webpacker_handler.rb +29 -0
- data/lib/serviceworker/middleware.rb +14 -12
- data/lib/serviceworker/rails.rb +2 -1
- data/lib/serviceworker/rails/version.rb +2 -1
- data/lib/serviceworker/route.rb +21 -8
- data/lib/serviceworker/router.rb +2 -1
- data/serviceworker-rails.gemspec +7 -7
- metadata +36 -47
- data/lib/serviceworker/handler.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1b9cc730def9c457542951247f29f359590450f0101cf302939e2fc09f767d14
|
4
|
+
data.tar.gz: f0c0e3d207450ce4abfb81260146ffa939dcc8a67430510b4a1c34b99090471d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ba64ff82b3c7c29a39391156883e725a4a17900ab9b67d0586d5def600f277caceef3fb71b590197bc36b4ba37005132157e0dc24f907e0c4660148a428017c
|
7
|
+
data.tar.gz: cb7b65a49574244b19baf1ce5d1c44b4cd5ba59a06194b7bbcda78d1fcf602acf628346d3fa36b38ef6460d77bf7d8d8ff8aed517e7d3055c01cf8ac497445b5
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
AllCops:
|
2
2
|
Exclude:
|
3
3
|
- "test/tmp/**/*"
|
4
|
+
- "test/log/**/*"
|
4
5
|
- "tmp/**/*"
|
5
6
|
- "coverage/**/*"
|
6
7
|
- "gemfiles/**/*"
|
8
|
+
- "**/node_modules/**/*"
|
7
9
|
|
8
10
|
Metrics/LineLength:
|
9
11
|
Max: 120
|
@@ -29,7 +31,7 @@ Metrics/CyclomaticComplexity:
|
|
29
31
|
Metrics/PerceivedComplexity:
|
30
32
|
Enabled: false
|
31
33
|
|
32
|
-
|
34
|
+
Layout/AlignParameters:
|
33
35
|
EnforcedStyle: with_fixed_indentation
|
34
36
|
|
35
37
|
Style/StringLiterals:
|
@@ -38,7 +40,7 @@ Style/StringLiterals:
|
|
38
40
|
Style/StringLiteralsInInterpolation:
|
39
41
|
EnforcedStyle: double_quotes
|
40
42
|
|
41
|
-
|
43
|
+
Layout/ClosingParenthesisIndentation:
|
42
44
|
Enabled: false
|
43
45
|
|
44
46
|
Style/OneLineConditional:
|
@@ -53,41 +55,51 @@ Style/Not:
|
|
53
55
|
Documentation:
|
54
56
|
Enabled: false # TODO: Enable again once we have more docs
|
55
57
|
|
56
|
-
|
57
|
-
|
58
|
+
Layout/CaseIndentation:
|
59
|
+
EnforcedStyle: case
|
58
60
|
SupportedStyles:
|
59
61
|
- case
|
60
62
|
- end
|
61
|
-
IndentOneStep:
|
63
|
+
IndentOneStep: false
|
62
64
|
|
63
65
|
Style/PercentLiteralDelimiters:
|
64
66
|
PreferredDelimiters:
|
65
67
|
'%w': "[]"
|
66
68
|
'%W': "[]"
|
67
69
|
|
68
|
-
|
70
|
+
Layout/AccessModifierIndentation:
|
69
71
|
Enabled: false
|
70
72
|
|
71
73
|
Style/SignalException:
|
72
74
|
Enabled: false
|
73
75
|
|
74
|
-
|
76
|
+
Layout/IndentationWidth:
|
75
77
|
Enabled: false
|
76
78
|
|
77
|
-
|
78
|
-
ExactNameMatch: true
|
79
|
-
|
80
|
-
Lint/DefEndAlignment:
|
79
|
+
Layout/DefEndAlignment:
|
81
80
|
Enabled: false
|
82
81
|
|
83
82
|
Lint/HandleExceptions:
|
84
83
|
Enabled: false
|
85
84
|
|
85
|
+
Naming/FileName:
|
86
|
+
Enabled: false
|
87
|
+
|
86
88
|
Style/SpecialGlobalVars:
|
87
89
|
Enabled: false
|
88
90
|
|
89
91
|
Style/TrivialAccessors:
|
92
|
+
ExactNameMatch: true
|
90
93
|
Enabled: false
|
91
94
|
|
92
95
|
Style/ClassAndModuleChildren:
|
93
96
|
Enabled: false
|
97
|
+
|
98
|
+
Style/FormatStringToken:
|
99
|
+
Enabled: false
|
100
|
+
|
101
|
+
Style/TrailingUnderscoreVariable:
|
102
|
+
Enabled: false
|
103
|
+
|
104
|
+
Style/ModuleFunction:
|
105
|
+
Enabled: false
|
data/.travis.yml
CHANGED
@@ -1,10 +1,28 @@
|
|
1
1
|
language: ruby
|
2
|
-
cache:
|
2
|
+
cache:
|
3
|
+
bundler: true
|
4
|
+
yarn: true
|
5
|
+
directories:
|
6
|
+
- node_modules
|
3
7
|
rvm:
|
4
|
-
- 2.
|
5
|
-
- 2.
|
6
|
-
|
8
|
+
- 2.4
|
9
|
+
- 2.5
|
10
|
+
- 2.6
|
11
|
+
before_install:
|
12
|
+
- gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
|
13
|
+
- gem install bundler -v '< 2'
|
14
|
+
install:
|
15
|
+
- bundle install --path vendor/bundle
|
16
|
+
- cd test/sample && yarn install && cd -
|
7
17
|
gemfile:
|
8
|
-
- gemfiles/rails_3.gemfile
|
9
|
-
- gemfiles/rails_4.gemfile
|
10
|
-
- gemfiles/rails_5.gemfile
|
18
|
+
- gemfiles/rails_3.2.gemfile
|
19
|
+
- gemfiles/rails_4.2.gemfile
|
20
|
+
- gemfiles/rails_5.0.gemfile
|
21
|
+
- gemfiles/rails_5.1.gemfile
|
22
|
+
- gemfiles/rails_3.2.gemfile
|
23
|
+
matrix:
|
24
|
+
exclude:
|
25
|
+
- rvm: 2.6
|
26
|
+
gemfile: gemfiles/rails_3.2.gemfile
|
27
|
+
script:
|
28
|
+
- bundle exec rake
|
data/Appraisals
CHANGED
@@ -1,12 +1,26 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
appraise "rails-3.2" do
|
2
4
|
gem "rails", "~> 3.2"
|
3
5
|
gem "test-unit", "~> 3.0"
|
4
6
|
end
|
5
7
|
|
6
|
-
appraise "rails-4" do
|
8
|
+
appraise "rails-4.2" do
|
7
9
|
gem "rails", "~> 4.2"
|
10
|
+
gem "webpacker"
|
8
11
|
end
|
9
12
|
|
10
|
-
appraise "rails-5" do
|
13
|
+
appraise "rails-5.0" do
|
11
14
|
gem "rails", "~> 5.0"
|
15
|
+
gem "webpacker"
|
16
|
+
end
|
17
|
+
|
18
|
+
appraise "rails-5.1" do
|
19
|
+
gem "rails", "~> 5.1"
|
20
|
+
gem "webpacker"
|
21
|
+
end
|
22
|
+
|
23
|
+
appraise "rails-5.2" do
|
24
|
+
gem "rails", "~> 5.2"
|
25
|
+
gem "webpacker", "~> 3.4"
|
12
26
|
end
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Guardfile
CHANGED
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
[![Build Status](https://travis-ci.org/rossta/serviceworker-rails.svg?branch=master)](https://travis-ci.org/rossta/serviceworker-rails)
|
4
4
|
[![Code Climate](https://codeclimate.com/github/rossta/serviceworker-rails/badges/gpa.svg)](https://codeclimate.com/github/rossta/serviceworker-rails)
|
5
5
|
|
6
|
-
Turn your Rails app into a Progressive Web App. Use [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) with the Rails asset pipeline.
|
6
|
+
Turn your Rails app into a Progressive Web App. Use [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) with the Rails [asset pipeline](https://github.com/rails/sprockets-rails) or [Webpacker](https://github.com/rails/webpacker)
|
7
7
|
|
8
8
|
## Why?
|
9
9
|
|
@@ -18,7 +18,7 @@ with requests and responses within `/assets/`<em>**</em>. This is not what we wa
|
|
18
18
|
|
19
19
|
* [MDN states](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API#Download_install_and_activate) browsers check for updated service worker scripts in the background every 24 hours (possibly less). Rails developers wouldn't be able to take advantage of this feature since the fingerprint strategy means assets at a given url are immutable. Beside fingerprintings, the `Cache-Control` headers used for static files served from Rails also work against browser's treatment of service workers.
|
20
20
|
|
21
|
-
We want Sprockets to compile service worker JavaScript from ES6/7, CoffeeScript, ERB, etc. but must remove the caching and scoping mechanisms offered by Rails
|
21
|
+
We want Sprockets or Webpacker to compile service worker JavaScript from ES6/7, CoffeeScript, ERB, etc. but must remove the caching and scoping mechanisms offered by Rails defaults. This is where `serviceworker-rails` comes in.
|
22
22
|
|
23
23
|
*Check out the [blog post](https://rossta.net/blog/service-worker-on-rails.html)
|
24
24
|
for more background.*
|
@@ -271,6 +271,9 @@ Rails.application.configure do
|
|
271
271
|
match "/header-serviceworker.js" => "another/serviceworker.js",
|
272
272
|
headers: { "X-Resource-Header" => "A resource" }
|
273
273
|
|
274
|
+
# maps to serviceworker "pack" compiled by Webpacker
|
275
|
+
match "/webpack-serviceworker.js" => "serviceworker.js", pack: true
|
276
|
+
|
274
277
|
# anonymous glob exposes `paths` variable for interpolation
|
275
278
|
match "/*/serviceworker.js" => "%{paths}/serviceworker.js"
|
276
279
|
end
|
data/Rakefile
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "rubygems"
|
2
4
|
require "bundler/setup"
|
3
5
|
require "bundler/gem_tasks"
|
4
6
|
require "rake/testtask"
|
5
7
|
require "rubocop/rake_task"
|
6
8
|
|
7
|
-
APP_RAKEFILE = File.expand_path("
|
9
|
+
APP_RAKEFILE = File.expand_path("test/sample/Rakefile", __dir__)
|
8
10
|
load "rails/tasks/engine.rake"
|
9
11
|
|
10
12
|
RuboCop::RakeTask.new
|
@@ -15,4 +17,21 @@ Rake::TestTask.new(:test) do |t|
|
|
15
17
|
t.test_files = FileList["test/**/*_test.rb"]
|
16
18
|
end
|
17
19
|
|
18
|
-
task default: [
|
20
|
+
task default: %i[test rubocop]
|
21
|
+
|
22
|
+
task :compile do
|
23
|
+
if defined?(Webpacker)
|
24
|
+
Dir.chdir("test/sample") do
|
25
|
+
sh "NODE_ENV=test yarn install"
|
26
|
+
sh "RAILS_ENV=test ./bin/rake webpacker:compile"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Rake::Task[:test].enhance [:compile] do
|
32
|
+
if defined?(Webpacker)
|
33
|
+
Dir.chdir("test/sample") do
|
34
|
+
sh "RAILS_ENV=test ./bin/rake webpacker:clobber"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/bin/_guard-core
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -9,7 +10,7 @@
|
|
9
10
|
|
10
11
|
require "pathname"
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
-
|
13
|
+
Pathname.new(__FILE__).realpath)
|
13
14
|
|
14
15
|
require "rubygems"
|
15
16
|
require "bundler/setup"
|
data/bin/appraisal
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -9,7 +10,7 @@
|
|
9
10
|
|
10
11
|
require "pathname"
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
-
|
13
|
+
Pathname.new(__FILE__).realpath)
|
13
14
|
|
14
15
|
require "rubygems"
|
15
16
|
require "bundler/setup"
|
data/bin/console
CHANGED
data/bin/guard
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
|
+
|
3
4
|
#
|
4
5
|
# This file was generated by Bundler.
|
5
6
|
#
|
@@ -9,7 +10,7 @@
|
|
9
10
|
|
10
11
|
require "pathname"
|
11
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
-
|
13
|
+
Pathname.new(__FILE__).realpath)
|
13
14
|
|
14
15
|
require "rubygems"
|
15
16
|
require "bundler/setup"
|
data/bin/rake
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
#
|
3
5
|
# This file was generated by Bundler.
|
4
6
|
#
|
@@ -8,7 +10,7 @@
|
|
8
10
|
|
9
11
|
require "pathname"
|
10
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
-
|
13
|
+
Pathname.new(__FILE__).realpath)
|
12
14
|
|
13
15
|
require "rubygems"
|
14
16
|
require "bundler/setup"
|
data/bin/rubocop
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
#
|
3
5
|
# This file was generated by Bundler.
|
4
6
|
#
|
@@ -8,7 +10,7 @@
|
|
8
10
|
|
9
11
|
require "pathname"
|
10
12
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
-
|
13
|
+
Pathname.new(__FILE__).realpath)
|
12
14
|
|
13
15
|
require "rubygems"
|
14
16
|
require "bundler/setup"
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
gem "rails", "~> 5.1"
|
6
|
+
gem "webpacker"
|
7
|
+
|
8
|
+
group :development, :test do
|
9
|
+
gem "guard", :require => false
|
10
|
+
gem "guard-minitest", :require => false
|
11
|
+
gem "pry"
|
12
|
+
gem "pry-byebug", :platforms => [:mri]
|
13
|
+
end
|
14
|
+
|
15
|
+
gemspec :path => "../"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
gem "rails", "~> 5.2"
|
6
|
+
gem "webpacker", "~> 3.4"
|
7
|
+
|
8
|
+
group :development, :test do
|
9
|
+
gem "guard", :require => false
|
10
|
+
gem "guard-minitest", :require => false
|
11
|
+
gem "pry"
|
12
|
+
gem "pry-byebug", :platforms => [:mri]
|
13
|
+
end
|
14
|
+
|
15
|
+
gemspec :path => "../"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "rails/generators"
|
2
4
|
require "fileutils"
|
3
5
|
|
@@ -33,7 +35,7 @@ module Serviceworker
|
|
33
35
|
def update_application_layout
|
34
36
|
layout = detect_layout
|
35
37
|
snippet = %(<link rel="manifest" href="/manifest.json" />)
|
36
|
-
snippet
|
38
|
+
snippet += %(\n<meta name="apple-mobile-web-app-capable" content="yes">)
|
37
39
|
unless layout
|
38
40
|
conditional_warn "Could not locate application layout. To insert manifest tags manually, use:\n\n#{snippet}\n"
|
39
41
|
return
|
@@ -55,6 +57,7 @@ module Serviceworker
|
|
55
57
|
%w[.js .js.erb .coffee .coffee.erb .js.coffee .js.coffee.erb].each do |ext|
|
56
58
|
next unless File.exist?(javascripts_dir("application#{ext}"))
|
57
59
|
return [ext, "#="] if ext.include?(".coffee")
|
60
|
+
|
58
61
|
return [ext, "//="]
|
59
62
|
end
|
60
63
|
end
|
data/lib/service_worker.rb
CHANGED
data/lib/serviceworker-rails.rb
CHANGED
data/lib/serviceworker.rb
CHANGED
data/lib/serviceworker/engine.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "rails"
|
3
4
|
require "rails/railtie"
|
4
5
|
require "serviceworker"
|
@@ -8,7 +9,7 @@ module ServiceWorker
|
|
8
9
|
config.serviceworker = ActiveSupport::OrderedOptions.new
|
9
10
|
config.serviceworker.headers = {}
|
10
11
|
config.serviceworker.routes = ServiceWorker::Router.new
|
11
|
-
config.serviceworker.handler =
|
12
|
+
config.serviceworker.handler = :sprockets
|
12
13
|
config.serviceworker.icon_sizes = %w[36 48 60 72 76 96 120 152 180 192 512]
|
13
14
|
|
14
15
|
initializer "serviceworker-rails.configure_rails_initialization", after: :load_config_initializers do
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "serviceworker/handlers/rack_handler"
|
4
|
+
|
5
|
+
module ServiceWorker
|
6
|
+
module Handlers
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def build(handler)
|
10
|
+
resolve_handler(handler) || default_handler
|
11
|
+
end
|
12
|
+
|
13
|
+
def handler_for_route_match(route_match)
|
14
|
+
options = route_match.options
|
15
|
+
return webpacker_handler if Route.webpacker?(options)
|
16
|
+
return sprockets_handler if Route.sprockets?(options)
|
17
|
+
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def ===(other)
|
22
|
+
other.respond_to?(:call)
|
23
|
+
end
|
24
|
+
|
25
|
+
def handler_for_name(name)
|
26
|
+
available_handlers = %w[sprockets webpacker rack]
|
27
|
+
if available_handlers.include?(name.to_s)
|
28
|
+
send("#{name}_handler")
|
29
|
+
else
|
30
|
+
raise ServiceWorker::Error,
|
31
|
+
"Unknown handler #{name.inspect}. Please use one of #{available_handlers.inspect}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def resolve_handler(handler)
|
36
|
+
case handler
|
37
|
+
when Handlers
|
38
|
+
handler
|
39
|
+
when Symbol, String
|
40
|
+
handler_for_name(handler)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def webpacker_handler
|
45
|
+
require "serviceworker/handlers/webpacker_handler"
|
46
|
+
ServiceWorker::Handlers::WebpackerHandler.new
|
47
|
+
end
|
48
|
+
|
49
|
+
def sprockets_handler
|
50
|
+
require "serviceworker/handlers/sprockets_handler"
|
51
|
+
ServiceWorker::Handlers::SprocketsHandler.new
|
52
|
+
end
|
53
|
+
|
54
|
+
def rack_handler
|
55
|
+
ServiceWorker::Handlers::RackHandler.new
|
56
|
+
end
|
57
|
+
|
58
|
+
def default_handler
|
59
|
+
if sprockets?
|
60
|
+
sprockets_handler
|
61
|
+
else
|
62
|
+
rack_handler
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def webpacker?
|
67
|
+
defined?(::Webpacker)
|
68
|
+
end
|
69
|
+
|
70
|
+
def sprockets?
|
71
|
+
defined?(::Rails) && ::Rails.configuration.assets
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ServiceWorker
|
4
|
+
module Handlers
|
5
|
+
class RackHandler
|
6
|
+
def initialize(root = Dir.getwd)
|
7
|
+
@root = root
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
path_info = env.fetch("serviceworker.asset_name")
|
12
|
+
|
13
|
+
file_server.call(env.merge("PATH_INFO" => path_info))
|
14
|
+
end
|
15
|
+
|
16
|
+
def file_path(path_info)
|
17
|
+
@root.join(path_info)
|
18
|
+
end
|
19
|
+
|
20
|
+
def file_server
|
21
|
+
@file_server ||= ::Rack::File.new(@root)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "rack/file"
|
3
4
|
|
4
5
|
module ServiceWorker
|
5
|
-
module
|
6
|
-
class
|
6
|
+
module Handlers
|
7
|
+
class SprocketsHandler
|
7
8
|
def call(env)
|
8
9
|
path_info = env.fetch("serviceworker.asset_name")
|
9
10
|
|
@@ -14,7 +15,7 @@ module ServiceWorker
|
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
+
private
|
18
19
|
|
19
20
|
def sprockets_server
|
20
21
|
::Rails.application.assets
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rack/file"
|
4
|
+
require "webpacker"
|
5
|
+
|
6
|
+
module ServiceWorker
|
7
|
+
module Handlers
|
8
|
+
class WebpackerHandler
|
9
|
+
def call(env)
|
10
|
+
path_info = env.fetch("serviceworker.asset_name")
|
11
|
+
|
12
|
+
path = Webpacker.manifest.lookup(path_info)
|
13
|
+
|
14
|
+
if Webpacker.dev_server.running?
|
15
|
+
proxy = Webpacker::DevServerProxy.new
|
16
|
+
proxy.call(env.merge("PATH_INFO" => path))
|
17
|
+
else
|
18
|
+
file_server.call(env.merge("PATH_INFO" => path))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def file_server
|
25
|
+
@file_server ||= ::Rack::File.new(::Rails.public_path)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,9 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "serviceworker/handlers"
|
4
|
+
|
2
5
|
module ServiceWorker
|
3
6
|
class Middleware
|
4
|
-
REQUEST_METHOD = "REQUEST_METHOD"
|
5
|
-
GET = "GET"
|
6
|
-
HEAD = "HEAD"
|
7
|
+
REQUEST_METHOD = "REQUEST_METHOD"
|
8
|
+
GET = "GET"
|
9
|
+
HEAD = "HEAD"
|
7
10
|
|
8
11
|
# Initialize the Rack middleware for responding to serviceworker asset
|
9
12
|
# requests
|
@@ -17,14 +20,14 @@ module ServiceWorker
|
|
17
20
|
def initialize(app, opts = {})
|
18
21
|
@app = app
|
19
22
|
@opts = opts
|
20
|
-
@headers = opts.fetch(:headers, {})
|
23
|
+
@headers = default_headers.merge(opts.fetch(:headers, {}))
|
21
24
|
@router = opts.fetch(:routes, ServiceWorker::Router.new)
|
22
|
-
@handler = @opts.fetch(:handler,
|
25
|
+
@handler = Handlers.build(@opts.fetch(:handler, nil))
|
23
26
|
end
|
24
27
|
|
25
28
|
def call(env)
|
26
29
|
case env[REQUEST_METHOD]
|
27
|
-
|
30
|
+
when GET, HEAD
|
28
31
|
route_match = @router.match_route(env)
|
29
32
|
return respond_to_match(route_match, env) if route_match
|
30
33
|
end
|
@@ -43,11 +46,15 @@ module ServiceWorker
|
|
43
46
|
def respond_to_match(route_match, env)
|
44
47
|
env = env.merge("serviceworker.asset_name" => route_match.asset_name)
|
45
48
|
|
46
|
-
status, headers, body =
|
49
|
+
status, headers, body = handler_for_route_match(route_match).call(env)
|
47
50
|
|
48
51
|
[status, headers.merge(@headers).merge(route_match.headers), body]
|
49
52
|
end
|
50
53
|
|
54
|
+
def handler_for_route_match(route_match)
|
55
|
+
Handlers.handler_for_route_match(route_match) || @handler
|
56
|
+
end
|
57
|
+
|
51
58
|
def info(msg)
|
52
59
|
logger.info "[#{self.class}] - #{msg}"
|
53
60
|
end
|
@@ -55,10 +62,5 @@ module ServiceWorker
|
|
55
62
|
def logger
|
56
63
|
@logger ||= @opts.fetch(:logger, Logger.new(STDOUT))
|
57
64
|
end
|
58
|
-
|
59
|
-
def default_handler
|
60
|
-
require "serviceworker/handler"
|
61
|
-
ServiceWorker::Handler.new
|
62
|
-
end
|
63
65
|
end
|
64
66
|
end
|
data/lib/serviceworker/rails.rb
CHANGED
data/lib/serviceworker/route.rb
CHANGED
@@ -1,14 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module ServiceWorker
|
3
4
|
class Route
|
4
5
|
attr_reader :path_pattern, :asset_pattern, :options
|
5
6
|
|
6
|
-
RouteMatch = Struct.new(:path, :asset_name, :headers) do
|
7
|
+
RouteMatch = Struct.new(:path, :asset_name, :headers, :options) do
|
7
8
|
def to_s
|
8
9
|
asset_name
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
13
|
+
def self.webpacker?(options)
|
14
|
+
options.key?(:pack) && Handlers.webpacker?
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.sprockets?(options)
|
18
|
+
options.key?(:asset)
|
19
|
+
end
|
20
|
+
|
12
21
|
def initialize(path_pattern, asset_pattern = nil, options = {})
|
13
22
|
if asset_pattern.is_a?(Hash)
|
14
23
|
options = asset_pattern
|
@@ -16,7 +25,11 @@ module ServiceWorker
|
|
16
25
|
end
|
17
26
|
|
18
27
|
@path_pattern = path_pattern
|
19
|
-
@asset_pattern =
|
28
|
+
@asset_pattern = if self.class.webpacker?(options)
|
29
|
+
asset_pattern || options.fetch(:pack, path_pattern)
|
30
|
+
else
|
31
|
+
asset_pattern || options.fetch(:asset, path_pattern)
|
32
|
+
end
|
20
33
|
@options = options
|
21
34
|
end
|
22
35
|
|
@@ -25,7 +38,7 @@ module ServiceWorker
|
|
25
38
|
|
26
39
|
asset = resolver.call(path) or return nil
|
27
40
|
|
28
|
-
RouteMatch.new(path, asset, headers)
|
41
|
+
RouteMatch.new(path, asset, headers, options)
|
29
42
|
end
|
30
43
|
|
31
44
|
def headers
|
@@ -39,14 +52,14 @@ module ServiceWorker
|
|
39
52
|
end
|
40
53
|
|
41
54
|
class AssetResolver
|
42
|
-
PATH_INFO = "PATH_INFO"
|
55
|
+
PATH_INFO = "PATH_INFO"
|
43
56
|
DEFAULT_WILDCARD_NAME = :paths
|
44
|
-
WILDCARD_PATTERN = %r{\/\*([^\/]*)}
|
45
|
-
NAMED_SEGMENTS_PATTERN = %r{\/([^\/]*):([^:$\/]+)}
|
46
|
-
LEADING_SLASH_PATTERN = %r{^\/}
|
57
|
+
WILDCARD_PATTERN = %r{\/\*([^\/]*)}.freeze
|
58
|
+
NAMED_SEGMENTS_PATTERN = %r{\/([^\/]*):([^:$\/]+)}.freeze
|
59
|
+
LEADING_SLASH_PATTERN = %r{^\/}.freeze
|
47
60
|
INTERPOLATION_PATTERN = Regexp.union(
|
48
61
|
/%%/,
|
49
|
-
/%\{(\w+)\}
|
62
|
+
/%\{(\w+)\}/ # matches placeholders like "%{foo}"
|
50
63
|
)
|
51
64
|
|
52
65
|
attr_reader :path_pattern, :asset_pattern
|
data/lib/serviceworker/router.rb
CHANGED
data/serviceworker-rails.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require "serviceworker/rails/version"
|
5
6
|
|
@@ -21,13 +22,12 @@ Gem::Specification.new do |spec|
|
|
21
22
|
|
22
23
|
spec.add_dependency "railties", [">= 3.1"]
|
23
24
|
|
24
|
-
spec.add_development_dependency "
|
25
|
-
spec.add_development_dependency "bundler", "~> 1.11"
|
26
|
-
spec.add_development_dependency "rake", "~> 11.0"
|
25
|
+
spec.add_development_dependency "appraisal", "~> 2.1.0"
|
27
26
|
spec.add_development_dependency "minitest", "~> 5.0"
|
28
27
|
spec.add_development_dependency "rack-test"
|
29
|
-
spec.add_development_dependency "rubocop", "0.46.0"
|
30
28
|
spec.add_development_dependency "rails"
|
31
|
-
spec.add_development_dependency "
|
29
|
+
spec.add_development_dependency "rake"
|
30
|
+
spec.add_development_dependency "rubocop"
|
32
31
|
spec.add_development_dependency "simplecov"
|
32
|
+
spec.add_development_dependency "sprockets-rails"
|
33
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: serviceworker-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ross Kaffenberger
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -25,63 +25,49 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
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
|
28
|
+
name: appraisal
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
31
|
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
33
|
+
version: 2.1.0
|
48
34
|
type: :development
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
38
|
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
40
|
+
version: 2.1.0
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
42
|
+
name: minitest
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
45
|
- - "~>"
|
60
46
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
47
|
+
version: '5.0'
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
52
|
- - "~>"
|
67
53
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
54
|
+
version: '5.0'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
56
|
+
name: rack-test
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
|
-
- - "
|
59
|
+
- - ">="
|
74
60
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
61
|
+
version: '0'
|
76
62
|
type: :development
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
|
-
- - "
|
66
|
+
- - ">="
|
81
67
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
68
|
+
version: '0'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
70
|
+
name: rails
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
86
72
|
requirements:
|
87
73
|
- - ">="
|
@@ -95,21 +81,21 @@ dependencies:
|
|
95
81
|
- !ruby/object:Gem::Version
|
96
82
|
version: '0'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
84
|
+
name: rake
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
100
86
|
requirements:
|
101
|
-
- -
|
87
|
+
- - ">="
|
102
88
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0
|
89
|
+
version: '0'
|
104
90
|
type: :development
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
|
-
- -
|
94
|
+
- - ">="
|
109
95
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0
|
96
|
+
version: '0'
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
98
|
+
name: rubocop
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
114
100
|
requirements:
|
115
101
|
- - ">="
|
@@ -123,21 +109,21 @@ dependencies:
|
|
123
109
|
- !ruby/object:Gem::Version
|
124
110
|
version: '0'
|
125
111
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
112
|
+
name: simplecov
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
128
114
|
requirements:
|
129
|
-
- - "
|
115
|
+
- - ">="
|
130
116
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
117
|
+
version: '0'
|
132
118
|
type: :development
|
133
119
|
prerelease: false
|
134
120
|
version_requirements: !ruby/object:Gem::Requirement
|
135
121
|
requirements:
|
136
|
-
- - "
|
122
|
+
- - ">="
|
137
123
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
124
|
+
version: '0'
|
139
125
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
126
|
+
name: sprockets-rails
|
141
127
|
requirement: !ruby/object:Gem::Requirement
|
142
128
|
requirements:
|
143
129
|
- - ">="
|
@@ -175,9 +161,11 @@ files:
|
|
175
161
|
- bin/rake
|
176
162
|
- bin/rubocop
|
177
163
|
- bin/setup
|
178
|
-
- gemfiles/rails_3.gemfile
|
179
|
-
- gemfiles/rails_4.gemfile
|
180
|
-
- gemfiles/rails_5.gemfile
|
164
|
+
- gemfiles/rails_3.2.gemfile
|
165
|
+
- gemfiles/rails_4.2.gemfile
|
166
|
+
- gemfiles/rails_5.0.gemfile
|
167
|
+
- gemfiles/rails_5.1.gemfile
|
168
|
+
- gemfiles/rails_5.2.gemfile
|
181
169
|
- lib/assets/images/convert.rb
|
182
170
|
- lib/assets/images/serviceworker-rails/heart-1200x1200.png
|
183
171
|
- lib/assets/images/serviceworker-rails/heart-120x120.png
|
@@ -201,10 +189,12 @@ files:
|
|
201
189
|
- lib/serviceworker-rails.rb
|
202
190
|
- lib/serviceworker.rb
|
203
191
|
- lib/serviceworker/engine.rb
|
204
|
-
- lib/serviceworker/
|
192
|
+
- lib/serviceworker/handlers.rb
|
193
|
+
- lib/serviceworker/handlers/rack_handler.rb
|
194
|
+
- lib/serviceworker/handlers/sprockets_handler.rb
|
195
|
+
- lib/serviceworker/handlers/webpacker_handler.rb
|
205
196
|
- lib/serviceworker/middleware.rb
|
206
197
|
- lib/serviceworker/rails.rb
|
207
|
-
- lib/serviceworker/rails/handler.rb
|
208
198
|
- lib/serviceworker/rails/version.rb
|
209
199
|
- lib/serviceworker/route.rb
|
210
200
|
- lib/serviceworker/router.rb
|
@@ -228,8 +218,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
228
218
|
- !ruby/object:Gem::Version
|
229
219
|
version: '0'
|
230
220
|
requirements: []
|
231
|
-
|
232
|
-
rubygems_version: 2.5.2
|
221
|
+
rubygems_version: 3.0.3
|
233
222
|
signing_key:
|
234
223
|
specification_version: 4
|
235
224
|
summary: ServiceWorker for Rails 3+
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module ServiceWorker
|
3
|
-
class Handler
|
4
|
-
def initialize(root = Dir.getwd)
|
5
|
-
@root = root
|
6
|
-
end
|
7
|
-
|
8
|
-
def call(env)
|
9
|
-
path_info = env.fetch("serviceworker.asset_name")
|
10
|
-
|
11
|
-
file_server.call(env.merge("PATH_INFO" => path_info))
|
12
|
-
end
|
13
|
-
|
14
|
-
def file_path(path_info)
|
15
|
-
@root.join(path_info)
|
16
|
-
end
|
17
|
-
|
18
|
-
def file_server
|
19
|
-
@file_server ||= ::Rack::File.new(@root)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|