rs-webpack-rails 0.10.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.
@@ -0,0 +1,69 @@
1
+ module WebpackRails
2
+ # :nodoc:
3
+ class InstallGenerator < ::Rails::Generators::Base
4
+ source_root File.expand_path("../../../../example", __FILE__)
5
+
6
+ desc "Install everything you need for a basic webpack-rails integration"
7
+
8
+ def add_foreman_to_gemfile
9
+ gem 'foreman'
10
+ end
11
+
12
+ def copy_procfile
13
+ copy_file "Procfile", "Procfile"
14
+ end
15
+
16
+ def copy_package_json
17
+ copy_file "package.json", "package.json"
18
+ end
19
+
20
+ def copy_webpack_conf
21
+ copy_file "webpack.config.js", "config/webpack.config.js"
22
+ end
23
+
24
+ def create_webpack_application_js
25
+ empty_directory "webpack"
26
+ create_file "webpack/application.js" do
27
+ <<-EOF.strip_heredoc
28
+ console.log("Hello world!");
29
+ EOF
30
+ end
31
+ end
32
+
33
+ def add_to_gitignore
34
+ append_to_file ".gitignore" do
35
+ <<-EOF.strip_heredoc
36
+ # Added by webpack-rails
37
+ /node_modules
38
+ /public/webpack
39
+ EOF
40
+ end
41
+ end
42
+
43
+ def run_yarn_install
44
+ run "yarn install" if yes?("Would you like us to run 'yarn install' for you?")
45
+ end
46
+
47
+ def run_bundle_install
48
+ run "bundle install" if yes?("Would you like us to run 'bundle install' for you?")
49
+ end
50
+
51
+ def whats_next
52
+ puts <<-EOF.strip_heredoc
53
+
54
+ We've set up the basics of webpack-rails for you, but you'll still
55
+ need to:
56
+
57
+ 1. Add the 'application' entry point in to your layout, and
58
+ 2. Run 'foreman start' to run the webpack-dev-server and rails server
59
+
60
+ See the README.md for this gem at
61
+ https://github.com/mipearson/webpack-rails/blob/master/README.md
62
+ for more info.
63
+
64
+ Thanks for using webpack-rails!
65
+
66
+ EOF
67
+ end
68
+ end
69
+ end
@@ -0,0 +1 @@
1
+ require 'webpack/rails'
@@ -0,0 +1,19 @@
1
+ namespace :webpack do
2
+ desc "Compile webpack bundles"
3
+ task compile: :environment do
4
+ ENV["TARGET"] = 'production' # TODO: Deprecated, use NODE_ENV instead
5
+ ENV["NODE_ENV"] ||= 'production'
6
+ webpack_bin = ::Rails.root.join(::Rails.configuration.webpack.binary)
7
+ config_file = ::Rails.root.join(::Rails.configuration.webpack.config_file)
8
+
9
+ unless File.exist?(webpack_bin)
10
+ raise "Can't find our webpack executable at #{webpack_bin} - have you run `npm install`?"
11
+ end
12
+
13
+ unless File.exist?(config_file)
14
+ raise "Can't find our webpack config file at #{config_file}"
15
+ end
16
+
17
+ sh "#{webpack_bin} --config #{config_file} --bail"
18
+ end
19
+ end
@@ -0,0 +1 @@
1
+ require 'webpack/rails'
@@ -0,0 +1,2 @@
1
+ require 'webpack/rails/version'
2
+ require 'webpack/railtie' if defined? ::Rails::Railtie
@@ -0,0 +1,42 @@
1
+ require 'action_view'
2
+ require 'webpack/rails/manifest'
3
+
4
+ module Webpack
5
+ module Rails
6
+ # Asset path helpers for use with webpack
7
+ module Helper
8
+ # Return asset paths for a particular webpack entry point.
9
+ #
10
+ # Response may either be full URLs (eg http://localhost/...) if the dev server
11
+ # is in use or a host-relative URl (eg /webpack/...) if assets are precompiled.
12
+ #
13
+ # Will raise an error if our manifest can't be found or the entry point does
14
+ # not exist.
15
+ def webpack_asset_paths(source, extension: nil)
16
+ return "" unless source.present?
17
+
18
+ if ::Rails.configuration.webpack.manifest_type == "manifest"
19
+ extension = "js" if extension.nil?
20
+ paths = Webpack::Rails::Manifest.manifest_asset_paths(source + "." + extension)
21
+ elsif ::Rails.configuration.webpack.manifest_type == "stats"
22
+ paths = Webpack::Rails::Manifest.asset_paths(source)
23
+ paths = paths.select { |p| p.ends_with? ".#{extension}" } if extension
24
+ end
25
+
26
+ port = ::Rails.configuration.webpack.dev_server.port
27
+ protocol = ::Rails.configuration.webpack.dev_server.https ? 'https' : 'http'
28
+
29
+ host = ::Rails.configuration.webpack.dev_server.host
30
+ host = instance_eval(&host) if host.respond_to?(:call)
31
+
32
+ if ::Rails.configuration.webpack.dev_server.enabled && ::Rails.configuration.webpack.manifest_type == "stats"
33
+ paths.map! do |p|
34
+ "#{protocol}://#{host}:#{port}#{p}"
35
+ end
36
+ end
37
+
38
+ paths
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,114 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+
4
+ module Webpack
5
+ module Rails
6
+ # Webpack manifest loading, caching & entry point retrieval
7
+ class Manifest
8
+ # Raised if we can't read our webpack manifest for whatever reason
9
+ class ManifestLoadError < StandardError
10
+ def initialize(message, orig)
11
+ super "#{message} (original error #{orig})"
12
+ end
13
+ end
14
+
15
+ # Raised if webpack couldn't build one of your entry points
16
+ class WebpackError < StandardError
17
+ def initialize(errors)
18
+ super "Error in webpack compile, details follow below:\n#{errors.join("\n\n")}"
19
+ end
20
+ end
21
+
22
+ # Raised if a supplied entry point does not exist in the webpack manifest
23
+ class EntryPointMissingError < StandardError
24
+ end
25
+
26
+ class << self
27
+ # :nodoc:
28
+ def asset_paths(source)
29
+ raise WebpackError, manifest["errors"] unless manifest_bundled?
30
+
31
+ paths = manifest["assetsByChunkName"][source]
32
+ if paths
33
+ # Can be either a string or an array of strings.
34
+ # Do not include source maps as they are not javascript
35
+ [paths].flatten.reject { |p| p =~ /.*\.map$/ }.map do |p|
36
+ "/#{::Rails.configuration.webpack.public_path}/#{p}"
37
+ end
38
+ else
39
+ raise EntryPointMissingError, "Can't find entry point '#{source}' in webpack manifest"
40
+ end
41
+ end
42
+
43
+ def manifest_asset_paths(source)
44
+ raise WebpackError, manifest["errors"] unless manifest_bundled?
45
+
46
+ paths = manifest[source]
47
+ if paths
48
+ paths
49
+ else
50
+ raise EntryPointMissingError, "Can't find entry point '#{source}' in webpack manifest"
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def manifest_bundled?
57
+ return true unless manifest.key?("errors")
58
+ !manifest["errors"].any? { |error| error.include? "Module build failed" }
59
+ end
60
+
61
+ def manifest
62
+ if ::Rails.configuration.webpack.dev_server.enabled
63
+ # Don't cache if we're in dev server mode, manifest may change ...
64
+ load_manifest
65
+ else
66
+ # ... otherwise cache at class level, as JSON loading/parsing can be expensive
67
+ @manifest ||= load_manifest
68
+ end
69
+ end
70
+
71
+ def load_manifest
72
+ data = if ::Rails.configuration.webpack.dev_server.enabled
73
+ load_dev_server_manifest
74
+ else
75
+ load_static_manifest
76
+ end
77
+ JSON.parse(data)
78
+ end
79
+
80
+ def load_dev_server_manifest
81
+ host = ::Rails.configuration.webpack.dev_server.manifest_host
82
+ port = ::Rails.configuration.webpack.dev_server.manifest_port
83
+ http = Net::HTTP.new(host, port)
84
+ http.use_ssl = ::Rails.configuration.webpack.dev_server.https
85
+ http.verify_mode = ::Rails.configuration.webpack.dev_server.https_verify_peer ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
86
+ http.get(dev_server_path).body
87
+ rescue => e
88
+ raise ManifestLoadError.new("Could not load manifest from webpack-dev-server at http://#{host}:#{port}#{dev_server_path} - is it running, and is stats-webpack-plugin loaded?", e)
89
+ end
90
+
91
+ def load_static_manifest
92
+ File.read(static_manifest_path)
93
+ rescue => e
94
+ raise ManifestLoadError.new("Could not load compiled manifest from #{static_manifest_path} - have you run `rake webpack:compile`?", e)
95
+ end
96
+
97
+ def static_manifest_path
98
+ ::Rails.root.join(
99
+ ::Rails.configuration.webpack.output_dir,
100
+ ::Rails.configuration.webpack.manifest_filename
101
+ )
102
+ end
103
+
104
+ def dev_server_path
105
+ "/#{::Rails.configuration.webpack.public_path}/#{::Rails.configuration.webpack.manifest_filename}"
106
+ end
107
+
108
+ def dev_server_url
109
+ "http://#{::Rails.configuration.webpack.dev_server.host}:#{::Rails.configuration.webpack.dev_server.port}#{dev_server_path}"
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,6 @@
1
+ module Webpack
2
+ # :nodoc:
3
+ module Rails
4
+ VERSION = "0.10.0"
5
+ end
6
+ end
@@ -0,0 +1,51 @@
1
+ require 'rails'
2
+ require 'rails/railtie'
3
+ require 'webpack/rails/helper'
4
+
5
+ module Webpack
6
+ # :nodoc:
7
+ class Railtie < ::Rails::Railtie
8
+ config.after_initialize do
9
+ ActiveSupport.on_load(:action_view) do
10
+ include Webpack::Rails::Helper
11
+ end
12
+ end
13
+
14
+ config.webpack = ActiveSupport::OrderedOptions.new
15
+ config.webpack.dev_server = ActiveSupport::OrderedOptions.new
16
+
17
+ config.webpack.config_file = 'config/webpack.config.js'
18
+ config.webpack.binary = 'node_modules/.bin/webpack'
19
+
20
+ # Host & port to use when generating asset URLS in the manifest helpers in dev
21
+ # server mode. Defaults to the requested host rather than localhost, so
22
+ # that requests from remote hosts work.
23
+ config.webpack.dev_server.host = proc { respond_to?(:request) ? request.host : 'localhost' }
24
+ config.webpack.dev_server.port = 3808
25
+
26
+ # The host and port to use when fetching the manifest
27
+ # This is helpful for e.g. docker containers, where the host and port you
28
+ # use via the web browser is not the same as those that the containers use
29
+ # to communicate among each other
30
+ config.webpack.dev_server.manifest_host = 'localhost'
31
+ config.webpack.dev_server.manifest_port = 3808
32
+
33
+ config.webpack.dev_server.https = false
34
+ # Below will default to 'true' in 1.0 release
35
+ config.webpack.dev_server.https_verify_peer = false
36
+ config.webpack.dev_server.binary = 'node_modules/.bin/webpack-dev-server'
37
+ config.webpack.dev_server.enabled = ::Rails.env.development? || ::Rails.env.test?
38
+
39
+ config.webpack.output_dir = "public/webpack"
40
+ config.webpack.public_path = "webpack"
41
+ config.webpack.manifest_filename = "manifest.json"
42
+
43
+ # manifest: https://github.com/danethurber/webpack-manifest-plugin
44
+ # stats: https://github.com/unindented/stats-webpack-plugin
45
+ config.webpack.manifest_type = "stats"
46
+
47
+ rake_tasks do
48
+ load "tasks/webpack.rake"
49
+ end
50
+ end
51
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rs-webpack-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.10.0
5
+ platform: ruby
6
+ authors:
7
+ - Michael Pearson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-12-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 3.2.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: 3.2.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 3.2.0
41
+ description: No longer maintained - use webpacker instead.
42
+ email:
43
+ - mipearson@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - MIT-LICENSE
49
+ - README.md
50
+ - Rakefile
51
+ - example/Procfile
52
+ - example/dot_gitignore
53
+ - example/package.json
54
+ - example/public/webpack/manifest.json
55
+ - example/webpack.config.js
56
+ - example/webpack/application.js
57
+ - example/yarn.lock
58
+ - lib/generators/webpack_rails/install_generator.rb
59
+ - lib/rs-webpack-rails.rb
60
+ - lib/tasks/webpack.rake
61
+ - lib/webpack-rails.rb
62
+ - lib/webpack/rails.rb
63
+ - lib/webpack/rails/helper.rb
64
+ - lib/webpack/rails/manifest.rb
65
+ - lib/webpack/rails/version.rb
66
+ - lib/webpack/railtie.rb
67
+ homepage: http://github.com/mipearson/webpack-rails
68
+ licenses:
69
+ - MIT
70
+ metadata: {}
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 2.0.0
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubyforge_project:
87
+ rubygems_version: 2.6.14
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: No longer maintained - use webpacker instead.
91
+ test_files: []