sprockets 4.0.3 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +17 -0
 - data/README.md +56 -5
 - data/lib/rake/sprocketstask.rb +6 -2
 - data/lib/sprockets/cache/memory_store.rb +20 -11
 - data/lib/sprockets/cached_environment.rb +10 -10
 - data/lib/sprockets/coffee_script_processor.rb +1 -1
 - data/lib/sprockets/digest_utils.rb +1 -1
 - data/lib/sprockets/directive_processor.rb +19 -1
 - data/lib/sprockets/exporting.rb +2 -2
 - data/lib/sprockets/path_utils.rb +1 -1
 - data/lib/sprockets/server.rb +19 -19
 - data/lib/sprockets/uri_utils.rb +1 -1
 - data/lib/sprockets/utils.rb +22 -17
 - data/lib/sprockets/version.rb +1 -1
 - data/lib/sprockets.rb +4 -1
 - metadata +11 -11
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 3c5995147a647a6d47d625b6cc9f10586506f3832cff0070985ec9560ee3fc0d
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 1befd6f705efbef88f05dc58b38f719f11b445f76c60a95f854a43ef8e84c21d
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 9d47aea08307515c8a0fab29615fbde5f892c91300668afd83b2739032adeb77794d4303e6ecb56c570bc784695d25304f7481fa45c4ab7bbe0727281ee7deab
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 6d0f0b116766053d96402f5d88602374829ef9610160bd8398a093db33ceaafe31a2f2b33a8d0c615769f0bbba7c39d867db90dfded9bc5ff35d0c0ff4482e36
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -2,6 +2,23 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            Get upgrade notes from Sprockets 3.x to 4.x at https://github.com/rails/sprockets/blob/master/UPGRADING.md
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
      
 5 
     | 
    
         
            +
            ## 4.2.0
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            - Rack 3 compatibility. [#758](https://github.com/rails/sprockets/pull/758)
         
     | 
| 
      
 8 
     | 
    
         
            +
            - Fix thread safety of `Sprockets::CachedEnvironment` and `Sprockets::Cache::MemoryStore`. [#771](https://github.com/rails/sprockets/pull/771)
         
     | 
| 
      
 9 
     | 
    
         
            +
            - Add support for Rack 3.0. Headers set by sprockets will now be lower case. [#758](https://github.com/rails/sprockets/pull/758)
         
     | 
| 
      
 10 
     | 
    
         
            +
            - Make `Sprockets::Utils.module_include` thread safe on JRuby. [#759](https://github.com/rails/sprockets/pull/759)
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            ## 4.1.0
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            - Allow age to be altered in asset:clean rake task.
         
     | 
| 
      
 15 
     | 
    
         
            +
            - Fix `Sprockets::Server` to return lower-cased response headers to comply with Rack::Lint 3.0. [#744](https://github.com/rails/sprockets/pull/744)
         
     | 
| 
      
 16 
     | 
    
         
            +
            - Adding new directive `depend_on_directory` [#668](https://github.com/rails/sprockets/pull/668)
         
     | 
| 
      
 17 
     | 
    
         
            +
            - Fix `application/js-sourcemap+json` charset [#669](https://github.com/rails/sprockets/pull/669)
         
     | 
| 
      
 18 
     | 
    
         
            +
            - Fix `CachedEnvironment` caching nil values [#723](https://github.com/rails/sprockets/pull/723)
         
     | 
| 
      
 19 
     | 
    
         
            +
            - Process `*.jst.ejs.erb` files with ERBProcessor [#674](https://github.com/rails/sprockets/pull/674)
         
     | 
| 
      
 20 
     | 
    
         
            +
            - Fix cache key for coffee script processor to be dependent on the filename [#670](https://github.com/rails/sprockets/pull/670)
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
       5 
22 
     | 
    
         
             
            ## 4.0.3
         
     | 
| 
       6 
23 
     | 
    
         | 
| 
       7 
24 
     | 
    
         
             
            - Fix `Manifest#find` yielding from a Promise causing issue on Ruby 3.1.0-dev. [#720](https://github.com/rails/sprockets/pull/720)
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -119,6 +119,7 @@ Here is a list of the available directives: 
     | 
|
| 
       119 
119 
     | 
    
         
             
            - [`link_directory`](#link_directory) - Make target directory compile and be publicly available without adding contents to current
         
     | 
| 
       120 
120 
     | 
    
         
             
            - [`link_tree`](#link_tree) - Make target tree compile and be publicly available without adding contents to current
         
     | 
| 
       121 
121 
     | 
    
         
             
            - [`depend_on`](#depend_on) - Recompile current file if target has changed
         
     | 
| 
      
 122 
     | 
    
         
            +
            - [`depend_on_directory`](#depend_on_directory) - Recompile current file if any files in target directory has changed
         
     | 
| 
       122 
123 
     | 
    
         
             
            - [`stub`](#stub) - Ignore target file
         
     | 
| 
       123 
124 
     | 
    
         | 
| 
       124 
125 
     | 
    
         
             
            You can see what each of these does below.
         
     | 
| 
         @@ -239,7 +240,7 @@ The first time this file is compiled the `application.js` output will be written 
     | 
|
| 
       239 
240 
     | 
    
         | 
| 
       240 
241 
     | 
    
         
             
            So, if `b.js` changes it will get recompiled. However instead of having to recompile the other files from `a.js` to `z.js` since they did not change, we can use the prior intermediary files stored in the cached values . If these files were expensive to generate, then this "partial" asset cache strategy can save a lot of time.
         
     | 
| 
       241 
242 
     | 
    
         | 
| 
       242 
     | 
    
         
            -
            Directives such as `require`, `link`, and ` 
     | 
| 
      
 243 
     | 
    
         
            +
            Directives such as `require`, `link`, `depend_on`, and `depend_on_directory` tell Sprockets what assets need to be re-compiled when a file changes. Files are considered "fresh" based on their mtime on disk and a combination of cache keys.
         
     | 
| 
       243 
244 
     | 
    
         | 
| 
       244 
245 
     | 
    
         
             
            On Rails you can force a "clean" install by clearing the `public/assets` and `tmp/cache/assets` directories.
         
     | 
| 
       245 
246 
     | 
    
         | 
| 
         @@ -381,6 +382,14 @@ the current file won't work, it must be a logical path. 
     | 
|
| 
       381 
382 
     | 
    
         | 
| 
       382 
383 
     | 
    
         
             
            **Caution**: the "link" directive should always have an explicit extension on the end.
         
     | 
| 
       383 
384 
     | 
    
         | 
| 
      
 385 
     | 
    
         
            +
            `link` can also be used to include manifest files from mounted Rails engines:
         
     | 
| 
      
 386 
     | 
    
         
            +
             
     | 
| 
      
 387 
     | 
    
         
            +
            ```
         
     | 
| 
      
 388 
     | 
    
         
            +
            //= link my_engine_manifest
         
     | 
| 
      
 389 
     | 
    
         
            +
            ```
         
     | 
| 
      
 390 
     | 
    
         
            +
             
     | 
| 
      
 391 
     | 
    
         
            +
            This would find a manifest file at `my_engine/app/assets/config/my_engine_manifest.js` and include its directives.
         
     | 
| 
      
 392 
     | 
    
         
            +
             
     | 
| 
       384 
393 
     | 
    
         
             
            ### link_directory
         
     | 
| 
       385 
394 
     | 
    
         | 
| 
       386 
395 
     | 
    
         
             
            `link_directory` *path* links all the files inside the directory specified by the *path*. By "link", we mean they are specified as compilation targets to be written out to disk, and made available to be served to user-agents.
         
     | 
| 
         @@ -445,11 +454,53 @@ you need to tell sprockets that it needs to re-compile the file if `bar.data` ch 
     | 
|
| 
       445 
454 
     | 
    
         
             
            var bar = '<%= File.read("bar.data") %>'
         
     | 
| 
       446 
455 
     | 
    
         
             
            ```
         
     | 
| 
       447 
456 
     | 
    
         | 
| 
      
 457 
     | 
    
         
            +
            To depend on an entire directory containing multiple files, use `depend_on_directory`
         
     | 
| 
      
 458 
     | 
    
         
            +
             
     | 
| 
       448 
459 
     | 
    
         
             
            ### depend_on_asset
         
     | 
| 
       449 
460 
     | 
    
         | 
| 
       450 
461 
     | 
    
         
             
            `depend_on_asset` *path* works like `depend_on`, but operates
         
     | 
| 
       451 
462 
     | 
    
         
             
            recursively reading the file and following the directives found. This is automatically implied if you use `link`, so consider if it just makes sense using `link` instead of `depend_on_asset`.
         
     | 
| 
       452 
463 
     | 
    
         | 
| 
      
 464 
     | 
    
         
            +
            ### depend_on_directory
         
     | 
| 
      
 465 
     | 
    
         
            +
             
     | 
| 
      
 466 
     | 
    
         
            +
            `depend_on_directory` *path* declares all files in the given *path* without
         
     | 
| 
      
 467 
     | 
    
         
            +
            including them in the bundle. This is useful when you need to expire an
         
     | 
| 
      
 468 
     | 
    
         
            +
            asset's cache in response to a change in multiple files in a single directory.
         
     | 
| 
      
 469 
     | 
    
         
            +
             
     | 
| 
      
 470 
     | 
    
         
            +
            All paths are relative to your declaration and must begin with `./`
         
     | 
| 
      
 471 
     | 
    
         
            +
             
     | 
| 
      
 472 
     | 
    
         
            +
            Also, your must include these directories in your [load path](guides/building_an_asset_processing_framework.md#the-load-path).
         
     | 
| 
      
 473 
     | 
    
         
            +
             
     | 
| 
      
 474 
     | 
    
         
            +
            **Example:**
         
     | 
| 
      
 475 
     | 
    
         
            +
             
     | 
| 
      
 476 
     | 
    
         
            +
            If we've got a directory called `data` with files `a.data` and `b.data`
         
     | 
| 
      
 477 
     | 
    
         
            +
             
     | 
| 
      
 478 
     | 
    
         
            +
            ```
         
     | 
| 
      
 479 
     | 
    
         
            +
            // ./data/a.data
         
     | 
| 
      
 480 
     | 
    
         
            +
            A
         
     | 
| 
      
 481 
     | 
    
         
            +
            ```
         
     | 
| 
      
 482 
     | 
    
         
            +
             
     | 
| 
      
 483 
     | 
    
         
            +
            ```
         
     | 
| 
      
 484 
     | 
    
         
            +
            // ./data/b.data
         
     | 
| 
      
 485 
     | 
    
         
            +
            B
         
     | 
| 
      
 486 
     | 
    
         
            +
            ```
         
     | 
| 
      
 487 
     | 
    
         
            +
             
     | 
| 
      
 488 
     | 
    
         
            +
            ```
         
     | 
| 
      
 489 
     | 
    
         
            +
            // ./file.js.erb
         
     | 
| 
      
 490 
     | 
    
         
            +
            //= depend_on_directory ./data
         
     | 
| 
      
 491 
     | 
    
         
            +
            var a = '<% File.read('data/a.data') %>'
         
     | 
| 
      
 492 
     | 
    
         
            +
            var b = '<% File.read('data/b.data') %>'
         
     | 
| 
      
 493 
     | 
    
         
            +
            ```
         
     | 
| 
      
 494 
     | 
    
         
            +
             
     | 
| 
      
 495 
     | 
    
         
            +
            Would produce:
         
     | 
| 
      
 496 
     | 
    
         
            +
             
     | 
| 
      
 497 
     | 
    
         
            +
            ```js
         
     | 
| 
      
 498 
     | 
    
         
            +
            var a = "A";
         
     | 
| 
      
 499 
     | 
    
         
            +
            var b = "B";
         
     | 
| 
      
 500 
     | 
    
         
            +
            ```
         
     | 
| 
      
 501 
     | 
    
         
            +
             
     | 
| 
      
 502 
     | 
    
         
            +
            You can also see [Index files are proxies for folders](#index-files-are-proxies-for-folders) for another method of organizing folders that will give you more control.
         
     | 
| 
      
 503 
     | 
    
         
            +
             
     | 
| 
       453 
504 
     | 
    
         
             
            ### stub
         
     | 
| 
       454 
505 
     | 
    
         | 
| 
       455 
506 
     | 
    
         
             
            `stub` *path* excludes that asset and its dependencies from the asset bundle.
         
     | 
| 
         @@ -474,7 +525,7 @@ Generated files are cached. If you're using an `ENV` var then 
     | 
|
| 
       474 
525 
     | 
    
         
             
            when you change then ENV var the asset will be forced to
         
     | 
| 
       475 
526 
     | 
    
         
             
            recompile. This behavior is only true for environment variables,
         
     | 
| 
       476 
527 
     | 
    
         
             
            if you are pulling a value from somewhere else, such as a database,
         
     | 
| 
       477 
     | 
    
         
            -
            must manually invalidate the cache to see the change.
         
     | 
| 
      
 528 
     | 
    
         
            +
            you must manually invalidate the cache to see the change.
         
     | 
| 
       478 
529 
     | 
    
         | 
| 
       479 
530 
     | 
    
         
             
            If you're using Rails, there are helpers you can use such as `asset_url`
         
     | 
| 
       480 
531 
     | 
    
         
             
            that will cause a recompile if the value changes.
         
     | 
| 
         @@ -491,9 +542,9 @@ When you modify the `logo.png` on disk, it will force `application.css` to be 
     | 
|
| 
       491 
542 
     | 
    
         
             
            recompiled so that the fingerprint will be correct in the generated asset.
         
     | 
| 
       492 
543 
     | 
    
         | 
| 
       493 
544 
     | 
    
         
             
            You can manually make sprockets depend on any other file that is generated
         
     | 
| 
       494 
     | 
    
         
            -
            by sprockets by using the `depend_on` directive. Rails 
     | 
| 
       495 
     | 
    
         
            -
            feature by auto calling `depend_on` on the original asset 
     | 
| 
       496 
     | 
    
         
            -
            is used inside of an asset.
         
     | 
| 
      
 545 
     | 
    
         
            +
            by sprockets by using the `depend_on` or `depend_on_directory` directive. Rails
         
     | 
| 
      
 546 
     | 
    
         
            +
            implements the above feature by auto calling `depend_on` on the original asset
         
     | 
| 
      
 547 
     | 
    
         
            +
            when the `asset_url` is used inside of an asset.
         
     | 
| 
       497 
548 
     | 
    
         | 
| 
       498 
549 
     | 
    
         
             
            ### Styling with Sass and SCSS
         
     | 
| 
       499 
550 
     | 
    
         | 
    
        data/lib/rake/sprocketstask.rb
    CHANGED
    
    | 
         @@ -69,9 +69,12 @@ module Rake 
     | 
|
| 
       69 
69 
     | 
    
         
             
                #
         
     | 
| 
       70 
70 
     | 
    
         
             
                attr_accessor :assets
         
     | 
| 
       71 
71 
     | 
    
         | 
| 
       72 
     | 
    
         
            -
                #  
     | 
| 
      
 72 
     | 
    
         
            +
                # Minimum number of old assets to keep. See Sprockets::Manifest#clean for more information.
         
     | 
| 
       73 
73 
     | 
    
         
             
                attr_accessor :keep
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
      
 75 
     | 
    
         
            +
                # Assets created within this age will be kept. See Sprockets::Manifest#clean for more information.
         
     | 
| 
      
 76 
     | 
    
         
            +
                attr_accessor :age
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
       75 
78 
     | 
    
         
             
                # Logger to use during rake tasks. Defaults to using stderr.
         
     | 
| 
       76 
79 
     | 
    
         
             
                #
         
     | 
| 
       77 
80 
     | 
    
         
             
                #   t.logger = Logger.new($stdout)
         
     | 
| 
         @@ -103,6 +106,7 @@ module Rake 
     | 
|
| 
       103 
106 
     | 
    
         
             
                  @logger       = Logger.new($stderr)
         
     | 
| 
       104 
107 
     | 
    
         
             
                  @logger.level = Logger::INFO
         
     | 
| 
       105 
108 
     | 
    
         
             
                  @keep         = 2
         
     | 
| 
      
 109 
     | 
    
         
            +
                  @age          = 3600
         
     | 
| 
       106 
110 
     | 
    
         | 
| 
       107 
111 
     | 
    
         
             
                  yield self if block_given?
         
     | 
| 
       108 
112 
     | 
    
         | 
| 
         @@ -130,7 +134,7 @@ module Rake 
     | 
|
| 
       130 
134 
     | 
    
         
             
                  desc name == :assets ? "Clean old assets" : "Clean old #{name} assets"
         
     | 
| 
       131 
135 
     | 
    
         
             
                  task "clean_#{name}" do
         
     | 
| 
       132 
136 
     | 
    
         
             
                    with_logger do
         
     | 
| 
       133 
     | 
    
         
            -
                      manifest.clean(keep)
         
     | 
| 
      
 137 
     | 
    
         
            +
                      manifest.clean(keep, age)
         
     | 
| 
       134 
138 
     | 
    
         
             
                    end
         
     | 
| 
       135 
139 
     | 
    
         
             
                  end
         
     | 
| 
       136 
140 
     | 
    
         | 
| 
         @@ -22,6 +22,7 @@ module Sprockets 
     | 
|
| 
       22 
22 
     | 
    
         
             
                  def initialize(max_size = DEFAULT_MAX_SIZE)
         
     | 
| 
       23 
23 
     | 
    
         
             
                    @max_size = max_size
         
     | 
| 
       24 
24 
     | 
    
         
             
                    @cache = {}
         
     | 
| 
      
 25 
     | 
    
         
            +
                    @mutex = Mutex.new
         
     | 
| 
       25 
26 
     | 
    
         
             
                  end
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
28 
     | 
    
         
             
                  # Public: Retrieve value from cache.
         
     | 
| 
         @@ -32,12 +33,14 @@ module Sprockets 
     | 
|
| 
       32 
33 
     | 
    
         
             
                  #
         
     | 
| 
       33 
34 
     | 
    
         
             
                  # Returns Object or nil or the value is not set.
         
     | 
| 
       34 
35 
     | 
    
         
             
                  def get(key)
         
     | 
| 
       35 
     | 
    
         
            -
                     
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
                       
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                       
     | 
| 
      
 36 
     | 
    
         
            +
                    @mutex.synchronize do
         
     | 
| 
      
 37 
     | 
    
         
            +
                      exists = true
         
     | 
| 
      
 38 
     | 
    
         
            +
                      value = @cache.delete(key) { exists = false }
         
     | 
| 
      
 39 
     | 
    
         
            +
                      if exists
         
     | 
| 
      
 40 
     | 
    
         
            +
                        @cache[key] = value
         
     | 
| 
      
 41 
     | 
    
         
            +
                      else
         
     | 
| 
      
 42 
     | 
    
         
            +
                        nil
         
     | 
| 
      
 43 
     | 
    
         
            +
                      end
         
     | 
| 
       41 
44 
     | 
    
         
             
                    end
         
     | 
| 
       42 
45 
     | 
    
         
             
                  end
         
     | 
| 
       43 
46 
     | 
    
         | 
| 
         @@ -50,9 +53,11 @@ module Sprockets 
     | 
|
| 
       50 
53 
     | 
    
         
             
                  #
         
     | 
| 
       51 
54 
     | 
    
         
             
                  # Returns Object value.
         
     | 
| 
       52 
55 
     | 
    
         
             
                  def set(key, value)
         
     | 
| 
       53 
     | 
    
         
            -
                    @ 
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
      
 56 
     | 
    
         
            +
                    @mutex.synchronize do
         
     | 
| 
      
 57 
     | 
    
         
            +
                      @cache.delete(key)
         
     | 
| 
      
 58 
     | 
    
         
            +
                      @cache[key] = value
         
     | 
| 
      
 59 
     | 
    
         
            +
                      @cache.shift if @cache.size > @max_size
         
     | 
| 
      
 60 
     | 
    
         
            +
                    end
         
     | 
| 
       56 
61 
     | 
    
         
             
                    value
         
     | 
| 
       57 
62 
     | 
    
         
             
                  end
         
     | 
| 
       58 
63 
     | 
    
         | 
| 
         @@ -60,14 +65,18 @@ module Sprockets 
     | 
|
| 
       60 
65 
     | 
    
         
             
                  #
         
     | 
| 
       61 
66 
     | 
    
         
             
                  # Returns String.
         
     | 
| 
       62 
67 
     | 
    
         
             
                  def inspect
         
     | 
| 
       63 
     | 
    
         
            -
                     
     | 
| 
      
 68 
     | 
    
         
            +
                    @mutex.synchronize do
         
     | 
| 
      
 69 
     | 
    
         
            +
                      "#<#{self.class} size=#{@cache.size}/#{@max_size}>"
         
     | 
| 
      
 70 
     | 
    
         
            +
                    end
         
     | 
| 
       64 
71 
     | 
    
         
             
                  end
         
     | 
| 
       65 
72 
     | 
    
         | 
| 
       66 
73 
     | 
    
         
             
                  # Public: Clear the cache
         
     | 
| 
       67 
74 
     | 
    
         
             
                  #
         
     | 
| 
       68 
75 
     | 
    
         
             
                  # Returns true
         
     | 
| 
       69 
76 
     | 
    
         
             
                  def clear(options=nil)
         
     | 
| 
       70 
     | 
    
         
            -
                    @ 
     | 
| 
      
 77 
     | 
    
         
            +
                    @mutex.synchronize do
         
     | 
| 
      
 78 
     | 
    
         
            +
                      @cache.clear
         
     | 
| 
      
 79 
     | 
    
         
            +
                    end
         
     | 
| 
       71 
80 
     | 
    
         
             
                    true
         
     | 
| 
       72 
81 
     | 
    
         
             
                  end
         
     | 
| 
       73 
82 
     | 
    
         
             
                end
         
     | 
| 
         @@ -16,11 +16,11 @@ module Sprockets 
     | 
|
| 
       16 
16 
     | 
    
         
             
                  initialize_configuration(environment)
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
18 
     | 
    
         
             
                  @cache   = environment.cache
         
     | 
| 
       19 
     | 
    
         
            -
                  @stats   =  
     | 
| 
       20 
     | 
    
         
            -
                  @entries =  
     | 
| 
       21 
     | 
    
         
            -
                  @uris    =  
     | 
| 
       22 
     | 
    
         
            -
                  @processor_cache_keys =  
     | 
| 
       23 
     | 
    
         
            -
                  @resolved_dependencies =  
     | 
| 
      
 19 
     | 
    
         
            +
                  @stats   = Concurrent::Map.new
         
     | 
| 
      
 20 
     | 
    
         
            +
                  @entries = Concurrent::Map.new
         
     | 
| 
      
 21 
     | 
    
         
            +
                  @uris    = Concurrent::Map.new
         
     | 
| 
      
 22 
     | 
    
         
            +
                  @processor_cache_keys = Concurrent::Map.new
         
     | 
| 
      
 23 
     | 
    
         
            +
                  @resolved_dependencies = Concurrent::Map.new
         
     | 
| 
       24 
24 
     | 
    
         
             
                end
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
                # No-op return self as cached environment.
         
     | 
| 
         @@ -31,27 +31,27 @@ module Sprockets 
     | 
|
| 
       31 
31 
     | 
    
         | 
| 
       32 
32 
     | 
    
         
             
                # Internal: Cache Environment#entries
         
     | 
| 
       33 
33 
     | 
    
         
             
                def entries(path)
         
     | 
| 
       34 
     | 
    
         
            -
                  @entries 
     | 
| 
      
 34 
     | 
    
         
            +
                  @entries.fetch_or_store(path) { super(path) }
         
     | 
| 
       35 
35 
     | 
    
         
             
                end
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
37 
     | 
    
         
             
                # Internal: Cache Environment#stat
         
     | 
| 
       38 
38 
     | 
    
         
             
                def stat(path)
         
     | 
| 
       39 
     | 
    
         
            -
                  @stats 
     | 
| 
      
 39 
     | 
    
         
            +
                  @stats.fetch_or_store(path) { super(path) }
         
     | 
| 
       40 
40 
     | 
    
         
             
                end
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
       42 
42 
     | 
    
         
             
                # Internal: Cache Environment#load
         
     | 
| 
       43 
43 
     | 
    
         
             
                def load(uri)
         
     | 
| 
       44 
     | 
    
         
            -
                  @uris 
     | 
| 
      
 44 
     | 
    
         
            +
                  @uris.fetch_or_store(uri) { super(uri) }
         
     | 
| 
       45 
45 
     | 
    
         
             
                end
         
     | 
| 
       46 
46 
     | 
    
         | 
| 
       47 
47 
     | 
    
         
             
                # Internal: Cache Environment#processor_cache_key
         
     | 
| 
       48 
48 
     | 
    
         
             
                def processor_cache_key(str)
         
     | 
| 
       49 
     | 
    
         
            -
                  @processor_cache_keys 
     | 
| 
      
 49 
     | 
    
         
            +
                  @processor_cache_keys.fetch_or_store(str) { super(str) }
         
     | 
| 
       50 
50 
     | 
    
         
             
                end
         
     | 
| 
       51 
51 
     | 
    
         | 
| 
       52 
52 
     | 
    
         
             
                # Internal: Cache Environment#resolve_dependency
         
     | 
| 
       53 
53 
     | 
    
         
             
                def resolve_dependency(str)
         
     | 
| 
       54 
     | 
    
         
            -
                  @resolved_dependencies 
     | 
| 
      
 54 
     | 
    
         
            +
                  @resolved_dependencies.fetch_or_store(str) { super(str) }
         
     | 
| 
       55 
55 
     | 
    
         
             
                end
         
     | 
| 
       56 
56 
     | 
    
         | 
| 
       57 
57 
     | 
    
         
             
                private
         
     | 
| 
         @@ -20,7 +20,7 @@ module Sprockets 
     | 
|
| 
       20 
20 
     | 
    
         
             
                def self.call(input)
         
     | 
| 
       21 
21 
     | 
    
         
             
                  data = input[:data]
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
                  js, map = input[:cache].fetch([self.cache_key, data]) do
         
     | 
| 
      
 23 
     | 
    
         
            +
                  js, map = input[:cache].fetch([self.cache_key, data, input[:filename]]) do
         
     | 
| 
       24 
24 
     | 
    
         
             
                    result = Autoload::CoffeeScript.compile(
         
     | 
| 
       25 
25 
     | 
    
         
             
                      data,
         
     | 
| 
       26 
26 
     | 
    
         
             
                      sourceMap: "v3",
         
     | 
| 
         @@ -183,7 +183,7 @@ module Sprockets 
     | 
|
| 
       183 
183 
     | 
    
         
             
                #
         
     | 
| 
       184 
184 
     | 
    
         
             
                # Returns true if the name contains a digest like string and .digested before the extension
         
     | 
| 
       185 
185 
     | 
    
         
             
                def already_digested?(name)
         
     | 
| 
       186 
     | 
    
         
            -
                  return name =~ /-([0-9a- 
     | 
| 
      
 186 
     | 
    
         
            +
                  return name =~ /-([0-9a-zA-Z]{7,128})\.digested/
         
     | 
| 
       187 
187 
     | 
    
         
             
                end
         
     | 
| 
       188 
188 
     | 
    
         | 
| 
       189 
189 
     | 
    
         
             
                private
         
     | 
| 
         @@ -285,6 +285,24 @@ module Sprockets 
     | 
|
| 
       285 
285 
     | 
    
         
             
                    to_load(resolve(path))
         
     | 
| 
       286 
286 
     | 
    
         
             
                  end
         
     | 
| 
       287 
287 
     | 
    
         | 
| 
      
 288 
     | 
    
         
            +
                  # Allows you to state a dependency on a relative directory
         
     | 
| 
      
 289 
     | 
    
         
            +
                  # without including it.
         
     | 
| 
      
 290 
     | 
    
         
            +
                  #
         
     | 
| 
      
 291 
     | 
    
         
            +
                  # This is used for caching purposes. Any changes made to
         
     | 
| 
      
 292 
     | 
    
         
            +
                  # the dependency directory will invalidate the cache of the
         
     | 
| 
      
 293 
     | 
    
         
            +
                  # source file.
         
     | 
| 
      
 294 
     | 
    
         
            +
                  #
         
     | 
| 
      
 295 
     | 
    
         
            +
                  # This is useful if you are using ERB and File.read to pull
         
     | 
| 
      
 296 
     | 
    
         
            +
                  # in contents from multiple files in a directory.
         
     | 
| 
      
 297 
     | 
    
         
            +
                  #
         
     | 
| 
      
 298 
     | 
    
         
            +
                  #     //= depend_on_directory ./data
         
     | 
| 
      
 299 
     | 
    
         
            +
                  #
         
     | 
| 
      
 300 
     | 
    
         
            +
                  def process_depend_on_directory_directive(path = ".", accept = nil)
         
     | 
| 
      
 301 
     | 
    
         
            +
                    path = expand_relative_dirname(:depend_on_directory, path)
         
     | 
| 
      
 302 
     | 
    
         
            +
                    accept = expand_accept_shorthand(accept)
         
     | 
| 
      
 303 
     | 
    
         
            +
                    resolve_paths(*@environment.stat_directory_with_dependencies(path), accept: accept)
         
     | 
| 
      
 304 
     | 
    
         
            +
                  end
         
     | 
| 
      
 305 
     | 
    
         
            +
             
     | 
| 
       288 
306 
     | 
    
         
             
                  # Allows dependency to be excluded from the asset bundle.
         
     | 
| 
       289 
307 
     | 
    
         
             
                  #
         
     | 
| 
       290 
308 
     | 
    
         
             
                  # The `path` must be a valid asset and may or may not already
         
     | 
| 
         @@ -374,7 +392,7 @@ module Sprockets 
     | 
|
| 
       374 
392 
     | 
    
         
             
                      next if subpath == @filename || stat.directory?
         
     | 
| 
       375 
393 
     | 
    
         
             
                      uri, deps = @environment.resolve(subpath, **kargs)
         
     | 
| 
       376 
394 
     | 
    
         
             
                      @dependencies.merge(deps)
         
     | 
| 
       377 
     | 
    
         
            -
                      yield uri if uri
         
     | 
| 
      
 395 
     | 
    
         
            +
                      yield uri if uri && block_given?
         
     | 
| 
       378 
396 
     | 
    
         
             
                    end
         
     | 
| 
       379 
397 
     | 
    
         
             
                  end
         
     | 
| 
       380 
398 
     | 
    
         | 
    
        data/lib/sprockets/exporting.rb
    CHANGED
    
    | 
         @@ -28,11 +28,11 @@ module Sprockets 
     | 
|
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
                # Public: Remove Exporting processor `klass` for `mime_type`.
         
     | 
| 
       30 
30 
     | 
    
         
             
                #
         
     | 
| 
       31 
     | 
    
         
            -
                #     environment.unregister_exporter '*/*', Sprockets::Exporters:: 
     | 
| 
      
 31 
     | 
    
         
            +
                #     environment.unregister_exporter '*/*', Sprockets::Exporters::ZlibExporter
         
     | 
| 
       32 
32 
     | 
    
         
             
                #
         
     | 
| 
       33 
33 
     | 
    
         
             
                # Can be called without a mime type
         
     | 
| 
       34 
34 
     | 
    
         
             
                #
         
     | 
| 
       35 
     | 
    
         
            -
                #     environment.unregister_exporter Sprockets::Exporters:: 
     | 
| 
      
 35 
     | 
    
         
            +
                #     environment.unregister_exporter Sprockets::Exporters::ZlibExporter
         
     | 
| 
       36 
36 
     | 
    
         
             
                #
         
     | 
| 
       37 
37 
     | 
    
         
             
                # Does not remove any exporters that depend on `klass`.
         
     | 
| 
       38 
38 
     | 
    
         
             
                def unregister_exporter(mime_types, exporter = nil)
         
     | 
    
        data/lib/sprockets/path_utils.rb
    CHANGED
    
    
    
        data/lib/sprockets/server.rb
    CHANGED
    
    | 
         @@ -148,39 +148,39 @@ module Sprockets 
     | 
|
| 
       148 
148 
     | 
    
         
             
                  # Returns a 400 Forbidden response tuple
         
     | 
| 
       149 
149 
     | 
    
         
             
                  def bad_request_response(env)
         
     | 
| 
       150 
150 
     | 
    
         
             
                    if head_request?(env)
         
     | 
| 
       151 
     | 
    
         
            -
                      [ 400, { " 
     | 
| 
      
 151 
     | 
    
         
            +
                      [ 400, { "content-type" => "text/plain", "content-length" => "0" }, [] ]
         
     | 
| 
       152 
152 
     | 
    
         
             
                    else
         
     | 
| 
       153 
     | 
    
         
            -
                      [ 400, { " 
     | 
| 
      
 153 
     | 
    
         
            +
                      [ 400, { "content-type" => "text/plain", "content-length" => "11" }, [ "Bad Request" ] ]
         
     | 
| 
       154 
154 
     | 
    
         
             
                    end
         
     | 
| 
       155 
155 
     | 
    
         
             
                  end
         
     | 
| 
       156 
156 
     | 
    
         | 
| 
       157 
157 
     | 
    
         
             
                  # Returns a 403 Forbidden response tuple
         
     | 
| 
       158 
158 
     | 
    
         
             
                  def forbidden_response(env)
         
     | 
| 
       159 
159 
     | 
    
         
             
                    if head_request?(env)
         
     | 
| 
       160 
     | 
    
         
            -
                      [ 403, { " 
     | 
| 
      
 160 
     | 
    
         
            +
                      [ 403, { "content-type" => "text/plain", "content-length" => "0" }, [] ]
         
     | 
| 
       161 
161 
     | 
    
         
             
                    else
         
     | 
| 
       162 
     | 
    
         
            -
                      [ 403, { " 
     | 
| 
      
 162 
     | 
    
         
            +
                      [ 403, { "content-type" => "text/plain", "content-length" => "9" }, [ "Forbidden" ] ]
         
     | 
| 
       163 
163 
     | 
    
         
             
                    end
         
     | 
| 
       164 
164 
     | 
    
         
             
                  end
         
     | 
| 
       165 
165 
     | 
    
         | 
| 
       166 
166 
     | 
    
         
             
                  # Returns a 404 Not Found response tuple
         
     | 
| 
       167 
167 
     | 
    
         
             
                  def not_found_response(env)
         
     | 
| 
       168 
168 
     | 
    
         
             
                    if head_request?(env)
         
     | 
| 
       169 
     | 
    
         
            -
                      [ 404, { " 
     | 
| 
      
 169 
     | 
    
         
            +
                      [ 404, { "content-type" => "text/plain", "content-length" => "0", "x-cascade" => "pass" }, [] ]
         
     | 
| 
       170 
170 
     | 
    
         
             
                    else
         
     | 
| 
       171 
     | 
    
         
            -
                      [ 404, { " 
     | 
| 
      
 171 
     | 
    
         
            +
                      [ 404, { "content-type" => "text/plain", "content-length" => "9", "x-cascade" => "pass" }, [ "Not found" ] ]
         
     | 
| 
       172 
172 
     | 
    
         
             
                    end
         
     | 
| 
       173 
173 
     | 
    
         
             
                  end
         
     | 
| 
       174 
174 
     | 
    
         | 
| 
       175 
175 
     | 
    
         
             
                  def method_not_allowed_response
         
     | 
| 
       176 
     | 
    
         
            -
                    [ 405, { " 
     | 
| 
      
 176 
     | 
    
         
            +
                    [ 405, { "content-type" => "text/plain", "content-length" => "18" }, [ "Method Not Allowed" ] ]
         
     | 
| 
       177 
177 
     | 
    
         
             
                  end
         
     | 
| 
       178 
178 
     | 
    
         | 
| 
       179 
179 
     | 
    
         
             
                  def precondition_failed_response(env)
         
     | 
| 
       180 
180 
     | 
    
         
             
                    if head_request?(env)
         
     | 
| 
       181 
     | 
    
         
            -
                      [ 412, { " 
     | 
| 
      
 181 
     | 
    
         
            +
                      [ 412, { "content-type" => "text/plain", "content-length" => "0", "x-cascade" => "pass" }, [] ]
         
     | 
| 
       182 
182 
     | 
    
         
             
                    else
         
     | 
| 
       183 
     | 
    
         
            -
                      [ 412, { " 
     | 
| 
      
 183 
     | 
    
         
            +
                      [ 412, { "content-type" => "text/plain", "content-length" => "19", "x-cascade" => "pass" }, [ "Precondition Failed" ] ]
         
     | 
| 
       184 
184 
     | 
    
         
             
                    end
         
     | 
| 
       185 
185 
     | 
    
         
             
                  end
         
     | 
| 
       186 
186 
     | 
    
         | 
| 
         @@ -189,7 +189,7 @@ module Sprockets 
     | 
|
| 
       189 
189 
     | 
    
         
             
                  def javascript_exception_response(exception)
         
     | 
| 
       190 
190 
     | 
    
         
             
                    err  = "#{exception.class.name}: #{exception.message}\n  (in #{exception.backtrace[0]})"
         
     | 
| 
       191 
191 
     | 
    
         
             
                    body = "throw Error(#{err.inspect})"
         
     | 
| 
       192 
     | 
    
         
            -
                    [ 200, { " 
     | 
| 
      
 192 
     | 
    
         
            +
                    [ 200, { "content-type" => "application/javascript", "content-length" => body.bytesize.to_s }, [ body ] ]
         
     | 
| 
       193 
193 
     | 
    
         
             
                  end
         
     | 
| 
       194 
194 
     | 
    
         | 
| 
       195 
195 
     | 
    
         
             
                  # Returns a CSS response that hides all elements on the page and
         
     | 
| 
         @@ -242,7 +242,7 @@ module Sprockets 
     | 
|
| 
       242 
242 
     | 
    
         
             
                      }
         
     | 
| 
       243 
243 
     | 
    
         
             
                    CSS
         
     | 
| 
       244 
244 
     | 
    
         | 
| 
       245 
     | 
    
         
            -
                    [ 200, { " 
     | 
| 
      
 245 
     | 
    
         
            +
                    [ 200, { "content-type" => "text/css; charset=utf-8", "content-length" => body.bytesize.to_s }, [ body ] ]
         
     | 
| 
       246 
246 
     | 
    
         
             
                  end
         
     | 
| 
       247 
247 
     | 
    
         | 
| 
       248 
248 
     | 
    
         
             
                  # Escape special characters for use inside a CSS content("...") string
         
     | 
| 
         @@ -258,18 +258,18 @@ module Sprockets 
     | 
|
| 
       258 
258 
     | 
    
         
             
                    headers = {}
         
     | 
| 
       259 
259 
     | 
    
         | 
| 
       260 
260 
     | 
    
         
             
                    # Set caching headers
         
     | 
| 
       261 
     | 
    
         
            -
                    headers[" 
     | 
| 
       262 
     | 
    
         
            -
                    headers[" 
     | 
| 
      
 261 
     | 
    
         
            +
                    headers["cache-control"] = +"public"
         
     | 
| 
      
 262 
     | 
    
         
            +
                    headers["etag"]          = %("#{etag}")
         
     | 
| 
       263 
263 
     | 
    
         | 
| 
       264 
264 
     | 
    
         
             
                    # If the request url contains a fingerprint, set a long
         
     | 
| 
       265 
265 
     | 
    
         
             
                    # expires on the response
         
     | 
| 
       266 
266 
     | 
    
         
             
                    if path_fingerprint(env["PATH_INFO"])
         
     | 
| 
       267 
     | 
    
         
            -
                      headers[" 
     | 
| 
      
 267 
     | 
    
         
            +
                      headers["cache-control"] << ", max-age=31536000, immutable"
         
     | 
| 
       268 
268 
     | 
    
         | 
| 
       269 
269 
     | 
    
         
             
                    # Otherwise set `must-revalidate` since the asset could be modified.
         
     | 
| 
       270 
270 
     | 
    
         
             
                    else
         
     | 
| 
       271 
     | 
    
         
            -
                      headers[" 
     | 
| 
       272 
     | 
    
         
            -
                      headers[" 
     | 
| 
      
 271 
     | 
    
         
            +
                      headers["cache-control"] << ", must-revalidate"
         
     | 
| 
      
 272 
     | 
    
         
            +
                      headers["vary"] = "Accept-Encoding"
         
     | 
| 
       273 
273 
     | 
    
         
             
                    end
         
     | 
| 
       274 
274 
     | 
    
         | 
| 
       275 
275 
     | 
    
         
             
                    headers
         
     | 
| 
         @@ -279,7 +279,7 @@ module Sprockets 
     | 
|
| 
       279 
279 
     | 
    
         
             
                    headers = {}
         
     | 
| 
       280 
280 
     | 
    
         | 
| 
       281 
281 
     | 
    
         
             
                    # Set content length header
         
     | 
| 
       282 
     | 
    
         
            -
                    headers[" 
     | 
| 
      
 282 
     | 
    
         
            +
                    headers["content-length"] = length.to_s
         
     | 
| 
       283 
283 
     | 
    
         | 
| 
       284 
284 
     | 
    
         
             
                    # Set content type header
         
     | 
| 
       285 
285 
     | 
    
         
             
                    if type = asset.content_type
         
     | 
| 
         @@ -287,7 +287,7 @@ module Sprockets 
     | 
|
| 
       287 
287 
     | 
    
         
             
                      if type.start_with?("text/") && asset.charset
         
     | 
| 
       288 
288 
     | 
    
         
             
                        type += "; charset=#{asset.charset}"
         
     | 
| 
       289 
289 
     | 
    
         
             
                      end
         
     | 
| 
       290 
     | 
    
         
            -
                      headers[" 
     | 
| 
      
 290 
     | 
    
         
            +
                      headers["content-type"] = type
         
     | 
| 
       291 
291 
     | 
    
         
             
                    end
         
     | 
| 
       292 
292 
     | 
    
         | 
| 
       293 
293 
     | 
    
         
             
                    headers.merge(cache_headers(env, asset.etag))
         
     | 
| 
         @@ -299,7 +299,7 @@ module Sprockets 
     | 
|
| 
       299 
299 
     | 
    
         
             
                  #     # => "0aa2105d29558f3eb790d411d7d8fb66"
         
     | 
| 
       300 
300 
     | 
    
         
             
                  #
         
     | 
| 
       301 
301 
     | 
    
         
             
                  def path_fingerprint(path)
         
     | 
| 
       302 
     | 
    
         
            -
                    path[/-([0-9a- 
     | 
| 
      
 302 
     | 
    
         
            +
                    path[/-([0-9a-zA-Z]{7,128})\.[^.]+\z/, 1]
         
     | 
| 
       303 
303 
     | 
    
         
             
                  end
         
     | 
| 
       304 
304 
     | 
    
         
             
              end
         
     | 
| 
       305 
305 
     | 
    
         
             
            end
         
     | 
    
        data/lib/sprockets/uri_utils.rb
    CHANGED
    
    
    
        data/lib/sprockets/utils.rb
    CHANGED
    
    | 
         @@ -118,33 +118,38 @@ module Sprockets 
     | 
|
| 
       118 
118 
     | 
    
         
             
                  buf
         
     | 
| 
       119 
119 
     | 
    
         
             
                end
         
     | 
| 
       120 
120 
     | 
    
         | 
| 
      
 121 
     | 
    
         
            +
                MODULE_INCLUDE_MUTEX = Mutex.new
         
     | 
| 
      
 122 
     | 
    
         
            +
                private_constant :MODULE_INCLUDE_MUTEX
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
       121 
124 
     | 
    
         
             
                # Internal: Inject into target module for the duration of the block.
         
     | 
| 
       122 
125 
     | 
    
         
             
                #
         
     | 
| 
       123 
126 
     | 
    
         
             
                # mod - Module
         
     | 
| 
       124 
127 
     | 
    
         
             
                #
         
     | 
| 
       125 
128 
     | 
    
         
             
                # Returns result of block.
         
     | 
| 
       126 
129 
     | 
    
         
             
                def module_include(base, mod)
         
     | 
| 
       127 
     | 
    
         
            -
                   
     | 
| 
      
 130 
     | 
    
         
            +
                  MODULE_INCLUDE_MUTEX.synchronize do
         
     | 
| 
      
 131 
     | 
    
         
            +
                    old_methods = {}
         
     | 
| 
       128 
132 
     | 
    
         | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
             
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
      
 133 
     | 
    
         
            +
                    mod.instance_methods.each do |sym|
         
     | 
| 
      
 134 
     | 
    
         
            +
                      old_methods[sym] = base.instance_method(sym) if base.method_defined?(sym)
         
     | 
| 
      
 135 
     | 
    
         
            +
                    end
         
     | 
| 
       132 
136 
     | 
    
         | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
       134 
     | 
    
         
            -
             
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
      
 137 
     | 
    
         
            +
                    mod.instance_methods.each do |sym|
         
     | 
| 
      
 138 
     | 
    
         
            +
                      method = mod.instance_method(sym)
         
     | 
| 
      
 139 
     | 
    
         
            +
                      if base.method_defined?(sym)
         
     | 
| 
      
 140 
     | 
    
         
            +
                        base.send(:alias_method, sym, sym)
         
     | 
| 
      
 141 
     | 
    
         
            +
                      end
         
     | 
| 
      
 142 
     | 
    
         
            +
                      base.send(:define_method, sym, method)
         
     | 
| 
       137 
143 
     | 
    
         
             
                    end
         
     | 
| 
       138 
     | 
    
         
            -
                    base.send(:define_method, sym, method)
         
     | 
| 
       139 
     | 
    
         
            -
                  end
         
     | 
| 
       140 
144 
     | 
    
         | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
             
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
       144 
     | 
    
         
            -
             
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
      
 145 
     | 
    
         
            +
                    yield
         
     | 
| 
      
 146 
     | 
    
         
            +
                  ensure
         
     | 
| 
      
 147 
     | 
    
         
            +
                    mod.instance_methods.each do |sym|
         
     | 
| 
      
 148 
     | 
    
         
            +
                      base.send(:undef_method, sym) if base.method_defined?(sym)
         
     | 
| 
      
 149 
     | 
    
         
            +
                    end
         
     | 
| 
      
 150 
     | 
    
         
            +
                    old_methods.each do |sym, method|
         
     | 
| 
      
 151 
     | 
    
         
            +
                      base.send(:define_method, sym, method)
         
     | 
| 
      
 152 
     | 
    
         
            +
                    end
         
     | 
| 
       148 
153 
     | 
    
         
             
                  end
         
     | 
| 
       149 
154 
     | 
    
         
             
                end
         
     | 
| 
       150 
155 
     | 
    
         | 
    
        data/lib/sprockets/version.rb
    CHANGED
    
    
    
        data/lib/sprockets.rb
    CHANGED
    
    | 
         @@ -51,6 +51,7 @@ module Sprockets 
     | 
|
| 
       51 
51 
     | 
    
         
             
              register_mime_type 'application/json', extensions: ['.json'], charset: :unicode
         
     | 
| 
       52 
52 
     | 
    
         
             
              register_mime_type 'application/ruby', extensions: ['.rb']
         
     | 
| 
       53 
53 
     | 
    
         
             
              register_mime_type 'application/xml', extensions: ['.xml']
         
     | 
| 
      
 54 
     | 
    
         
            +
              register_mime_type 'application/manifest+json', extensions: ['.webmanifest']
         
     | 
| 
       54 
55 
     | 
    
         
             
              register_mime_type 'text/css', extensions: ['.css'], charset: :css
         
     | 
| 
       55 
56 
     | 
    
         
             
              register_mime_type 'text/html', extensions: ['.html', '.htm'], charset: :html
         
     | 
| 
       56 
57 
     | 
    
         
             
              register_mime_type 'text/plain', extensions: ['.txt', '.text']
         
     | 
| 
         @@ -89,7 +90,7 @@ module Sprockets 
     | 
|
| 
       89 
90 
     | 
    
         
             
              register_mime_type 'application/font-woff2', extensions: ['.woff2']
         
     | 
| 
       90 
91 
     | 
    
         | 
| 
       91 
92 
     | 
    
         
             
              require 'sprockets/source_map_processor'
         
     | 
| 
       92 
     | 
    
         
            -
              register_mime_type 'application/js-sourcemap+json', extensions: ['.js.map']
         
     | 
| 
      
 93 
     | 
    
         
            +
              register_mime_type 'application/js-sourcemap+json', extensions: ['.js.map'], charset: :unicode
         
     | 
| 
       93 
94 
     | 
    
         
             
              register_mime_type 'application/css-sourcemap+json', extensions: ['.css.map']
         
     | 
| 
       94 
95 
     | 
    
         
             
              register_transformer 'application/javascript', 'application/js-sourcemap+json', SourceMapProcessor
         
     | 
| 
       95 
96 
     | 
    
         
             
              register_transformer 'text/css', 'application/css-sourcemap+json', SourceMapProcessor
         
     | 
| 
         @@ -180,6 +181,7 @@ module Sprockets 
     | 
|
| 
       180 
181 
     | 
    
         
             
                application/ecmascript-6
         
     | 
| 
       181 
182 
     | 
    
         
             
                application/javascript
         
     | 
| 
       182 
183 
     | 
    
         
             
                application/json
         
     | 
| 
      
 184 
     | 
    
         
            +
                application/manifest+json
         
     | 
| 
       183 
185 
     | 
    
         
             
                application/xml
         
     | 
| 
       184 
186 
     | 
    
         
             
                text/coffeescript
         
     | 
| 
       185 
187 
     | 
    
         
             
                text/css
         
     | 
| 
         @@ -189,6 +191,7 @@ module Sprockets 
     | 
|
| 
       189 
191 
     | 
    
         
             
                text/scss
         
     | 
| 
       190 
192 
     | 
    
         
             
                text/yaml
         
     | 
| 
       191 
193 
     | 
    
         
             
                text/eco
         
     | 
| 
      
 194 
     | 
    
         
            +
                text/ejs
         
     | 
| 
       192 
195 
     | 
    
         
             
              ), 'application/\2+ruby', '.erb', ERBProcessor)
         
     | 
| 
       193 
196 
     | 
    
         | 
| 
       194 
197 
     | 
    
         
             
              register_mime_type 'application/html+ruby', extensions: ['.html.erb', '.erb', '.rhtml'], charset: :html
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: sprockets
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 4.0 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 4.2.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Sam Stephenson
         
     | 
| 
         @@ -9,28 +9,28 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire:
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2022- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2022-12-20 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: rack
         
     | 
| 
       16 
16 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       17 
17 
     | 
    
         
             
                requirements:
         
     | 
| 
       18 
     | 
    
         
            -
                - - " 
     | 
| 
      
 18 
     | 
    
         
            +
                - - ">="
         
     | 
| 
       19 
19 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       20 
     | 
    
         
            -
                    version:  
     | 
| 
      
 20 
     | 
    
         
            +
                    version: 2.2.4
         
     | 
| 
       21 
21 
     | 
    
         
             
                - - "<"
         
     | 
| 
       22 
22 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       23 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 23 
     | 
    
         
            +
                    version: '4'
         
     | 
| 
       24 
24 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       25 
25 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       26 
26 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       27 
27 
     | 
    
         
             
                requirements:
         
     | 
| 
       28 
     | 
    
         
            -
                - - " 
     | 
| 
      
 28 
     | 
    
         
            +
                - - ">="
         
     | 
| 
       29 
29 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       30 
     | 
    
         
            -
                    version:  
     | 
| 
      
 30 
     | 
    
         
            +
                    version: 2.2.4
         
     | 
| 
       31 
31 
     | 
    
         
             
                - - "<"
         
     | 
| 
       32 
32 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       33 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 33 
     | 
    
         
            +
                    version: '4'
         
     | 
| 
       34 
34 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       35 
35 
     | 
    
         
             
              name: concurrent-ruby
         
     | 
| 
       36 
36 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -219,14 +219,14 @@ dependencies: 
     | 
|
| 
       219 
219 
     | 
    
         
             
                requirements:
         
     | 
| 
       220 
220 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       221 
221 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       222 
     | 
    
         
            -
                    version:  
     | 
| 
      
 222 
     | 
    
         
            +
                    version: 2.0.0
         
     | 
| 
       223 
223 
     | 
    
         
             
              type: :development
         
     | 
| 
       224 
224 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       225 
225 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       226 
226 
     | 
    
         
             
                requirements:
         
     | 
| 
       227 
227 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       228 
228 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       229 
     | 
    
         
            -
                    version:  
     | 
| 
      
 229 
     | 
    
         
            +
                    version: 2.0.0
         
     | 
| 
       230 
230 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       231 
231 
     | 
    
         
             
              name: rake
         
     | 
| 
       232 
232 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -438,7 +438,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       438 
438 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       439 
439 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       440 
440 
     | 
    
         
             
            requirements: []
         
     | 
| 
       441 
     | 
    
         
            -
            rubygems_version: 3. 
     | 
| 
      
 441 
     | 
    
         
            +
            rubygems_version: 3.3.7
         
     | 
| 
       442 
442 
     | 
    
         
             
            signing_key:
         
     | 
| 
       443 
443 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       444 
444 
     | 
    
         
             
            summary: Rack-based asset packaging system
         
     |