webpacker 4.0.0.rc.2 → 4.0.0.rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +5 -0
- data/CHANGELOG.md +32 -0
- data/Gemfile.lock +2 -2
- data/MIT-LICENSE +1 -1
- data/README.md +26 -1
- data/docs/engines.md +155 -0
- data/docs/webpack.md +26 -22
- data/docs/yarn.md +12 -1
- data/lib/install/config/webpacker.yml +2 -1
- data/lib/install/examples/react/babel.config.js +1 -1
- data/lib/webpacker/compiler.rb +12 -4
- data/lib/webpacker/configuration.rb +1 -1
- data/lib/webpacker/dev_server.rb +7 -1
- data/lib/webpacker/dev_server_proxy.rb +13 -6
- data/lib/webpacker/helper.rb +45 -12
- data/lib/webpacker/manifest.rb +22 -16
- data/lib/webpacker/version.rb +1 -1
- data/package/__tests__/dev_server.js +15 -0
- data/package/config.js +1 -1
- data/package/dev_server.js +3 -1
- data/package/environments/development.js +0 -1
- data/package/rules/node_modules.js +1 -0
- data/package/utils/helpers.js +3 -1
- data/package.json +2 -1
- data/test/configuration_test.rb +9 -0
- data/test/helper_test.rb +1 -1
- data/test/manifest_test.rb +5 -1
- data/test/test_app/config/webpacker.yml +1 -0
- data/test/test_app/config/webpacker_public_root.yml +19 -0
- data/yarn.lock +5 -0
- metadata +7 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 7b4e8fa7b4d57022ab1e34dd1e5ea82e7aeabda41f11c158bdb8989c05fe1c0e
         | 
| 4 | 
            +
              data.tar.gz: 0c9f6d2906a79d379d7f3f5fb097b338e740a39452d0bc2ac33dd3bd30eb3895
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: ee59500d81e622c90f0feddd8c026126eb1f1e14f0d37af880d826af56b60f74b5b3ee380397c36bbbd157de059e48d9f2552e6d72dcd295d310ee7ebaa01a42
         | 
| 7 | 
            +
              data.tar.gz: 0fc59e37a1d3fa940ed3b9e5e8e15667c771a0571029142d507f5d0d3577fa70eb670115ccc6ea0540c0b2afa35c9c501049d204701a2a0389a9499e29f2699d
         | 
    
        data/.travis.yml
    CHANGED
    
    | @@ -6,6 +6,7 @@ rvm: | |
| 6 6 | 
             
              - 2.3.8
         | 
| 7 7 | 
             
              - 2.4.5
         | 
| 8 8 | 
             
              - 2.5.3
         | 
| 9 | 
            +
              - 2.6.0
         | 
| 9 10 | 
             
              - ruby-head
         | 
| 10 11 | 
             
            gemfile:
         | 
| 11 12 | 
             
              - gemfiles/Gemfile-rails.4.2.x
         | 
| @@ -36,5 +37,9 @@ matrix: | |
| 36 37 | 
             
              exclude:
         | 
| 37 38 | 
             
                - rvm: 2.3.8
         | 
| 38 39 | 
             
                  gemfile: gemfiles/Gemfile-rails-edge
         | 
| 40 | 
            +
                - rvm: 2.4.5
         | 
| 41 | 
            +
                  gemfile: gemfiles/Gemfile-rails-edge
         | 
| 42 | 
            +
                - rvm: 2.5.3
         | 
| 43 | 
            +
                  gemfile: gemfiles/Gemfile-rails-edge
         | 
| 39 44 | 
             
                - rvm: ruby-head
         | 
| 40 45 | 
             
                  gemfile: gemfiles/Gemfile-rails.4.2.x
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,37 @@ | |
| 1 1 | 
             
            **Please note that Webpacker 3.1.0 and 3.1.1 have some serious bugs so please consider using either 3.0.2 or 3.2.0**
         | 
| 2 2 |  | 
| 3 | 
            +
            ## [4.0.0.rc.3] - 2019-01-17
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ### Fixed
         | 
