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.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +4 -1
  3. data/.rubocop.yml +23 -11
  4. data/.travis.yml +25 -7
  5. data/Appraisals +17 -3
  6. data/CHANGELOG.md +7 -0
  7. data/Gemfile +2 -0
  8. data/Guardfile +2 -0
  9. data/README.md +5 -2
  10. data/Rakefile +21 -2
  11. data/bin/_guard-core +2 -1
  12. data/bin/appraisal +2 -1
  13. data/bin/console +1 -0
  14. data/bin/guard +2 -1
  15. data/bin/rake +3 -1
  16. data/bin/rubocop +3 -1
  17. data/gemfiles/{rails_3.gemfile → rails_3.2.gemfile} +0 -0
  18. data/gemfiles/{rails_4.gemfile → rails_4.2.gemfile} +1 -0
  19. data/gemfiles/{rails_5.gemfile → rails_5.0.gemfile} +1 -0
  20. data/gemfiles/rails_5.1.gemfile +15 -0
  21. data/gemfiles/rails_5.2.gemfile +15 -0
  22. data/lib/assets/images/convert.rb +4 -0
  23. data/lib/generators/serviceworker/install_generator.rb +4 -1
  24. data/lib/generators/serviceworker/templates/serviceworker.rb +2 -0
  25. data/lib/service_worker.rb +2 -0
  26. data/lib/serviceworker-rails.rb +2 -1
  27. data/lib/serviceworker.rb +2 -0
  28. data/lib/serviceworker/engine.rb +2 -1
  29. data/lib/serviceworker/handlers.rb +74 -0
  30. data/lib/serviceworker/handlers/rack_handler.rb +25 -0
  31. data/lib/serviceworker/{rails/handler.rb → handlers/sprockets_handler.rb} +4 -3
  32. data/lib/serviceworker/handlers/webpacker_handler.rb +29 -0
  33. data/lib/serviceworker/middleware.rb +14 -12
  34. data/lib/serviceworker/rails.rb +2 -1
  35. data/lib/serviceworker/rails/version.rb +2 -1
  36. data/lib/serviceworker/route.rb +21 -8
  37. data/lib/serviceworker/router.rb +2 -1
  38. data/serviceworker-rails.gemspec +7 -7
  39. metadata +36 -47
  40. data/lib/serviceworker/handler.rb +0 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6e58a2ae3f4679e8cd32a024d0114d5a924a174a
4
- data.tar.gz: 474f2390c03df7be5efb55d7f173b40dd863c259
2
+ SHA256:
3
+ metadata.gz: 1b9cc730def9c457542951247f29f359590450f0101cf302939e2fc09f767d14
4
+ data.tar.gz: f0c0e3d207450ce4abfb81260146ffa939dcc8a67430510b4a1c34b99090471d
5
5
  SHA512:
6
- metadata.gz: b212fcdba3d949901fb95462fda9472e9c27d241542c7303949d87eff1183e0c492c77596d01ddb70e41bb86f30e4eecd717a2403bb4edfea6da52724eb78d95
7
- data.tar.gz: 331f5ea58dbd378e481397ff48219a80e113aff428c904a93044f6b68cf613fa7f00c9530776397a87b8fde6bfffbba78431c9ea5ba701b8cb32face5a1b2b0d
6
+ metadata.gz: 6ba64ff82b3c7c29a39391156883e725a4a17900ab9b67d0586d5def600f277caceef3fb71b590197bc36b4ba37005132157e0dc24f907e0c4660148a428017c
7
+ data.tar.gz: cb7b65a49574244b19baf1ce5d1c44b4cd5ba59a06194b7bbcda78d1fcf602acf628346d3fa36b38ef6460d77bf7d8d8ff8aed517e7d3055c01cf8ac497445b5
data/.gitignore CHANGED
@@ -6,5 +6,8 @@
6
6
  /doc/
7
7
  /pkg/
8
8
  /spec/reports/
