shakapacker 7.0.3 → 7.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/dummy.yml +3 -1
  3. data/.github/workflows/generator.yml +3 -1
  4. data/.github/workflows/jest.yml +4 -2
  5. data/.github/workflows/js-lint.yml +4 -2
  6. data/.github/workflows/rubocop.yml +3 -1
  7. data/.github/workflows/ruby-backward-compatibility.yml +3 -1
  8. data/.github/workflows/ruby.yml +4 -2
  9. data/CHANGELOG.md +7 -0
  10. data/README.md +29 -20
  11. data/docs/troubleshooting.md +4 -8
  12. data/docs/using_esbuild_loader.md +2 -4
  13. data/lib/install/template.rb +2 -2
  14. data/lib/shakapacker/deprecation_helper.rb +1 -1
  15. data/lib/shakapacker/dev_server_runner.rb +2 -1
  16. data/lib/shakapacker/version.rb +1 -1
  17. data/lib/shakapacker/version_checker.rb +35 -2
  18. data/lib/shakapacker/webpack_runner.rb +4 -3
  19. data/package/__tests__/index.js +24 -0
  20. data/package/index.d.ts +1 -1
  21. data/package/index.js +8 -2
  22. data/package.json +1 -1
  23. data/spec/backward_compatibility_specs/compiler_strategy_spec.rb +5 -3
  24. data/spec/backward_compatibility_specs/configuration_spec.rb +12 -4
  25. data/spec/backward_compatibility_specs/dev_server_runner_spec.rb +17 -16
  26. data/spec/backward_compatibility_specs/dev_server_spec.rb +1 -1
  27. data/spec/backward_compatibility_specs/digest_strategy_spec.rb +2 -0
  28. data/spec/backward_compatibility_specs/engine_rake_tasks_spec.rb +2 -1
  29. data/spec/backward_compatibility_specs/helper_spec.rb +20 -20
  30. data/spec/backward_compatibility_specs/instance_spec.rb +3 -3
  31. data/spec/backward_compatibility_specs/manifest_spec.rb +12 -12
  32. data/spec/backward_compatibility_specs/mtime_strategy_spec.rb +3 -3
  33. data/spec/backward_compatibility_specs/rake_tasks_spec.rb +9 -5
  34. data/spec/backward_compatibility_specs/webpack_runner_spec.rb +14 -18
  35. data/spec/dummy/config/webpack/commonWebpackConfig.js +1 -1
  36. data/spec/fixtures/beta_pnpm-lock.v7.yaml +116 -0
  37. data/spec/fixtures/beta_pnpm-lock.v8.yaml +2537 -0
  38. data/spec/fixtures/git_url_pnpm-lock.v7.yaml +126 -0
  39. data/spec/fixtures/git_url_pnpm-lock.v8.yaml +3728 -0
  40. data/spec/fixtures/github_url_pnpm-lock.v7.yaml +126 -0
  41. data/spec/fixtures/github_url_pnpm-lock.v8.yaml +3728 -0
  42. data/spec/fixtures/relative_path_pnpm-lock.v7.yaml +18 -0
  43. data/spec/fixtures/relative_path_pnpm-lock.v8.yaml +22 -0
  44. data/spec/fixtures/semver_caret_pnpm-lock.v7.yaml +117 -0
  45. data/spec/fixtures/semver_caret_pnpm-lock.v8.yaml +2558 -0
  46. data/spec/fixtures/semver_exact_pnpm-lock.v7.yaml +117 -0
  47. data/spec/fixtures/semver_exact_pnpm-lock.v8.yaml +2558 -0
  48. data/spec/fixtures/semver_tilde_pnpm-lock.v7.yaml +116 -0
  49. data/spec/fixtures/semver_tilde_pnpm-lock.v8.yaml +2558 -0
  50. data/spec/fixtures/without_pnpm-lock.v7.yaml +23 -0
  51. data/spec/fixtures/without_pnpm-lock.v8.yaml +27 -0
  52. data/spec/generator_specs/generator_spec.rb +7 -3
  53. data/spec/shakapacker/compiler_strategy_spec.rb +5 -3
  54. data/spec/shakapacker/configuration_spec.rb +12 -2
  55. data/spec/shakapacker/dev_server_runner_spec.rb +22 -16
  56. data/spec/shakapacker/dev_server_spec.rb +1 -1
  57. data/spec/shakapacker/digest_strategy_spec.rb +2 -0
  58. data/spec/shakapacker/engine_rake_tasks_spec.rb +2 -1
  59. data/spec/shakapacker/helper_spec.rb +20 -20
  60. data/spec/shakapacker/instance_spec.rb +2 -2
  61. data/spec/shakapacker/manifest_spec.rb +12 -12
  62. data/spec/shakapacker/mtime_strategy_spec.rb +3 -3
  63. data/spec/shakapacker/rake_tasks_spec.rb +5 -2
  64. data/spec/shakapacker/shakapacker_spec.rb +4 -4
  65. data/spec/shakapacker/version_checker_spec.rb +468 -121
  66. data/spec/shakapacker/webpack_runner_spec.rb +14 -18
  67. metadata +19 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c9451e388d4f6c2419456201c10b56e5f24ef5a1b6abaf82fb950187f16c4cbb