| 6 | 
            +
             - Issue with javascript_pack_tag asset duplication [#1898](https://github.com/rails/webpacker/pull/1898)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
             | 
| 9 | 
            +
            ### Added
         | 
| 10 | 
            +
             - `javascript_packs_with_chunks_tag` helper, which creates html tags
         | 
| 11 | 
            +
              for a pack and all the dependent chunks, when using splitchunks.
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            ```erb
         | 
| 14 | 
            +
            <%= javascript_packs_with_chunks_tag 'calendar', 'map', 'data-turbolinks-track': 'reload' %>
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            <script src="/packs/vendor-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 17 | 
            +
            <script src="/packs/calendar~runtime-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 18 | 
            +
            <script src="/packs/calendar-1016838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 19 | 
            +
            <script src="/packs/map~runtime-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 20 | 
            +
            <script src="/packs/map-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 21 | 
            +
            ```
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            **Important:** Pass all your pack names when using `javascript_packs_with_chunks_tag`
         | 
| 24 | 
            +
            helper otherwise you will get duplicated chunks on the page.
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            ```erb
         | 
| 27 | 
            +
            <%# DO %>
         | 
| 28 | 
            +
            <%= javascript_packs_with_chunks_tag 'calendar', 'map' %>
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            <%# DON'T %>
         | 
| 31 | 
            +
            <%= javascript_packs_with_chunks_tag 'calendar' %>
         | 
| 32 | 
            +
            <%= javascript_packs_with_chunks_tag 'map' %>
         | 
| 33 | 
            +
            ```
         | 
| 34 | 
            +
             | 
| 3 35 | 
             
            ## [4.0.0.rc.2] - 2018-12-15
         | 
| 4 36 |  | 
| 5 37 | 
             
            ### Fixed
         | 
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -14,7 +14,7 @@ GIT | |
| 14 14 | 
             
            PATH
         | 
| 15 15 | 
             
              remote: .
         | 
| 16 16 | 
             
              specs:
         | 
| 17 | 
            -
                webpacker (4.0.0.rc. | 
| 17 | 
            +
                webpacker (4.0.0.rc.3)
         | 
| 18 18 | 
             
                  activesupport (>= 4.2)
         | 
| 19 19 | 
             
                  rack-proxy (>= 0.6.1)
         | 
| 20 20 | 
             
                  railties (>= 4.2)
         | 
| @@ -156,4 +156,4 @@ DEPENDENCIES | |
| 156 156 | 
             
              webpacker!
         | 
| 157 157 |  | 
| 158 158 | 
             
            BUNDLED WITH
         | 
| 159 | 
            -
               1.17. | 
| 159 | 
            +
               1.17.3
         | 
    
        data/MIT-LICENSE
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -142,6 +142,31 @@ can use the `asset_pack_path` helper: | |
| 142 142 | 
             
            <img src="<%= asset_pack_path 'images/logo.svg' %>" />
         | 
| 143 143 | 
             
            ```
         | 
| 144 144 |  | 
| 145 | 
            +
            If you are using new webpack 4 split chunks API, then consider using `javascript_packs_with_chunks_tag` helper, which creates html
         | 
| 146 | 
            +
            tags for a pack and all the dependent chunks.
         | 
| 147 | 
            +
             | 
| 148 | 
            +
            ```erb
         | 
| 149 | 
            +
            <%= javascript_packs_with_chunks_tag 'calendar', 'map', 'data-turbolinks-track': 'reload' %>
         | 
| 150 | 
            +
             | 
| 151 | 
            +
            <script src="/packs/vendor-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 152 | 
            +
            <script src="/packs/calendar~runtime-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 153 | 
            +
            <script src="/packs/calendar-1016838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 154 | 
            +
            <script src="/packs/map~runtime-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 155 | 
            +
            <script src="/packs/map-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 156 | 
            +
            ```
         | 
| 157 | 
            +
             | 
| 158 | 
            +
            **Important:** Pass all your pack names when using `javascript_packs_with_chunks_tag`
         | 
| 159 | 
            +
            helper otherwise you will get duplicated chunks on the page.
         | 
| 160 | 
            +
             | 
| 161 | 
            +
            ```erb
         | 
| 162 | 
            +
            <%# DO %>
         | 
| 163 | 
            +
            <%= javascript_packs_with_chunks_tag 'calendar', 'map' %>
         | 
| 164 | 
            +
             | 
| 165 | 
            +
            <%# DON'T %>
         | 
| 166 | 
            +
            <%= javascript_packs_with_chunks_tag 'calendar' %>
         | 
| 167 | 
            +
            <%= javascript_packs_with_chunks_tag 'map' %>
         | 
| 168 | 
            +
            ```
         | 
| 169 | 
            +
             | 
| 145 170 | 
             
            **Note:** In order for your styles or static assets files to be available in your view,
         | 
| 146 171 | 
             
            you would need to link them in your "pack" or entry file.
         | 
| 147 172 |  | 
| @@ -269,7 +294,7 @@ You can run following commands to upgrade Webpacker to the latest stable version | |
| 269 294 | 
             
            bundle update webpacker
         | 
| 270 295 | 
             
            rails webpacker:binstubs
         | 
| 271 296 | 
             
            yarn upgrade @rails/webpacker --latest
         | 
| 272 | 
            -
            yarn add webpack-dev-server@^ | 
| 297 | 
            +
            yarn add webpack-dev-server@^3.1.14
         | 
| 273 298 |  | 
| 274 299 | 
             
            # Or to install a latest release (including pre-releases)
         | 
| 275 300 | 
             
            yarn add @rails/webpacker@next
         | 
    
        data/docs/engines.md
    ADDED
    
    | @@ -0,0 +1,155 @@ | |
| 1 | 
            +
            # Using in Rails engines
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            If the application UI consists of multiple frontend application, you'd probably like to isolate their building too (e.g. if you use different frameworks/versions). Hence we needed our webpack(-er) to be isolated too: separate `package.json`, dev server, compilation process.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            You can do this by adding another Webpacker instance to your application.
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            This guide describes how to do that using [Rails engines](https://guides.rubyonrails.org/engines.html).
         | 
| 8 | 
            +
             | 
| 9 | 
            +
             | 
| 10 | 
            +
            ## Step 1: create Rails engine.
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            First, you create a Rails engine (say, `MyEngine`). See the offical [Rails guide](https://guides.rubyonrails.org/engines.html).
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            ## Step 2: install Webpacker within the engine.
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            There is no built-in tasks to install Webpacker within the engine, thus you have to add all the require files manually (you can copy them from the main app):
         | 
| 17 | 
            +
            - Add `config/webpacker.yml` and `config/webpack/*.js` files
         | 
| 18 | 
            +
            - Add `bin/webpack` and `bin/webpack-dev-server` files
         | 
| 19 | 
            +
            - Add `package.json` with required deps.
         | 
| 20 | 
            +
             | 
| 21 | 
            +
             | 
| 22 | 
            +
            ## Step 3: configure Webpacker instance.
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            ```ruby
         | 
| 25 | 
            +
            module MyEngine
         | 
| 26 | 
            +
              ROOT_PATH = Pathname.new(File.join(__dir__, ".."))
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              class << self
         | 
| 29 | 
            +
                def webpacker
         | 
| 30 | 
            +
                  @webpacker ||= ::Webpacker::Instance.new(
         | 
| 31 | 
            +
                    root_path: ROOT_PATH,
         | 
| 32 | 
            +
                    config_path: ROOT_PATH.join("config/webpacker.yml")
         | 
| 33 | 
            +
                  )
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
            end
         | 
| 37 | 
            +
            ```
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            ## Step 4: Configure dev server proxy.
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            ```ruby
         | 
| 42 | 
            +
            module MyEngine
         | 
| 43 | 
            +
              class Engine < ::Rails::Engine
         | 
| 44 | 
            +
                initializer "webpacker.proxy" do |app|
         | 
| 45 | 
            +
                    insert_middleware = begin
         | 
| 46 | 
            +
                                        MyEngine.webpacker.config.dev_server.present?
         | 
| 47 | 
            +
                                      rescue
         | 
| 48 | 
            +
                                        nil
         | 
| 49 | 
            +
                                      end
         | 
| 50 | 
            +
                    next unless insert_middleware
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    app.middleware.insert_before(
         | 
| 53 | 
            +
                      0, Webpacker::DevServerProxy, # "Webpacker::DevServerProxy" if Rails version < 5
         | 
| 54 | 
            +
                      ssl_verify_none: true,
         | 
| 55 | 
            +
                      webpacker: MyEngine.webpacker
         | 
| 56 | 
            +
                    )
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
            end
         | 
| 60 | 
            +
            ```
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            If you have multiple webpackers, you would probably want to run multiple dev servers at a time, and hence be able to configure their setting through env vars (e.g. within a `docker-compose.yml` file):
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            ```yml
         | 
| 65 | 
            +
            # webpacker.yml
         | 
| 66 | 
            +
            # ...
         | 
| 67 | 
            +
            development:
         | 
| 68 | 
            +
              # ...
         | 
| 69 | 
            +
              dev_server:
         | 
| 70 | 
            +
                env_prefix: "MY_ENGINE_WEBPACKER_DEV_SERVER"
         | 
| 71 | 
            +
                # ...
         | 
| 72 | 
            +
            ```
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            ## Step 5: configure helper.
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            ```ruby
         | 
| 77 | 
            +
            require "webpacker/helper"
         | 
| 78 | 
            +
             | 
| 79 | 
            +
            module MyEngine
         | 
| 80 | 
            +
              module ApplicationHelper
         | 
| 81 | 
            +
                include ::Webpacker::Helper
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                def current_webpacker_instance
         | 
| 84 | 
            +
                  MyEngine.webpacker
         | 
| 85 | 
            +
                end
         | 
| 86 | 
            +
              end
         | 
| 87 | 
            +
            end
         | 
| 88 | 
            +
            ```
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            Now you can use `stylesheet_pack_tag` and `javascript_pack_tag` from within your engine.
         | 
| 91 | 
            +
             | 
| 92 | 
            +
            ## Step 6: rake tasks.
         | 
| 93 | 
            +
             | 
| 94 | 
            +
            Add Rake task to compile assets in production (`rake my_engine:webpacker:compile`)
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            ```ruby
         | 
| 97 | 
            +
            namespace :my_engine do
         | 
| 98 | 
            +
              namespace :webpacker do
         | 
| 99 | 
            +
                desc "Install deps with yarn"
         | 
| 100 | 
            +
                task :yarn_install do
         | 
| 101 | 
            +
                  Dir.chdir(File.join(__dir__, "../..")) do
         | 
| 102 | 
            +
                    system "yarn install --no-progress --production"
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
                end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                desc "Compile JavaScript packs using webpack for production with digests"
         | 
| 107 | 
            +
                task compile: [:yarn_install, :environment] do
         | 
| 108 | 
            +
                  Webpacker.with_node_env("production") do
         | 
| 109 | 
            +
                      if MyEngine.webpacker.commands.compile
         | 
| 110 | 
            +
                        # Successful compilation!
         | 
| 111 | 
            +
                      else
         | 
| 112 | 
            +
                        # Failed compilation
         | 
| 113 | 
            +
                        exit!
         | 
| 114 | 
            +
                      end
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
              end
         | 
| 118 | 
            +
            end
         | 
| 119 | 
            +
            ```
         | 
| 120 | 
            +
             | 
| 121 | 
            +
            ## Step 7: serving compiled packs.
         | 
| 122 | 
            +
             | 
| 123 | 
            +
            There are two approaches on serving compiled assets.
         | 
| 124 | 
            +
             | 
| 125 | 
            +
            ### Put engine's assets to the root app's public/ folder
         | 
| 126 | 
            +
             | 
| 127 | 
            +
            You can serve engine's assets using the main app's static files server which serves files from `public/` folder.
         | 
| 128 | 
            +
             | 
| 129 | 
            +
            For that you must configure your engine's webpacker to put compiled assets to the app's `public/` folder:
         | 
| 130 | 
            +
             | 
| 131 | 
            +
            ```yml
         | 
| 132 | 
            +
            # my_engine/config/webpacker.yml
         | 
| 133 | 
            +
            default: &default
         | 
| 134 | 
            +
              # ...
         | 
| 135 | 
            +
              # public_root_path could be used to override the path to `public/` folder
         | 
| 136 | 
            +
              # (relative to the engine root)
         | 
| 137 | 
            +
              public_root_path: ../public
         | 
| 138 | 
            +
              # use a different sub-folder name
         | 
| 139 | 
            +
              public_output_path: my-engine-packs
         | 
| 140 | 
            +
            ```
         | 
| 141 | 
            +
             | 
| 142 | 
            +
            ### Use a separate middleware
         | 
| 143 | 
            +
             | 
| 144 | 
            +
            To serve static assets from the engine's `public/` folder you must add a middleware and point it to your engine's webpacker output path:
         | 
| 145 | 
            +
             | 
| 146 | 
            +
            ```ruby
         | 
| 147 | 
            +
            # application.rb
         | 
| 148 | 
            +
             | 
| 149 | 
            +
            config.middleware.use(
         | 
| 150 | 
            +
              "Rack::Static",
         | 
| 151 | 
            +
              urls: ["/my-engine-packs"], root: "my_engine/public"
         | 
| 152 | 
            +
            )
         | 
| 153 | 
            +
            ```
         | 
| 154 | 
            +
             | 
| 155 | 
            +
            **NOTE:** in the example above we assume that your `public_output_path` is set to `my-engine-packs` in your engine's `webpacker.yml`.
         | 
    
        data/docs/webpack.md
    CHANGED
    
    | @@ -267,32 +267,36 @@ For the full configuration options of SplitChunks, see the [Webpack documentatio | |
| 267 267 | 
             
            // config/webpack/environment.js
         | 
| 268 268 | 
             
            const WebpackAssetsManifest = require('webpack-assets-manifest');
         | 
| 269 269 |  | 
| 270 | 
            -
             | 
| 271 | 
            -
             | 
| 272 | 
            -
             | 
| 273 | 
            -
             | 
| 274 | 
            -
             | 
| 275 | 
            -
              },
         | 
| 276 | 
            -
            };
         | 
| 277 | 
            -
             | 
| 278 | 
            -
            environment.config.merge(splitChunks);
         | 
| 279 | 
            -
             | 
| 280 | 
            -
            // Should override the existing manifest plugin
         | 
| 281 | 
            -
            environment.plugins.insert(
         | 
| 282 | 
            -
              'Manifest',
         | 
| 283 | 
            -
              new WebpackAssetsManifest({
         | 
| 284 | 
            -
                entrypoints: true, // default in rails is false
         | 
| 285 | 
            -
                writeToDisk: true, // rails defaults copied from webpacker
         | 
| 286 | 
            -
                publicPath: true // rails defaults copied from webpacker
         | 
| 287 | 
            -
              })
         | 
| 288 | 
            -
            )
         | 
| 270 | 
            +
            // Enable the default config
         | 
| 271 | 
            +
            environment.splitChunks()
         | 
| 272 | 
            +
             | 
| 273 | 
            +
            // or using custom config
         | 
| 274 | 
            +
            environment.splitChunks((config) => Object.assign({}, config, { optimization: { splitChunks: false }}))
         | 
| 289 275 | 
             
            ```
         | 
| 290 276 |  | 
| 291 | 
            -
             | 
| 277 | 
            +
            Then use, `javascript_packs_with_chunks_tag` helper to include all the transpiled
         | 
| 278 | 
            +
            packs with the chunks in your view, which creates html tags for all the chunks.
         | 
| 292 279 |  | 
| 293 280 | 
             
            ```erb
         | 
| 294 | 
            -
             | 
| 295 | 
            -
             | 
| 281 | 
            +
            <%= javascript_packs_with_chunks_tag 'calendar', 'map', 'data-turbolinks-track': 'reload' %>
         | 
| 282 | 
            +
             | 
| 283 | 
            +
            <script src="/packs/vendor-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 284 | 
            +
            <script src="/packs/calendar~runtime-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 285 | 
            +
            <script src="/packs/calendar-1016838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 286 | 
            +
            <script src="/packs/map~runtime-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 287 | 
            +
            <script src="/packs/map-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 288 | 
            +
            ```
         | 
| 289 | 
            +
             | 
| 290 | 
            +
            **Important:** Pass all your pack names when using this helper otherwise you will
         | 
| 291 | 
            +
            get duplicated chunks on the page.
         | 
| 292 | 
            +
             | 
| 293 | 
            +
            ```erb
         | 
| 294 | 
            +
            <%# DO %>
         | 
| 295 | 
            +
            <%= javascript_packs_with_chunks_tag 'calendar', 'map' %>
         | 
| 296 | 
            +
             | 
| 297 | 
            +
            <%# DON'T %>
         | 
| 298 | 
            +
            <%= javascript_packs_with_chunks_tag 'calendar' %>
         | 
| 299 | 
            +
            <%= javascript_packs_with_chunks_tag 'map' %>
         | 
| 296 300 | 
             
            ```
         | 
| 297 301 |  | 
| 298 302 | 
             
            For the old configuration with the CommonsChunkPlugin see below. **Note** that this functionality is deprecated in Webpack V4.
         | 
    
        data/docs/yarn.md
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # Yarn
         | 
| 2 2 |  | 
| 3 | 
            -
            Webpacker by default uses `yarn` as package manager for  | 
| 3 | 
            +
            Webpacker by default uses `yarn` as a package manager for `node_modules`
         | 
| 4 4 |  | 
| 5 5 |  | 
| 6 6 | 
             
            ## Add a new npm module
         | 
| @@ -10,3 +10,14 @@ To add any new JS module you can use `yarn`: | |
| 10 10 | 
             
            ```bash
         | 
| 11 11 | 
             
            yarn add bootstrap material-ui
         | 
| 12 12 | 
             
            ```
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            ## Add an npm module to `devDependencies`
         | 
| 15 | 
            +
            To add a new JS module that will only be available to local development:
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            ```bash
         | 
| 18 | 
            +
            yarn add --dev browser-sync
         | 
| 19 | 
            +
            ```
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            Be careful not to add any build or app related JS modules in this fashion. Adding JS modules to `devDependencies` [will block them from being installed in **any** production environment](https://yarnpkg.com/lang/en/docs/cli/install/#toc-yarn-install-production-true-false).
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            Docs from JS modules may instruct you to use `--dev` or `devDependencies`, but this is generally under the assumption that you are using a `node.js` workflow.
         | 
| @@ -3,6 +3,7 @@ | |
| 3 3 | 
             
            default: &default
         | 
| 4 4 | 
             
              source_path: app/javascript
         | 
| 5 5 | 
             
              source_entry_path: packs
         | 
| 6 | 
            +
              public_root_path: public
         | 
| 6 7 | 
             
              public_output_path: packs
         | 
| 7 8 | 
             
              cache_path: tmp/cache/webpacker
         | 
| 8 9 | 
             
              check_yarn_integrity: false
         | 
| @@ -71,7 +72,7 @@ development: | |
| 71 72 | 
             
                headers:
         | 
| 72 73 | 
             
                  'Access-Control-Allow-Origin': '*'
         | 
| 73 74 | 
             
                watch_options:
         | 
| 74 | 
            -
                  ignored:  | 
| 75 | 
            +
                  ignored: '**/node_modules/**'
         | 
| 75 76 |  | 
| 76 77 |  | 
| 77 78 | 
             
            test:
         | 
| @@ -10,7 +10,7 @@ module.exports = function(api) { | |
| 10 10 | 
             
                  'Please specify a valid `NODE_ENV` or ' +
         | 
| 11 11 | 
             
                    '`BABEL_ENV` environment variables. Valid values are "development", ' +
         | 
| 12 12 | 
             
                    '"test", and "production". Instead, received: ' +
         | 
| 13 | 
            -
                    JSON.stringify( | 
| 13 | 
            +
                    JSON.stringify(currentEnv) +
         | 
| 14 14 | 
             
                    '.'
         | 
| 15 15 | 
             
                )
         | 
| 16 16 | 
             
              }
         | 
    
        data/lib/webpacker/compiler.rb
    CHANGED
    
    | @@ -10,7 +10,7 @@ class Webpacker::Compiler | |
| 10 10 | 
             
              # Webpacker::Compiler.env['FRONTEND_API_KEY'] = 'your_secret_key'
         | 
| 11 11 | 
             
              cattr_accessor(:env) { {} }
         | 
| 12 12 |  | 
| 13 | 
            -
              delegate :config, :logger, to:  | 
| 13 | 
            +
              delegate :config, :logger, to: :webpacker
         | 
| 14 14 |  | 
| 15 15 | 
             
              def initialize(webpacker)
         | 
| 16 16 | 
             
                @webpacker = webpacker
         | 
| @@ -37,6 +37,8 @@ class Webpacker::Compiler | |
| 37 37 | 
             
              end
         | 
| 38 38 |  | 
| 39 39 | 
             
              private
         | 
| 40 | 
            +
                attr_reader :webpacker
         | 
| 41 | 
            +
             | 
| 40 42 | 
             
                def last_compilation_digest
         | 
| 41 43 | 
             
                  compilation_digest_path.read if compilation_digest_path.exist? && config.public_manifest_path.exist?
         | 
| 42 44 | 
             
                rescue Errno::ENOENT, Errno::ENOTDIR
         | 
| @@ -56,7 +58,11 @@ class Webpacker::Compiler | |
| 56 58 | 
             
                def run_webpack
         | 
| 57 59 | 
             
                  logger.info "Compiling…"
         | 
| 58 60 |  | 
| 59 | 
            -
                  stdout, sterr , status = Open3.capture3( | 
| 61 | 
            +
                  stdout, sterr , status = Open3.capture3(
         | 
| 62 | 
            +
                    webpack_env,
         | 
| 63 | 
            +
                    "#{RbConfig.ruby} ./bin/webpack",
         | 
| 64 | 
            +
                    chdir: File.expand_path(config.root_path)
         | 
| 65 | 
            +
                  )
         | 
| 60 66 |  | 
| 61 67 | 
             
                  if sterr == "" && status.success?
         | 
| 62 68 | 
             
                    logger.info "Compiled all packs in #{config.public_output_path}"
         | 
| @@ -71,17 +77,19 @@ class Webpacker::Compiler | |
| 71 77 | 
             
                def default_watched_paths
         | 
| 72 78 | 
             
                  [
         | 
| 73 79 | 
             
                    *config.resolved_paths_globbed,
         | 
| 74 | 
            -
                    "#{config.source_path.relative_path_from( | 
| 80 | 
            +
                    "#{config.source_path.relative_path_from(config.root_path)}/**/*",
         | 
| 75 81 | 
             
                    "yarn.lock", "package.json",
         | 
| 76 82 | 
             
                    "config/webpack/**/*"
         | 
| 77 83 | 
             
                  ].freeze
         | 
| 78 84 | 
             
                end
         | 
| 79 85 |  | 
| 80 86 | 
             
                def compilation_digest_path
         | 
| 81 | 
            -
                  config.cache_path.join("last-compilation-digest-#{ | 
| 87 | 
            +
                  config.cache_path.join("last-compilation-digest-#{webpacker.env}")
         | 
| 82 88 | 
             
                end
         | 
| 83 89 |  | 
| 84 90 | 
             
                def webpack_env
         | 
| 91 | 
            +
                  return env unless defined?(ActionController::Base)
         | 
| 92 | 
            +
             | 
| 85 93 | 
             
                  env.merge("WEBPACKER_ASSET_HOST"        => ActionController::Base.helpers.compute_asset_host,
         | 
| 86 94 | 
             
                            "WEBPACKER_RELATIVE_URL_ROOT" => ActionController::Base.relative_url_root)
         | 
| 87 95 | 
             
                end
         | 
    
        data/lib/webpacker/dev_server.rb
    CHANGED
    
    | @@ -1,4 +1,6 @@ | |
| 1 1 | 
             
            class Webpacker::DevServer
         | 
| 2 | 
            +
              DEFAULT_ENV_PREFIX = "WEBPACKER_DEV_SERVER".freeze
         | 
| 3 | 
            +
             | 
| 2 4 | 
             
              # Configure dev server connection timeout (in seconds), default: 0.01
         | 
| 3 5 | 
             
              # Webpacker.dev_server.connect_timeout = 1
         | 
| 4 6 | 
             
              cattr_accessor(:connect_timeout) { 0.01 }
         | 
| @@ -49,9 +51,13 @@ class Webpacker::DevServer | |
| 49 51 | 
             
                fetch(:pretty)
         | 
| 50 52 | 
             
              end
         | 
| 51 53 |  | 
| 54 | 
            +
              def env_prefix
         | 
| 55 | 
            +
                config.dev_server.fetch(:env_prefix, DEFAULT_ENV_PREFIX)
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 52 58 | 
             
              private
         | 
| 53 59 | 
             
                def fetch(key)
         | 
| 54 | 
            -
                  ENV[" | 
| 60 | 
            +
                  ENV["#{env_prefix}_#{key.upcase}"] || config.dev_server.fetch(key, defaults[key])
         | 
| 55 61 | 
             
                end
         | 
| 56 62 |  | 
| 57 63 | 
             
                def defaults
         | 
| @@ -1,18 +1,25 @@ | |
| 1 1 | 
             
            require "rack/proxy"
         | 
| 2 2 |  | 
| 3 3 | 
             
            class Webpacker::DevServerProxy < Rack::Proxy
         | 
| 4 | 
            +
              delegate :config, :dev_server, to: :@webpacker
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def initialize(app = nil, opts = {})
         | 
| 7 | 
            +
                @webpacker = opts.delete(:webpacker) || Webpacker.instance
         | 
| 8 | 
            +
                super
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 4 11 | 
             
              def rewrite_response(response)
         | 
| 5 12 | 
             
                _status, headers, _body = response
         | 
| 6 13 | 
             
                headers.delete "transfer-encoding"
         | 
| 7 | 
            -
                headers.delete "content-length" if  | 
| 14 | 
            +
                headers.delete "content-length" if dev_server.running? && dev_server.https?
         | 
| 8 15 | 
             
                response
         | 
| 9 16 | 
             
              end
         | 
| 10 17 |  | 
| 11 18 | 
             
              def perform_request(env)
         | 
| 12 | 
            -
                if env["PATH_INFO"].start_with?("/#{public_output_uri_path}") &&  | 
| 13 | 
            -
                  env["HTTP_HOST"] = env["HTTP_X_FORWARDED_HOST"] = env["HTTP_X_FORWARDED_SERVER"] =  | 
| 14 | 
            -
                  env["HTTP_X_FORWARDED_PROTO"] = env["HTTP_X_FORWARDED_SCHEME"] =  | 
| 15 | 
            -
                  unless  | 
| 19 | 
            +
                if env["PATH_INFO"].start_with?("/#{public_output_uri_path}") && dev_server.running?
         | 
| 20 | 
            +
                  env["HTTP_HOST"] = env["HTTP_X_FORWARDED_HOST"] = env["HTTP_X_FORWARDED_SERVER"] = dev_server.host_with_port
         | 
| 21 | 
            +
                  env["HTTP_X_FORWARDED_PROTO"] = env["HTTP_X_FORWARDED_SCHEME"] = dev_server.protocol
         | 
| 22 | 
            +
                  unless dev_server.https?
         | 
| 16 23 | 
             
                    env["HTTPS"] = env["HTTP_X_FORWARDED_SSL"] = "off"
         | 
| 17 24 | 
             
                  end
         | 
| 18 25 | 
             
                  env["SCRIPT_NAME"] = ""
         | 
| @@ -25,6 +32,6 @@ class Webpacker::DevServerProxy < Rack::Proxy | |
| 25 32 |  | 
| 26 33 | 
             
              private
         | 
| 27 34 | 
             
                def public_output_uri_path
         | 
| 28 | 
            -
                   | 
| 35 | 
            +
                  config.public_output_path.relative_path_from(config.public_path)
         | 
| 29 36 | 
             
                end
         | 
| 30 37 | 
             
            end
         | 
    
        data/lib/webpacker/helper.rb
    CHANGED
    
    | @@ -1,6 +1,13 @@ | |
| 1 1 | 
             
            module Webpacker::Helper
         | 
| 2 | 
            +
              # Returns current Webpacker instance.
         | 
| 3 | 
            +
              # Could be overriden to use multiple Webpacker
         | 
| 4 | 
            +
              # configurations within the same app (e.g. with engines)
         | 
| 5 | 
            +
              def current_webpacker_instance
         | 
| 6 | 
            +
                Webpacker.instance
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 2 9 | 
             
              # Computes the relative path for a given Webpacker asset.
         | 
| 3 | 
            -
              # Return relative path using manifest.json and passes it to asset_path helper
         | 
| 10 | 
            +
              # Return relative path using manifest.json and passes it to asset_path helper.
         | 
| 4 11 | 
             
              # This will use asset_path internally, so most of their behaviors will be the same.
         | 
| 5 12 | 
             
              #
         | 
| 6 13 | 
             
              # Example:
         | 
| @@ -11,13 +18,13 @@ module Webpacker::Helper | |
| 11 18 | 
             
              #   # When extract_css is true in webpacker.yml or the file is not a css:
         | 
| 12 19 | 
             
              #   <%= asset_pack_path 'calendar.css' %> # => "/packs/calendar-1016838bab065ae1e122.css"
         | 
| 13 20 | 
             
              def asset_pack_path(name, **options)
         | 
| 14 | 
            -
                if  | 
| 15 | 
            -
                  asset_path( | 
| 21 | 
            +
                if current_webpacker_instance.config.extract_css? || !stylesheet?(name)
         | 
| 22 | 
            +
                  asset_path(current_webpacker_instance.manifest.lookup!(name), **options)
         | 
| 16 23 | 
             
                end
         | 
| 17 24 | 
             
              end
         | 
| 18 25 |  | 
| 19 26 | 
             
              # Computes the absolute path for a given Webpacker asset.
         | 
| 20 | 
            -
              # Return absolute path using manifest.json and passes it to asset_url helper
         | 
| 27 | 
            +
              # Return absolute path using manifest.json and passes it to asset_url helper.
         | 
| 21 28 | 
             
              # This will use asset_url internally, so most of their behaviors will be the same.
         | 
| 22 29 | 
             
              #
         | 
| 23 30 | 
             
              # Example:
         | 
| @@ -28,8 +35,8 @@ module Webpacker::Helper | |
| 28 35 | 
             
              #   # When extract_css is true in webpacker.yml or the file is not a css:
         | 
| 29 36 | 
             
              #   <%= asset_pack_url 'calendar.css' %> # => "http://example.com/packs/calendar-1016838bab065ae1e122.css"
         | 
| 30 37 | 
             
              def asset_pack_url(name, **options)
         | 
| 31 | 
            -
                if  | 
| 32 | 
            -
                  asset_url( | 
| 38 | 
            +
                if current_webpacker_instance.config.extract_css? || !stylesheet?(name)
         | 
| 39 | 
            +
                  asset_url(current_webpacker_instance.manifest.lookup!(name), **options)
         | 
| 33 40 | 
             
                end
         | 
| 34 41 | 
             
              end
         | 
| 35 42 |  | 
| @@ -40,7 +47,7 @@ module Webpacker::Helper | |
| 40 47 | 
             
              #  <%= image_pack_tag 'application.png', size: '16x10', alt: 'Edit Entry' %>
         | 
| 41 48 | 
             
              #  <img alt='Edit Entry' src='/packs/application-k344a6d59eef8632c9d1.png' width='16' height='10' />
         | 
| 42 49 | 
             
              def image_pack_tag(name, **options)
         | 
| 43 | 
            -
                image_tag(asset_path( | 
| 50 | 
            +
                image_tag(asset_path(current_webpacker_instance.manifest.lookup!(name)), **options)
         | 
| 44 51 | 
             
              end
         | 
| 45 52 |  | 
| 46 53 | 
             
              # Creates a script tag that references the named pack file, as compiled by webpack per the entries list
         | 
| @@ -52,7 +59,29 @@ module Webpacker::Helper | |
| 52 59 | 
             
              #   <%= javascript_pack_tag 'calendar', 'data-turbolinks-track': 'reload' %> # =>
         | 
| 53 60 | 
             
              #   <script src="/packs/calendar-1016838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 54 61 | 
             
              def javascript_pack_tag(*names, **options)
         | 
| 55 | 
            -
                javascript_include_tag(* | 
| 62 | 
            +
                javascript_include_tag(*sources_from_manifest_entries(names, type: :javascript), **options)
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              # Creates script tags that references the chunks from entrypoints when using split chunks API,
         | 
| 66 | 
            +
              # as compiled by webpack per the entries list in config/webpack/shared.js.
         | 
| 67 | 
            +
              # By default, this list is auto-generated to match everything in
         | 
| 68 | 
            +
              # app/javascript/packs/*.js and all the dependent chunks. In production mode, the digested reference is automatically looked up.
         | 
| 69 | 
            +
              # See: https://webpack.js.org/plugins/split-chunks-plugin/
         | 
| 70 | 
            +
              # Example:
         | 
| 71 | 
            +
              #
         | 
| 72 | 
            +
              #   <%= javascript_packs_with_chunks_tag 'calendar', 'map', 'data-turbolinks-track': 'reload' %> # =>
         | 
| 73 | 
            +
              #   <script src="/packs/vendor-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 74 | 
            +
              #   <script src="/packs/calendar~runtime-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 75 | 
            +
              #   <script src="/packs/calendar-1016838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 76 | 
            +
              #   <script src="/packs/map~runtime-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 77 | 
            +
              #   <script src="/packs/map-16838bab065ae1e314.js" data-turbolinks-track="reload"></script>
         | 
| 78 | 
            +
              # DO:
         | 
| 79 | 
            +
              # <%= javascript_packs_with_chunks_tag 'calendar', 'map' %>
         | 
| 80 | 
            +
              # DON'T:
         | 
| 81 | 
            +
              # <%= javascript_packs_with_chunks_tag 'calendar' %>
         | 
| 82 | 
            +
              # <%= javascript_packs_with_chunks_tag 'map' %>
         | 
| 83 | 
            +
              def javascript_packs_with_chunks_tag(*names, **options)
         | 
| 84 | 
            +
                javascript_include_tag(*sources_from_manifest_entrypoints(names, type: :javascript), **options)
         | 
| 56 85 | 
             
              end
         | 
| 57 86 |  | 
| 58 87 | 
             
              # Creates a link tag that references the named pack file, as compiled by webpack per the entries list
         | 
| @@ -72,8 +101,8 @@ module Webpacker::Helper | |
| 72 101 | 
             
              #   <%= stylesheet_pack_tag 'calendar', 'data-turbolinks-track': 'reload' %> # =>
         | 
| 73 102 | 
             
              #   <link rel="stylesheet" media="screen" href="/packs/calendar-1016838bab065ae1e122.css" data-turbolinks-track="reload" />
         | 
| 74 103 | 
             
              def stylesheet_pack_tag(*names, **options)
         | 
| 75 | 
            -
                if  | 
| 76 | 
            -
                  stylesheet_link_tag(* | 
| 104 | 
            +
                if current_webpacker_instance.config.extract_css?
         | 
| 105 | 
            +
                  stylesheet_link_tag(*sources_from_manifest_entries(names, type: :stylesheet), **options)
         | 
| 77 106 | 
             
                end
         | 
| 78 107 | 
             
              end
         | 
| 79 108 |  | 
| @@ -82,7 +111,11 @@ module Webpacker::Helper | |
| 82 111 | 
             
                  File.extname(name) == ".css"
         | 
| 83 112 | 
             
                end
         | 
| 84 113 |  | 
| 85 | 
            -
                def  | 
| 86 | 
            -
                  names.map { |name|  | 
| 114 | 
            +
                def sources_from_manifest_entries(names, type:)
         | 
| 115 | 
            +
                  names.map { |name| current_webpacker_instance.manifest.lookup!(name, type: type) }.flatten
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                def sources_from_manifest_entrypoints(names, type:)
         | 
| 119 | 
            +
                  names.map { |name| current_webpacker_instance.manifest.lookup_pack_with_chunks!(name, type: type) }.flatten.uniq
         | 
| 87 120 | 
             
                end
         | 
| 88 121 | 
             
            end
         | 
    
        data/lib/webpacker/manifest.rb
    CHANGED
    
    | @@ -18,27 +18,33 @@ class Webpacker::Manifest | |
| 18 18 | 
             
                @data = load
         | 
| 19 19 | 
             
              end
         | 
| 20 20 |  | 
| 21 | 
            +
              def lookup_pack_with_chunks(name, pack_type = {})
         | 
| 22 | 
            +
                compile if compiling?
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                manifest_pack_type = manifest_type(pack_type[:type])
         | 
| 25 | 
            +
                manifest_pack_name = manifest_name(name, manifest_pack_type)
         | 
| 26 | 
            +
                find("entrypoints")[manifest_pack_name][manifest_pack_type]
         | 
| 27 | 
            +
              rescue NoMethodError
         | 
| 28 | 
            +
                nil
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              def lookup_pack_with_chunks!(name, pack_type = {})
         | 
| 32 | 
            +
                lookup_pack_with_chunks(name, pack_type) || handle_missing_entry(name)
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              # Computes the relative path for a given Webpacker asset using manifest.json.
         | 
| 36 | 
            +
              # If no asset is found, returns nil.
         | 
| 37 | 
            +
              #
         | 
| 38 | 
            +
              # Example:
         | 
| 39 | 
            +
              #
         | 
| 40 | 
            +
              #   Webpacker.manifest.lookup('calendar.js') # => "/packs/calendar-1016838bab065ae1e122.js"
         | 
| 21 41 | 
             
              def lookup(name, pack_type = {})
         | 
| 22 42 | 
             
                compile if compiling?
         | 
| 23 43 |  | 
| 24 | 
            -
                 | 
| 25 | 
            -
                # an extra object called "entrypoints". When the entrypoints key is not
         | 
| 26 | 
            -
                # present in the manifest, or the name is not found in the entrypoints hash,
         | 
| 27 | 
            -
                # it will raise a NoMethodError. If this happens, we should try to lookup
         | 
| 28 | 
            -
                # a single instance of the pack based on the given name.
         | 
| 29 | 
            -
                begin
         | 
| 30 | 
            -
                  manifest_pack_type = manifest_type(pack_type[:type])
         | 
| 31 | 
            -
                  manifest_pack_name = manifest_name(name, manifest_pack_type)
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                  # Lookup the pack in the entrypoints of the manifest
         | 
| 34 | 
            -
                  find("entrypoints")[manifest_pack_name][manifest_pack_type]
         | 
| 35 | 
            -
                rescue NoMethodError
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                  # Lookup a single instance of the pack
         | 
| 38 | 
            -
                  find(full_pack_name(name, pack_type[:type]))
         | 
| 39 | 
            -
                end
         | 
| 44 | 
            +
                find(full_pack_name(name, pack_type[:type]))
         | 
| 40 45 | 
             
              end
         | 
| 41 46 |  | 
| 47 | 
            +
              # Like lookup, except that if no asset is found, raises a Webpacker::Manifest::MissingEntryError.
         | 
| 42 48 | 
             
              def lookup!(name, pack_type = {})
         | 
| 43 49 | 
             
                lookup(name, pack_type) || handle_missing_entry(name)
         | 
| 44 50 | 
             
              end
         | 
    
        data/lib/webpacker/version.rb
    CHANGED
    
    
| @@ -20,6 +20,21 @@ describe('DevServer', () => { | |
| 20 20 | 
             
                expect(devServer.port).toEqual('5000')
         | 
| 21 21 | 
             
              })
         | 
| 22 22 |  | 
| 23 | 
            +
              test('with custom env prefix', () => {
         | 
| 24 | 
            +
                const config = require('../config')
         | 
| 25 | 
            +
                config.dev_server.env_prefix = 'TEST_WEBPACKER_DEV_SERVER_'
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                process.env.NODE_ENV = 'development'
         | 
| 28 | 
            +
                process.env.RAILS_ENV = 'development'
         | 
| 29 | 
            +
                process.env.TEST_WEBPACKER_DEV_SERVER_HOST = '0.0.0.0'
         | 
| 30 | 
            +
                process.env.TEST_WEBPACKER_DEV_SERVER_PORT = 5000
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                const devServer = require('../dev_server')
         | 
| 33 | 
            +
                expect(devServer).toBeDefined()
         | 
| 34 | 
            +
                expect(devServer.host).toEqual('0.0.0.0')
         | 
| 35 | 
            +
                expect(devServer.port).toEqual('5000')
         | 
| 36 | 
            +
              })
         | 
| 37 | 
            +
             | 
| 23 38 | 
             
              test('with NODE_ENV and RAILS_ENV set to production', () => {
         | 
| 24 39 | 
             
                process.env.RAILS_ENV = 'production'
         | 
| 25 40 | 
             
                process.env.NODE_ENV = 'production'
         | 
    
        data/package/config.js
    CHANGED
    
    | @@ -19,7 +19,7 @@ const app = safeLoad(readFileSync(configPath), 'utf8')[railsEnv] | |
| 19 19 | 
             
            if (isArray(app.extensions) && app.extensions.length) delete defaults.extensions
         | 
| 20 20 |  | 
| 21 21 | 
             
            const config = deepMerge(defaults, app)
         | 
| 22 | 
            -
            config.outputPath = resolve( | 
| 22 | 
            +
            config.outputPath = resolve(config.public_root_path, config.public_output_path)
         | 
| 23 23 |  | 
| 24 24 | 
             
            // Ensure that the publicPath includes our asset host so dynamic imports
         | 
| 25 25 | 
             
            // (code-splitting chunks and static assets) load from the CDN instead of a relative path.
         | 
    
        data/package/dev_server.js
    CHANGED
    
    | @@ -9,8 +9,10 @@ const fetch = (key) => { | |
| 9 9 | 
             
            const devServerConfig = config.dev_server
         | 
| 10 10 |  | 
| 11 11 | 
             
            if (devServerConfig) {
         | 
| 12 | 
            +
              const envPrefix = config.dev_server.env_prefix || 'WEBPACKER_DEV_SERVER_'
         | 
| 13 | 
            +
             | 
| 12 14 | 
             
              Object.keys(devServerConfig).forEach((key) => {
         | 
| 13 | 
            -
                const envValue = fetch( | 
| 15 | 
            +
                const envValue = fetch(`${envPrefix}${key.toUpperCase().replace(/_/g, '')}`)
         | 
| 14 16 | 
             
                if (envValue !== undefined) devServerConfig[key] = envValue
         | 
| 15 17 | 
             
              })
         | 
| 16 18 | 
             
            }
         | 
| @@ -9,7 +9,6 @@ module.exports = class extends Base { | |
| 9 9 |  | 
| 10 10 | 
             
                if (devServer.hmr) {
         | 
| 11 11 | 
             
                  this.plugins.append('HotModuleReplacement', new webpack.HotModuleReplacementPlugin())
         | 
| 12 | 
            -
                  this.plugins.append('NamedModules', new webpack.NamedModulesPlugin())
         | 
| 13 12 | 
             
                  this.config.output.filename = '[name]-[hash].js'
         | 
| 14 13 | 
             
                }
         | 
| 15 14 |  | 
    
        data/package/utils/helpers.js
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            const { stringify } = require('flatted/cjs')
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            const isObject = value => typeof value === 'object'
         | 
| 2 4 | 
             
              && value !== null
         | 
| 3 5 | 
             
              && (value.length === undefined || value.length === null)
         | 
| @@ -17,7 +19,7 @@ const isStrPath = (key) => { | |
| 17 19 |  | 
| 18 20 | 
             
            const isArray = value => Array.isArray(value)
         | 
| 19 21 |  | 
| 20 | 
            -
            const isEqual = (target, source) =>  | 
| 22 | 
            +
            const isEqual = (target, source) => stringify(target) === stringify(source)
         | 
| 21 23 |  | 
| 22 24 | 
             
            const canMerge = value => isObject(value) || isArray(value)
         | 
| 23 25 |  | 
    
        data/package.json
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            {
         | 
| 2 2 | 
             
              "name": "@rails/webpacker",
         | 
| 3 | 
            -
              "version": "4.0.0-rc. | 
| 3 | 
            +
              "version": "4.0.0-rc.3",
         | 
| 4 4 | 
             
              "description": "Use webpack to manage app-like JavaScript modules in Rails",
         | 
| 5 5 | 
             
              "main": "package/index.js",
         | 
| 6 6 | 
             
              "files": [
         | 
| @@ -29,6 +29,7 @@ | |
| 29 29 | 
             
                "compression-webpack-plugin": "^2.0.0",
         | 
| 30 30 | 
             
                "css-loader": "^2.0.1",
         | 
| 31 31 | 
             
                "file-loader": "^2.0.0",
         | 
| 32 | 
            +
                "flatted": "^2.0.0",
         | 
| 32 33 | 
             
                "glob": "^7.1.3",
         | 
| 33 34 | 
             
                "js-yaml": "^3.12.0",
         | 
| 34 35 | 
             
                "mini-css-extract-plugin": "^0.5.0",
         | 
    
        data/test/configuration_test.rb
    CHANGED
    
    | @@ -22,6 +22,15 @@ class ConfigurationTest < Webpacker::Test | |
| 22 22 | 
             
              def test_public_output_path
         | 
| 23 23 | 
             
                public_output_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/public/packs").to_s
         | 
| 24 24 | 
             
                assert_equal @config.public_output_path.to_s, public_output_path
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                @config = Webpacker::Configuration.new(
         | 
| 27 | 
            +
                  root_path: @config.root_path,
         | 
| 28 | 
            +
                  config_path: Pathname.new(File.expand_path("./test_app/config/webpacker_public_root.yml", __dir__)),
         | 
| 29 | 
            +
                  env: "production"
         | 
| 30 | 
            +
                )
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                public_output_path = File.expand_path File.join(File.dirname(__FILE__), "public/packs").to_s
         | 
| 33 | 
            +
                assert_equal @config.public_output_path.to_s, public_output_path
         | 
| 25 34 | 
             
              end
         | 
| 26 35 |  | 
| 27 36 | 
             
              def test_public_manifest_path
         | 
    
        data/test/helper_test.rb
    CHANGED
    
    | @@ -64,7 +64,7 @@ class HelperTest < ActionView::TestCase | |
| 64 64 | 
             
                  %(<script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js"></script>\n) +
         | 
| 65 65 | 
             
                    %(<script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js"></script>\n) +
         | 
| 66 66 | 
             
                    %(<script src="/packs/application-k344a6d59eef8632c9d1.js"></script>),
         | 
| 67 | 
            -
                   | 
| 67 | 
            +
                  javascript_packs_with_chunks_tag("application")
         | 
| 68 68 | 
             
              end
         | 
| 69 69 |  | 
| 70 70 | 
             
              def test_stylesheet_pack_tag
         | 
    
        data/test/manifest_test.rb
    CHANGED
    
    | @@ -22,6 +22,10 @@ class ManifestTest < Minitest::Test | |
| 22 22 | 
             
                assert_nil Webpacker.manifest.lookup("foo.js")
         | 
| 23 23 | 
             
              end
         | 
| 24 24 |  | 
| 25 | 
            +
              def test_lookup_chunks_nil
         | 
| 26 | 
            +
                assert_nil Webpacker.manifest.lookup_pack_with_chunks("foo.js")
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 25 29 | 
             
              def test_lookup_success
         | 
| 26 30 | 
             
                assert_equal Webpacker.manifest.lookup("bootstrap.js"), "/packs/bootstrap-300631c4f0e0f9c865bc.js"
         | 
| 27 31 | 
             
              end
         | 
| @@ -33,6 +37,6 @@ class ManifestTest < Minitest::Test | |
| 33 37 | 
             
                  "/packs/application-k344a6d59eef8632c9d1.js"
         | 
| 34 38 | 
             
                ]
         | 
| 35 39 |  | 
| 36 | 
            -
                assert_equal Webpacker.manifest. | 
| 40 | 
            +
                assert_equal Webpacker.manifest.lookup_pack_with_chunks!("application", type: :javascript), application_entrypoints
         | 
| 37 41 | 
             
              end
         | 
| 38 42 | 
             
            end
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            # Note: You must restart bin/webpack-dev-server for changes to take effect
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            default: &default
         | 
| 4 | 
            +
              public_root_path: ../public
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            development:
         | 
| 7 | 
            +
              <<: *default
         | 
| 8 | 
            +
              compile: true
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            test:
         | 
| 11 | 
            +
              <<: *default
         | 
| 12 | 
            +
              compile: true
         | 
| 13 | 
            +
              public_output_path: packs-test
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            production:
         | 
| 16 | 
            +
              <<: *default
         | 
| 17 | 
            +
              compile: false
         | 
| 18 | 
            +
              extract_css: true
         | 
| 19 | 
            +
              cache_manifest: true
         | 
    
        data/yarn.lock
    CHANGED
    
    | @@ -3053,6 +3053,11 @@ flat-cache@^1.2.1: | |
| 3053 3053 | 
             
                rimraf "~2.6.2"
         | 
| 3054 3054 | 
             
                write "^0.2.1"
         | 
| 3055 3055 |  | 
| 3056 | 
            +
            flatted@^2.0.0:
         | 
| 3057 | 
            +
              version "2.0.0"
         | 
| 3058 | 
            +
              resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916"
         | 
| 3059 | 
            +
              integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==
         | 
| 3060 | 
            +
             | 
| 3056 3061 | 
             
            flatten@^1.0.2:
         | 
| 3057 3062 | 
             
              version "1.0.2"
         | 
| 3058 3063 | 
             
              resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: webpacker
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 4.0.0.rc. | 
| 4 | 
            +
              version: 4.0.0.rc.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - David Heinemeier Hansson
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2019-01-17 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: activesupport
         | 
| @@ -93,6 +93,7 @@ files: | |
| 93 93 | 
             
            - docs/css.md
         | 
| 94 94 | 
             
            - docs/deployment.md
         | 
| 95 95 | 
             
            - docs/docker.md
         | 
| 96 | 
            +
            - docs/engines.md
         | 
| 96 97 | 
             
            - docs/env.md
         | 
| 97 98 | 
             
            - docs/es6.md
         | 
| 98 99 | 
             
            - docs/folder-structure.md
         | 
| @@ -238,6 +239,7 @@ files: | |
| 238 239 | 
             
            - test/test_app/config/environment.rb
         | 
| 239 240 | 
             
            - test/test_app/config/webpack/development.js
         | 
| 240 241 | 
             
            - test/test_app/config/webpacker.yml
         | 
| 242 | 
            +
            - test/test_app/config/webpacker_public_root.yml
         | 
| 241 243 | 
             
            - test/test_app/package.json
         | 
| 242 244 | 
             
            - test/test_app/public/packs/manifest.json
         | 
| 243 245 | 
             
            - test/test_app/yarn.lock
         | 
| @@ -250,8 +252,8 @@ homepage: https://github.com/rails/webpacker | |
| 250 252 | 
             
            licenses:
         | 
| 251 253 | 
             
            - MIT
         | 
| 252 254 | 
             
            metadata:
         | 
| 253 | 
            -
              source_code_uri: https://github.com/rails/webpacker/tree/v4.0.0.rc. | 
| 254 | 
            -
              changelog_uri: https://github.com/rails/webpacker/blob/v4.0.0.rc. | 
| 255 | 
            +
              source_code_uri: https://github.com/rails/webpacker/tree/v4.0.0.rc.3
         | 
| 256 | 
            +
              changelog_uri: https://github.com/rails/webpacker/blob/v4.0.0.rc.3/CHANGELOG.md
         | 
| 255 257 | 
             
            post_install_message: 
         | 
| 256 258 | 
             
            rdoc_options: []
         | 
| 257 259 | 
             
            require_paths:
         | 
| @@ -291,6 +293,7 @@ test_files: | |
| 291 293 | 
             
            - test/test_app/config/environment.rb
         | 
| 292 294 | 
             
            - test/test_app/config/webpack/development.js
         | 
| 293 295 | 
             
            - test/test_app/config/webpacker.yml
         | 
| 296 | 
            +
            - test/test_app/config/webpacker_public_root.yml
         | 
| 294 297 | 
             
            - test/test_app/package.json
         | 
| 295 298 | 
             
            - test/test_app/public/packs/manifest.json
         | 
| 296 299 | 
             
            - test/test_app/yarn.lock
         |