shakapacker 6.2.1 → 6.4.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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +53 -4
  3. data/CONTRIBUTING.md +2 -2
  4. data/Gemfile +2 -1
  5. data/Gemfile.lock +84 -74
  6. data/README.md +172 -65
  7. data/docs/react.md +262 -0
  8. data/docs/sprockets.md +10 -0
  9. data/docs/v6_upgrade.md +1 -1
  10. data/lib/install/config/webpacker.yml +14 -0
  11. data/lib/tasks/webpacker/clean.rake +1 -3
  12. data/lib/tasks/webpacker/clobber.rake +1 -3
  13. data/lib/tasks/webpacker/compile.rake +3 -14
  14. data/lib/tasks/webpacker.rake +0 -1
  15. data/lib/webpacker/base_strategy.rb +24 -0
  16. data/lib/webpacker/compiler.rb +4 -67
  17. data/lib/webpacker/compiler_strategy.rb +20 -0
  18. data/lib/webpacker/configuration.rb +13 -0
  19. data/lib/webpacker/digest_strategy.rb +59 -0
  20. data/lib/webpacker/helper.rb +26 -1
  21. data/lib/webpacker/instance.rb +4 -0
  22. data/lib/webpacker/manifest.rb +2 -2
  23. data/lib/webpacker/mtime_strategy.rb +40 -0
  24. data/lib/webpacker/version.rb +1 -1
  25. data/package/babel/preset.js +0 -1
  26. data/package/environments/__tests__/base.js +30 -3
  27. data/package/environments/base.js +8 -1
  28. data/package/rules/file.js +2 -2
  29. data/package.json +13 -12
  30. data/test/compiler_strategy_test.rb +27 -0
  31. data/test/compiler_test.rb +26 -34
  32. data/test/configuration_test.rb +24 -4
  33. data/test/digest_strategy_test.rb +33 -0
  34. data/test/helper_test.rb +22 -0
  35. data/test/manifest_test.rb +3 -3
  36. data/test/mtime_strategy_test.rb +42 -0
  37. data/test/rake_tasks_test.rb +0 -34
  38. data/test/test_app/app/packs/entrypoints/generated/something.js +2 -0
  39. data/test/test_app/config/webpacker.yml +1 -0
  40. data/test/test_app/config/webpacker_nested_entries.yml +83 -0
  41. data/test/test_app/config/webpacker_no_precompile.yml +7 -0
  42. data/yarn.lock +917 -884
  43. metadata +21 -5
  44. data/lib/tasks/webpacker/yarn_install.rake +0 -18
  45. data/lib/tasks/yarn.rake +0 -38
@@ -104,12 +104,12 @@ class Webpacker::Manifest
104
104
 
105
105
  def missing_file_from_manifest_error(bundle_name)
106
106
  <<-MSG
107
- Webpacker can't find #{bundle_name} in #{config.manifest_path}. Possible causes:
107
+ Shakapacker can't find #{bundle_name} in #{config.manifest_path}. Possible causes:
108
108
  1. You forgot to install node packages (try `yarn install`) or are running an incompatible version of Node
109
109
  2. Your app has code with a non-standard extension (like a `.jsx` file) but the extension is not in the `extensions` config in `config/webpacker.yml`
110
110
  3. You have set compile: false (see `config/webpacker.yml`) for this environment
