webpack-helpers 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 160027a4a47451b2e0286b4d2058eefe0638ea9c92bcf7512e7c9cda948562a8
4
+ data.tar.gz: 7f9be5e7aacc19e7cf51ed8b790f028c05f54c3213ed2f09466fac3b67a63dfe
5
+ SHA512:
6
+ metadata.gz: 7e9da58a17efdfadede2241f296cb2e0b1524c8d700c171cc23b0e67de1f313b146eb3049f9c5e03cdad204e44187073bcc06dcdbf1aa79a2a1fb041799e4336
7
+ data.tar.gz: 804ce8b553435f5df50de8d1337fbf49a05f32f5add763ed8e9feb666c69ea78b84c24682448144c2f2fd05c33da4e06d62e7a37c97a6906a00fced9defab750
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "webpack/dev_server"
4
+ require "webpack/manifest"
5
+
6
+ module Webpack
7
+ class Configuration
8
+ attr_accessor :dev_server, :manifest
9
+
10
+ def initialize
11
+ @dev_server = Webpack::DevServer.config
12
+ @manifest = Webpack::Manifest.config
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Webpack::DevServer
4
+ class Configuration
5
+ attr_accessor :url, :connect_timeout, :proxy_path
6
+
7
+ def initialize
8
+ @url = ENV.fetch("WEBPACK_DEV_SERVER_URL") { "http://0.0.0.0:8080" }
9
+ @connect_timeout = ENV.fetch("WEBPACK_DEV_SERVER_CONNECT_TIMEOUT") { 0.1 }
10
+ @proxy_path = ENV.fetch("WEBPACK_DEV_SERVER_PROXY_PATH") { "/webpack/" }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
4
+ require "socket"
5
+
6
+ module Webpack::DevServer
7
+ class Process
8
+ class UnsupportedAddressError < StandardError; end
9
+
10
+ attr_reader :uri, :timeout
11
+
12
+ def initialize(address, timeout: 0.01)
13
+ uri = URI.parse(address.to_s)
14
+ case uri
15
+ when URI::HTTP, URI::HTTPS
16
+ @uri = uri
17
+ else
18
+ raise UnsupportedAddressError, "`#{address}` is unsupported address."
19
+ end
20
+
21
+ @timeout = timeout
22
+ end
23
+
24
+ def protocol
25
+ uri.scheme
26
+ end
27
+
28
+ def https?
29
+ protocol == "https"
30
+ end
31
+
32
+ def host
33
+ uri.host
34
+ end
35
+
36
+ def port
37
+ uri.port
38
+ end
39
+
40
+ def host_with_port
41
+ "#{host}:#{port}"
42
+ end
43
+
44
+ def running?
45
+ Socket.tcp(host, port, connect_timeout: timeout).close
46
+ true
47
+ rescue StandardError
48
+ false
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rack/proxy"
4
+ require "webpack/dev_server"
5
+
6
+ module Webpack::DevServer
7
+ class Proxy < ::Rack::Proxy
8
+ def perform_request(env)
9
+ if proxy?(env)
10
+ env["HTTP_HOST"] = env["HTTP_X_FORWARDED_HOST"] = env["HTTP_X_FORWARDED_SERVER"] = dev_server.host_with_port
11
+ env["HTTP_X_FORWARDED_PROTO"] = env["HTTP_X_FORWARDED_SCHEME"] = dev_server.protocol
12
+ env["HTTPS"] = env["HTTP_X_FORWARDED_SSL"] = "off" unless dev_server.https?
13
+ env["PATH_INFO"] = env["PATH_INFO"].gsub(/^#{proxy_path}/, "/")
14
+
15
+ super(env)
16
+ else
17
+ @app.call(env)
18
+ end
19
+ end
20
+
21
+ protected
22
+
23
+ def config
24
+ ::Webpack::DevServer.config
25
+ end
26
+
27
+ def dev_server
28
+ ::Webpack::DevServer.process
29
+ end
30
+
31
+ def proxy_path
32
+ config.proxy_path || ""
33
+ end
34
+
35
+ def proxy?(env)
36
+ !proxy_path.empty? && env["PATH_INFO"].start_with?(proxy_path)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Webpack
4
+ module DevServer
5
+ class << self
6
+ def configure
7
+ yield config
8
+ end
9
+
10
+ def config
11
+ @config ||= Configuration.new
12
+ end
13
+
14
+ def process
15
+ Webpack::DevServer::Process.new config.url, timeout: config.connect_timeout
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ require "webpack/dev_server/configuration"
22
+ require "webpack/dev_server/process"
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Webpack
4
+ module Helpers
5
+ VERSION = "0.1.0"
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "webpack"
4
+
5
+ module Webpack
6
+ module Helpers
7
+ def webpack_bundle_path(entry)
8
+ lookuped = URI.parse Webpack.manifest.lookup!(entry)
9
+ prefix = Webpack.config.dev_server.proxy_path
10
+
11
+ return lookuped.to_s unless lookuped.host.nil? && prefix
12
+
13
+ Pathname.new("/#{prefix}/#{lookuped}").cleanpath.to_s
14
+ end
15
+ end
16
+ end
17
+
18
+ require "webpack/railtie" if defined? Rails
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Webpack::Manifest
4
+ class Configuration
5
+ attr_accessor :url, :cache
6
+
7
+ def initialize
8
+ @url = ENV.fetch("WEBPACK_MANIFEST_URL") { "/path/to/manifest.json" }
9
+ @cache = ENV.fetch("WEBPACK_MANIFEST_CACHE", false)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open-uri"
4
+ require "json"
5
+
6
+ module Webpack::Manifest
7
+ class Entries
8
+ class MissingEntryError < StandardError; end
9
+
10
+ attr_reader :entries
11
+
12
+ def initialize(entries)
13
+ @entries = entries
14
+ end
15
+
16
+ def lookup(entry)
17
+ entries.fetch(entry) { nil }
18
+ end
19
+
20
+ def lookup!(entry)
21
+ lookup(entry) || raise(MissingEntryError, "missing entry: #{entry}")
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Webpack
4
+ module Manifest
5
+ class << self
6
+ def configure
7
+ yield config
8
+ end
9
+
10
+ def config
11
+ @config ||= Configuration.new
12
+ end
13
+
14
+ def load(path)
15
+ # read file
16
+ uri = URI.parse(path.to_s)
17
+ str = case uri
18
+ when URI::HTTP, URI::HTTPS
19
+ OpenURI.open_uri(uri.to_s).read
20
+ else # default read file
21
+ File.read(uri.path)
22
+ end
23
+
24
+ # to json
25
+ entries = JSON.parse str
26
+
27
+ # return Manifest instance
28
+ Entries.new entries
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ require "webpack/manifest/configuration"
35
+ require "webpack/manifest/entries"
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+
5
+ module Webpack
6
+ module Generators
7
+ # rails g webpack:install
8
+ class ConfigGenerator < ::Rails::Generators::Base # :nodoc:
9
+ source_root File.expand_path(File.join(File.dirname(__FILE__), "templates"))
10
+
11
+ desc <<~DESC
12
+ Description:
13
+ Copies Webpack configuration file to your application's initializer directory.
14
+ DESC
15
+
16
+ def copy_initializer
17
+ template "config.rb", "config/initializers/webpack.rb"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "webpack/helpers"
4
+
5
+ Webpacky.configure do |config|
6
+ config.dev_server.url = ENV.fetch("WEBPACK_DEV_SERVER_URL") { "http://0.0.0.0:8080" }
7
+ config.dev_server.connect_timeout = ENV.fetch("WEBPACK_DEV_SERVER_CONNECT_TIMEOUT") { 0.1 }
8
+ config.dev_server.proxy_path = ENV.fetch("WEBPACK_DEV_SERVER_PROXY_PATH") { "/webpack/" }
9
+
10
+ config.manifest.url = ENV.fetch("WEBPACK_MANIFEST_URL") { "http://0.0.0.0:8080/manifest.json" }
11
+ config.manifest.cache = ENV.fetch("WEBPACK_MANIFEST_CACHE") { Rails.env.production? }
12
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "webpack/helpers"
4
+
5
+ module Webpack
6
+ module Rails
7
+ module Helpers
8
+ include Webpack::Helpers
9
+
10
+ def javascript_bundle_tag(*entries, **options)
11
+ javascript_include_tag(*entries.map { |entry| webpack_bundle_path "#{entry}.js" }, **options)
12
+ end
13
+
14
+ def stylesheet_bundle_tag(*entries, **options)
15
+ stylesheet_link_tag(*entries.map { |entry| webpack_bundle_path "#{entry}.css" }, **options)
16
+ end
17
+
18
+ def image_bundle_tag(entry, **options)
19
+ image_tag webpack_bundle_path(entry), **options
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/railtie"
4
+ require "webpack"
5
+
6
+ module Webpack
7
+ class Railtie < ::Rails::Railtie
8
+ initializer "webpack.dev_server.proxy" do |app|
9
+ if Webpack.config.dev_server.proxy_path
10
+ require "webpack/dev_server/proxy"
11
+ middleware = ::Rails::VERSION::MAJOR >= 5 ? Webpack::DevServer::Proxy : "Webpack::DevServer::Proxy"
12
+ app.middleware.insert_before 0, middleware, ssl_verify_none: true
13
+ end
14
+ end
15
+
16
+ config.after_initialize do
17
+ require "webpack/rails/helpers"
18
+ ActiveSupport.on_load :action_view do
19
+ ::ActionView::Base.include Webpack::Rails::Helpers
20
+ end
21
+ end
22
+
23
+ generators do
24
+ require "webpack/rails/generators/config_generator"
25
+ end
26
+ end
27
+ end
data/lib/webpack.rb ADDED
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Webpack
4
+ class << self
5
+ def configure
6
+ yield config
7
+ end
8
+
9
+ def config
10
+ @config ||= Configuration.new
11
+ end
12
+
13
+ def manifest
14
+ return @manifest if config.manifest.cache && defined?(@manifest)
15
+
16
+ @manifest = Webpack::Manifest.load config.manifest.url
17
+ end
18
+ end
19
+ end
20
+
21
+ require "webpack/configuration"
22
+ require "webpack/dev_server"
23
+ require "webpack/manifest"
metadata ADDED
@@ -0,0 +1,187 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webpack-helpers
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - ak10m
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-01-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack-proxy
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: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.1.3
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.1.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-reporters
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: rack-test
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: '12.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '12.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.78.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.78.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.5.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.5.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-performance
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 1.5.2
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 1.5.2
139
+ description: Make Ruby and Webpack as loosely coupled as possible.
140
+ email:
141
+ - akio.morimoto@airits.jp
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - lib/webpack.rb
147
+ - lib/webpack/configuration.rb
148
+ - lib/webpack/dev_server.rb
149
+ - lib/webpack/dev_server/configuration.rb
150
+ - lib/webpack/dev_server/process.rb
151
+ - lib/webpack/dev_server/proxy.rb
152
+ - lib/webpack/helpers.rb
153
+ - lib/webpack/helpers/version.rb
154
+ - lib/webpack/manifest.rb
155
+ - lib/webpack/manifest/configuration.rb
156
+ - lib/webpack/manifest/entries.rb
157
+ - lib/webpack/rails/generators/config_generator.rb
158
+ - lib/webpack/rails/generators/templates/config.rb
159
+ - lib/webpack/rails/helpers.rb
160
+ - lib/webpack/railtie.rb
161
+ homepage: https://github.com/ak10m/webpack-helpers
162
+ licenses:
163
+ - MIT
164
+ metadata:
165
+ homepage_uri: https://github.com/ak10m/webpack-helpers
166
+ source_code_uri: https://github.com/ak10m/webpack-helpers/tree/0.1.0
167
+ changelog_uri: https://github.com/ak10m/webpack-helpers/blob/0.1.0/CHANGELOG.md
168
+ post_install_message:
169
+ rdoc_options: []
170
+ require_paths:
171
+ - lib
172
+ required_ruby_version: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: 2.3.0
177
+ required_rubygems_version: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ requirements: []
183
+ rubygems_version: 3.1.2
184
+ signing_key:
185
+ specification_version: 4
186
+ summary: Make Ruby and Webpack as loosely coupled as possible.
187
+ test_files: []