4
- data.tar.gz: 9082cdaec1dffb060c1a903a3589373170741d0744b65c41d6d901669b77d614
3
+ metadata.gz: b52fbe18d6cc69e790f1432b93a8badee45c64229b7e0b5ad9bf6e7645c1c28c
4
+ data.tar.gz: 94ba2b7a48537e4b3ece200e2983975b444a340edff45b9af3544b1709375c38
5
5
  SHA512:
6
- metadata.gz: bc8eb8a8b9b52b4a1a9c2a1bcb4ae6e24f59484ea97f660e030a5660b5c6b4d8b077f8e784fbf6f1bf032e5d89b0c26b7d5b421b8c2692747aafb9820e46971b
7
- data.tar.gz: c3a7d20636ee49637516df81a72813f34f82dceb88ecd1dbc276071f6d44ce756326094d9b31feaf93d8d83325687af37eaead127b3f00e8cf25e9d65764be6f
6
+ metadata.gz: ade899e22f00c9863302d2a9aa7e58549d057b07be50d34d853751cabf59a9d318a637240734854059b352110b20245361ec7d427488166b4e481639b90cb380
7
+ data.tar.gz: 6364f8d109c008da994d01f7ad553472a90d5392511b796ba7286502d5f3b6969ad225cbd8e3364fb86da6f2dc5b19524631399eebae982b43558444cb886a0e
@@ -7,7 +7,9 @@ jobs:
7
7
  runs-on: ubuntu-latest
8
8
 
9
9
  steps:
10
- - uses: actions/checkout@v2
10
+ - uses: actions/checkout@v4
11
+ with:
12
+ persist-credentials: false
11
13
  - uses: ruby/setup-ruby@v1
12
14
  with:
13
15
  ruby-version: '3.1.2'
@@ -28,7 +28,9 @@ jobs:
28
28
  BUNDLE_GEMFILE: ${{ matrix.gemfile }}
29
29
 
30
30
  steps:
31
- - uses: actions/checkout@v2
31
+ - uses: actions/checkout@v4
32
+ with:
33
+ persist-credentials: false
32
34
  - uses: ruby/setup-ruby@v1
33
35
  with:
34
36
  ruby-version: ${{ matrix.ruby }}
@@ -13,9 +13,11 @@ jobs:
13
13
  runs-on: ${{ matrix.os }}
14
14
 
15
15
  steps:
16
- - uses: actions/checkout@v2
16
+ - uses: actions/checkout@v4
17
+ with:
18
+ persist-credentials: false
17
19
  - name: Use Node.js ${{ matrix.node }}
18
- uses: actions/setup-node@v2
20
+ uses: actions/setup-node@v3
19
21
  with:
20
22
  node-version: ${{ matrix.node }}
21
23
  cache: yarn
@@ -13,9 +13,11 @@ jobs:
13
13
  runs-on: ${{ matrix.os }}
14
14
 
15
15
  steps:
16
- - uses: actions/checkout@v2
16
+ - uses: actions/checkout@v4
17
+ with:
18
+ persist-credentials: false
17
19
  - name: Use Node.js ${{ matrix.node }}
