webpacker 6.0.0.beta.7 → 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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/jest.yml +7 -15
  3. data/.github/workflows/js-lint.yml +7 -15
  4. data/.github/workflows/rubocop.yml +1 -1
  5. data/.github/workflows/ruby.yml +15 -40
  6. data/.node-version +1 -1
  7. data/.rubocop.yml +2 -1
  8. data/CHANGELOG.md +34 -11
  9. data/CONTRIBUTING.md +19 -0
  10. data/Gemfile.lock +84 -84
  11. data/README.md +177 -165
  12. data/config/webpacker.yml +1 -1
  13. data/docs/developing_webpacker.md +29 -0
  14. data/docs/troubleshooting.md +57 -23
  15. data/docs/v6_upgrade.md +69 -42
  16. data/gemfiles/Gemfile-rails-edge +1 -1
  17. data/gemfiles/Gemfile-rails.6.1.x +12 -0
  18. data/lib/install/{packs/entrypoints/application.js → application.js} +3 -8
  19. data/lib/install/bin/webpack +4 -7
  20. data/lib/install/bin/yarn +18 -0
  21. data/lib/install/config/webpacker.yml +18 -19
  22. data/lib/install/package.json +15 -0
  23. data/lib/install/template.rb +38 -16
  24. data/lib/tasks/webpacker/check_node.rake +3 -1
  25. data/lib/tasks/webpacker/check_yarn.rake +4 -2
  26. data/lib/tasks/webpacker/clobber.rake +1 -1
  27. data/lib/tasks/webpacker/verify_config.rake +14 -0
  28. data/lib/tasks/webpacker/verify_install.rake +1 -11
  29. data/lib/tasks/yarn.rake +38 -0
  30. data/lib/webpacker/commands.rb +19 -15
  31. data/lib/webpacker/configuration.rb +15 -4
  32. data/lib/webpacker/dev_server.rb +6 -0
  33. data/lib/webpacker/dev_server_runner.rb +6 -3
  34. data/lib/webpacker/env.rb +5 -1
  35. data/lib/webpacker/helper.rb +14 -8
  36. data/lib/webpacker/instance.rb +4 -0
  37. data/lib/webpacker/manifest.rb +1 -2
  38. data/lib/webpacker/railtie.rb +8 -2
  39. data/lib/webpacker/runner.rb +1 -1
  40. data/lib/webpacker/version.rb +1 -1
  41. data/lib/webpacker/webpack_runner.rb +27 -7
  42. data/lib/webpacker.rb +1 -1
  43. data/package/__tests__/development.js +4 -11
  44. data/package/__tests__/env.js +8 -4
  45. data/package/babel/preset.js +0 -1
  46. data/package/config.js +3 -3
  47. data/package/env.js +6 -3
  48. data/package/environments/__tests__/base.js +3 -3
  49. data/package/environments/base.js +13 -8
  50. data/package/environments/development.js +36 -36
  51. data/package/index.js +2 -0
  52. data/package/inliningCss.js +7 -0
  53. data/package/rules/file.js +1 -1
  54. data/package/rules/sass.js +1 -2
  55. data/package/utils/get_style_rule.js +4 -2
  56. data/package.json +25 -29
  57. data/test/command_test.rb +76 -0
  58. data/test/configuration_test.rb +1 -1
  59. data/test/dev_server_runner_test.rb +5 -2
  60. data/test/helper_test.rb +48 -34
  61. data/test/manifest_test.rb +10 -2
  62. data/test/mounted_app/test/dummy/config/webpacker.yml +1 -1
  63. data/test/test_app/config/initializers/inspect_autoload_paths.rb +1 -0
  64. data/test/test_app/config/webpacker.yml +1 -3
  65. data/test/test_app/config/webpacker_other_location.yml +79 -0
  66. data/test/test_app/public/packs/manifest.json +12 -5
  67. data/test/webpacker_test.rb +21 -0
  68. data/webpacker.gemspec +2 -2
  69. data/yarn.lock +2357 -3262
  70. metadata +22 -11
@@ -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
@@ -17,20 +17,21 @@ class Webpacker::Commands
17
17
  #
18
18
  def clean(count = 2, age = 3600)