111
111
  (unless you are using the `bin/webpacker -w` or the `bin/webpacker-dev-server`, in which case maybe you aren't running the dev server in the background?)
112
- 4. webpack has not yet re-run to reflect updates.
112
+ 4. webpack has not yet FINISHED running to reflect updates.
113
113
  5. You have misconfigured Webpacker's `config/webpacker.yml` file.
114
114
  6. Your webpack configuration is not creating a manifest.
115
115
 
@@ -0,0 +1,40 @@
1
+ require "webpacker/base_strategy"
2
+
3
+ module Webpacker
4
+ class MtimeStrategy < BaseStrategy
5
+ # Returns true if manifest file mtime is newer than the timestamp of the last modified watched file
6
+ def fresh?
7
+ manifest_mtime > latest_modified_timestamp
8
+ end
9
+
10
+ # Returns true if manifest file mtime is older than the timestamp of the last modified watched file
11
+ def stale?
12
+ !fresh?
13
+ end
14
+
15
+ private
16
+
17
+ def manifest_mtime
18
+ config.manifest_path.exist? ? File.mtime(config.manifest_path).to_i : 0
19
+ end
20
+
21
+ def latest_modified_timestamp
22
+ if Rails.env.development?
23
+ warn <<~MSG.strip
24
+ Webpacker::Compiler - Slow setup for development
25
+
26
+ Prepare JS assets with either:
27
+ 1. Running `bin/webpacker-dev-server`
28
+ 2. Set `compile` to false in webpacker.yml and run `bin/webpacker -w`
29
+ MSG
30
+ end
31
+
32
+ root_path = Pathname.new(File.expand_path(config.root_path))
33
+ expanded_paths = [*default_watched_paths].map do |path|
34
+ root_path.join(path)
35
+ end
36
+ latest_modified = Dir[*expanded_paths].max_by { |f| File.mtime(f) }
37
+ File.mtime(latest_modified).to_i
38
+ end
39
+ end
40
+ end
@@ -1,4 +1,4 @@
1
1
  module Webpacker
2
2
  # Change the version in package.json too, please!
3
- VERSION = "6.2.1".freeze
3
+ VERSION = "6.4.0".freeze
4
4
  end
@@ -25,7 +25,6 @@ module.exports = function config(api) {
25
25
  corejs: '3.8',
26
26
  modules: 'auto',
27
27
  bugfixes: true,
28
- loose: true,
29
28
  exclude: ['transform-typeof-symbol']
30
29
  }
31
30
  ],
@@ -3,15 +3,18 @@
3
3
  // environment.js expects to find config/webpacker.yml and resolved modules from
4
4
  // the root of a Rails project
5
5
 
6
- const { chdirTestApp, chdirCwd } = require('../../utils/helpers')
6
+ const { chdirTestApp, chdirCwd, resetEnv } = require('../../utils/helpers')
7
7
 
8
8
  chdirTestApp()
9
9
 
10
10
  const { resolve } = require('path')
11
- const rules = require('../../rules')
11
+
12
12
  const baseConfig = require('../base')
13
+ const config = require("../../config");
13
14
 