18
- uses: actions/setup-node@v2
20
+ uses: actions/setup-node@v3
19
21
  with:
20
22
  node-version: ${{ matrix.node }}
21
23
  cache: yarn
@@ -12,7 +12,9 @@ jobs:
12
12
  ruby: ['2.7', '3.0']
13
13
 
14
14
  steps:
15
- - uses: actions/checkout@v2
15
+ - uses: actions/checkout@v4
16
+ with:
17
+ persist-credentials: false
16
18
  - uses: ruby/setup-ruby@v1
17
19
  with:
18
20
  ruby-version: ${{ matrix.ruby }}
@@ -29,7 +29,9 @@ jobs:
29
29
  BUNDLE_GEMFILE: ${{ matrix.gemfile }}
30
30
 
31
31
  steps:
32
- - uses: actions/checkout@v2
32
+ - uses: actions/checkout@v4
33
+ with:
34
+ persist-credentials: false
33
35
  - uses: ruby/setup-ruby@v1
34
36
  with:
35
37
  ruby-version: ${{ matrix.ruby }}
@@ -29,11 +29,13 @@ jobs:
29
29
  BUNDLE_GEMFILE: ${{ matrix.gemfile }}
30
30
 
31
31
  steps:
32
- - uses: actions/checkout@v2
32
+ - uses: actions/checkout@v4
33
+ with:
34
+ persist-credentials: false
33
35
  - uses: ruby/setup-ruby@v1
34
36
  with:
35
37
  ruby-version: ${{ matrix.ruby }}
36
38
  bundler-cache: true
37
39
 
38
40
  - name: Ruby specs
39
- run: bundle exec rake run_spec:gem_bc
41
+ run: bundle exec rake run_spec:gem
data/CHANGELOG.md CHANGED
@@ -9,6 +9,13 @@ Changes since last non-beta release.
9
9
 
10
10
  _Please add entries here for your pull requests that are not yet released._
11
11
 