19
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
20
+ packs
21
+ .map do |paths|
22
+ paths.map { |path| [Time.now - File.mtime(path), path] }
23
+ .sort
24
+ .reject.with_index do |(file_age, _), index|
25
+ file_age < age || index < count
26
+ end
27
+ .map { |_, path| path }
27
28
  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
29
+ .flatten
30
+ .compact
31
+ .each do |file|
32
+ if File.file?(file)
33
+ File.delete(file)
34
+ logger.info "Removed #{file}"
34
35
  end
35
36
  end
36
37
  end
@@ -54,12 +55,15 @@ class Webpacker::Commands
54
55
  end
55
56
 
56
57
  private
57
- def versions
58
+ def packs
58
59
  all_files = Dir.glob("#{config.public_output_path}/**/*")
59
60
  manifest_config = Dir.glob("#{config.public_manifest_path}*")
60
61
 
61
62
  packs = all_files - manifest_config - current_version
62
- packs.reject { |file| File.directory?(file) }.group_by { |file| File.mtime(file).utc.to_i }
63
+ packs.reject { |file| File.directory?(file) }.group_by do |path|
64
+ base, _, ext = File.basename(path).scan(/(.*)(-[\da-f]+)(\.\w+)/).flatten
65
+ "#{File.dirname(path)}/#{base}#{ext}"
66
+ end.values
63
67
  end
64
68
 
65
69
  def current_version
@@ -73,8 +73,12 @@ class Webpacker::Configuration
73
73
  end
74
74
 
75
75
  def load
76
- YAML.load(config_path.read)[env].deep_symbolize_keys
77
-
76
+ config = begin
77
+ YAML.load_file(config_path.to_s, aliases: true)
78
+ rescue ArgumentError
79
+ YAML.load_file(config_path.to_s)
80
+ end
81
+ config[env].deep_symbolize_keys
78
82
  rescue Errno::ENOENT => e
79
83
  raise "Webpacker configuration file not found #{config_path}. " \
80
84
  "Please run rails webpacker:install " \
@@ -87,7 +91,14 @@ class Webpacker::Configuration
87
91
  end
88
92
 
89
93
  def defaults
90
- @defaults ||= \
91
- HashWithIndifferentAccess.new(YAML.load_file(File.expand_path("../../install/config/webpacker.yml", __FILE__))[env])
94
+ @defaults ||= begin
95
+ path = File.expand_path("../../install/config/webpacker.yml", __FILE__)
96
+ config = begin
97
+ YAML.load_file(path, aliases: true)
98
+ rescue ArgumentError
99
+ YAML.load_file(path)
100
+ end
101
+ HashWithIndifferentAccess.new(config[env])
102
+ end
92
103
  end
93
104
  end
@@ -51,12 +51,18 @@ class Webpacker::DevServer
51
51
  fetch(:pretty)
52
52
  end
53
53
 
54
+ def hmr?
55
+ fetch(:hmr)
56
+ end
57
+
54
58
  def env_prefix
55
59
  config.dev_server.fetch(:env_prefix, DEFAULT_ENV_PREFIX)
56
60
  end
57
61
 
58
62
  private
59
63
  def fetch(key)
64
+ return nil unless config.dev_server.present?
65
+
60
66
  ENV["#{env_prefix}_#{key.upcase}"] || config.dev_server.fetch(key, defaults[key])
61
67
  end
62
68
 
@@ -20,7 +20,7 @@ module Webpacker
20
20
 
21
21
  @config = Configuration.new(
22
22
  root_path: app_root,
23
- config_path: app_root.join("config/webpacker.yml"),
23
+ config_path: Pathname.new(@webpacker_config),
24
24
  env: ENV["RAILS_ENV"]
25
25
  )
26
26
 
@@ -30,6 +30,7 @@ module Webpacker
30
30
  @port = dev_server.port
31
31
  @pretty = dev_server.pretty?
32
32
  @https = dev_server.https?
33
+ @hot = dev_server.hmr?
33
34
 
34
35
  rescue Errno::ENOENT, NoMethodError
35
36
  $stdout.puts "webpack dev_server configuration not found in #{@config.config_path}[#{ENV["RAILS_ENV"]}]."
