webpacker 4.0.2 → 5.4.3
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 +4 -4
- data/.eslintrc.js +8 -8
- data/.github/workflows/jest.yml +38 -0
- data/.github/workflows/js-lint.yml +39 -0
- data/.github/workflows/rubocop.yml +39 -0
- data/.github/workflows/ruby.yml +58 -0
- data/.gitignore +1 -0
- data/.node-version +1 -1
- data/.rubocop.yml +115 -14
- data/.travis.yml +16 -18
- data/CHANGELOG.md +329 -130
- data/Gemfile +1 -1
- data/Gemfile.lock +127 -105
- data/README.md +84 -217
- data/docs/assets.md +20 -10
- data/docs/css.md +126 -7
- data/docs/deployment.md +55 -10
- data/docs/docker.md +33 -14
- data/docs/engines.md +60 -2
- data/docs/env.md +0 -2
- data/docs/es6.md +24 -5
- data/docs/integrations.md +220 -0
- data/docs/target.md +22 -0
- data/docs/testing.md +2 -3
- data/docs/troubleshooting.md +46 -7
- data/docs/typescript.md +93 -26
- data/docs/v4-upgrade.md +12 -2
- data/docs/webpack-dev-server.md +2 -2
- data/docs/webpack.md +21 -7
- data/gemfiles/Gemfile-rails-edge +2 -3
- data/gemfiles/Gemfile-rails.5.2.x +1 -2
- data/gemfiles/Gemfile-rails.6.0.x +9 -0
- data/lib/install/bin/webpack +0 -1
- data/lib/install/bin/webpack-dev-server +0 -1
- data/lib/install/coffee.rb +1 -1
- data/lib/install/config/babel.config.js +24 -12
- data/lib/install/config/webpacker.yml +3 -6
- data/lib/install/elm.rb +3 -3
- data/lib/install/erb.rb +2 -2
- data/lib/install/examples/angular/hello_angular/polyfills.ts +2 -2
- data/lib/install/examples/react/babel.config.js +31 -15
- data/lib/install/examples/react/tsconfig.json +2 -1
- data/lib/install/examples/svelte/app.svelte +11 -0
- data/lib/install/examples/svelte/hello_svelte.js +20 -0
- data/lib/install/examples/typescript/tsconfig.json +2 -1
- data/lib/install/examples/vue/hello_vue.js +2 -3
- data/lib/install/loaders/elm.js +9 -6
- data/lib/install/loaders/svelte.js +9 -0
- data/lib/install/svelte.rb +29 -0
- data/lib/install/template.rb +12 -4
- data/lib/install/typescript.rb +6 -13
- data/lib/install/vue.rb +1 -1
- data/lib/tasks/installers.rake +1 -0
- data/lib/tasks/webpacker/check_node.rake +15 -8
- data/lib/tasks/webpacker/check_yarn.rake +16 -10
- data/lib/tasks/webpacker/clean.rake +25 -0
- data/lib/tasks/webpacker/clobber.rake +8 -4
- data/lib/tasks/webpacker/compile.rake +10 -15
- data/lib/tasks/webpacker/yarn_install.rake +11 -1
- data/lib/tasks/webpacker.rake +2 -0
- data/lib/webpacker/commands.rb +53 -1
- data/lib/webpacker/compiler.rb +24 -9
- data/lib/webpacker/configuration.rb +36 -13
- data/lib/webpacker/dev_server.rb +1 -1
- data/lib/webpacker/dev_server_proxy.rb +5 -9
- data/lib/webpacker/dev_server_runner.rb +10 -4
- data/lib/webpacker/env.rb +6 -2
- data/lib/webpacker/helper.rb +71 -26
- data/lib/webpacker/manifest.rb +4 -4
- data/lib/webpacker/railtie.rb +6 -43
- data/lib/webpacker/runner.rb +1 -0
- data/lib/webpacker/version.rb +1 -1
- data/lib/webpacker/webpack_runner.rb +6 -0
- data/lib/webpacker.rb +9 -1
- data/package/__tests__/config.js +12 -24
- data/package/__tests__/dev_server.js +2 -0
- data/package/__tests__/development.js +14 -1
- data/package/config.js +6 -11
- data/package/configPath.js +3 -0
- data/package/config_types/config_list.js +3 -3
- data/package/config_types/config_object.js +1 -1
- data/package/dev_server.js +1 -1
- data/package/env.js +1 -2
- data/package/environments/__tests__/base.js +30 -3
- data/package/environments/base.js +20 -10
- data/package/environments/development.js +39 -37
- data/package/environments/production.js +12 -2
- data/package/rules/babel.js +12 -5
- data/package/rules/file.js +3 -2
- data/package/rules/node_modules.js +3 -4
- data/package/rules/sass.js +11 -2
- data/package/utils/__tests__/get_style_rule.js +9 -0
- data/package/utils/deep_merge.js +5 -5
- data/package/utils/get_style_rule.js +7 -12
- data/package/utils/helpers.js +10 -10
- data/package.json +43 -42
- data/test/command_test.rb +6 -0
- data/test/compiler_test.rb +10 -6
- data/test/configuration_test.rb +40 -30
- data/test/dev_server_runner_test.rb +1 -1
- data/test/dev_server_test.rb +22 -0
- data/test/helper_test.rb +58 -9
- data/test/manifest_test.rb +37 -6
- data/test/rake_tasks_test.rb +17 -0
- data/test/test_app/app/javascript/packs/multi_entry.css +4 -0
- data/test/test_app/app/javascript/packs/multi_entry.js +4 -0
- data/test/test_app/bin/webpack +0 -1
- data/test/test_app/bin/webpack-dev-server +0 -1
- data/test/test_app/config/application.rb +0 -1
- data/test/test_app/config/webpacker.yml +8 -1
- data/test/test_app/public/packs/manifest.json +4 -0
- data/test/webpack_runner_test.rb +1 -1
- data/webpacker.gemspec +7 -4
- data/yarn.lock +4552 -4077
- metadata +73 -19
- data/gemfiles/Gemfile-rails.4.2.x +0 -10
- data/gemfiles/Gemfile-rails.5.0.x +0 -10
- data/gemfiles/Gemfile-rails.5.1.x +0 -10
- data/lib/install/loaders/typescript.js +0 -11
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/* eslint no-console: 0 */
|
|
2
|
+
// Run this example by adding <%= javascript_pack_tag 'hello_svelte' %> (and
|
|
3
|
+
// <%= stylesheet_pack_tag 'hello_svelte' %> if you have styles in your component)
|
|
4
|
+
// to the head of your layout file,
|
|
5
|
+
// like app/views/layouts/application.html.erb.
|
|
6
|
+
// All it does is render <div>Hello Svelte!</div> at the bottom of the page.
|
|
7
|
+
|
|
8
|
+
import App from '../app.svelte'
|
|
9
|
+
|
|
10
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
11
|
+
const app = new App({
|
|
12
|
+
target: document.body,
|
|
13
|
+
props: {
|
|
14
|
+
name: 'Svelte'
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
window.app = app;
|
|
19
|
+
})
|
|
20
|
+
|
|
@@ -9,11 +9,10 @@ import Vue from 'vue'
|
|
|
9
9
|
import App from '../app.vue'
|
|
10
10
|
|
|
11
11
|
document.addEventListener('DOMContentLoaded', () => {
|
|
12
|
-
const el = document.body.appendChild(document.createElement('hello'))
|
|
13
12
|
const app = new Vue({
|
|
14
|
-
el,
|
|
15
13
|
render: h => h(App)
|
|
16
|
-
})
|
|
14
|
+
}).$mount()
|
|
15
|
+
document.body.appendChild(app.$el)
|
|
17
16
|
|
|
18
17
|
console.log(app)
|
|
19
18
|
})
|
data/lib/install/loaders/elm.js
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
const { resolve } = require('path')
|
|
2
2
|
|
|
3
3
|
const isProduction = process.env.NODE_ENV === 'production'
|
|
4
|
+
const isDevelopment = process.env.NODE_ENV === 'development'
|
|
4
5
|
const elmSource = resolve(process.cwd())
|
|
5
6
|
const elmBinary = `${elmSource}/node_modules/.bin/elm`
|
|
6
7
|
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
const options = {
|
|
9
|
+
cwd: elmSource,
|
|
10
|
+
pathToElm: elmBinary,
|
|
11
|
+
optimize: isProduction,
|
|
12
|
+
verbose: isDevelopment,
|
|
13
|
+
debug: isDevelopment
|
|
14
|
+
}
|
|
12
15
|
|
|
13
16
|
const elmWebpackLoader = {
|
|
14
17
|
loader: 'elm-webpack-loader',
|
|
15
|
-
options:
|
|
18
|
+
options: options
|
|
16
19
|
}
|
|
17
20
|
|
|
18
21
|
module.exports = {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require "webpacker/configuration"
|
|
2
|
+
|
|
3
|
+
say "Copying svelte loader to config/webpack/loaders"
|
|
4
|
+
copy_file "#{__dir__}/loaders/svelte.js", Rails.root.join("config/webpack/loaders/svelte.js").to_s
|
|
5
|
+
|
|
6
|
+
say "Adding svelte loader to config/webpack/environment.js"
|
|
7
|
+
insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
|
|
8
|
+
"const svelte = require('./loaders/svelte')\n",
|
|
9
|
+
after: /require\(('|")@rails\/webpacker\1\);?\n/
|
|
10
|
+
|
|
11
|
+
insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
|
|
12
|
+
"environment.loaders.prepend('svelte', svelte)\n",
|
|
13
|
+
before: "module.exports"
|
|
14
|
+
|
|
15
|
+
say "Copying Svelte example entry file to #{Webpacker.config.source_entry_path}"
|
|
16
|
+
copy_file "#{__dir__}/examples/svelte/hello_svelte.js",
|
|
17
|
+
"#{Webpacker.config.source_entry_path}/hello_svelte.js"
|
|
18
|
+
|
|
19
|
+
say "Copying Svelte app file to #{Webpacker.config.source_path}"
|
|
20
|
+
copy_file "#{__dir__}/examples/svelte/app.svelte",
|
|
21
|
+
"#{Webpacker.config.source_path}/app.svelte"
|
|
22
|
+
|
|
23
|
+
say "Installing all Svelte dependencies"
|
|
24
|
+
run "yarn add svelte svelte-loader"
|
|
25
|
+
|
|
26
|
+
say "Updating webpack paths to include .svelte file extension"
|
|
27
|
+
insert_into_file Webpacker.config.config_path, "- .svelte\n".indent(4), after: /\s+extensions:\n/
|
|
28
|
+
|
|
29
|
+
say "Webpacker now supports Svelte 🎉", :green
|
data/lib/install/template.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Install Webpacker
|
|
2
2
|
copy_file "#{__dir__}/config/webpacker.yml", "config/webpacker.yml"
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
say "Copying webpack core config"
|
|
5
5
|
directory "#{__dir__}/config/webpack", "config/webpack"
|
|
6
6
|
|
|
7
7
|
say "Copying postcss.config.js to app root directory"
|
|
@@ -34,16 +34,24 @@ if File.exists?(".gitignore")
|
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
if Webpacker::VERSION
|
|
37
|
+
if Webpacker::VERSION.match?(/^[0-9]+\.[0-9]+\.[0-9]+$/)
|
|
38
38
|
say "Installing all JavaScript dependencies [#{Webpacker::VERSION}]"
|
|
39
|
-
run "yarn add @rails/webpacker"
|
|
39
|
+
run "yarn add @rails/webpacker@#{Webpacker::VERSION}"
|
|
40
40
|
else
|
|
41
41
|
say "Installing all JavaScript dependencies [from prerelease rails/webpacker]"
|
|
42
42
|
run "yarn add @rails/webpacker@next"
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
+
package_json = File.read("#{__dir__}/../../package.json")
|
|
46
|
+
webpack_version = package_json.match(/"webpack": "(.*)"/)[1]
|
|
47
|
+
webpack_cli_version = package_json.match(/"webpack-cli": "(.*)"/)[1]
|
|
48
|
+
|
|
49
|
+
# needed for experimental Yarn 2 support and should not harm Yarn 1
|
|
50
|
+
say "Installing webpack and webpack-cli as direct dependencies"
|
|
51
|
+
run "yarn add webpack@#{webpack_version} webpack-cli@#{webpack_cli_version}"
|
|
52
|
+
|
|
45
53
|
say "Installing dev server for live reloading"
|
|
46
|
-
run "yarn add --dev webpack-dev-server"
|
|
54
|
+
run "yarn add --dev webpack-dev-server@^3"
|
|
47
55
|
|
|
48
56
|
if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR > 1
|
|
49
57
|
say "You need to allow webpack-dev-server host as allowed origin for connect-src.", :yellow
|
data/lib/install/typescript.rb
CHANGED
|
@@ -9,23 +9,16 @@ if File.exist?(package_json)
|
|
|
9
9
|
package = JSON.parse(File.read(package_json))
|
|
10
10
|
package["dependencies"] ||= {}
|
|
11
11
|
|
|
12
|
-
if package["dependencies"].
|
|
12
|
+
if package["dependencies"].key?("react")
|
|
13
13
|
additional_packages = "@types/react @types/react-dom"
|
|
14
14
|
example_source = "react"
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
say "
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
|
|
23
|
-
"const typescript = require('./loaders/typescript')\n",
|
|
24
|
-
after: "require('@rails/webpacker')\n"
|
|
25
|
-
|
|
26
|
-
insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
|
|
27
|
-
"environment.loaders.prepend('typescript', typescript)\n",
|
|
28
|
-
before: "module.exports"
|
|
18
|
+
say "Adding TypeScript preset to babel.config.js"
|
|
19
|
+
insert_into_file Rails.root.join("babel.config.js").to_s,
|
|
20
|
+
",\n ['@babel/preset-typescript', { 'allExtensions': true, 'isTSX': true }]",
|
|
21
|
+
before: /\s*\].filter\(Boolean\),\n\s*plugins: \[/
|
|
29
22
|
|
|
30
23
|
say "Copying tsconfig.json to the Rails root directory for typescript"
|
|
31
24
|
copy_file "#{__dir__}/examples/#{example_source}/tsconfig.json", "tsconfig.json"
|
|
@@ -41,6 +34,6 @@ copy_file "#{__dir__}/examples/typescript/hello_typescript.ts",
|
|
|
41
34
|
"#{Webpacker.config.source_entry_path}/hello_typescript.ts"
|
|
42
35
|
|
|
43
36
|
say "Installing all typescript dependencies"
|
|
44
|
-
run "yarn add typescript
|
|
37
|
+
run "yarn add typescript @babel/preset-typescript #{additional_packages}"
|
|
45
38
|
|
|
46
39
|
say "Webpacker now supports typescript 🎉", :green
|
data/lib/install/vue.rb
CHANGED
|
@@ -6,7 +6,7 @@ copy_file "#{__dir__}/loaders/vue.js", Rails.root.join("config/webpack/loaders/v
|
|
|
6
6
|
say "Adding vue loader plugin to config/webpack/environment.js"
|
|
7
7
|
insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
|
|
8
8
|
"const { VueLoaderPlugin } = require('vue-loader')\n",
|
|
9
|
-
after:
|
|
9
|
+
after: /require\(('|")@rails\/webpacker\1\);?\n/
|
|
10
10
|
|
|
11
11
|
insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
|
|
12
12
|
"environment.plugins.prepend('VueLoaderPlugin', new VueLoaderPlugin())\n",
|
data/lib/tasks/installers.rake
CHANGED
|
@@ -1,24 +1,31 @@
|
|
|
1
|
+
require "semantic_range"
|
|
1
2
|
namespace :webpacker do
|
|
2
3
|
desc "Verifies if Node.js is installed"
|
|
3
4
|
task :check_node do
|
|
4
5
|
begin
|
|
5
|
-
node_version = `node -v || nodejs -v
|
|
6
|
+
node_version = `node -v || nodejs -v`.strip
|
|
6
7
|
raise Errno::ENOENT if node_version.blank?
|
|
7
8
|
|
|
8
9
|
pkg_path = Pathname.new("#{__dir__}/../../../package.json").realpath
|
|
9
|
-
|
|
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
|
|
10
14
|
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
13
18
|
|
|
14
|
-
unless
|
|
15
|
-
$stderr.puts "Webpacker requires Node.js #{
|
|
19
|
+
unless is_valid
|
|
20
|
+
$stderr.puts "Webpacker requires Node.js \"#{node_range}\" and you are using #{node_version}"
|
|
16
21
|
$stderr.puts "Please upgrade Node.js https://nodejs.org/en/download/"
|
|
17
|
-
$stderr.puts "Exiting!"
|
|
22
|
+
$stderr.puts "Exiting!"
|
|
23
|
+
exit!
|
|
18
24
|
end
|
|
19
25
|
rescue Errno::ENOENT
|
|
20
26
|
$stderr.puts "Node.js not installed. Please download and install Node.js https://nodejs.org/en/download/"
|
|
21
|
-
$stderr.puts "Exiting!"
|
|
27
|
+
$stderr.puts "Exiting!"
|
|
28
|
+
exit!
|
|
22
29
|
end
|
|
23
30
|
end
|
|
24
31
|
end
|
|
@@ -1,24 +1,30 @@
|
|
|
1
|
+
require "semantic_range"
|
|
1
2
|
namespace :webpacker do
|
|
2
3
|
desc "Verifies if Yarn is installed"
|
|
3
4
|
task :check_yarn do
|
|
4
5
|
begin
|
|
5
|
-
yarn_version = `yarn --version
|
|
6
|
+
yarn_version = `yarn --version`.strip
|
|
6
7
|
raise Errno::ENOENT if yarn_version.blank?
|
|
7
8
|
|
|
8
9
|
pkg_path = Pathname.new("#{__dir__}/../../../package.json").realpath
|
|
9
|
-
|
|
10
|
+
yarn_range = JSON.parse(pkg_path.read)["engines"]["yarn"]
|
|
11
|
+
is_valid = SemanticRange.satisfies?(yarn_version, yarn_range) rescue false
|
|
12
|
+
is_unsupported = SemanticRange.satisfies?(yarn_version, ">=4.0.0") rescue false
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
unless is_valid
|
|
15
|
+
$stderr.puts "Webpacker requires Yarn \"#{yarn_range}\" and you are using #{yarn_version}"
|
|
16
|
+
if is_unsupported
|
|
17
|
+
$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/"
|
|
18
|
+
else
|
|
19
|
+
$stderr.puts "Please upgrade Yarn https://yarnpkg.com/lang/en/docs/install/"
|
|
20
|
+
end
|
|
21
|
+
$stderr.puts "Exiting!"
|
|
22
|
+
exit!
|
|
18
23
|
end
|
|
19
24
|
rescue Errno::ENOENT
|
|
20
25
|
$stderr.puts "Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/"
|
|
21
|
-
$stderr.puts "Exiting!"
|
|
26
|
+
$stderr.puts "Exiting!"
|
|
27
|
+
exit!
|
|
22
28
|
end
|
|
23
29
|
end
|
|
24
30
|
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
|
|
@@ -8,9 +8,13 @@ namespace :webpacker do
|
|
|
8
8
|
end
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
15
19
|
end
|
|
16
20
|
end
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
$stdout.sync = true
|
|
2
2
|
|
|
3
|
-
def ensure_log_goes_to_stdout
|
|
4
|
-
old_logger = Webpacker.logger
|
|
5
|
-
Webpacker.logger = ActiveSupport::Logger.new(STDOUT)
|
|
6
|
-
yield
|
|
7
|
-
ensure
|
|
8
|
-
Webpacker.logger = old_logger
|
|
9
|
-
end
|
|
10
|
-
|
|
11
3
|
def yarn_install_available?
|
|
12
4
|
rails_major = Rails::VERSION::MAJOR
|
|
13
5
|
rails_minor = Rails::VERSION::MINOR
|
|
@@ -26,8 +18,8 @@ end
|
|
|
26
18
|
namespace :webpacker do
|
|
27
19
|
desc "Compile JavaScript packs using webpack for production with digests"
|
|
28
20
|
task compile: ["webpacker:verify_install", :environment] do
|
|
29
|
-
Webpacker.with_node_env("production") do
|
|
30
|
-
ensure_log_goes_to_stdout do
|
|
21
|
+
Webpacker.with_node_env(ENV.fetch("NODE_ENV", "production")) do
|
|
22
|
+
Webpacker.ensure_log_goes_to_stdout do
|
|
31
23
|
if Webpacker.compile
|
|
32
24
|
# Successful compilation!
|
|
33
25
|
else
|
|
@@ -40,9 +32,12 @@ namespace :webpacker do
|
|
|
40
32
|
end
|
|
41
33
|
|
|
42
34
|
# Compile packs after we've compiled all other assets during precompilation
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
35
|
+
skip_webpacker_precompile = %w(no false n f).include?(ENV["WEBPACKER_PRECOMPILE"])
|
|
36
|
+
|
|
37
|
+
unless skip_webpacker_precompile
|
|
38
|
+
if Rake::Task.task_defined?("assets:precompile")
|
|
39
|
+
enhance_assets_precompile
|
|
40
|
+
else
|
|
41
|
+
Rake::Task.define_task("assets:precompile" => ["webpacker:yarn_install", "webpacker:compile"])
|
|
42
|
+
end
|
|
48
43
|
end
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
namespace :webpacker do
|
|
2
2
|
desc "Support for older Rails versions. Install all JavaScript dependencies as specified via Yarn"
|
|
3
3
|
task :yarn_install do
|
|
4
|
-
|
|
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
|
+
yarn_flags =
|
|
9
|
+
if `yarn --version`.start_with?("1")
|
|
10
|
+
"--no-progress --frozen-lockfile"
|
|
11
|
+
else
|
|
12
|
+
"--immutable"
|
|
13
|
+
end
|
|
14
|
+
system({ "NODE_ENV" => node_env }, "yarn install #{yarn_flags}")
|
|
5
15
|
end
|
|
6
16
|
end
|
data/lib/tasks/webpacker.rake
CHANGED
|
@@ -2,6 +2,7 @@ tasks = {
|
|
|
2
2
|
"webpacker:info" => "Provides information on Webpacker's environment",
|
|
3
3
|
"webpacker:install" => "Installs and setup webpack with Yarn",
|
|
4
4
|
"webpacker:compile" => "Compiles webpack bundles based on environment",
|
|
5
|
+
"webpacker:clean" => "Remove old compiled webpacks",
|
|
5
6
|
"webpacker:clobber" => "Removes the webpack compiled output directory",
|
|
6
7
|
"webpacker:check_node" => "Verifies if Node.js is installed",
|
|
7
8
|
"webpacker:check_yarn" => "Verifies if Yarn is installed",
|
|
@@ -13,6 +14,7 @@ tasks = {
|
|
|
13
14
|
"webpacker:install:vue" => "Installs and setup example Vue component",
|
|
14
15
|
"webpacker:install:angular" => "Installs and setup example Angular component",
|
|
15
16
|
"webpacker:install:elm" => "Installs and setup example Elm component",
|
|
17
|
+
"webpacker:install:svelte" => "Installs and setup example Svelte component",
|
|
16
18
|
"webpacker:install:stimulus" => "Installs and setup example Stimulus component",
|
|
17
19
|
"webpacker:install:erb" => "Installs Erb loader with an example",
|
|
18
20
|
"webpacker:install:coffee" => "Installs CoffeeScript loader with an example",
|
data/lib/webpacker/commands.rb
CHANGED
|
@@ -1,10 +1,43 @@
|
|
|
1
1
|
class Webpacker::Commands
|
|
2
|
-
delegate :config, :compiler, :manifest, to: :@webpacker
|
|
2
|
+
delegate :config, :compiler, :manifest, :logger, to: :@webpacker
|
|
3
3
|
|
|
4
4
|
def initialize(webpacker)
|
|
5
5
|
@webpacker = webpacker
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
+
# Cleanup old assets in the compile directory. By default it will
|
|
9
|
+
# keep the latest version, 2 backups created within the past hour.
|
|
10
|
+
#
|
|
11
|
+
# Examples
|
|
12
|
+
#
|
|
13
|
+
# To force only 1 backup to be kept, set count=1 and age=0.
|
|
14
|
+
#
|
|
15
|
+
# To only keep files created within the last 10 minutes, set count=0 and
|
|
16
|
+
# age=600.
|
|
17
|
+
#
|
|
18
|
+
def clean(count = 2, age = 3600)
|
|
19
|
+
if config.public_output_path.exist? && config.public_manifest_path.exist?
|
|
20
|
+
versions
|
|
21
|
+
.sort
|
|
22
|
+
.reverse
|
|
23
|
+
.each_with_index
|
|
24
|
+
.drop_while do |(mtime, _), index|
|
|
25
|
+
max_age = [0, Time.now - Time.at(mtime)].max
|
|
26
|
+
max_age < age || index < count
|
|
27
|
+
end
|
|
28
|
+
.each do |(_, files), index|
|
|
29
|
+
files.each do |file|
|
|
30
|
+
if File.file?(file)
|
|
31
|
+
File.delete(file)
|
|
32
|
+
logger.info "Removed #{file}"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
true
|
|
39
|
+
end
|
|
40
|
+
|
|
8
41
|
def clobber
|
|
9
42
|
config.public_output_path.rmtree if config.public_output_path.exist?
|
|
10
43
|
config.cache_path.rmtree if config.cache_path.exist?
|
|
@@ -19,4 +52,23 @@ class Webpacker::Commands
|
|
|
19
52
|
manifest.refresh if success
|
|
20
53
|
end
|
|
21
54
|
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
def versions
|
|
58
|
+
all_files = Dir.glob("#{config.public_output_path}/**/*")
|
|
59
|
+
manifest_config = Dir.glob("#{config.public_manifest_path}*")
|
|
60
|
+
|
|
61
|
+
packs = all_files - manifest_config - current_version
|
|
62
|
+
packs.reject { |file| File.directory?(file) }.group_by { |file| File.mtime(file).utc.to_i }
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def current_version
|
|
66
|
+
packs = manifest.refresh.values.map do |value|
|
|
67
|
+
next if value.is_a?(Hash)
|
|
68
|
+
|
|
69
|
+
File.join(config.root_path, "public", "#{value}*")
|
|
70
|
+
end.compact
|
|
71
|
+
|
|
72
|
+
Dir.glob(packs).uniq
|
|
73
|
+
end
|
|
22
74
|
end
|
data/lib/webpacker/compiler.rb
CHANGED
|
@@ -4,6 +4,8 @@ require "digest/sha1"
|
|
|
4
4
|
class Webpacker::Compiler
|
|
5
5
|
# Additional paths that test compiler needs to watch
|
|
6
6
|
# Webpacker::Compiler.watched_paths << 'bower_components'
|
|
7
|
+
#
|
|
8
|
+
# Deprecated. Use additional_paths in the YAML configuration instead.
|
|
7
9
|
cattr_accessor(:watched_paths) { [] }
|
|
8
10
|
|
|
9
11
|
# Additional environment variables that the compiler is being run with
|
|
@@ -19,9 +21,14 @@ class Webpacker::Compiler
|
|
|
19
21
|
def compile
|
|
20
22
|
if stale?
|
|
21
23
|
run_webpack.tap do |success|
|
|
22
|
-
|
|
24
|
+
# We used to only record the digest on success
|
|
25
|
+
# However, the output file is still written on error, meaning that the digest should still be updated.
|
|
26
|
+
# If it's not, you can end up in a situation where a recompile doesn't take place when it should.
|
|
27
|
+
# See https://github.com/rails/webpacker/issues/2113
|
|
28
|
+
record_compilation_digest
|
|
23
29
|
end
|
|
24
30
|
else
|
|
31
|
+
logger.info "Everything's up-to-date. Nothing to do"
|
|
25
32
|
true
|
|
26
33
|
end
|
|
27
34
|
end
|
|
@@ -45,6 +52,8 @@ class Webpacker::Compiler
|
|
|
45
52
|
end
|
|
46
53
|
|
|
47
54
|
def watched_files_digest
|
|
55
|
+
warn "Webpacker::Compiler.watched_paths has been deprecated. Set additional_paths in webpacker.yml instead." unless watched_paths.empty?
|
|
56
|
+
|
|
48
57
|
files = Dir[*default_watched_paths, *watched_paths].reject { |f| File.directory?(f) }
|
|
49
58
|
file_ids = files.sort.map { |f| "#{File.basename(f)}/#{Digest::SHA1.file(f).hexdigest}" }
|
|
50
59
|
Digest::SHA1.hexdigest(file_ids.join("/"))
|
|
@@ -56,19 +65,24 @@ class Webpacker::Compiler
|
|
|
56
65
|
end
|
|
57
66
|
|
|
58
67
|
def run_webpack
|
|
59
|
-
logger.info "Compiling
|
|
68
|
+
logger.info "Compiling..."
|
|
60
69
|
|
|
61
|
-
stdout,
|
|
70
|
+
stdout, stderr, status = Open3.capture3(
|
|
62
71
|
webpack_env,
|
|
63
72
|
"#{RbConfig.ruby} ./bin/webpack",
|
|
64
73
|
chdir: File.expand_path(config.root_path)
|
|
65
74
|
)
|
|
66
75
|
|
|
67
|
-
if
|
|
76
|
+
if status.success?
|
|
68
77
|
logger.info "Compiled all packs in #{config.public_output_path}"
|
|
69
|
-
logger.
|
|
78
|
+
logger.error "#{stderr}" unless stderr.empty?
|
|
79
|
+
|
|
80
|
+
if config.webpack_compile_output?
|
|
81
|
+
logger.info stdout
|
|
82
|
+
end
|
|
70
83
|
else
|
|
71
|
-
|
|
84
|
+
non_empty_streams = [stdout, stderr].delete_if(&:empty?)
|
|
85
|
+
logger.error "Compilation failed:\n#{non_empty_streams.join("\n\n")}"
|
|
72
86
|
end
|
|
73
87
|
|
|
74
88
|
status.success?
|
|
@@ -76,8 +90,8 @@ class Webpacker::Compiler
|
|
|
76
90
|
|
|
77
91
|
def default_watched_paths
|
|
78
92
|
[
|
|
79
|
-
*config.
|
|
80
|
-
|
|
93
|
+
*config.additional_paths_globbed,
|
|
94
|
+
config.source_path_globbed,
|
|
81
95
|
"yarn.lock", "package.json",
|
|
82
96
|
"config/webpack/**/*"
|
|
83
97
|
].freeze
|
|
@@ -91,6 +105,7 @@ class Webpacker::Compiler
|
|
|
91
105
|
return env unless defined?(ActionController::Base)
|
|
92
106
|
|
|
93
107
|
env.merge("WEBPACKER_ASSET_HOST" => ENV.fetch("WEBPACKER_ASSET_HOST", ActionController::Base.helpers.compute_asset_host),
|
|
94
|
-
"WEBPACKER_RELATIVE_URL_ROOT" => ENV.fetch("WEBPACKER_RELATIVE_URL_ROOT", ActionController::Base.relative_url_root)
|
|
108
|
+
"WEBPACKER_RELATIVE_URL_ROOT" => ENV.fetch("WEBPACKER_RELATIVE_URL_ROOT", ActionController::Base.relative_url_root),
|
|
109
|
+
"WEBPACKER_CONFIG" => webpacker.config_path.to_s)
|
|
95
110
|
end
|
|
96
111
|
end
|