shakapacker 6.0.0.rc.6
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 +7 -0
- data/.eslintignore +4 -0
- data/.eslintrc.js +14 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
- data/.github/ISSUE_TEMPLATE/feature-request.md +18 -0
- data/.github/workflows/jest.yml +30 -0
- data/.github/workflows/js-lint.yml +31 -0
- data/.github/workflows/rubocop.yml +39 -0
- data/.github/workflows/ruby.yml +48 -0
- data/.gitignore +13 -0
- data/.node-version +1 -0
- data/.rubocop.yml +229 -0
- data/CHANGELOG.md +32 -0
- data/CONTRIBUTING.md +62 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +183 -0
- data/MIT-LICENSE +20 -0
- data/README.md +666 -0
- data/Rakefile +11 -0
- data/config/README.md +3 -0
- data/config/webpacker.yml +1 -0
- data/docs/customizing_babel_config.md +59 -0
- data/docs/deployment.md +116 -0
- data/docs/developing_webpacker.md +29 -0
- data/docs/troubleshooting.md +212 -0
- data/docs/v6_upgrade.md +158 -0
- data/gemfiles/Gemfile-rails-edge +12 -0
- data/gemfiles/Gemfile-rails.5.2.x +9 -0
- data/gemfiles/Gemfile-rails.6.0.x +9 -0
- data/gemfiles/Gemfile-rails.6.1.x +12 -0
- data/lib/install/application.js +15 -0
- data/lib/install/bin/webpacker +15 -0
- data/lib/install/bin/webpacker-dev-server +18 -0
- data/lib/install/bin/yarn +18 -0
- data/lib/install/binstubs.rb +4 -0
- data/lib/install/config/webpack/webpack.config.js +5 -0
- data/lib/install/config/webpacker.yml +64 -0
- data/lib/install/package.json +15 -0
- data/lib/install/template.rb +100 -0
- data/lib/shakapacker/utils/git_utils.rb +23 -0
- data/lib/shakapacker/utils/version_syntax_converter.rb +24 -0
- data/lib/tasks/webpacker/binstubs.rake +15 -0
- data/lib/tasks/webpacker/check_binstubs.rake +12 -0
- data/lib/tasks/webpacker/check_node.rake +31 -0
- data/lib/tasks/webpacker/check_yarn.rake +33 -0
- data/lib/tasks/webpacker/clean.rake +25 -0
- data/lib/tasks/webpacker/clobber.rake +20 -0
- data/lib/tasks/webpacker/compile.rake +45 -0
- data/lib/tasks/webpacker/info.rake +21 -0
- data/lib/tasks/webpacker/install.rake +17 -0
- data/lib/tasks/webpacker/verify_config.rake +14 -0
- data/lib/tasks/webpacker/verify_install.rake +4 -0
- data/lib/tasks/webpacker/yarn_install.rake +18 -0
- data/lib/tasks/webpacker.rake +19 -0
- data/lib/tasks/yarn.rake +38 -0
- data/lib/webpacker/commands.rb +79 -0
- data/lib/webpacker/compiler.rb +130 -0
- data/lib/webpacker/configuration.rb +111 -0
- data/lib/webpacker/dev_server.rb +72 -0
- data/lib/webpacker/dev_server_proxy.rb +33 -0
- data/lib/webpacker/dev_server_runner.rb +96 -0
- data/lib/webpacker/env.rb +43 -0
- data/lib/webpacker/helper.rb +161 -0
- data/lib/webpacker/instance.rb +41 -0
- data/lib/webpacker/manifest.rb +120 -0
- data/lib/webpacker/railtie.rb +63 -0
- data/lib/webpacker/runner.rb +23 -0
- data/lib/webpacker/version.rb +4 -0
- data/lib/webpacker/webpack_runner.rb +58 -0
- data/lib/webpacker.rb +46 -0
- data/package/__tests__/config.js +34 -0
- data/package/__tests__/dev_server.js +45 -0
- data/package/__tests__/development.js +35 -0
- data/package/__tests__/env.js +58 -0
- data/package/__tests__/index.js +9 -0
- data/package/__tests__/production.js +29 -0
- data/package/__tests__/staging.js +30 -0
- data/package/__tests__/test.js +25 -0
- data/package/babel/preset.js +41 -0
- data/package/config.js +32 -0
- data/package/configPath.js +3 -0
- data/package/dev_server.js +20 -0
- data/package/env.js +27 -0
- data/package/environments/__tests__/base.js +69 -0
- data/package/environments/base.js +116 -0
- data/package/environments/development.js +55 -0
- data/package/environments/production.js +79 -0
- data/package/environments/test.js +3 -0
- data/package/index.js +33 -0
- data/package/inliningCss.js +7 -0
- data/package/rules/babel.js +30 -0
- data/package/rules/coffee.js +6 -0
- data/package/rules/css.js +3 -0
- data/package/rules/erb.js +15 -0
- data/package/rules/file.js +23 -0
- data/package/rules/index.js +18 -0
- data/package/rules/less.js +22 -0
- data/package/rules/raw.js +5 -0
- data/package/rules/sass.js +16 -0
- data/package/rules/stylus.js +26 -0
- data/package/utils/get_style_rule.js +37 -0
- data/package/utils/helpers.js +51 -0
- data/package.json +71 -0
- data/rakelib/release.rake +57 -0
- data/test/command_test.rb +109 -0
- data/test/compiler_test.rb +68 -0
- data/test/configuration_test.rb +78 -0
- data/test/dev_server_runner_test.rb +81 -0
- data/test/dev_server_test.rb +47 -0
- data/test/engine_rake_tasks_test.rb +39 -0
- data/test/env_test.rb +23 -0
- data/test/helper_test.rb +159 -0
- data/test/manifest_test.rb +89 -0
- data/test/mounted_app/Rakefile +4 -0
- data/test/mounted_app/test/dummy/Rakefile +3 -0
- data/test/mounted_app/test/dummy/bin/rails +3 -0
- data/test/mounted_app/test/dummy/bin/rake +3 -0
- data/test/mounted_app/test/dummy/config/application.rb +10 -0
- data/test/mounted_app/test/dummy/config/environment.rb +3 -0
- data/test/mounted_app/test/dummy/config/webpacker.yml +75 -0
- data/test/mounted_app/test/dummy/config.ru +5 -0
- data/test/mounted_app/test/dummy/package.json +7 -0
- data/test/rake_tasks_test.rb +71 -0
- data/test/test_app/Rakefile +3 -0
- data/test/test_app/app/packs/entrypoints/application.js +10 -0
- data/test/test_app/app/packs/entrypoints/multi_entry.css +4 -0
- data/test/test_app/app/packs/entrypoints/multi_entry.js +4 -0
- data/test/test_app/bin/webpacker +14 -0
- data/test/test_app/bin/webpacker-dev-server +14 -0
- data/test/test_app/config/application.rb +11 -0
- data/test/test_app/config/environment.rb +4 -0
- data/test/test_app/config/initializers/inspect_autoload_paths.rb +1 -0
- data/test/test_app/config/webpack/webpack.config.js +0 -0
- data/test/test_app/config/webpacker.yml +77 -0
- data/test/test_app/config/webpacker_other_location.yml +79 -0
- data/test/test_app/config/webpacker_public_root.yml +18 -0
- data/test/test_app/config.ru +5 -0
- data/test/test_app/package.json +13 -0
- data/test/test_app/public/packs/manifest.json +50 -0
- data/test/test_app/some.config.js +0 -0
- data/test/test_app/yarn.lock +11 -0
- data/test/test_helper.rb +33 -0
- data/test/webpack_runner_test.rb +57 -0
- data/test/webpacker_test.rb +34 -0
- data/webpacker.gemspec +31 -0
- data/yarn.lock +4029 -0
- metadata +331 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
ENV["RAILS_ENV"] ||= "development"
|
|
4
|
+
ENV["NODE_ENV"] ||= ENV["RAILS_ENV"]
|
|
5
|
+
|
|
6
|
+
require "pathname"
|
|
7
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
|
8
|
+
Pathname.new(__FILE__).realpath)
|
|
9
|
+
|
|
10
|
+
require "bundler/setup"
|
|
11
|
+
|
|
12
|
+
require "webpacker"
|
|
13
|
+
require "webpacker/dev_server_runner"
|
|
14
|
+
|
|
15
|
+
APP_ROOT = File.expand_path("..", __dir__)
|
|
16
|
+
Dir.chdir(APP_ROOT) do
|
|
17
|
+
Webpacker::DevServerRunner.run(ARGV)
|
|
18
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
APP_ROOT = File.expand_path("..", __dir__)
|
|
4
|
+
Dir.chdir(APP_ROOT) do
|
|
5
|
+
yarn = ENV["PATH"].split(File::PATH_SEPARATOR).
|
|
6
|
+
select { |dir| File.expand_path(dir) != __dir__ }.
|
|
7
|
+
product(["yarn", "yarnpkg", "yarn.cmd", "yarn.ps1"]).
|
|
8
|
+
map { |dir, file| File.expand_path(file, dir) }.
|
|
9
|
+
find { |file| File.executable?(file) }
|
|
10
|
+
|
|
11
|
+
if yarn
|
|
12
|
+
exec yarn, *ARGV
|
|
13
|
+
else
|
|
14
|
+
$stderr.puts "Yarn executable was not detected in the system."
|
|
15
|
+
$stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install"
|
|
16
|
+
exit 1
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Note: You must restart bin/webpacker-dev-server for changes to take effect
|
|
2
|
+
|
|
3
|
+
default: &default
|
|
4
|
+
source_path: app/javascript
|
|
5
|
+
source_entry_path: /
|
|
6
|
+
public_root_path: public
|
|
7
|
+
public_output_path: packs
|
|
8
|
+
cache_path: tmp/webpacker
|
|
9
|
+
webpack_compile_output: true
|
|
10
|
+
|
|
11
|
+
# Additional paths webpack should look up modules
|
|
12
|
+
# ['app/assets', 'engine/foo/app/assets']
|
|
13
|
+
additional_paths: []
|
|
14
|
+
|
|
15
|
+
# Reload manifest.json on all requests so we reload latest compiled packs
|
|
16
|
+
cache_manifest: false
|
|
17
|
+
|
|
18
|
+
development:
|
|
19
|
+
<<: *default
|
|
20
|
+
compile: true
|
|
21
|
+
|
|
22
|
+
# Reference: https://webpack.js.org/configuration/dev-server/
|
|
23
|
+
dev_server:
|
|
24
|
+
https: false
|
|
25
|
+
host: localhost
|
|
26
|
+
port: 3035
|
|
27
|
+
# Hot Module Replacement updates modules while the application is running without a full reload
|
|
28
|
+
hmr: false
|
|
29
|
+
# Defaults to the inverse of hmr. Uncomment to manually set this.
|
|
30
|
+
# live_reload: true
|
|
31
|
+
client:
|
|
32
|
+
# Should we show a full-screen overlay in the browser when there are compiler errors or warnings?
|
|
33
|
+
overlay: true
|
|
34
|
+
# May also be a string
|
|
35
|
+
# webSocketURL:
|
|
36
|
+
# hostname: "0.0.0.0"
|
|
37
|
+
# pathname: "/ws"
|
|
38
|
+
# port: 8080
|
|
39
|
+
# Should we use gzip compression?
|
|
40
|
+
compress: true
|
|
41
|
+
# Note that apps that do not check the host are vulnerable to DNS rebinding attacks
|
|
42
|
+
allowed_hosts: "all"
|
|
43
|
+
pretty: true
|
|
44
|
+
headers:
|
|
45
|
+
'Access-Control-Allow-Origin': '*'
|
|
46
|
+
static:
|
|
47
|
+
watch:
|
|
48
|
+
ignored: '**/node_modules/**'
|
|
49
|
+
|
|
50
|
+
test:
|
|
51
|
+
<<: *default
|
|
52
|
+
compile: true
|
|
53
|
+
|
|
54
|
+
# Compile test packs to a separate directory
|
|
55
|
+
public_output_path: packs-test
|
|
56
|
+
|
|
57
|
+
production:
|
|
58
|
+
<<: *default
|
|
59
|
+
|
|
60
|
+
# Production depends on precompilation of packs prior to booting for performance.
|
|
61
|
+
compile: false
|
|
62
|
+
|
|
63
|
+
# Cache manifest.json for performance
|
|
64
|
+
cache_manifest: true
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Install Webpacker
|
|
2
|
+
copy_file "#{__dir__}/config/webpacker.yml", "config/webpacker.yml"
|
|
3
|
+
copy_file "#{__dir__}/package.json", "package.json"
|
|
4
|
+
|
|
5
|
+
say "Copying webpack core config"
|
|
6
|
+
directory "#{__dir__}/config/webpack", "config/webpack"
|
|
7
|
+
|
|
8
|
+
if Dir.exist?(Webpacker.config.source_path)
|
|
9
|
+
say "The packs app source directory already exists"
|
|
10
|
+
else
|
|
11
|
+
say "Creating packs app source directory"
|
|
12
|
+
empty_directory "app/javascript"
|
|
13
|
+
copy_file "#{__dir__}/application.js", "app/javascript/application.js"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
apply "#{__dir__}/binstubs.rb"
|
|
17
|
+
|
|
18
|
+
git_ignore_path = Rails.root.join(".gitignore")
|
|
19
|
+
if File.exist?(git_ignore_path)
|
|
20
|
+
append_to_file git_ignore_path do
|
|
21
|
+
"\n" +
|
|
22
|
+
"/public/packs\n" +
|
|
23
|
+
"/public/packs-test\n" +
|
|
24
|
+
"/node_modules\n" +
|
|
25
|
+
"/yarn-error.log\n" +
|
|
26
|
+
"yarn-debug.log*\n" +
|
|
27
|
+
".yarn-integrity\n"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
if (app_layout_path = Rails.root.join("app/views/layouts/application.html.erb")).exist?
|
|
32
|
+
say "Add JavaScript include tag in application layout"
|
|
33
|
+
insert_into_file app_layout_path.to_s, %(\n <%= javascript_pack_tag "application" %>), before: /\s*<\/head>/
|
|
34
|
+
else
|
|
35
|
+
say "Default application.html.erb is missing!", :red
|
|
36
|
+
say %( Add <%= javascript_pack_tag "application" %> within the <head> tag in your custom layout.)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
if (setup_path = Rails.root.join("bin/setup")).exist?
|
|
40
|
+
say "Run bin/yarn during bin/setup"
|
|
41
|
+
insert_into_file setup_path.to_s, <<-RUBY, after: %( system("bundle check") || system!("bundle install")\n)
|
|
42
|
+
|
|
43
|
+
# Install JavaScript dependencies
|
|
44
|
+
system! "bin/yarn"
|
|
45
|
+
RUBY
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
if (asset_config_path = Rails.root.join("config/initializers/assets.rb")).exist?
|
|
49
|
+
say "Add node_modules to the asset load path"
|
|
50
|
+
append_to_file asset_config_path, <<-RUBY
|
|
51
|
+
|
|
52
|
+
# Add node_modules folder to the asset load path.
|
|
53
|
+
Rails.application.config.assets.paths << Rails.root.join("node_modules")
|
|
54
|
+
RUBY
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
if (csp_config_path = Rails.root.join("config/initializers/content_security_policy.rb")).exist?
|
|
58
|
+
say "Make note of webpack-dev-server exemption needed to csp"
|
|
59
|
+
insert_into_file csp_config_path, <<-RUBY, after: %(# Rails.application.config.content_security_policy do |policy|)
|
|
60
|
+
# # If you are using webpack-dev-server then specify webpack-dev-server host
|
|
61
|
+
# policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development?
|
|
62
|
+
RUBY
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
results = []
|
|
66
|
+
|
|
67
|
+
Dir.chdir(Rails.root) do
|
|
68
|
+
if Webpacker::VERSION.match?(/^[0-9]+\.[0-9]+\.[0-9]+$/)
|
|
69
|
+
say "Installing @shakacode/shakapacker@#{Webpacker::VERSION}"
|
|
70
|
+
results << run("yarn add @shakacode/shakapacker@#{Webpacker::VERSION}")
|
|
71
|
+
else
|
|
72
|
+
say "Installing @shakacode/shakapacker@next"
|
|
73
|
+
results << run("yarn add @shakacode/shakapacker@next")
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
package_json = File.read("#{__dir__}/../../package.json")
|
|
77
|
+
peers = JSON.parse(package_json)["peerDependencies"]
|
|
78
|
+
peers_to_add = peers.reduce([]) do |result, (package, version)|
|
|
79
|
+
major_version = version.match(/(\d+)/)[1]
|
|
80
|
+
result << "#{package}@#{major_version}"
|
|
81
|
+
end.join(" ")
|
|
82
|
+
|
|
83
|
+
say "Adding @shakacode/shakapacker peerDependencies"
|
|
84
|
+
results << run("yarn add #{peers_to_add}")
|
|
85
|
+
|
|
86
|
+
say "Installing webpack-dev-server for live reloading as a development dependency"
|
|
87
|
+
results << run("yarn add --dev webpack-dev-server")
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR > 1
|
|
91
|
+
say "You need to allow webpack-dev-server host as allowed origin for connect-src.", :yellow
|
|
92
|
+
say "This can be done in Rails 5.2+ for development environment in the CSP initializer", :yellow
|
|
93
|
+
say "config/initializers/content_security_policy.rb with a snippet like this:", :yellow
|
|
94
|
+
say "policy.connect_src :self, :https, \"http://localhost:3035\", \"ws://localhost:3035\" if Rails.env.development?", :yellow
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
unless results.all?
|
|
98
|
+
say "Webpacker installation failed 😭 See above for details.", :red
|
|
99
|
+
exit 1
|
|
100
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "English"
|
|
4
|
+
module Shakapacker
|
|
5
|
+
module Utils
|
|
6
|
+
module GitUtils
|
|
7
|
+
def self.uncommitted_changes?(message_handler)
|
|
8
|
+
return false if ENV["COVERAGE"] == "true"
|
|
9
|
+
|
|
10
|
+
status = `git status --porcelain`
|
|
11
|
+
return false if $CHILD_STATUS.success? && status.empty?
|
|
12
|
+
|
|
13
|
+
error = if $CHILD_STATUS.success?
|
|
14
|
+
"You have uncommitted code. Please commit or stash your changes before continuing"
|
|
15
|
+
else
|
|
16
|
+
"You do not have Git installed. Please install Git, and commit your changes before continuing"
|
|
17
|
+
end
|
|
18
|
+
message_handler.add_error(error)
|
|
19
|
+
true
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../webpacker/version"
|
|
4
|
+
|
|
5
|
+
module Shakapacker
|
|
6
|
+
module Utils
|
|
7
|
+
class VersionSyntaxConverter
|
|
8
|
+
def rubygem_to_npm(rubygem_version = Webpacker::VERSION)
|
|
9
|
+
regex_match = rubygem_version.match(/(\d+\.\d+\.\d+)[.\-]?(.+)?/)
|
|
10
|
+
return "#{regex_match[1]}-#{regex_match[2]}" if regex_match[2]
|
|
11
|
+
|
|
12
|
+
regex_match[1].to_s
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def npm_to_rubygem(npm_version)
|
|
16
|
+
match = npm_version
|
|
17
|
+
.tr("-", ".")
|
|
18
|
+
.strip
|
|
19
|
+
.match(/(\d.*)/)
|
|
20
|
+
match.present? ? match[0] : nil
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
binstubs_template_path = File.expand_path("../../install/binstubs.rb", __dir__).freeze
|
|
2
|
+
bin_path = ENV["BUNDLE_BIN"] || Rails.root.join("bin")
|
|
3
|
+
|
|
4
|
+
namespace :webpacker do
|
|
5
|
+
desc "Installs Webpacker binstubs in this application"
|
|
6
|
+
task binstubs: [:check_node, :check_yarn] do |task|
|
|
7
|
+
prefix = task.name.split(/#|webpacker:binstubs/).first
|
|
8
|
+
|
|
9
|
+
if Rails::VERSION::MAJOR >= 5
|
|
10
|
+
exec "#{RbConfig.ruby} #{bin_path}/rails #{prefix}app:template LOCATION='#{binstubs_template_path}'"
|
|
11
|
+
else
|
|
12
|
+
exec "#{RbConfig.ruby} #{bin_path}/rake #{prefix}rails:template LOCATION='#{binstubs_template_path}'"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
namespace :webpacker do
|
|
2
|
+
desc "Verifies that bin/webpacker is present"
|
|
3
|
+
task :check_binstubs do
|
|
4
|
+
unless File.exist?(Rails.root.join("bin/webpacker"))
|
|
5
|
+
$stderr.puts "webpacker binstub not found.\n"\
|
|
6
|
+
"Have you run rails webpacker:install ?\n"\
|
|
7
|
+
"Make sure the bin directory and bin/webpacker are not included in .gitignore\n"\
|
|
8
|
+
"Exiting!"
|
|
9
|
+
exit!
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require "semantic_range"
|
|
2
|
+
namespace :webpacker do
|
|
3
|
+
desc "Verifies if Node.js is installed"
|
|
4
|
+
task :check_node do
|
|
5
|
+
begin
|
|
6
|
+
node_version = `node -v || nodejs -v`.strip
|
|
7
|
+
raise Errno::ENOENT if node_version.blank?
|
|
8
|
+
|
|
9
|
+
pkg_path = Pathname.new("#{__dir__}/../../../package.json").realpath
|
|
10
|
+
node_range = JSON.parse(pkg_path.read)["engines"]["node"]
|
|
11
|
+
is_valid = SemanticRange.satisfies?(node_version, node_range) rescue false
|
|
12
|
+
semver_major = node_version[/\d+/] rescue nil
|
|
13
|
+
is_unstable = semver_major.to_i.odd? rescue false
|
|
14
|
+
|
|
15
|
+
if is_unstable
|
|
16
|
+
$stderr.puts "Warning: you are using an unstable release of Node.js (#{node_version}). If you encounter issues with Node.js, consider switching to an Active LTS release. More info: https://docs.npmjs.com/try-the-latest-stable-version-of-node"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
unless is_valid
|
|
20
|
+
$stderr.puts "Webpacker requires Node.js \"#{node_range}\" and you are using #{node_version}"
|
|
21
|
+
$stderr.puts "Please upgrade Node.js https://nodejs.org/en/download/"
|
|
22
|
+
$stderr.puts "Exiting!"
|
|
23
|
+
exit!
|
|
24
|
+
end
|
|
25
|
+
rescue Errno::ENOENT
|
|
26
|
+
$stderr.puts "Node.js not installed. Please download and install Node.js https://nodejs.org/en/download/"
|
|
27
|
+
$stderr.puts "Exiting!"
|
|
28
|
+
exit!
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require "semantic_range"
|
|
2
|
+
namespace :webpacker do
|
|
3
|
+
desc "Verifies if Yarn is installed"
|
|
4
|
+
task :check_yarn do
|
|
5
|
+
begin
|
|
6
|
+
which_command = Gem.win_platform? ? "where" : "which"
|
|
7
|
+
raise Errno::ENOENT if `#{which_command} yarn`.strip.empty?
|
|
8
|
+
|
|
9
|
+
yarn_version = `yarn --version`.strip
|
|
10
|
+
raise Errno::ENOENT if yarn_version.blank?
|
|
11
|
+
|
|
12
|
+
pkg_path = Pathname.new("#{__dir__}/../../../package.json").realpath
|
|
13
|
+
yarn_range = JSON.parse(pkg_path.read)["engines"]["yarn"]
|
|
14
|
+
is_valid = SemanticRange.satisfies?(yarn_version, yarn_range) rescue false
|
|
15
|
+
is_unsupported = SemanticRange.satisfies?(yarn_version, ">=4.0.0") rescue false
|
|
16
|
+
|
|
17
|
+
unless is_valid
|
|
18
|
+
$stderr.puts "Webpacker requires Yarn \"#{yarn_range}\" and you are using #{yarn_version}"
|
|
19
|
+
if is_unsupported
|
|
20
|
+
$stderr.puts "This version of Webpacker does not support Yarn #{yarn_version}. Please downgrade to a supported version of Yarn https://yarnpkg.com/lang/en/docs/install/"
|
|
21
|
+
else
|
|
22
|
+
$stderr.puts "Please upgrade Yarn https://yarnpkg.com/lang/en/docs/install/"
|
|
23
|
+
end
|
|
24
|
+
$stderr.puts "Exiting!"
|
|
25
|
+
exit!
|
|
26
|
+
end
|
|
27
|
+
rescue Errno::ENOENT
|
|
28
|
+
$stderr.puts "Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/"
|
|
29
|
+
$stderr.puts "Exiting!"
|
|
30
|
+
exit!
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
$stdout.sync = true
|
|
2
|
+
|
|
3
|
+
require "webpacker/configuration"
|
|
4
|
+
|
|
5
|
+
namespace :webpacker do
|
|
6
|
+
desc "Remove old compiled webpacks"
|
|
7
|
+
task :clean, [:keep, :age] => ["webpacker:verify_install", :environment] do |_, args|
|
|
8
|
+
Webpacker.ensure_log_goes_to_stdout do
|
|
9
|
+
Webpacker.clean(Integer(args.keep || 2), Integer(args.age || 3600))
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
skip_webpacker_clean = %w(no false n f).include?(ENV["WEBPACKER_PRECOMPILE"])
|
|
15
|
+
|
|
16
|
+
unless skip_webpacker_clean
|
|
17
|
+
# Run clean if the assets:clean is run
|
|
18
|
+
if Rake::Task.task_defined?("assets:clean")
|
|
19
|
+
Rake::Task["assets:clean"].enhance do
|
|
20
|
+
Rake::Task["webpacker:clean"].invoke
|
|
21
|
+
end
|
|
22
|
+
else
|
|
23
|
+
Rake::Task.define_task("assets:clean" => "webpacker:clean")
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require "webpacker/configuration"
|
|
2
|
+
|
|
3
|
+
namespace :webpacker do
|
|
4
|
+
desc "Remove the webpack compiled output directory"
|
|
5
|
+
task clobber: ["webpacker:verify_config", :environment] do
|
|
6
|
+
Webpacker.clobber
|
|
7
|
+
$stdout.puts "Removed webpack output path directory #{Webpacker.config.public_output_path}"
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
skip_webpacker_clobber = %w(no false n f).include?(ENV["WEBPACKER_PRECOMPILE"])
|
|
12
|
+
|
|
13
|
+
unless skip_webpacker_clobber
|
|
14
|
+
# Run clobber if the assets:clobber is run
|
|
15
|
+
if Rake::Task.task_defined?("assets:clobber")
|
|
16
|
+
Rake::Task["assets:clobber"].enhance do
|
|
17
|
+
Rake::Task["webpacker:clobber"].invoke
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
$stdout.sync = true
|
|
2
|
+
|
|
3
|
+
def yarn_install_available?
|
|
4
|
+
rails_major = Rails::VERSION::MAJOR
|
|
5
|
+
rails_minor = Rails::VERSION::MINOR
|
|
6
|
+
|
|
7
|
+
rails_major > 5 || (rails_major == 5 && rails_minor >= 1)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def enhance_assets_precompile
|
|
11
|
+
# yarn:install was added in Rails 5.1
|
|
12
|
+
deps = yarn_install_available? ? [] : ["webpacker:yarn_install"]
|
|
13
|
+
Rake::Task["assets:precompile"].enhance(deps) do |task|
|
|
14
|
+
prefix = task.name.split(/#|assets:precompile/).first
|
|
15
|
+
|
|
16
|
+
Rake::Task["#{prefix}webpacker:compile"].invoke
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
namespace :webpacker do
|
|
21
|
+
desc "Compile JavaScript packs using webpack for production with digests"
|
|
22
|
+
task compile: ["webpacker:verify_install", :environment] do
|
|
23
|
+
Webpacker.with_node_env(ENV.fetch("NODE_ENV", "production")) do
|
|
24
|
+
Webpacker.ensure_log_goes_to_stdout do
|
|
25
|
+
if Webpacker.compile
|
|
26
|
+
# Successful compilation!
|
|
27
|
+
else
|
|
28
|
+
# Failed compilation
|
|
29
|
+
exit!
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Compile packs after we've compiled all other assets during precompilation
|
|
37
|
+
skip_webpacker_precompile = %w(no false n f).include?(ENV["WEBPACKER_PRECOMPILE"])
|
|
38
|
+
|
|
39
|
+
unless skip_webpacker_precompile
|
|
40
|
+
if Rake::Task.task_defined?("assets:precompile")
|
|
41
|
+
enhance_assets_precompile
|
|
42
|
+
else
|
|
43
|
+
Rake::Task.define_task("assets:precompile" => ["webpacker:yarn_install", "webpacker:compile"])
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require "webpacker/version"
|
|
2
|
+
|
|
3
|
+
namespace :webpacker do
|
|
4
|
+
desc "Provide information on Webpacker's environment"
|
|
5
|
+
task :info do
|
|
6
|
+
Dir.chdir(Rails.root) do
|
|
7
|
+
$stdout.puts "Ruby: #{`ruby --version`}"
|
|
8
|
+
$stdout.puts "Rails: #{Rails.version}"
|
|
9
|
+
$stdout.puts "Webpacker: #{Webpacker::VERSION}"
|
|
10
|
+
$stdout.puts "Node: #{`node --version`}"
|
|
11
|
+
$stdout.puts "Yarn: #{`yarn --version`}"
|
|
12
|
+
|
|
13
|
+
$stdout.puts "\n"
|
|
14
|
+
$stdout.puts "@shakacode/shakapacker: \n#{`npm list @shakacode/shakapacker version`}"
|
|
15
|
+
|
|
16
|
+
$stdout.puts "Is bin/webpacker present?: #{File.exist? 'bin/webpacker'}"
|
|
17
|
+
$stdout.puts "Is bin/webpacker-dev-server present?: #{File.exist? 'bin/webpacker-dev-server'}"
|
|
18
|
+
$stdout.puts "Is bin/yarn present?: #{File.exist? 'bin/yarn'}"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
install_template_path = File.expand_path("../../install/template.rb", __dir__).freeze
|
|
2
|
+
bin_path = ENV["BUNDLE_BIN"] || Rails.root.join("bin")
|
|
3
|
+
|
|
4
|
+
namespace :webpacker do
|
|
5
|
+
desc "Install Webpacker in this application"
|
|
6
|
+
task install: [:check_node, :check_yarn] do |task|
|
|
7
|
+
Webpacker::Configuration.installing = true
|
|
8
|
+
|
|
9
|
+
prefix = task.name.split(/#|webpacker:install/).first
|
|
10
|
+
|
|
11
|
+
if Rails::VERSION::MAJOR >= 5
|
|
12
|
+
exec "#{RbConfig.ruby} #{bin_path}/rails #{prefix}app:template LOCATION='#{install_template_path}'"
|
|
13
|
+
else
|
|
14
|
+
exec "#{RbConfig.ruby} #{bin_path}/rake #{prefix}rails:template LOCATION='#{install_template_path}'"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require "webpacker/configuration"
|
|
2
|
+
|
|
3
|
+
namespace :webpacker do
|
|
4
|
+
desc "Verifies if the Webpacker config is present"
|
|
5
|
+
task :verify_config do
|
|
6
|
+
unless Webpacker.config.config_path.exist?
|
|
7
|
+
path = Webpacker.config.config_path.relative_path_from(Pathname.new(pwd)).to_s
|
|
8
|
+
$stderr.puts "Configuration #{path} file not found. \n"\
|
|
9
|
+
"Make sure webpacker:install is run successfully before " \
|
|
10
|
+
"running dependent tasks"
|
|
11
|
+
exit!
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
namespace :webpacker do
|
|
2
|
+
desc "Support for older Rails versions. Install all JavaScript dependencies as specified via Yarn"
|
|
3
|
+
task :yarn_install do
|
|
4
|
+
valid_node_envs = %w[test development production]
|
|
5
|
+
node_env = ENV.fetch("NODE_ENV") do
|
|
6
|
+
valid_node_envs.include?(Rails.env) ? Rails.env : "production"
|
|
7
|
+
end
|
|
8
|
+
Dir.chdir(Rails.root) do
|
|
9
|
+
yarn_flags =
|
|
10
|
+
if `yarn --version`.start_with?("1")
|
|
11
|
+
"--no-progress --frozen-lockfile"
|
|
12
|
+
else
|
|
13
|
+
"--immutable"
|
|
14
|
+
end
|
|
15
|
+
system({ "NODE_ENV" => node_env }, "yarn install #{yarn_flags}")
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
tasks = {
|
|
2
|
+
"webpacker:info" => "Provides information on Webpacker's environment",
|
|
3
|
+
"webpacker:install" => "Installs and setup webpack with Yarn",
|
|
4
|
+
"webpacker:compile" => "Compiles webpack bundles based on environment",
|
|
5
|
+
"webpacker:clean" => "Remove old compiled webpacks",
|
|
6
|
+
"webpacker:clobber" => "Removes the webpack compiled output directory",
|
|
7
|
+
"webpacker:check_node" => "Verifies if Node.js is installed",
|
|
8
|
+
"webpacker:check_yarn" => "Verifies if Yarn is installed",
|
|
9
|
+
"webpacker:check_binstubs" => "Verifies that bin/webpacker is present",
|
|
10
|
+
"webpacker:binstubs" => "Installs Webpacker binstubs in this application",
|
|
11
|
+
"webpacker:verify_install" => "Verifies if Webpacker is installed",
|
|
12
|
+
"webpacker:yarn_install" => "Support for older Rails versions. Install all JavaScript dependencies as specified via Yarn"
|
|
13
|
+
}.freeze
|
|
14
|
+
|
|
15
|
+
desc "Lists all available tasks in Webpacker"
|
|
16
|
+
task :webpacker do
|
|
17
|
+
puts "Available Webpacker tasks are:"
|
|
18
|
+
tasks.each { |task, message| puts task.ljust(30) + message }
|
|
19
|
+
end
|
data/lib/tasks/yarn.rake
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Duplicate of the yarn tasks still present in Rails until Webpacker <5 have been deprecated
|
|
4
|
+
|
|
5
|
+
namespace :yarn do
|
|
6
|
+
desc "Install all JavaScript dependencies as specified via Yarn"
|
|
7
|
+
task :install do
|
|
8
|
+
begin
|
|
9
|
+
# Install only production deps when for not usual envs.
|
|
10
|
+
valid_node_envs = %w[test development production]
|
|
11
|
+
node_env = ENV.fetch("NODE_ENV") do
|
|
12
|
+
valid_node_envs.include?(Rails.env) ? Rails.env : "production"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
yarn_flags =
|
|
16
|
+
if `#{RbConfig.ruby} "#{Rails.root}/bin/yarn" --version`.start_with?("1")
|
|
17
|
+
"--no-progress --frozen-lockfile"
|
|
18
|
+
else
|
|
19
|
+
"--immutable"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
system(
|
|
23
|
+
{ "NODE_ENV" => node_env },
|
|
24
|
+
"#{RbConfig.ruby} \"#{Rails.root}/bin/yarn\" install #{yarn_flags}",
|
|
25
|
+
exception: true
|
|
26
|
+
)
|
|
27
|
+
rescue Errno::ENOENT
|
|
28
|
+
$stderr.puts "bin/yarn was not found."
|
|
29
|
+
$stderr.puts "Please run `bundle exec rails app:update:bin` to create it."
|
|
30
|
+
exit 1
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Run Yarn prior to Sprockets assets precompilation, so dependencies are available for use.
|
|
36
|
+
if Rake::Task.task_defined?("assets:precompile") && File.exist?(Rails.root.join("bin", "yarn"))
|
|
37
|
+
Rake::Task["assets:precompile"].enhance [ "yarn:install" ]
|
|
38
|
+
end
|