@@ -64,7 +65,7 @@ module Webpacker
64
65
  def execute_cmd
65
66
  env = Webpacker::Compiler.env
66
67
  env["WEBPACKER_CONFIG"] = @webpacker_config
67
- env["WEBPACK_DEV_SERVER"] = "true"
68
+ env["WEBPACK_SERVE"] = "true"
68
69
 
69
70
  cmd = if node_modules_bin_exist?
70
71
  ["#{@node_modules_bin_path}/webpack", "serve"]
@@ -73,12 +74,14 @@ module Webpacker
73
74
  end
74
75
 
75
76
  if @argv.include?("--debug-webpacker")
76
- cmd = [ "node", "--inspect-brk"] + cmd
77
+ cmd = [ "node", "--inspect-brk", "--trace-warnings" ] + cmd
77
78
  @argv.delete "--debug-webpacker"
78
79
  end
79
80
 
80
81
  cmd += ["--config", @webpack_config]
81
82
  cmd += ["--progress", "--color"] if @pretty
83
+
84
+ cmd += ["--hot"] if @hot
82
85
  cmd += @argv
83
86
 
84
87
  Dir.chdir(@app_path) do
data/lib/webpacker/env.rb CHANGED
@@ -27,7 +27,11 @@ class Webpacker::Env
27
27
 
28
28
  def available_environments
29
29
  if config_path.exist?
30
- YAML.load(config_path.read).keys
30
+ begin
31
+ YAML.load_file(config_path.to_s, aliases: true)
32
+ rescue ArgumentError
33
+ YAML.load_file(config_path.to_s)
34
+ end
31
35
  else
32
36
  [].freeze
33
37
  end
@@ -81,11 +81,11 @@ module Webpacker::Helper
81
81
  # Example:
82
82
  #
83
83
  # <%= javascript_pack_tag 'calendar', 'map', 'data-turbolinks-track': 'reload' %> # =>
84
- # <script src="/packs/vendor-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload"></script>
85
- # <script src="/packs/calendar~runtime-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload"></script>
86
- # <script src="/packs/calendar-1016838bab065ae1e314.chunk.js" data-turbolinks-track="reload"></script>
87
- # <script src="/packs/map~runtime-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload"></script>
88
- # <script src="/packs/map-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload"></script>
84
+ # <script src="/packs/vendor-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload" defer="true"></script>
85
+ # <script src="/packs/calendar~runtime-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload" defer="true"></script>
86
+ # <script src="/packs/calendar-1016838bab065ae1e314.chunk.js" data-turbolinks-track="reload" defer="true"></script>
87
+ # <script src="/packs/map~runtime-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload" defer="true"></script>
88
+ # <script src="/packs/map-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload" defer="true"></script>
89
89
  #
90
90
  # DO:
91
91
  #
@@ -95,8 +95,8 @@ module Webpacker::Helper
95
95
  #
96
96
  # <%= javascript_pack_tag 'calendar' %>
97
97
  # <%= javascript_pack_tag 'map' %>
98
- def javascript_pack_tag(*names, **options)
99
- javascript_include_tag(*sources_from_manifest_entrypoints(names, type: :javascript), **options)
98
+ def javascript_pack_tag(*names, defer: true, **options)
99
+ javascript_include_tag(*sources_from_manifest_entrypoints(names, type: :javascript), **options.tap { |o| o[:defer] = defer })
100
100
  end
101
101
 
102
102
  # Creates a link tag, for preloading, that references a given Webpacker asset.
@@ -128,6 +128,10 @@ module Webpacker::Helper
128
128
  # <link rel="stylesheet" media="screen" href="/packs/calendar-8c7ce31a.chunk.css" />
129
129
  # <link rel="stylesheet" media="screen" href="/packs/map-8c7ce31a.chunk.css" />
130
130
  #
131
+ # When using the webpack-dev-server, CSS is inlined so HMR can be turned on for CSS,
132
+ # including CSS modules
133
+ # <%= stylesheet_pack_tag 'calendar', 'map' %> # => nil
134
+ #
131
135
  # DO:
132
136
  #
133
137
  # <%= stylesheet_pack_tag 'calendar', 'map' %>