9
- /tmp/
9
+ **/tmp/
10
+ **/log/
11
+ **/node_modules/
10
12
  /gemfiles/*.lock
13
+ .byebug_history
@@ -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
- Style/AlignParameters:
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
- Style/ClosingParenthesisIndentation:
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
- Style/CaseIndentation:
57
- IndentWhenRelativeTo: case
58
+ Layout/CaseIndentation:
59
+ EnforcedStyle: case
58
60
  SupportedStyles:
59
61
  - case
60
62
  - end
61
- IndentOneStep: true
63
+ IndentOneStep: false
62
64
 
63
65
  Style/PercentLiteralDelimiters:
64
66
  PreferredDelimiters:
65
67
  '%w': "[]"
66
68
  '%W': "[]"
67
69
 
68
- Style/AccessModifierIndentation:
70
+ Layout/AccessModifierIndentation:
69
71
  Enabled: false
70
72
 
71
73
  Style/SignalException:
72
74
  Enabled: false
73
75
 
74
- Style/IndentationWidth:
76
+ Layout/IndentationWidth:
75
77
  Enabled: false
76
78
 
77
- Style/TrivialAccessors:
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
@@ -1,10 +1,28 @@
1
1
  language: ruby
2
- cache: bundler
2
+ cache:
3
+ bundler: true
4
+ yarn: true
5
+ directories:
6
+ - node_modules
3
7
  rvm:
4
- - 2.2.6
5
- - 2.3.3
6
- before_install: gem install bundler -v 1.13.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
- appraise "rails-3" do
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
@@ -1,3 +1,10 @@
1
+ ### 0.6.0 - 2019-04-11
2
+
3
+ * enhancements
4
+ * experimental support for Webpacker (@rossta, @pedantic-git)
5
+ * allow cache override (@omnibs)
6
+ * support recent rubies (@grzuy)
7
+
1
8
  ### 0.5.5 - 2017-05-01
2
9
 
3
10
  * bug fixes
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  # Specify your gem's dependencies in serviceworker-rails.gemspec
data/Guardfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # A sample Guardfile
2
4
  # More info at https://github.com/guard/guard#readme
3
5
 
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 asset pipeline defaults. This is where `serviceworker-rails` comes in.
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("../test/sample/Rakefile", __FILE__)
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: [:test, :rubocop]
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
@@ -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
- Pathname.new(__FILE__).realpath)
13
+ Pathname.new(__FILE__).realpath)
13
14
 
14
15
  require "rubygems"
15
16
  require "bundler/setup"
@@ -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
- Pathname.new(__FILE__).realpath)
13
+ Pathname.new(__FILE__).realpath)
13
14
 
14
15
  require "rubygems"
15
16
  require "bundler/setup"
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require "bundler/setup"
4
5
  require "serviceworker/rails"
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
- Pathname.new(__FILE__).realpath)
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
- Pathname.new(__FILE__).realpath)
13
+ Pathname.new(__FILE__).realpath)
12
14
 
13
15
  require "rubygems"
14
16
  require "bundler/setup"
@@ -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
- Pathname.new(__FILE__).realpath)
13
+ Pathname.new(__FILE__).realpath)
12
14
 
13
15
  require "rubygems"
14
16
  require "bundler/setup"
@@ -3,6 +3,7 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "rails", "~> 4.2"
6
+ gem "webpacker"
6
7
 
7
8
  group :development, :test do
8
9
  gem "guard", :require => false
@@ -3,6 +3,7 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "rails", "~> 5.0"
6
+ gem "webpacker"
6
7
 
7
8
  group :development, :test do
8
9
  gem "guard", :require => false
@@ -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,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Lint/Void
1
4
  %w[48 60 72 76 96 120 152 180 192 512].each do |dim|
2
5
  %(convert heart-1200x1200.png -resize #{dim}x heart-#{dim}x#{dim}.png)
3
6
  end
7
+ # rubocop:enable Lint/Void
@@ -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 << %(\n<meta name="apple-mobile-web-app-capable" content="yes">)
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Rails.application.configure do
2
4
  config.serviceworker.routes.draw do
3
5
  # map to assets implicitly
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "serviceworker"
@@ -1,3 +1,4 @@
1
- # rubocop:disable Style/FileName
1
+ # frozen_string_literal: true
2
+
2
3
  require "serviceworker"
3
4
  require "serviceworker/rails"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ServiceWorker
2
4
  Error = Class.new(StandardError)
3
5
  RouteError = Class.new(Error)
@@ -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 = ServiceWorker::Rails::Handler.new
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 Rails
6
- class Handler
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
- private
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".freeze
5
- GET = "GET".freeze
6
- HEAD = "HEAD".freeze
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, {}).merge(default_headers)
23
+ @headers = default_headers.merge(opts.fetch(:headers, {}))
21
24
  @router = opts.fetch(:routes, ServiceWorker::Router.new)
22
- @handler = @opts.fetch(:handler, default_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
- when GET, HEAD
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 = @handler.call(env)
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
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ServiceWorker
2
4
  module Rails
3
5
  end
4
6
  end
5
7
 
6
8
  require "serviceworker/rails/version"
7
- require "serviceworker/rails/handler"
8
9
  require "serviceworker/engine"
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module ServiceWorker
3
4
  module Rails
4
- VERSION = "0.5.5".freeze
5
+ VERSION = "0.6.0"
5
6
  end
6
7
  end
@@ -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 = asset_pattern || options[:asset] || path_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".freeze
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+)\}/, # matches placeholders like "%{foo}"
62
+ /%\{(\w+)\}/ # matches placeholders like "%{foo}"
50
63
  )
51
64
 
52
65
  attr_reader :path_pattern, :asset_pattern
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module ServiceWorker
3
4
  class Router
4
- PATH_INFO = "PATH_INFO".freeze
5
+ PATH_INFO = "PATH_INFO"
5
6
 
6
7
  def self.default
7
8
  new.draw_default
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path("../lib", __FILE__)
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 "sprockets-rails"
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 "appraisal", "~> 2.1.0"
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.5.5
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: 2017-05-02 00:00:00.000000000 Z
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: sprockets-rails
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: '1.11'
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: '1.11'
40
+ version: 2.1.0
55
41
  - !ruby/object:Gem::Dependency
56
- name: rake
42
+ name: minitest
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: '11.0'
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: '11.0'
54
+ version: '5.0'
69
55
  - !ruby/object:Gem::Dependency
70
- name: minitest
56
+ name: rack-test
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
- - - "~>"
59
+ - - ">="
74
60
  - !ruby/object:Gem::Version
75
- version: '5.0'
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: '5.0'
68
+ version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
- name: rack-test
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: rubocop
84
+ name: rake
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
- - - '='
87
+ - - ">="
102
88
  - !ruby/object:Gem::Version
103
- version: 0.46.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.46.0
96
+ version: '0'
111
97
  - !ruby/object:Gem::Dependency
112
- name: rails
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: appraisal
112
+ name: simplecov
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
- - - "~>"
115
+ - - ">="
130
116
  - !ruby/object:Gem::Version
131
- version: 2.1.0
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: 2.1.0
124
+ version: '0'
139
125
  - !ruby/object:Gem::Dependency
140
- name: simplecov
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/handler.rb
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
- rubyforge_project:
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