12
+ ### Added
13
+ - Support passing custom webpack config directly to `generateWebpackConfig` for merging [PR 343](https://github.com/shakacode/shakapacker/pull/343) by [G-Rath](https://github.com/g-rath)
14
+
15
+ ### Fixed
16
+ - Use `NODE_OPTIONS` to enable Node-specific debugging flags [PR 350](https://github.com/shakacode/shakapacker/pull/350)
17
+ - Add the boilplate `application.js` into `packs/` [PR 363](https://github.com/shakacode/shakapacker/pull/363)
18
+
12
19
  ## [v7.0.3] - July 7, 2023
13
20
  ### Fixed
14
21
  - Fixed commands execution for projects with space in absolute path [PR 322](https://github.com/shakacode/shakapacker/pull/322) by [kukicola](https://github.com/kukicola).
data/README.md CHANGED
@@ -465,26 +465,40 @@ First, you don't _need_ to use Shakapacker's webpack configuration. However, the
465
465
 
466
466
  1. Your output files go to the right directory
467
467
  2. Your output includes a manifest, via package [`webpack-assets-manifest`](https://github.com/webdeveric/webpack-assets-manifest) that maps output names (your 'packs') to the fingerprinted versions, including bundle-splitting dependencies. That's the main secret sauce of Shakapacker!
468
+
469
+ The webpack configuration used by Shakapacker lives in `config/webpack/webpack.config.js`; this makes it easy to customize the configuration beyond what's available in `config/shakapacker.yml` by giving you complete control of the final configuration. By default, this file exports the result of `generateWebpackConfig` which handles generating a webpack configuration based on `config/shakapacker.yml`.
468
470
 
469
- The most practical webpack configuration is to take the default from Shakapacker and then use [webpack-merge](https://github.com/survivejs/webpack-merge) to merge your customizations with the default. For example, suppose you want to add some `resolve.extensions`:
471
+ The easiest way to modify this config is to pass your desired customizations to `generateWebpackConfig` which will use [webpack-merge](https://github.com/survivejs/webpack-merge) to merge them with the configuration generated from `config/shakapacker.yml`:
470
472
 
471
473
  ```js
472
- // use the new NPM package name, `shakapacker`.
473
- // merge is webpack-merge from https://github.com/survivejs/webpack-merge
474
+ // config/webpack/webpack.config.js
475
+ const { generateWebpackConfig } = require('shakapacker')
476
+
477
+ const options = {
478
+ resolve: {
479
+ extensions: ['.css', '.ts', '.tsx']
480
+ }
481
+ }
482
+
483
+ // This results in a new object copied from the mutable global
484
+ module.exports = generateWebpackConfig(options)
485
+ ```
486
+
487
+ The `shakapacker` package also exports the `merge` function from [webpack-merge](https://github.com/survivejs/webpack-merge) to make it easier to do more advanced customizations:
488
+
489
+ ```js
490
+ // config/webpack/webpack.config.js
474
491
  const { generateWebpackConfig, merge } = require('shakapacker')
475
492
 
476
- const baseWebpackConfig = generateWebpackConfig()
493
+ const webpackConfig = generateWebpackConfig()
477
494
 
478
495
  const options = {
479
496
  resolve: {
480
- extensions: ['.css', '.ts', '.tsx']
497
+ extensions: ['.css', '.ts', '.tsx']
481
498
  }
482
499
  }
483
500
 
484
- // Copy the object using merge b/c the baseClientWebpackConfig is a mutable global
485
- // If you want to use this object for client and server rendering configurations,
486
- // having a new object is essential.
487
- module.exports = merge({}, baseWebpackConfig, options)
501
+ module.exports = merge(options, webpackConfig)
488
502
  ```
489
503
 
490
504
  This example is based on [an example project](https://github.com/shakacode/react_on_rails_tutorial_with_ssr_and_hmr_fast_refresh/blob/master/config/webpack/webpack.config.js)
@@ -513,12 +527,11 @@ Then `require` this file in your `config/webpack/webpack.config.js`:
513
527
  ```js
514
528
  // config/webpack/webpack.config.js
515
529
  // use the new NPM package name, `shakapacker`.
516
- const { generateWebpackConfig, merge } = require('shakapacker')
530
+ const { generateWebpackConfig } = require('shakapacker')
517
531
 
518
- const webpackConfig = generateWebpackConfig()
519
532
  const customConfig = require('./custom')
520
533
 
521
- module.exports = merge(webpackConfig, customConfig)
534
+ module.exports = generateWebpackConfig(customConfig)
522
535
  ```
523
536
 
524
537
  If you need access to configs within Shakapacker's configuration, you can import them like so:
@@ -616,12 +629,10 @@ Then modify the webpack config to use it as a plugin:
616
629
 
617
630
  ```js
618
631
  // config/webpack/webpack.config.js
619
- const { generateWebpackConfig, merge } = require("shakapacker");
620
-
621
- const webpackConfig = generateWebpackConfig()
632
+ const { generateWebpackConfig } = require("shakapacker");
622
633
  const ForkTSCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");
623
634
 
624
- module.exports = merge(webpackConfig, {
635
+ module.exports = generateWebpackConfig({
625
636
  plugins: [new ForkTSCheckerWebpackPlugin()],
626
637
  });
627
638
  ```
@@ -638,9 +649,7 @@ Optionally, add the `CSS` extension to webpack config for easy resolution.
638
649
 
639
650
  ```js
640
651
  // config/webpack/webpack.config.js
641
- const { generateWebpackConfig, merge } = require('shakapacker')
642
-
643
- const webpackConfig = generateWebpackConfig()
652
+ const { generateWebpackConfig } = require('shakapacker')
644
653
 
645
654
  const customConfig = {
646
655
  resolve: {
@@ -648,7 +657,7 @@ const customConfig = {
648
657
  }
649
658
  }
650
659
 
651
- module.exports = merge(webpackConfig, customConfig)
660
+ module.exports = generateWebpackConfig(customConfig)
652
661
  ```
653
662
 
654
663
  To enable `PostCSS`, `Sass` or `Less` support, add `CSS` support first and
@@ -150,11 +150,9 @@ To silent these warnings, please update `config/webpack/webpack.config.js`:
150
150
  ```js
151
151
  const webpack = require('webpack')
152
152
  const { resolve } = require('path')
153
- const { generateWebpackConfig, merge } = require('shakapacker')
153
+ const { generateWebpackConfig } = require('shakapacker')
154
154
 
155
- const webpackConfig = generateWebpackConfig();
156
-
157
- module.exports = merge(webpackConfig, {
155
+ module.exports = generateWebpackConfig({
158
156
  plugins: [
159
157
  new webpack.ContextReplacementPlugin(
160
158
  /angular(\\|\/)core(\\|\/)(@angular|esm5)/,
@@ -201,11 +199,9 @@ Instead do:
201
199
  // config/webpack/webpack.config.js
202
200
 
203
201
  const webpack = require('webpack')
204
- const { generateWebpackConfig, merge } = require('shakapacker')
205
-
206
- const webpackConfig = generateWebpackConfig();
202
+ const { generateWebpackConfig } = require('shakapacker')
207
203
 
208
- module.exports = merge(webpackConfig, {
204
+ module.exports = generateWebpackConfig({
209
205
  plugins: [
210
206
  new webpack.ProvidePlugin({
211
207
  $: 'jquery',
@@ -59,11 +59,9 @@ o do so, you need to modify your webpack configuration and use `ESBuildMinifyPlu
59
59
  Example:
60
60
 
61
61
  ```js
62
- const { generateWebpackConfig, merge } = require('shakapacker')
62
+ const { generateWebpackConfig } = require('shakapacker')
63
63
  const { ESBuildMinifyPlugin } = require('esbuild-loader')
64
64
 
65
- const baseWebpackConfig = generateWebpackConfig()
66
-
67
65
  const options = {
68
66
  optimization: {
69
67
  minimizer: [
@@ -74,7 +72,7 @@ const options = {
74
72
  }
75
73
  }
76
74
 
77
- module.exports = merge({}, baseWebpackConfig, options)
75
+ module.exports = generateWebpackConfig(options)
78
76
  ```
79
77
 
80
78
  For more details, see instructions at https://github.com/shakacode/shakapacker#webpack-configuration and https://github.com/privatenumber/esbuild-loader#js-minification-eg-terser.
@@ -14,8 +14,8 @@ if Dir.exist?(Shakapacker.config.source_path)
14
14
  say "The packs app source directory already exists"
15
15
  else
16
16
  say "Creating packs app source directory"
17
- empty_directory "app/javascript"
18
- copy_file "#{__dir__}/application.js", "app/javascript/application.js"
17
+ empty_directory "app/javascript/packs"
18
+ copy_file "#{__dir__}/application.js", "app/javascript/packs/application.js"
19
19
  end
20
20
 
21
21
  apply "#{__dir__}/binstubs.rb"
@@ -1,7 +1,7 @@
1
1
  require "thor"
2
2
 
3
3
  module Shakapacker
4
- DEPRECATION_GUIDE_URL = "https://github.com/shakacode/shakapacker/docs/v7_upgrade.md"
4
+ DEPRECATION_GUIDE_URL = "https://github.com/shakacode/shakapacker/blob/master/docs/v7_upgrade.md"
5
5
  DEPRECATION_MESSAGE = <<~MSG
6
6
  DEPRECATION NOTICE:
7
7
 
@@ -66,6 +66,7 @@ module Shakapacker
66
66
  env = Shakapacker::Compiler.env
67
67
  env["SHAKAPACKER_CONFIG"] = @shakapacker_config
68
68
  env["WEBPACK_SERVE"] = "true"
69
+ env["NODE_OPTIONS"] = ENV["NODE_OPTIONS"] || ""
69
70
 
70
71
  cmd = if node_modules_bin_exist?
71
72
  ["#{@node_modules_bin_path}/webpack", "serve"]
@@ -83,7 +84,7 @@ module Shakapacker
83
84
  end
84
85
 
85
86
  if @argv.delete("--debug-shakapacker") || @argv.delete("--debug-webpacker")
86
- cmd = [ "node", "--inspect-brk", "--trace-warnings" ] + cmd
87
+ env["NODE_OPTIONS"] = "#{env["NODE_OPTIONS"]} --inspect-brk --trace-warnings"
87
88
  end
88
89
 
89
90
  cmd += ["--config", @webpack_config]
@@ -1,4 +1,4 @@
1
1
  module Shakapacker
2
2
  # Change the version in package.json too, please!
3
- VERSION = "7.0.3".freeze
3
+ VERSION = "7.1.0".freeze
4
4
  end
@@ -91,7 +91,7 @@ module Shakapacker
91
91
  attr_reader :package_json
92
92
 
93
93
  def self.build
94
- new(package_json_path, yarn_lock_path, package_lock_path)
94
+ new(package_json_path, yarn_lock_path, package_lock_path, pnpm_lock_path)
95
95
  end
96
96
 
97
97
  def self.package_json_path
@@ -106,10 +106,15 @@ module Shakapacker
106
106
  Rails.root.join("package-lock.json")
107
107
  end
108
108
 
109
- def initialize(package_json, yarn_lock, package_lock)
109
+ def self.pnpm_lock_path
110
+ Rails.root.join("pnpm-lock.yaml")
111
+ end
112
+
113
+ def initialize(package_json, yarn_lock, package_lock, pnpm_lock)
110
114
  @package_json = package_json
111
115
  @yarn_lock = yarn_lock
112
116
  @package_lock = package_lock
117
+ @pnpm_lock = pnpm_lock
113
118
  end
114
119
 
115
120
  def raw
@@ -170,6 +175,12 @@ module Shakapacker
170
175
  return version unless version.nil?
171
176
  end
172
177
 
178
+ if File.exist?(@pnpm_lock)
179
+ version = from_pnpm_lock
180
+
181
+ return version unless version.nil?
182
+ end
183
+
173
184
  parsed_package_contents = JSON.parse(package_json_contents)
174
185
  parsed_package_contents.dig("dependencies", "shakapacker").to_s
175
186
  end
@@ -210,6 +221,28 @@ module Shakapacker
210
221
 
211
222
  version
212
223
  end
224
+
225
+ def from_pnpm_lock
226
+ require "yaml"
227
+
228
+ content = YAML.load_file(@pnpm_lock)
229
+
230
+ content.fetch("packages", {}).each do |key, value|
231
+ return value["version"] if value["name"] == "shakapacker"
232
+
233
+ parts = key.split("/")
234
+
235
+ return parts[2] if parts[1] == "shakapacker"
236
+ next unless parts[1].start_with?("shakapacker@")
237
+
238
+ _, version = parts[1].split("@")
239
+
240
+ return version[0, version.index("(")] if version.include?("(")
241
+ return version
242
+ end
243
+
244
+ nil
245
+ end
213
246
  end
214
247
  end
215
248
  end
@@ -19,6 +19,7 @@ module Shakapacker
19
19
  def run
20
20
  env = Shakapacker::Compiler.env
21
21
  env["SHAKAPACKER_CONFIG"] = @shakapacker_config
22
+ env["NODE_OPTIONS"] = ENV["NODE_OPTIONS"] || ""
22
23
 
23
24
  cmd = if node_modules_bin_exist?
24
25
  ["#{@node_modules_bin_path}/webpack"]
@@ -36,15 +37,15 @@ module Shakapacker
36
37
  end
37
38
 
38
39
  if @argv.delete("--debug-shakapacker") || @argv.delete("--debug-webpacker")
39
- cmd = ["node", "--inspect-brk"] + cmd
40
+ env["NODE_OPTIONS"] = "#{env["NODE_OPTIONS"]} --inspect-brk"
40
41
  end
41
42
 
42
43
  if @argv.delete "--trace-deprecation"
43
- cmd = ["node", "--trace-deprecation"] + cmd
44
+ env["NODE_OPTIONS"] = "#{env["NODE_OPTIONS"]} --trace-deprecation"
44
45
  end
45
46
 
46
47
  if @argv.delete "--no-deprecation"
47
- cmd = ["node", "--no-deprecation"] + cmd
48
+ env["NODE_OPTIONS"] = "#{env["NODE_OPTIONS"]} --no-deprecation"
48
49
  end
49
50
 
50
51
  # Webpack commands are not compatible with --config option.
@@ -1,4 +1,5 @@
1
1
  const index = require('../index')
2
+ const { generateWebpackConfig } = require("../index");
2
3
 
3
4
  describe('index', () => {
4
5
  test('exports webpack-merge v5 functions', () => {
@@ -19,4 +20,27 @@ describe('index', () => {
19
20
  expect(webpackConfig2).not.toHaveProperty('newKey')
20
21
  expect(webpackConfig2.output.path).not.toEqual('new value')
21
22
  })
23
+
24
+ test('webpackConfig merges extra config', () => {
25
+ const { generateWebpackConfig } = require('../index')
26
+
27
+ const webpackConfig = generateWebpackConfig({
28
+ newKey: 'new value',
29
+ output: {
30
+ path: 'new path'
31
+ }
32
+ })
33
+
34
+ expect(webpackConfig).toHaveProperty('newKey', 'new value')
35
+ expect(webpackConfig).toHaveProperty('output.path', 'new path')
36
+ expect(webpackConfig).toHaveProperty('output.publicPath', '/packs/')
37
+ })
38
+
39
+ test('webpackConfig errors if multiple configs are provided', () => {
40
+ const { generateWebpackConfig } = require('../index')
41
+
42
+ expect(() => generateWebpackConfig({}, {})).toThrow(
43
+ 'use webpack-merge to merge configs before passing them to Shakapacker'
44
+ )
45
+ })
22
46
  })
data/package/index.d.ts CHANGED
@@ -34,7 +34,7 @@ declare module 'shakapacker' {
34
34
 
35
35
  export const config: Config
36
36
  export const devServer: Record<string, unknown>
37
- export function generateWebpackConfig(): Configuration
37
+ export function generateWebpackConfig(extraConfig?: Configuration): Configuration
38
38
  export const globalMutableWebpackConfig: Configuration
39
39
  export const baseConfig: Configuration
40
40
  export const env: Env
data/package/index.js CHANGED
@@ -19,9 +19,15 @@ const globalMutableWebpackConfig = () => {
19
19
  return environmentConfig
20
20
  }
21
21
 
22
- const generateWebpackConfig = () => {
22
+ const generateWebpackConfig = (extraConfig = {}, ...extraArgs) => {
23
+ if (extraArgs.length > 0) {
24
+ throw new Error(
25
+ 'Only one extra config may be passed here - use webpack-merge to merge configs before passing them to Shakapacker'
26
+ )
27
+ }
28
+
23
29
  const environmentConfig = globalMutableWebpackConfig()
24
- const immutable = webpackMerge.merge({}, environmentConfig)
30
+ const immutable = webpackMerge.merge({}, environmentConfig, extraConfig)
25
31
  return immutable
26
32
  }
27
33
 
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shakapacker",
3
- "version": "7.0.3",
3
+ "version": "7.1.0",
4
4
  "description": "Use webpack to manage app-like JavaScript modules in Rails",
5
5
  "main": "package/index.js",
6
6
  "types": "package/index.d.ts",
@@ -2,17 +2,19 @@ require_relative "spec_helper_initializer"
2
2
 
3
3
  describe "Webpacker::CompilerStrategy" do
4
4
  describe "#from_config" do
5
- it "returns and instance of MtimeStrategy when compiler_strategy is set to mtime" do
5
+ it "returns an instance of MtimeStrategy when compiler_strategy is set to mtime" do
6
6
  allow(Webpacker.config).to receive(:compiler_strategy).and_return("mtime")
7
+
7
8
  expect(Webpacker::CompilerStrategy.from_config).to be_an_instance_of(Webpacker::MtimeStrategy)
8
9
  end
9
10
 
10
- it "returns and instance of DigestStrategy when compiler_strategy is set to digest" do
11
+ it "returns an instance of DigestStrategy when compiler_strategy is set to digest" do
11
12
  allow(Webpacker.config).to receive(:compiler_strategy).and_return("digest")
13
+
12
14
  expect(Webpacker::CompilerStrategy.from_config).to be_an_instance_of(Webpacker::DigestStrategy)
13
15
  end
14
16
 
15
- it "raise exception for unknown compiler_strategy in the config file" do
17
+ it "raise an exception for unknown compiler_strategy in the config file" do
16
18
  expected_error_message = "Unknown strategy 'other'. Available options are 'mtime' and 'digest'."
17
19
  allow(Webpacker.config).to receive(:compiler_strategy).and_return("other")
18
20
 
@@ -14,36 +14,43 @@ describe "Webpacker::Configuration" do
14
14
 
15
15
  it "#source_path returns correct path" do
16
16
  source_path = File.expand_path File.join(File.dirname(__FILE__), "webpacker_test_app/app/packs").to_s
17
+
17
18
  expect(config.source_path.to_s).to eq source_path
18
19
  end
19
20
 
20
21
  it "#source_entry_path returns correct path" do
21
22
  source_entry_path = File.expand_path File.join(File.dirname(__FILE__), "webpacker_test_app/app/packs", "entrypoints").to_s
23
+
22
24
  expect(config.source_entry_path.to_s).to eq source_entry_path
23
25
  end
24
26
 
25
27
  it "#public_root_path returns correct path" do
26
28
  public_root_path = File.expand_path File.join(File.dirname(__FILE__), "webpacker_test_app/public").to_s
29
+
27
30
  expect(config.public_path.to_s).to eq public_root_path
28
31
  end
29
32
 
30
33
  it "#public_output_path returns correct path" do
31
34
  public_output_path = File.expand_path File.join(File.dirname(__FILE__), "webpacker_test_app/public/packs").to_s
35
+
32
36
  expect(config.public_output_path.to_s).to eq public_output_path
33
37
  end
34
38
 
35
39
  it "#public_manifest_path returns correct path" do
36
40
  public_manifest_path = File.expand_path File.join(File.dirname(__FILE__), "webpacker_test_app/public/packs", "manifest.json").to_s
41
+
37
42
  expect(config.public_manifest_path.to_s).to eq public_manifest_path
38
43
  end
39
44
 
40
45
  it "#manifest_path returns correct path" do
41
46
  manifest_path = File.expand_path File.join(File.dirname(__FILE__), "webpacker_test_app/public/packs", "manifest.json").to_s
47
+
42
48
  expect(config.manifest_path.to_s).to eq manifest_path
43
49
  end
44
50
 
45
51
  it "#cache_path returns correct path" do
46
52
  cache_path = File.expand_path File.join(File.dirname(__FILE__), "webpacker_test_app/tmp/webpacker").to_s
53
+
47
54
  expect(config.cache_path.to_s).to eq cache_path
48
55
  end
49
56
 
@@ -186,6 +193,7 @@ describe "Webpacker::Configuration" do
186
193
 
187
194
  it "#public_output_path returns correct path" do
188
195
  expected_public_output_path = File.expand_path File.join(File.dirname(__FILE__), "public/packs").to_s
196
+
189
197
  expect(config.public_output_path.to_s).to eq expected_public_output_path
190
198
  end
191
199
  end
@@ -199,6 +207,7 @@ describe "Webpacker::Configuration" do
199
207
 
200
208
  it "#manifest_path returns correct expected value" do
201
209
  expected_manifest_path = File.expand_path File.join(File.dirname(__FILE__), "webpacker_test_app/app/packs", "manifest.json").to_s
210
+
202
211
  expect(config.manifest_path.to_s).to eq expected_manifest_path
203
212
  end
204
213
  end
@@ -206,8 +215,8 @@ describe "Webpacker::Configuration" do
206
215
  context "with webpacker_precompile entry set to false" do
207
216
  describe "#webpacker_precompile?" do
208
217
  before :each do
209
- ENV.delete("WEBPACKER_PRECOMPILE")
210
218
  ENV.delete("SHAKAPACKER_PRECOMPILE")
219
+ ENV.delete("WEBPACKER_PRECOMPILE")
211
220
  end
212
221
 
213
222
  let(:config) {
@@ -229,9 +238,8 @@ describe "Webpacker::Configuration" do
229
238
  expect(subject).to be true
230
239
  end
231
240
 
232
- it "returns false with WEBPACKER_PRECOMPILE set to falsy value" do
233
- # ENV["WEBPACKER_PRECOMPILE"] = "no"
234
- ENV.delete("WEBPACKER_PRECOMPILE")
241
+ it "returns false with WEBPACKER_PRECOMPILE set to nil" do
242
+ ENV["SHAKAPACKER_PRECOMPILE"] = nil
235
243
  expect(subject).to be false
236
244
  end
237
245
  end