14
15
  describe('Base config', () => {
16
+ beforeEach(() => jest.resetModules() && resetEnv())
17
+
15
18
  afterAll(chdirCwd)
16
19
 
17
20
  describe('config', () => {
@@ -21,11 +24,33 @@ describe('Base config', () => {
21
24
  )
22
25
  })
23
26
 
24
- test('should return multi file entry points', () => {
27
+ test('should return only 2 entry points with config.nested_entries == false', () => {
28
+ expect(config.nested_entries).toEqual(false)
29
+
30
+ expect(baseConfig.entry.multi_entry.sort()).toEqual([
31
+ resolve('app', 'packs', 'entrypoints', 'multi_entry.css'),
32
+ resolve('app', 'packs', 'entrypoints', 'multi_entry.js')
33
+ ])
34
+ expect(baseConfig.entry['generated/something']).toEqual(undefined)
35
+ })
36
+
37
+ test('should returns top level and nested entry points with config.nested_entries == true', () => {
38
+ process.env.WEBPACKER_CONFIG = 'config/webpacker_nested_entries.yml'
39
+ const config = require("../../config");
40
+ const baseConfig = require('../base')
41
+
42
+ expect(config.nested_entries).toEqual(true)
43
+
44
+ expect(baseConfig.entry.application).toEqual(
45
+ resolve('app', 'packs', 'entrypoints', 'application.js')
46
+ )
25
47
  expect(baseConfig.entry.multi_entry.sort()).toEqual([
26
48
  resolve('app', 'packs', 'entrypoints', 'multi_entry.css'),
27
49
  resolve('app', 'packs', 'entrypoints', 'multi_entry.js')
28
50
  ])
51
+ expect(baseConfig.entry['generated/something']).toEqual(
52
+ resolve('app', 'packs', 'entrypoints', 'generated', 'something.js')
53
+ )
29
54
  })
30
55
 
31
56
  test('should return output', () => {
@@ -36,6 +61,8 @@ describe('Base config', () => {
36
61
  })
37
62
 
38
63
  test('should return default loader rules for each file in config/loaders', () => {
64
+ const rules = require('../../rules')
65
+
39
66
  const defaultRules = Object.keys(rules)
40
67
  const configRules = baseConfig.module.rules
41
68
 
@@ -14,8 +14,15 @@ const { moduleExists } = require('../utils/helpers')
14
14
  const getEntryObject = () => {
15
15
  const entries = {}
16
16
  const rootPath = join(config.source_path, config.source_entry_path)
17
+ if (config.source_entry_path === '/' && config.nested_entries) {
18
+ throw new Error(
19
+ "Your webpacker config specified using a source_entry_path of '/' with 'nested_entries' == " +
20
+ "'true'. Doing this would result in packs for every one of your source files"
21
+ )
22
+ }
23
+ const nesting = config.nested_entries ? '**/' : ''
17
24
 
18
- globSync(`${rootPath}/*.*`).forEach((path) => {
25
+ globSync(`${rootPath}/${nesting}*.*`).forEach((path) => {
19
26
  const namespace = relative(join(rootPath), dirname(path))
20
27
  const name = join(namespace, basename(path, extname(path)))
21
28
  let assetPaths = resolve(path)
@@ -1,4 +1,4 @@
1
- const { dirname, join } = require('path')
1
+ const { dirname } = require('path')
2
2
  const { source_path: sourcePath } = require('../config')
3
3
 
4
4
  module.exports = {
@@ -12,7 +12,7 @@ module.exports = {
12
12
  .split('/')
13
13
  .slice(1)
14
14
 
15
- const foldersWithStatic = join('static', ...folders)
15
+ const foldersWithStatic = ['static', ...folders].join('/')
16
16
  return `${foldersWithStatic}/[name]-[hash][ext][query]`
17
17
  }
18
18
  }
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shakapacker",
3
- "version": "6.2.1",
3
+ "version": "6.4.0",
4
4
  "description": "Use webpack to manage app-like JavaScript modules in Rails",
5
5
  "main": "package/index.js",
6
6
  "files": [
@@ -12,16 +12,17 @@
12
12
  "yarn": ">=1 <4"
13
13
  },
14
14
  "peerDependencies": {
15
- "@babel/core": "^7.15.5",
16
- "@babel/plugin-transform-runtime": "^7.15.0",
17
- "@babel/preset-env": "^7.15.6",
18
- "@babel/runtime": "^7.15.4",
19
- "babel-loader": "^8.2.2",
20
- "compression-webpack-plugin": "^9.0.0",
21
- "terser-webpack-plugin": "^5.2.4",
22
- "webpack": "^5.53.0",
15
+ "@babel/core": "^7.17.9",
16
+ "@babel/plugin-transform-runtime": "^7.17.0",
17
+ "@babel/preset-env": "^7.16.11",
18
+ "@babel/runtime": "^7.17.9",
19
+ "babel-loader": "^8.2.4",
20
+ "compression-webpack-plugin": "^9.0.0 || ^10.0.0",
21
+ "terser-webpack-plugin": "^5.3.1",
22
+ "webpack": "^5.72.0",
23
23
  "webpack-assets-manifest": "^5.0.6",
24
- "webpack-cli": "^4.8.0",
24
+ "webpack-cli": "^4.9.2",
25
+ "webpack-dev-server": "^4.9.0",
25
26
  "webpack-merge": "^5.8.0"
26
27
  },
27
28
  "dependencies": {
@@ -30,7 +31,7 @@
30
31
  "path-complete-extname": "^1.0.0"
31
32
  },
32
33
  "devDependencies": {
33
- "babel-loader": "^8.2.2",
34
+ "babel-loader": "^8.2.4",
34
35
  "compression-webpack-plugin": "^9.0.0",
35
36
  "esbuild-loader": "^2.18.0",
36
37
  "eslint": "^7.32.0",
@@ -41,7 +42,7 @@
41
42
  "eslint-plugin-react": "^7.26.0",
42
43
  "jest": "^27.2.1",
43
44
  "swc-loader": "^0.1.15",
44
- "webpack": "^5.53.0",
45
+ "webpack": "^5.72.0",
45
46
  "webpack-assets-manifest": "^5.0.6",
46
47
  "webpack-merge": "^5.8.0"
47
48
  },
@@ -0,0 +1,27 @@
1
+ require "test_helper"
2
+
3
+ class CompilerStrategyTest < Minitest::Test
4
+ def test_mtime_strategy_returned
5
+ Webpacker.config.stub :compiler_strategy, "mtime" do
6
+ assert_instance_of Webpacker::MtimeStrategy, Webpacker::CompilerStrategy.from_config
7
+ end
8
+ end
9
+
10
+ def test_digest_strategy_returned
11
+ Webpacker.config.stub :compiler_strategy, "digest" do
12
+ assert_instance_of Webpacker::DigestStrategy, Webpacker::CompilerStrategy.from_config
13
+ end
14
+ end
15
+
16
+ def test_raise_on_unknown_strategy
17
+ Webpacker.config.stub :compiler_strategy, "other" do
18
+ error = assert_raises do
19
+ Webpacker::CompilerStrategy.from_config
20
+ end
21
+
22
+ assert_equal \
23
+ "Unknown strategy 'other'. Available options are 'mtime' and 'digest'.",
24
+ error.message
25
+ end
26
+ end
27
+ end
@@ -1,20 +1,6 @@
1
1
  require "test_helper"
2
2
 
3
3
  class CompilerTest < Minitest::Test
4
- def remove_compilation_digest_path
5
- Webpacker.compiler.send(:compilation_digest_path).tap do |path|
6
- path.delete if path.exist?
7
- end
8
- end
9
-
10
- def setup
11
- remove_compilation_digest_path
12
- end
13
-
14
- def teardown
15
- remove_compilation_digest_path
16
- end
17
-
18
4
  def test_custom_environment_variables
19
5
  assert_nil Webpacker.compiler.send(:webpack_env)["FOO"]
20
6
  Webpacker.compiler.env["FOO"] = "BAR"
@@ -23,37 +9,43 @@ class CompilerTest < Minitest::Test
23
9
  Webpacker.compiler.env = {}
24
10
  end
25
11
 
26
- def test_freshness
27
- assert Webpacker.compiler.stale?
28
- assert !Webpacker.compiler.fresh?
12
+ def test_compile_true_when_fresh
13
+ mock = Minitest::Mock.new
14
+ mock.expect(:stale?, false)
15
+ Webpacker.compiler.stub(:strategy, mock) do
16
+ assert Webpacker.compiler.compile
17
+ end
18
+ assert_mock mock
29
19
  end
30
20
 
31
- def test_compile
32
- assert !Webpacker.compiler.compile
33
- end
21
+ def test_after_compile_hook_called_on_success
22
+ mock = Minitest::Mock.new
23
+ mock.expect(:stale?, true)
24
+ mock.expect(:after_compile_hook, nil)
34
25
 
35
- def test_freshness_on_compile_success
36
26
  status = OpenStruct.new(success?: true)
37
27
 
38
- assert Webpacker.compiler.stale?
39
- Open3.stub :capture3, [:sterr, :stdout, status] do
40
- Webpacker.compiler.compile
41
- assert Webpacker.compiler.fresh?
28
+ Webpacker.compiler.stub(:strategy, mock) do
29
+ Open3.stub :capture3, [:sterr, :stdout, status] do
30
+ Webpacker.compiler.compile
31
+ end
42
32
  end
33
+ assert_mock mock
43
34
  end
44
35
 
45
- def test_freshness_on_compile_fail
36
+ def test_after_compile_hook_called_on_failure
37
+ mock = Minitest::Mock.new
38
+ mock.expect(:stale?, true)
39
+ mock.expect(:after_compile_hook, nil)
40
+
46
41
  status = OpenStruct.new(success?: false)
47
42
 
48
- assert Webpacker.compiler.stale?
49
- Open3.stub :capture3, [:sterr, :stdout, status] do
50
- Webpacker.compiler.compile
51
- assert Webpacker.compiler.fresh?
43
+ Webpacker.compiler.stub(:strategy, mock) do
44
+ Open3.stub :capture3, [:sterr, :stdout, status] do
45
+ Webpacker.compiler.compile
46
+ end
52
47
  end
53
- end
54
-
55
- def test_compilation_digest_path
56
- assert_equal Webpacker.compiler.send(:compilation_digest_path).basename.to_s, "last-compilation-digest-#{Webpacker.env}"
48
+ assert_mock mock
57
49
  end
58
50
 
59
51
  def test_external_env_variables
@@ -28,14 +28,14 @@ class ConfigurationTest < Webpacker::Test
28
28
  public_output_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/public/packs").to_s
29
29
  assert_equal @config.public_output_path.to_s, public_output_path
30
30
 
31
- @config = Webpacker::Configuration.new(
31
+ @public_root_config = Webpacker::Configuration.new(
32
32
  root_path: @config.root_path,
33
33
  config_path: Pathname.new(File.expand_path("./test_app/config/webpacker_public_root.yml", __dir__)),
34
34
  env: "production"
35
35
  )
36
36
 
37
37
  public_output_path = File.expand_path File.join(File.dirname(__FILE__), "public/packs").to_s
38
- assert_equal @config.public_output_path.to_s, public_output_path
38
+ assert_equal @public_root_config.public_output_path.to_s, public_output_path
39
39
  end
40
40
 
41
41
  def test_public_manifest_path
@@ -47,14 +47,14 @@ class ConfigurationTest < Webpacker::Test
47
47
  manifest_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/public/packs", "manifest.json").to_s
48
48
  assert_equal @config.manifest_path.to_s, manifest_path
49
49
 
50
- @config = Webpacker::Configuration.new(
50
+ @manifest_config = Webpacker::Configuration.new(
51
51
  root_path: @config.root_path,
52
52
  config_path: Pathname.new(File.expand_path("./test_app/config/webpacker_manifest_path.yml", __dir__)),
53
53
  env: "production"
54
54
  )
55
55
 
56
56
  manifest_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/app/packs", "manifest.json").to_s
57
- assert_equal @config.manifest_path.to_s, manifest_path
57
+ assert_equal @manifest_config.manifest_path.to_s, manifest_path
58
58
  end
59
59
 
60
60
  def test_cache_path
@@ -100,5 +100,25 @@ class ConfigurationTest < Webpacker::Test
100
100
  with_rails_env("test") do
101
101
  refute Webpacker.config.ensure_consistent_versioning?
102
102
  end
103
+
104
+ def test_webpacker_precompile
105
+ assert @config.webpacker_precompile
106
+
107
+ ENV["WEBPACKER_PRECOMPILE"] = "false"
108
+
109
+ refute Webpacker.config.webpacker_precompile?
110
+
111
+ ENV["WEBPACKER_PRECOMPILE"] = "yes"
112
+
113
+ assert Webpacker.config.webpacker_precompile?
114
+
115
+ @no_precompile_config = Webpacker::Configuration.new(
116
+ root_path: @config.root_path,
117
+ config_path: Pathname.new(File.expand_path("./test_app/config/webpacker_no_precompile.yml", __dir__)),
118
+ env: "production"
119
+ )
120
+
121
+ refute @no_precompile_config.webpacker_precompile
122
+ end
103
123
  end
104
124
  end
@@ -0,0 +1,33 @@
1
+ require "test_helper"
2
+
3
+ class DigestStrategyTest < Minitest::Test
4
+ def remove_compilation_digest_path
5
+ @digest_strategy.send(:compilation_digest_path).tap do |path|
6
+ path.delete if path.exist?
7
+ end
8
+ end
9
+
10
+ def setup
11
+ @digest_strategy = Webpacker::DigestStrategy.new
12
+ remove_compilation_digest_path
13
+ end
14
+
15
+ def teardown
16
+ remove_compilation_digest_path
17
+ end
18
+
19
+ def test_freshness
20
+ assert @digest_strategy.stale?
21
+ assert !@digest_strategy.fresh?
22
+ end
23
+
24
+ def test_freshness_after_compilation_hook
25
+ @digest_strategy.after_compile_hook
26
+ assert @digest_strategy.fresh?
27
+ assert !@digest_strategy.stale?
28
+ end
29
+
30
+ def test_compilation_digest_path
31
+ assert_equal @digest_strategy.send(:compilation_digest_path).basename.to_s, "last-compilation-digest-#{Webpacker.env}"
32
+ end
33
+ end
data/test/helper_test.rb CHANGED
@@ -115,6 +115,28 @@ class HelperTest < ActionView::TestCase
115
115
  javascript_pack_tag("application", "bootstrap", defer: false)
116
116
  end
117
117
 
118
+ def test_javascript_pack_with_append
119
+ append_javascript_pack_tag("bootstrap", defer: false)
120
+ assert_equal \
121
+ %(<script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js" defer="defer"></script>\n) +
122
+ %(<script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js" defer="defer"></script>\n) +
123
+ %(<script src="/packs/application-k344a6d59eef8632c9d1.js" defer="defer"></script>\n) +
124
+ %(<script src="/packs/bootstrap-300631c4f0e0f9c865bc.js"></script>),
125
+ javascript_pack_tag("application")
126
+ end
127
+
128
+ def test_append_javascript_pack_tag_raises
129
+ error = assert_raises do
130
+ javascript_pack_tag("application")
131
+ append_javascript_pack_tag("bootstrap", defer: false)
132
+ end
133
+
134
+ assert_equal \
135
+ "You can only call append_javascript_pack_tag before javascript_pack_tag helper. " +
136
+ "Please refer to https://github.com/shakacode/shakapacker/blob/master/README.md#usage for the usage guide",
137
+ error.message
138
+ end
139
+
118
140
  def test_javascript_pack_tag_splat
119
141
  assert_equal \
120
142
  %(<script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js" defer="defer"></script>\n) +
@@ -8,7 +8,7 @@ class ManifestTest < Minitest::Test
8
8
  Webpacker.manifest.lookup!(asset_file)
9
9
  end
10
10
 
11
- assert_match "Webpacker can't find #{asset_file} in #{manifest_path}", error.message
11
+ assert_match "Shakapacker can't find #{asset_file} in #{manifest_path}", error.message
12
12
  end
13
13
 
14
14
  def test_lookup_with_type_exception!
@@ -18,7 +18,7 @@ class ManifestTest < Minitest::Test
18
18
  Webpacker.manifest.lookup!(asset_file, type: :javascript)
19
19
  end
20
20
 
21
- assert_match "Webpacker can't find #{asset_file}.js in #{manifest_path}", error.message
21
+ assert_match "Shakapacker can't find #{asset_file}.js in #{manifest_path}", error.message
22
22
  end
23
23
 
24
24
  def test_lookup_success!
@@ -60,7 +60,7 @@ class ManifestTest < Minitest::Test
60
60
  Webpacker.manifest.lookup_pack_with_chunks!(asset_file, type: :javascript)
61
61
  end
62
62
 
63
- assert_match "Webpacker can't find #{asset_file}.js in #{manifest_path}", error.message
63
+ assert_match "Shakapacker can't find #{asset_file}.js in #{manifest_path}", error.message
64
64
  end
65
65
 
66
66
  def test_lookup_entrypoint
@@ -0,0 +1,42 @@
1
+ require "test_helper"
2
+
3
+ class MtimeStrategyTest < Minitest::Test
4
+ def setup
5
+ @mtime_strategy = Webpacker::MtimeStrategy.new
6
+ @manifest_timestamp = Time.parse("2021-01-01 12:34:56 UTC")
7
+ end
8
+
9
+ def with_stubs(latest_timestamp:, manifest_exists: true)
10
+ @mtime_strategy.stub :latest_modified_timestamp, latest_timestamp do
11
+ FileTest.stub :exist?, manifest_exists do
12
+ File.stub :mtime, @manifest_timestamp do
13
+ yield
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ def test_freshness_when_manifest_missing
20
+ latest_timestamp = @manifest_timestamp + 3600
21
+
22
+ with_stubs(latest_timestamp: latest_timestamp.to_i, manifest_exists: false) do
23
+ assert @mtime_strategy.stale?
24
+ end
25
+ end
26
+
27
+ def test_freshness_when_manifest_older
28
+ latest_timestamp = @manifest_timestamp + 3600
29
+
30
+ with_stubs(latest_timestamp: latest_timestamp.to_i) do
31
+ assert @mtime_strategy.stale?
32
+ end
33
+ end
34
+
35
+ def test_freshness_when_manifest_newer
36
+ latest_timestamp = @manifest_timestamp - 3600
37
+
38
+ with_stubs(latest_timestamp: latest_timestamp.to_i) do
39
+ assert @mtime_strategy.fresh?
40
+ end
41
+ end
42
+ end
@@ -30,42 +30,8 @@ class RakeTasksTest < Minitest::Test
30
30
  refute_includes output, "Webpacker requires Yarn"
31
31
  end
32
32
 
33
- def test_rake_webpacker_yarn_install_in_non_production_environments
34
- assert_includes test_app_dev_dependencies, "right-pad"
35
-
36
- Webpacker.with_node_env("test") do
37
- Dir.chdir(test_app_path) do
38
- `bundle exec rake webpacker:yarn_install`
39
- end
40
- end
41
-
42
- assert_includes installed_node_module_names, "right-pad",
43
- "Expected dev dependencies to be installed"
44
- end
45
-
46
- def test_rake_webpacker_yarn_install_in_production_environment
47
- Webpacker.with_node_env("production") do
48
- Dir.chdir(test_app_path) do
49
- `bundle exec rake webpacker:yarn_install`
50
- end
51
- end
52
-
53
- refute_includes installed_node_module_names, "right-pad",
54
- "Expected only production dependencies to be installed"
55
- end
56
-
57
33
  private
58
34
  def test_app_path
59
35
  File.expand_path("test_app", __dir__)
60
36
  end
61
-
62
- def test_app_dev_dependencies
63
- package_json = File.expand_path("package.json", test_app_path)
64
- JSON.parse(File.read(package_json))["devDependencies"]
65
- end
66
-
67
- def installed_node_module_names
68
- node_modules_path = File.expand_path("node_modules", test_app_path)
69
- Dir.chdir(node_modules_path) { Dir.glob("*") }
70
- end
71
37
  end
@@ -0,0 +1,2 @@
1
+ /* eslint no-console:0 */
2
+ console.log('entrypoints/nested/something')
@@ -3,6 +3,7 @@
3
3
  default: &default
4
4
  source_path: app/packs
5
5
  source_entry_path: entrypoints
6
+ nested_entries: false
6
7
  public_root_path: public
7
8
  public_output_path: packs
8
9
  cache_path: tmp/webpacker
@@ -0,0 +1,83 @@
1
+ # Note: You must restart bin/webpacker-dev-server for changes to take effect
2
+
3
+ default: &default
4
+ source_path: app/packs
5
+ source_entry_path: entrypoints
6
+ nested_entries: true
7
+ public_root_path: public
8
+ public_output_path: packs
9
+ cache_path: tmp/webpacker
10
+ webpack_compile_output: false
11
+ webpack_loader: babel
12
+
13
+ # Location for manifest.json, defaults to {public_output_path}/manifest.json if unset
14
+ # manifest_path: public/packs/manifest.json
15
+
16
+ # Additional paths webpack should look up modules
17
+ # ['app/assets', 'engine/foo/app/assets']
18
+ additional_paths:
19
+ - app/assets
20
+ - /etc/yarn
21
+ - some.config.js
22
+ - app/elm
23
+
24
+ # Reload manifest.json on all requests so we reload latest compiled packs
25
+ cache_manifest: false
26
+
27
+ static_assets_extensions:
28
+ - .jpg
29
+ - .jpeg
30
+ - .png
31
+ - .gif
32
+ - .tiff
33
+ - .ico
34
+ - .svg
35
+
36
+ extensions:
37
+ - .mjs
38
+ - .js
39
+
40
+ development:
41
+ <<: *default
42
+ compile: true
43
+ ensure_consistent_versioning: true
44
+
45
+ # Reference: https://webpack.js.org/configuration/dev-server/
46
+ dev_server:
47
+ https: false
48
+ host: localhost
49
+ port: 3035
50
+ public: localhost:3035
51
+ hmr: false
52
+ overlay: true
53
+ disable_host_check: true
54
+ use_local_ip: false
55
+ pretty: false
56
+
57
+ test:
58
+ <<: *default
59
+ compile: true
60
+
61
+ # Compile test packs to a separate directory
62
+ public_output_path: packs-test
63
+
64
+ production:
65
+ <<: *default
66
+
67
+ # Production depends on precompilation of packs prior to booting for performance.
68
+ compile: false
69
+
70
+ # Cache manifest.json for performance
71
+ cache_manifest: true
72
+
73
+ staging:
74
+ <<: *default
75
+
76
+ # Production depends on precompilation of packs prior to booting for performance.
77
+ compile: false
78
+
79
+ # Cache manifest.json for performance
80
+ cache_manifest: true
81
+
82
+ # Compile staging packs to a separate directory
83
+ public_output_path: packs-staging