@@ -137,6 +141,8 @@ module Webpacker::Helper
137
141
  # <%= stylesheet_pack_tag 'calendar' %>
138
142
  # <%= stylesheet_pack_tag 'map' %>
139
143
  def stylesheet_pack_tag(*names, **options)
144
+ return "" if Webpacker.inlining_css?
145
+
140
146
  stylesheet_link_tag(*sources_from_manifest_entrypoints(names, type: :stylesheet), **options)
141
147
  end
142
148
 
@@ -147,7 +153,7 @@ module Webpacker::Helper
147
153
  end
148
154
 
149
155
  def resolve_path_to_image(name, **options)
150
- path = name.starts_with?("media/images/") ? name : "media/images/#{name}"
156
+ path = name.starts_with?("static/") ? name : "static/#{name}"
151
157
  path_to_asset(current_webpacker_instance.manifest.lookup!(path), options)
152
158
  rescue
153
159
  path_to_asset(current_webpacker_instance.manifest.lookup!(name), options)
@@ -34,4 +34,8 @@ class Webpacker::Instance
34
34
  def commands
35
35
  @commands ||= Webpacker::Commands.new self
36
36
  end
37
+
38
+ def inlining_css?
39
+ dev_server.hmr? && dev_server.running?
40
+ end
37
41
  end
@@ -91,8 +91,7 @@ class Webpacker::Manifest
91
91
  # manifest hash the entrypoints are defined by their pack name without the extension.
92
92
  # When the user provides a name with a file extension, we want to try to strip it off.
93
93
  def manifest_name(name, pack_type)
94
- return name if File.extname(name.to_s).empty?
95
- File.basename(name, ".#{pack_type}")
94
+ name.chomp(".#{pack_type}")
96
95
  end
97
96
 
98
97
  def manifest_type(pack_type)
@@ -8,8 +8,7 @@ class Webpacker::Engine < ::Rails::Engine
8
8
  config.webpacker = ActiveSupport::OrderedOptions.new
9
9
 
10
10
  initializer "webpacker.proxy" do |app|
11
- insert_middleware = Webpacker.config.dev_server.present? rescue nil
12
- if insert_middleware
11
+ if (Webpacker.config.dev_server.present? rescue nil)
13
12
  app.middleware.insert_before 0,
14
13
  Rails::VERSION::MAJOR >= 5 ?
15
14
  Webpacker::DevServerProxy : "Webpacker::DevServerProxy", ssl_verify_none: true
@@ -52,4 +51,11 @@ class Webpacker::Engine < ::Rails::Engine
52
51
  app.config.javascript_path = Webpacker.config.source_path.relative_path_from(Rails.root.join("app")).to_s
53
52
  end
54
53
  end
54
+
55
+ initializer "webpacker.remove_app_packs_from_the_autoload_paths" do
56
+ Rails.application.config.before_initialize do
57
+ source_path = Webpacker.config.source_path.to_s
58
+ ActiveSupport::Dependencies.autoload_paths.delete(source_path)
59
+ end
60
+ end
55
61
  end
@@ -12,7 +12,7 @@ module Webpacker
12
12
  @app_path = File.expand_path(".", Dir.pwd)
13
13
  @node_modules_bin_path = ENV["WEBPACKER_NODE_MODULES_BIN_PATH"] || `yarn bin`.chomp
14
14
  @webpack_config = File.join(@app_path, "config/webpack/#{ENV["NODE_ENV"]}.js")
15
- @webpacker_config = File.join(@app_path, "config/webpacker.yml")
15
+ @webpacker_config = ENV["WEBPACKER_CONFIG"] || File.join(@app_path, "config/webpacker.yml")
16
16
 
17
17
  unless File.exist?(@webpack_config)
18
18
  $stderr.puts "webpack config #{@webpack_config} not found, please run 'bundle exec rails webpacker:install' to install Webpacker with default configs or add the missing config file for your custom environment."
@@ -1,4 +1,4 @@
1
1
  module Webpacker
2
2
  # Change the version in package.json too, please!
3
- VERSION = "6.0.0.beta.7".freeze
3
+ VERSION = "6.0.0.rc.6".freeze
4
4
  end
@@ -3,6 +3,19 @@ require "webpacker/runner"
3
3
 
