webpacker 4.0.3 → 4.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 +4 -4
- data/.node-version +1 -1
- data/.rubocop.yml +2 -1
- data/.travis.yml +7 -4
- data/CHANGELOG.md +244 -129
- data/Gemfile.lock +79 -60
- data/README.md +110 -3
- data/docs/css.md +12 -0
- data/docs/deployment.md +38 -9
- data/docs/docker.md +25 -6
- data/docs/engines.md +40 -3
- data/docs/es6.md +19 -1
- data/docs/troubleshooting.md +37 -9
- data/docs/typescript.md +8 -5
- data/docs/webpack-dev-server.md +1 -1
- data/docs/webpack.md +18 -3
- 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 +11 -11
- data/lib/install/config/webpacker.yml +2 -1
- data/lib/install/elm.rb +1 -1
- 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 +18 -15
- data/lib/install/examples/svelte/app.svelte +11 -0
- data/lib/install/examples/svelte/hello_svelte.js +20 -0
- data/lib/install/loaders/elm.js +9 -6
- data/lib/install/loaders/svelte.js +9 -0
- data/lib/install/loaders/typescript.js +1 -1
- data/lib/install/svelte.rb +29 -0
- data/lib/install/typescript.rb +1 -1
- data/lib/install/vue.rb +1 -1
- data/lib/tasks/installers.rake +1 -0
- data/lib/tasks/webpacker.rake +2 -0
- data/lib/tasks/webpacker/clean.rake +15 -0
- data/lib/tasks/webpacker/compile.rake +1 -1
- data/lib/tasks/webpacker/yarn_install.rake +15 -0
- data/lib/webpacker.rb +1 -1
- data/lib/webpacker/commands.rb +26 -0
- data/lib/webpacker/compiler.rb +15 -8
- data/lib/webpacker/configuration.rb +9 -1
- data/lib/webpacker/dev_server.rb +1 -1
- data/lib/webpacker/dev_server_proxy.rb +2 -8
- data/lib/webpacker/helper.rb +39 -13
- data/lib/webpacker/railtie.rb +4 -0
- data/lib/webpacker/version.rb +1 -1
- data/package.json +36 -37
- data/package/__tests__/config.js +0 -23
- data/package/config.js +2 -10
- data/package/config_types/config_list.js +3 -3
- data/package/config_types/config_object.js +1 -1
- data/package/environments/base.js +2 -2
- data/package/environments/development.js +1 -1
- data/package/environments/production.js +12 -0
- data/package/rules/babel.js +1 -1
- data/package/rules/node_modules.js +2 -1
- data/package/rules/sass.js +1 -1
- 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 +9 -9
- data/test/command_test.rb +6 -0
- data/test/compiler_test.rb +5 -6
- data/test/configuration_test.rb +36 -27
- data/test/dev_server_test.rb +22 -0
- data/test/helper_test.rb +34 -0
- data/test/rake_tasks_test.rb +6 -0
- data/test/test_app/bin/webpack +0 -1
- data/test/test_app/bin/webpack-dev-server +0 -1
- data/test/test_app/config/webpacker.yml +1 -0
- data/test/test_app/public/packs/manifest.json +3 -0
- data/webpacker.gemspec +2 -1
- data/yarn.lock +1934 -1642
- metadata +24 -10
@@ -38,8 +38,8 @@
|
|
38
38
|
// import 'classlist.js'; // Run `npm install --save classlist.js`.
|
39
39
|
|
40
40
|
/** Evergreen browsers require these. **/
|
41
|
-
import 'core-js/
|
42
|
-
import 'core-js/
|
41
|
+
import 'core-js/es/reflect';
|
42
|
+
import 'core-js/proposals/reflect-metadata';
|
43
43
|
|
44
44
|
|
45
45
|
/**
|
@@ -18,15 +18,17 @@ module.exports = function(api) {
|
|
18
18
|
return {
|
19
19
|
presets: [
|
20
20
|
isTestEnv && [
|
21
|
-
|
21
|
+
'@babel/preset-env',
|
22
22
|
{
|
23
23
|
targets: {
|
24
24
|
node: 'current'
|
25
|
-
}
|
26
|
-
|
25
|
+
},
|
26
|
+
modules: 'commonjs'
|
27
|
+
},
|
28
|
+
'@babel/preset-react'
|
27
29
|
],
|
28
30
|
(isProductionEnv || isDevelopmentEnv) && [
|
29
|
-
|
31
|
+
'@babel/preset-env',
|
30
32
|
{
|
31
33
|
forceAllTransforms: true,
|
32
34
|
useBuiltIns: 'entry',
|
@@ -36,7 +38,7 @@ module.exports = function(api) {
|
|
36
38
|
}
|
37
39
|
],
|
38
40
|
[
|
39
|
-
|
41
|
+
'@babel/preset-react',
|
40
42
|
{
|
41
43
|
development: isDevelopmentEnv || isTestEnv,
|
42
44
|
useBuiltIns: true
|
@@ -44,37 +46,38 @@ module.exports = function(api) {
|
|
44
46
|
]
|
45
47
|
].filter(Boolean),
|
46
48
|
plugins: [
|
47
|
-
|
48
|
-
|
49
|
-
isTestEnv &&
|
50
|
-
|
49
|
+
'babel-plugin-macros',
|
50
|
+
'@babel/plugin-syntax-dynamic-import',
|
51
|
+
isTestEnv && 'babel-plugin-dynamic-import-node',
|
52
|
+
'@babel/plugin-transform-destructuring',
|
51
53
|
[
|
52
|
-
|
54
|
+
'@babel/plugin-proposal-class-properties',
|
53
55
|
{
|
54
56
|
loose: true
|
55
57
|
}
|
56
58
|
],
|
57
59
|
[
|
58
|
-
|
60
|
+
'@babel/plugin-proposal-object-rest-spread',
|
59
61
|
{
|
60
62
|
useBuiltIns: true
|
61
63
|
}
|
62
64
|
],
|
63
65
|
[
|
64
|
-
|
66
|
+
'@babel/plugin-transform-runtime',
|
65
67
|
{
|
66
68
|
helpers: false,
|
67
|
-
regenerator: true
|
69
|
+
regenerator: true,
|
70
|
+
corejs: false
|
68
71
|
}
|
69
72
|
],
|
70
73
|
[
|
71
|
-
|
74
|
+
'@babel/plugin-transform-regenerator',
|
72
75
|
{
|
73
76
|
async: false
|
74
77
|
}
|
75
78
|
],
|
76
79
|
isProductionEnv && [
|
77
|
-
|
80
|
+
'babel-plugin-transform-react-remove-prop-types',
|
78
81
|
{
|
79
82
|
removeImport: true
|
80
83
|
}
|
@@ -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
|
+
|
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/typescript.rb
CHANGED
@@ -21,7 +21,7 @@ copy_file "#{__dir__}/loaders/typescript.js", Rails.root.join("config/webpack/lo
|
|
21
21
|
say "Adding typescript loader to config/webpack/environment.js"
|
22
22
|
insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
|
23
23
|
"const typescript = require('./loaders/typescript')\n",
|
24
|
-
after:
|
24
|
+
after: /require\(('|")@rails\/webpacker\1\);?\n/
|
25
25
|
|
26
26
|
insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
|
27
27
|
"environment.loaders.prepend('typescript', typescript)\n",
|
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
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",
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "webpacker/configuration"
|
2
|
+
|
3
|
+
namespace :webpacker do
|
4
|
+
desc "Remove old compiled webpacks"
|
5
|
+
task :clean, [:keep] => ["webpacker:verify_install", :environment] do |_, args|
|
6
|
+
Webpacker.clean(Integer(args.keep || 2))
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
# Run clean if the assets:clean is run
|
11
|
+
if Rake::Task.task_defined?("assets:clean")
|
12
|
+
Rake::Task["assets:clean"].enhance do
|
13
|
+
Rake::Task["webpacker:clean"].invoke
|
14
|
+
end
|
15
|
+
end
|
@@ -26,7 +26,7 @@ end
|
|
26
26
|
namespace :webpacker do
|
27
27
|
desc "Compile JavaScript packs using webpack for production with digests"
|
28
28
|
task compile: ["webpacker:verify_install", :environment] do
|
29
|
-
Webpacker.with_node_env("production") do
|
29
|
+
Webpacker.with_node_env(ENV.fetch("NODE_ENV", "production")) do
|
30
30
|
ensure_log_goes_to_stdout do
|
31
31
|
if Webpacker.compile
|
32
32
|
# Successful compilation!
|
@@ -2,5 +2,20 @@ 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
|
system "yarn install --no-progress"
|
5
|
+
|
6
|
+
exit(1) unless $?.success?
|
5
7
|
end
|
6
8
|
end
|
9
|
+
|
10
|
+
def enhance_yarn_install
|
11
|
+
Rake::Task["yarn:install"].enhance do
|
12
|
+
exit(1) unless $?.success?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
if Rake::Task.task_defined?("yarn:install")
|
17
|
+
enhance_yarn_install
|
18
|
+
else
|
19
|
+
# this is mainly for pre-5.x era
|
20
|
+
Rake::Task.define_task("yarn:install" => "webpacker:yarn_install")
|
21
|
+
end
|
data/lib/webpacker.rb
CHANGED
@@ -24,7 +24,7 @@ module Webpacker
|
|
24
24
|
|
25
25
|
delegate :logger, :logger=, :env, to: :instance
|
26
26
|
delegate :config, :compiler, :manifest, :commands, :dev_server, to: :instance
|
27
|
-
delegate :bootstrap, :clobber, :compile, to: :commands
|
27
|
+
delegate :bootstrap, :clean, :clobber, :compile, to: :commands
|
28
28
|
end
|
29
29
|
|
30
30
|
require "webpacker/instance"
|
data/lib/webpacker/commands.rb
CHANGED
@@ -5,6 +5,23 @@ class Webpacker::Commands
|
|
5
5
|
@webpacker = webpacker
|
6
6
|
end
|
7
7
|
|
8
|
+
def clean(count_to_keep = 2)
|
9
|
+
if config.public_output_path.exist? && config.public_manifest_path.exist?
|
10
|
+
files_in_manifest = process_manifest_hash(manifest.refresh)
|
11
|
+
files_to_be_removed = files_in_manifest.flat_map do |file_in_manifest|
|
12
|
+
file_prefix, file_ext = file_in_manifest.scan(/(.*)[0-9a-f]{20}(.*)/).first
|
13
|
+
versions_of_file = Dir.glob("#{file_prefix}*#{file_ext}").grep(/#{file_prefix}[0-9a-f]{20}#{file_ext}/)
|
14
|
+
versions_of_file.map do |version_of_file|
|
15
|
+
next if version_of_file == file_in_manifest
|
16
|
+
|
17
|
+
[version_of_file, File.mtime(version_of_file).utc.to_i]
|
18
|
+
end.compact.sort_by(&:last).reverse.drop(count_to_keep).map(&:first)
|
19
|
+
end
|
20
|
+
|
21
|
+
files_to_be_removed.each { |f| File.delete f }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
8
25
|
def clobber
|
9
26
|
config.public_output_path.rmtree if config.public_output_path.exist?
|
10
27
|
config.cache_path.rmtree if config.cache_path.exist?
|
@@ -19,4 +36,13 @@ class Webpacker::Commands
|
|
19
36
|
manifest.refresh if success
|
20
37
|
end
|
21
38
|
end
|
39
|
+
|
40
|
+
private
|
41
|
+
def process_manifest_hash(manifest_hash)
|
42
|
+
manifest_hash.values.map do |value|
|
43
|
+
next process_manifest_hash(value) if value.is_a?(Hash)
|
44
|
+
|
45
|
+
File.join(config.root_path, "public", value)
|
46
|
+
end.flatten
|
47
|
+
end
|
22
48
|
end
|
data/lib/webpacker/compiler.rb
CHANGED
@@ -19,9 +19,15 @@ class Webpacker::Compiler
|
|
19
19
|
def compile
|
20
20
|
if stale?
|
21
21
|
run_webpack.tap do |success|
|
22
|
-
|
22
|
+
# We used to only record the digest on success
|
23
|
+
# However, the output file is still written on error, (at least with ts-loader), meaning that the
|
24
|
+
# digest should still be updated. If it's not, you can end up in a situation where a recompile doesn't
|
25
|
+
# take place when it should.
|
26
|
+
# See https://github.com/rails/webpacker/issues/2113
|
27
|
+
record_compilation_digest
|
23
28
|
end
|
24
29
|
else
|
30
|
+
logger.info "Everything's up-to-date. Nothing to do"
|
25
31
|
true
|
26
32
|
end
|
27
33
|
end
|
@@ -56,7 +62,7 @@ class Webpacker::Compiler
|
|
56
62
|
end
|
57
63
|
|
58
64
|
def run_webpack
|
59
|
-
logger.info "Compiling
|
65
|
+
logger.info "Compiling..."
|
60
66
|
|
61
67
|
stdout, stderr, status = Open3.capture3(
|
62
68
|
webpack_env,
|
@@ -67,12 +73,13 @@ class Webpacker::Compiler
|
|
67
73
|
if status.success?
|
68
74
|
logger.info "Compiled all packs in #{config.public_output_path}"
|
69
75
|
logger.error "#{stderr}" unless stderr.empty?
|
70
|
-
else
|
71
|
-
logger.error "Compilation failed:\n#{stderr}"
|
72
|
-
end
|
73
76
|
|
74
|
-
|
75
|
-
|
77
|
+
if config.webpack_compile_output?
|
78
|
+
logger.info stdout
|
79
|
+
end
|
80
|
+
else
|
81
|
+
non_empty_streams = [stdout, stderr].delete_if(&:empty?)
|
82
|
+
logger.error "Compilation failed:\n#{non_empty_streams.join("\n\n")}"
|
76
83
|
end
|
77
84
|
|
78
85
|
status.success?
|
@@ -81,7 +88,7 @@ class Webpacker::Compiler
|
|
81
88
|
def default_watched_paths
|
82
89
|
[
|
83
90
|
*config.resolved_paths_globbed,
|
84
|
-
|
91
|
+
config.source_path_globbed,
|
85
92
|
"yarn.lock", "package.json",
|
86
93
|
"config/webpack/**/*"
|
87
94
|
].freeze
|
@@ -23,12 +23,16 @@ class Webpacker::Configuration
|
|
23
23
|
root_path.join(fetch(:source_path))
|
24
24
|
end
|
25
25
|
|
26
|
+
def source_path_globbed
|
27
|
+
globbed_path_with_extensions(source_path.relative_path_from(root_path))
|
28
|
+
end
|
29
|
+
|
26
30
|
def resolved_paths
|
27
31
|
fetch(:resolved_paths)
|
28
32
|
end
|
29
33
|
|
30
34
|
def resolved_paths_globbed
|
31
|
-
resolved_paths.map { |p|
|
35
|
+
resolved_paths.map { |p| globbed_path_with_extensions(p) }
|
32
36
|
end
|
33
37
|
|
34
38
|
def source_entry_path
|
@@ -102,4 +106,8 @@ class Webpacker::Configuration
|
|
102
106
|
@defaults ||= \
|
103
107
|
HashWithIndifferentAccess.new(YAML.load_file(File.expand_path("../../install/config/webpacker.yml", __FILE__))[env])
|
104
108
|
end
|
109
|
+
|
110
|
+
def globbed_path_with_extensions(path)
|
111
|
+
"#{path}/**/*{#{extensions.join(',')}}"
|
112
|
+
end
|
105
113
|
end
|
data/lib/webpacker/dev_server.rb
CHANGED
@@ -5,16 +5,10 @@ class Webpacker::DevServerProxy < Rack::Proxy
|
|
5
5
|
|
6
6
|
def initialize(app = nil, opts = {})
|
7
7
|
@webpacker = opts.delete(:webpacker) || Webpacker.instance
|
8
|
+
opts[:streaming] = false if Rails.env.test? && !opts.key?(:streaming)
|
8
9
|
super
|
9
10
|
end
|
10
11
|
|
11
|
-
def rewrite_response(response)
|
12
|
-
_status, headers, _body = response
|
13
|
-
headers.delete "transfer-encoding"
|
14
|
-
headers.delete "content-length" if dev_server.running? && dev_server.https?
|
15
|
-
response
|
16
|
-
end
|
17
|
-
|
18
12
|
def perform_request(env)
|
19
13
|
if env["PATH_INFO"].start_with?("/#{public_output_uri_path}") && dev_server.running?
|
20
14
|
env["HTTP_HOST"] = env["HTTP_X_FORWARDED_HOST"] = env["HTTP_X_FORWARDED_SERVER"] = dev_server.host_with_port
|
@@ -32,6 +26,6 @@ class Webpacker::DevServerProxy < Rack::Proxy
|
|
32
26
|
|
33
27
|
private
|
34
28
|
def public_output_uri_path
|
35
|
-
config.public_output_path.relative_path_from(config.public_path)
|
29
|
+
config.public_output_path.relative_path_from(config.public_path).to_s + "/"
|
36
30
|
end
|
37
31
|
end
|