4
4
  module Webpacker
5
5
  class WebpackRunner < Webpacker::Runner
6
+ WEBPACK_COMMANDS = [
7
+ "help",
8
+ "h",
9
+ "--help",
10
+ "-h",
11
+ "version",
12
+ "v",
13
+ "--version",
14
+ "-v",
15
+ "info",
16
+ "i"
17
+ ].freeze
18
+
6
19
  def run
7
20
  env = Webpacker::Compiler.env
8
21
  env["WEBPACKER_CONFIG"] = @webpacker_config
@@ -13,17 +26,24 @@ module Webpacker
13
26
  ["yarn", "webpack"]
14
27
  end
15
28
 
16
- if @argv.include?("--debug-webpacker")
17
- cmd = [ "node", "--inspect-brk"] + cmd
18
- @argv.delete "--debug-webpacker"
29
+ if @argv.delete "--debug-webpacker"
30
+ cmd = ["node", "--inspect-brk"] + cmd
31
+ end
32
+
33
+ if @argv.delete "--trace-deprecation"
34
+ cmd = ["node", "--trace-deprecation"] + cmd
35
+ end
36
+
37
+ if @argv.delete "--no-deprecation"
38
+ cmd = ["node", "--no-deprecation"] + cmd
19
39
  end
20
40
 
21
- if @argv.include?("--trace-deprecation")
22
- cmd = [ "node", "--trace-deprecation"] + cmd
23
- @argv.delete "--trace-deprecation"
41
+ # Webpack commands are not compatible with --config option.
42
+ if (@argv & WEBPACK_COMMANDS).empty?
43
+ cmd += ["--config", @webpack_config]
24
44
  end
25
45
 
26
- cmd += ["--config", @webpack_config] + @argv
46
+ cmd += @argv
27
47
 
28
48
  Dir.chdir(@app_path) do
29
49
  Kernel.exec env, *cmd
data/lib/webpacker.rb CHANGED
@@ -30,7 +30,7 @@ module Webpacker
30
30
  Webpacker.logger = old_logger
31
31
  end
32
32
 
33
- delegate :logger, :logger=, :env, to: :instance
33
+ delegate :logger, :logger=, :env, :inlining_css?, to: :instance
34
34
  delegate :config, :compiler, :manifest, :commands, :dev_server, to: :instance
35
35
  delegate :bootstrap, :clean, :clobber, :compile, to: :commands
36
36
  end
@@ -11,27 +11,20 @@ describe('Development environment', () => {
11
11
  describe('webpackConfig', () => {
12
12
  beforeEach(() => jest.resetModules())
13
13
 
14
- test('should use development config and environment including devServer if WEBPACK_DEV_SERVER', () => {
14
+ test('should use development config and environment including devServer if WEBPACK_SERVE', () => {
15
15
  process.env.RAILS_ENV = 'development'
16
16
  process.env.NODE_ENV = 'development'
17
- process.env.WEBPACK_DEV_SERVER = 'YES'
17
+ process.env.WEBPACK_SERVE = 'true'
18
18
  const { webpackConfig } = require('../index')
19
19
 
20
20
  expect(webpackConfig.output.path).toEqual(resolve('public', 'packs'))
21
21
  expect(webpackConfig.output.publicPath).toEqual('/packs/')
22
- expect(webpackConfig).toMatchObject({
23
- devServer: {
24
- host: 'localhost',
25
- port: 3035,
26
- injectClient: true
27
- }
28
- })
29
22
  })
30
23
 
31
- test('should use development config and environment if WEBPACK_DEV_SERVER', () => {
24
+ test('should use development config and environment if WEBPACK_SERVE', () => {
32
25
  process.env.RAILS_ENV = 'development'
33
26
  process.env.NODE_ENV = 'development'
34
- process.env.WEBPACK_DEV_SERVER = undefined
27
+ process.env.WEBPACK_SERVE = undefined
35
28
  const { webpackConfig } = require('../index')
36
29
 
37
30
  expect(webpackConfig.output.path).toEqual(resolve('public', 'packs'))
@@ -15,7 +15,8 @@ describe('Env', () => {
15
15
  railsEnv: 'development',
16
16
  nodeEnv: 'development',
17
17
  isProduction: false,
18
- isDevelopment: true
18
+ isDevelopment: true,
19
+ runningWebpackDevServer: false
19
20
  })
20
21
  })
21
22
 
@@ -26,7 +27,8 @@ describe('Env', () => {
26
27
  railsEnv: 'development',
27
28
  nodeEnv: 'production',
28
29
  isProduction: true,
29
- isDevelopment: false
30
+ isDevelopment: false,
31
+ runningWebpackDevServer: false
30
32
  })
31
33
  })
32
34
 
@@ -37,7 +39,8 @@ describe('Env', () => {
37
39
  railsEnv: 'production',
38
40
  nodeEnv: 'production',
39
41
  isProduction: true,
40
- isDevelopment: false
42
+ isDevelopment: false,
43
+ runningWebpackDevServer: false
41
44
  })
42
45
  })
43
46
 
@@ -48,7 +51,8 @@ describe('Env', () => {
48
51
  railsEnv: 'staging',
49
52
  nodeEnv: 'production',
50
53
  isProduction: true,
51
- isDevelopment: false
54
+ isDevelopment: false,
55
+ runningWebpackDevServer: false
52
56
  })
53
57
  })
54
58
  })
@@ -42,7 +42,6 @@ module.exports = function config(api) {
42
42
  ]
43
43
  ].filter(Boolean),
44
44
  plugins: [
45
- 'babel-plugin-macros',
46
45
  ['@babel/plugin-proposal-class-properties', { loose: true }],
47
46
  ['@babel/plugin-transform-runtime', { helpers: false }],
48
47
  isProductionEnv &&
data/package/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const { resolve } = require('path')
2
- const { safeLoad } = require('js-yaml')
2
+ const { load } = require('js-yaml')
3
3
  const { readFileSync } = require('fs')
4
4
  const { merge } = require('webpack-merge')
5
5
  const { ensureTrailingSlash } = require('./utils/helpers')
@@ -9,12 +9,12 @@ const configPath = require('./configPath')
9
9
  const defaultConfigPath = require.resolve('../lib/install/config/webpacker.yml')
10
10
 
11
11
  const getDefaultConfig = () => {
12
- const defaultConfig = safeLoad(readFileSync(defaultConfigPath), 'utf8')
12
+ const defaultConfig = load(readFileSync(defaultConfigPath), 'utf8')
13
13
  return defaultConfig[railsEnv] || defaultConfig.production
14
14
  }
15
15
 
16
16
  const defaults = getDefaultConfig()
17
- const app = safeLoad(readFileSync(configPath), 'utf8')[railsEnv]
17
+ const app = load(readFileSync(configPath), 'utf8')[railsEnv]
18
18
 
19
19
  const config = merge(defaults, app)
20
20
  config.outputPath = resolve(config.public_root_path, config.public_output_path)
data/package/env.js CHANGED
@@ -1,4 +1,4 @@
1
- const { safeLoad } = require('js-yaml')
1
+ const { load } = require('js-yaml')
2
2
  const { readFileSync } = require('fs')
3
3
 
4
4
  const NODE_ENVIRONMENTS = ['development', 'production', 'test']
@@ -12,13 +12,16 @@ const nodeEnv
12
12
  const isProduction = nodeEnv === 'production'
13
13
  const isDevelopment = nodeEnv === 'development'
14
14
 
15
- const config = safeLoad(readFileSync(configPath), 'utf8')
15
+ const config = load(readFileSync(configPath), 'utf8')
16
16
  const availableEnvironments = Object.keys(config).join('|')
17
17
  const regex = new RegExp(`^(${availableEnvironments})$`, 'g')
18
18
 
19
+ const runningWebpackDevServer = process.env.WEBPACK_SERVE === 'true'
20
+
19
21
  module.exports = {
20
22
  railsEnv: railsEnv && railsEnv.match(regex) ? railsEnv : DEFAULT,
21
23
  nodeEnv,
22
24
  isProduction,
23
- isDevelopment
25
+ isDevelopment,
26
+ runningWebpackDevServer
24
27
  }
@@ -29,9 +29,9 @@ describe('Base config', () => {
29
29
  })
30
30
 
31
31
  test('should return output', () => {
32
- expect(baseConfig.output.filename).toEqual('js/[name]-[contenthash].js')
32
+ expect(baseConfig.output.filename).toEqual('js/[name].js')
33
33
  expect(baseConfig.output.chunkFilename).toEqual(
34
- 'js/[name]-[contenthash].chunk.js'
34
+ 'js/[name].chunk.js'
35
35
  )
36
36
  })
37
37
 
@@ -44,7 +44,7 @@ describe('Base config', () => {
44
44
  })
45
45
 
46
46
  test('should return default plugins', () => {
47
- expect(baseConfig.plugins.length).toEqual(3)
47
+ expect(baseConfig.plugins.length).toEqual(2)
48
48
  })
49
49
 
50
50
  test('should return default resolveLoader', () => {
@@ -5,10 +5,10 @@ const { basename, dirname, join, relative, resolve } = require('path')
5
5
  const extname = require('path-complete-extname')
6
6
  const PnpWebpackPlugin = require('pnp-webpack-plugin')
7
7
  const { sync: globSync } = require('glob')
8
- const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin')
9
8
  const WebpackAssetsManifest = require('webpack-assets-manifest')
10
9
  const webpack = require('webpack')
11
10
  const rules = require('../rules')
11
+ const { isProduction } = require('../env')
12
12
  const config = require('../config')
13
13
  const { moduleExists } = require('../utils/helpers')
14
14
 
@@ -16,7 +16,7 @@ const getEntryObject = () => {
16
16
  const entries = {}
17
17
  const rootPath = join(config.source_path, config.source_entry_path)
18
18
 
19
- globSync(`${rootPath}/**/*.*`).forEach((path) => {
19
+ globSync(`${rootPath}/*.*`).forEach((path) => {
20
20
  const namespace = relative(join(rootPath), dirname(path))
21
21
  const name = join(namespace, basename(path, extname(path)))
22
22
  let assetPaths = resolve(path)
@@ -52,7 +52,6 @@ const getModulePaths = () => {
52
52
  const getPlugins = () => {
53
53
  const plugins = [
54
54
  new webpack.EnvironmentPlugin(process.env),
55
- new CaseSensitivePathsPlugin(),
56
55
  new WebpackAssetsManifest({
57
56
  entrypoints: true,
58
57
  writeToDisk: true,
@@ -63,11 +62,12 @@ const getPlugins = () => {
63
62
  ]
64
63
 
65
64
  if (moduleExists('css-loader') && moduleExists('mini-css-extract-plugin')) {
65
+ const hash = isProduction ? '-[contenthash:8]' : ''
66
66
  const MiniCssExtractPlugin = require('mini-css-extract-plugin')
67
67
  plugins.push(
68
68
  new MiniCssExtractPlugin({
69
- filename: 'css/[name]-[contenthash:8].css',
70
- chunkFilename: 'css/[id]-[contenthash:8].css'
69
+ filename: `css/[name]${hash}.css`,
70
+ chunkFilename: `css/[id]${hash}.css`
71
71
  })
72
72
  )
73
73
  }
@@ -75,12 +75,17 @@ const getPlugins = () => {
75
75
  return plugins
76
76
  }
77
77
 
78
+ // Don't use contentHash except for production for performance
79
+ // https://webpack.js.org/guides/build-performance/#avoid-production-specific-tooling
80
+ const hash = isProduction ? '-[contenthash]' : ''
78
81
  module.exports = {
79
82
  mode: 'production',
80
83
  output: {
81
- filename: 'js/[name]-[contenthash].js',
82
- chunkFilename: 'js/[name]-[contenthash].chunk.js',
83
- hotUpdateChunkFilename: 'js/[id]-[hash].hot-update.js',
84
+ filename: `js/[name]${hash}.js`,
85
+ chunkFilename: `js/[name]${hash}.chunk.js`,
86
+
87
+ // https://webpack.js.org/configuration/output/#outputhotupdatechunkfilename
88
+ hotUpdateChunkFilename: 'js/[id].[fullhash].hot-update.js',
84
89
  path: config.outputPath,
85
90
  publicPath: config.publicPath
86
91
  },