sprockets 4.0.0.beta7 → 4.0.1
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 +24 -2
- data/README.md +44 -11
- data/lib/sprockets.rb +5 -5
- data/lib/sprockets/asset.rb +9 -2
- data/lib/sprockets/base.rb +10 -10
- data/lib/sprockets/cache/file_store.rb +4 -2
- data/lib/sprockets/directive_processor.rb +2 -2
- data/lib/sprockets/environment.rb +2 -2
- data/lib/sprockets/erb_processor.rb +6 -1
- data/lib/sprockets/exporters/base.rb +0 -1
- data/lib/sprockets/http_utils.rb +5 -3
- data/lib/sprockets/loader.rb +59 -51
- data/lib/sprockets/manifest.rb +1 -1
- data/lib/sprockets/manifest_utils.rb +8 -3
- data/lib/sprockets/path_utils.rb +1 -1
- data/lib/sprockets/processor_utils.rb +0 -20
- data/lib/sprockets/resolve.rb +1 -1
- data/lib/sprockets/sassc_compressor.rb +25 -3
- data/lib/sprockets/sassc_processor.rb +232 -5
- data/lib/sprockets/server.rb +2 -2
- data/lib/sprockets/source_map_utils.rb +16 -14
- data/lib/sprockets/uri_utils.rb +5 -3
- data/lib/sprockets/version.rb +1 -1
- metadata +38 -17
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 7bbf26f3dfff9a86ca4b4407072f1786fafed4040a2f3f25c875842dc834bdcf
         | 
| 4 | 
            +
              data.tar.gz: 5a6dd07a6568dca18b5d1eca850a1e3a78030c20a6530781d8a16ac31c25649c
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: fa3fb386fe8ded820388ff86e1b505736dadcf5e072fedc124c8635955af70df9db7386ce66f4e2d4f412c652e88df9c8dc93a451ac31b2982f0457393911202
         | 
| 7 | 
            +
              data.tar.gz: 3dde983e601b16c7b4bc71343543c69b7b8787b70daaaad711bc45ec47b4dd53507d67f6b6a9c1f8de1a7069bfbc12f72c96a0eaa088f976187fe9d4ca8f78f8
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -2,7 +2,30 @@ | |
| 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 | 
            -
            ##  | 
| 5 | 
            +
            ## 4.0.1
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            - Fix for Ruby 2.7 keyword arguments warning in `base.rb`. [#660](https://github.com/rails/sprockets/pull/660)
         | 
| 8 | 
            +
            - Fix for when `x_sprockets_linecount` is missing from a source map.
         | 
| 9 | 
            +
            - Fix subresource integrity to match the digest of the asset.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            ## 4.0.0
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            - Fixes for Ruby 2.7 keyword arguments warnings [#625](https://github.com/rails/sprockets/pull/625)
         | 
| 14 | 
            +
            - Manifest files are sorted alphabetically [#626](https://github.com/rails/sprockets/pull/626)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            ## 4.0.0.beta10
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            - Fix YACB (Yet Another Caching Bug) [Fix broken expansion of asset link paths](https://github.com/rails/sprockets/pull/614)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            ## 4.0.0.beta9
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            - Minimum Ruby version for Sprockets 4 is now 2.5+ which matches minimum ruby verision of Rails [#604]
         | 
| 23 | 
            +
            - Fix threading bug introduced in Sprockets 4 [#603]
         | 
| 24 | 
            +
            - Warn when two potential manifest files exist. [#560]
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            ## 4.0.0.beta8
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            - Security release for [CVE-2018-3760](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-3760)
         | 
| 6 29 |  | 
| 7 30 | 
             
            ## 4.0.0.beta7
         | 
| 8 31 |  | 
| @@ -47,4 +70,3 @@ Get upgrade notes from Sprockets 3.x to 4.x at https://github.com/rails/sprocket | |
| 47 70 | 
             
            - Initial release of Sprockets 4
         | 
| 48 71 |  | 
| 49 72 | 
             
            Please upgrade to the latest Sprockets 3 version before upgrading to Sprockets 4. Check the 3.x branch for previous changes https://github.com/rails/sprockets/blob/3.x/CHANGELOG.md.
         | 
| 50 | 
            -
             | 
    
        data/README.md
    CHANGED
    
    | @@ -115,9 +115,9 @@ Here is a list of the available directives: | |
| 115 115 | 
             
            - [`require_self`](#require_self) - Change order of where current contents are concatenated to current
         | 
| 116 116 | 
             
            - [`require_directory`](#require_directory) - Add contents of each file in a folder to current
         | 
| 117 117 | 
             
            - [`require_tree`](#require_tree) - Add contents of all files in all directories in a path to current
         | 
| 118 | 
            -
            - [`link`](#link) - Make target file compile and be  | 
| 119 | 
            -
            - [`link_directory`](#link_directory) - Make target directory compile and be  | 
| 120 | 
            -
            - [`link_tree`](#link_tree) - Make target tree compile and be  | 
| 118 | 
            +
            - [`link`](#link) - Make target file compile and be publicly available without adding contents to current
         | 
| 119 | 
            +
            - [`link_directory`](#link_directory) - Make target directory compile and be publicly available without adding contents to current
         | 
| 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 122 | 
             
            - [`stub`](#stub) - Ignore target file
         | 
| 123 123 |  | 
| @@ -363,37 +363,70 @@ directory specified by *path*. | |
| 363 363 | 
             
            ### link
         | 
| 364 364 |  | 
| 365 365 | 
             
            `link` *path* declares a dependency on the target *path* and adds it to a list
         | 
| 366 | 
            -
            of subdependencies to  | 
| 366 | 
            +
            of subdependencies to be compiled when the asset is written out to
         | 
| 367 367 | 
             
            disk.
         | 
| 368 368 |  | 
| 369 369 | 
             
            Example:
         | 
| 370 370 |  | 
| 371 | 
            -
            If you've got a `manifest.js` file and you want to  | 
| 372 | 
            -
            generated and made available to the public you can link it  | 
| 371 | 
            +
            If you've got a `manifest.js` file and you want to specify that a `admin.js` source file should be
         | 
| 372 | 
            +
            generated and made available to the public you can link it by including this in the `manifest.js` file:
         | 
| 373 373 |  | 
| 374 374 | 
             
            ```
         | 
| 375 375 | 
             
            //= link admin.js
         | 
| 376 376 | 
             
            ```
         | 
| 377 377 |  | 
| 378 | 
            +
            The argument to `link` is a _logical path_, that is it will be resolved according to the
         | 
| 379 | 
            +
            configured asset load paths. See [Accesing Assets](#accessing-assets) above. A path relative to
         | 
| 380 | 
            +
            the current file won't work, it must be a logical path.
         | 
| 381 | 
            +
             | 
| 382 | 
            +
            **Caution**: the "link" directive should always have an explicit extension on the end.
         | 
| 383 | 
            +
             | 
| 378 384 | 
             
            ### link_directory
         | 
| 379 385 |  | 
| 380 | 
            -
            `link_directory` *path* links all the files inside the directory specified by the *path | 
| 386 | 
            +
            `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.
         | 
| 387 | 
            +
             | 
| 388 | 
            +
            Files in subdirectories will not be linked (Compare to [link_tree](#link_tree)).
         | 
| 389 | 
            +
             | 
| 390 | 
            +
            The *path* argument to `link_directory` is _not_ a logical path (it does not use the asset load paths), but is a path relative to the file the `link_directory` directive is found in, and can use `..` to  . For instance, you might want:
         | 
| 391 | 
            +
             | 
| 392 | 
            +
            ```js
         | 
| 393 | 
            +
            //= link_directory ../stylesheets
         | 
| 394 | 
            +
            ```
         | 
| 395 | 
            +
             | 
| 396 | 
            +
            `link_directory` can take an optional second argument with an extension or content-type, with the
         | 
| 397 | 
            +
            two arguments separated by a space:
         | 
| 398 | 
            +
             | 
| 399 | 
            +
            ```js
         | 
| 400 | 
            +
            //= link_directory ../stylesheets text/css
         | 
| 401 | 
            +
            //= link_directory ../more_stylesheets .css
         | 
| 402 | 
            +
            ```
         | 
| 403 | 
            +
             | 
| 404 | 
            +
            This will limit the matching files to link to only files recognized as that type. An extension is
         | 
| 405 | 
            +
            just a shortcut for the type referenced, it does not need to match the source file exactly, but
         | 
| 406 | 
            +
            instead identifies the content-type the source file must be recognized as.
         | 
| 381 407 |  | 
| 382 408 | 
             
            ### link_tree
         | 
| 383 409 |  | 
| 384 | 
            -
            `link_tree` *path* works like  | 
| 410 | 
            +
            `link_tree` *path* works like [link_directory](#link_directory), but operates
         | 
| 385 411 | 
             
            recursively to link all files in all subdirectories of the
         | 
| 386 412 | 
             
            directory specified by *path*.
         | 
| 387 413 |  | 
| 388 414 | 
             
            Example:
         | 
| 389 415 |  | 
| 390 | 
            -
             | 
| 416 | 
            +
            ```js
         | 
| 417 | 
            +
            //= link_tree ./path/to/folder
         | 
| 418 | 
            +
            ```
         | 
| 419 | 
            +
             | 
| 420 | 
            +
            Like `link_directory`, the argument is path relative to the current file, it is *not* a 'logical path' tresolved against load paths.
         | 
| 421 | 
            +
             | 
| 422 | 
            +
             | 
| 423 | 
            +
            As with `link_directory`, you can also specify a second argument -- separated by a space --  so any extra files not matching the content-type specified will be ignored:
         | 
| 391 424 |  | 
| 392 425 | 
             
            ```js
         | 
| 393 | 
            -
            //= link_tree path/to/folder  | 
| 426 | 
            +
            //= link_tree ./path/to/folder text/javascript
         | 
| 427 | 
            +
            //= link_tree ./path/to/other_folder .js
         | 
| 394 428 | 
             
            ```
         | 
| 395 429 |  | 
| 396 | 
            -
            > Note: There is an intentional space between the path and the extension
         | 
| 397 430 |  | 
| 398 431 | 
             
            ### depend_on
         | 
| 399 432 |  | 
    
        data/lib/sprockets.rb
    CHANGED
    
    | @@ -119,8 +119,8 @@ module Sprockets | |
| 119 119 | 
             
              register_bundle_processor 'application/javascript', Bundle
         | 
| 120 120 | 
             
              register_bundle_processor 'text/css', Bundle
         | 
| 121 121 |  | 
| 122 | 
            -
              register_bundle_metadata_reducer '*/*', :data, proc {  | 
| 123 | 
            -
              register_bundle_metadata_reducer 'application/javascript', :data, proc {  | 
| 122 | 
            +
              register_bundle_metadata_reducer '*/*', :data, proc { +"" }, :concat
         | 
| 123 | 
            +
              register_bundle_metadata_reducer 'application/javascript', :data, proc { +"" }, Utils.method(:concat_javascript_sources)
         | 
| 124 124 | 
             
              register_bundle_metadata_reducer '*/*', :links, :+
         | 
| 125 125 | 
             
              register_bundle_metadata_reducer '*/*', :sources, proc { [] }, :+
         | 
| 126 126 |  | 
| @@ -165,11 +165,11 @@ module Sprockets | |
| 165 165 | 
             
              register_transformer 'application/javascript+function', 'application/javascript', JstProcessor
         | 
| 166 166 |  | 
| 167 167 | 
             
              # CSS processors
         | 
| 168 | 
            -
              require 'sprockets/ | 
| 168 | 
            +
              require 'sprockets/sassc_processor'
         | 
| 169 169 | 
             
              register_mime_type 'text/sass', extensions: ['.sass', '.css.sass']
         | 
| 170 170 | 
             
              register_mime_type 'text/scss', extensions: ['.scss', '.css.scss']
         | 
| 171 | 
            -
              register_transformer 'text/sass', 'text/css',  | 
| 172 | 
            -
              register_transformer 'text/scss', 'text/css',  | 
| 171 | 
            +
              register_transformer 'text/sass', 'text/css', SasscProcessor
         | 
| 172 | 
            +
              register_transformer 'text/scss', 'text/css', ScsscProcessor
         | 
| 173 173 | 
             
              register_preprocessor 'text/sass', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
         | 
| 174 174 | 
             
              register_preprocessor 'text/scss', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
         | 
| 175 175 | 
             
              register_bundle_metadata_reducer 'text/css', :sass_dependencies, Set.new, :+
         | 
    
        data/lib/sprockets/asset.rb
    CHANGED
    
    | @@ -123,13 +123,20 @@ module Sprockets | |
| 123 123 | 
             
                  metadata[:digest]
         | 
| 124 124 | 
             
                end
         | 
| 125 125 |  | 
| 126 | 
            +
                # Private: Return the version of the environment where the asset was generated.
         | 
| 127 | 
            +
                def environment_version
         | 
| 128 | 
            +
                  metadata[:environment_version]
         | 
| 129 | 
            +
                end
         | 
| 130 | 
            +
             | 
| 126 131 | 
             
                # Public: Returns String hexdigest of source.
         | 
| 127 132 | 
             
                def hexdigest
         | 
| 128 133 | 
             
                  DigestUtils.pack_hexdigest(digest)
         | 
| 129 134 | 
             
                end
         | 
| 130 135 |  | 
| 131 136 | 
             
                # Pubic: ETag String of Asset.
         | 
| 132 | 
            -
                 | 
| 137 | 
            +
                def etag
         | 
| 138 | 
            +
                  DigestUtils.pack_hexdigest(environment_version + digest)
         | 
| 139 | 
            +
                end
         | 
| 133 140 |  | 
| 134 141 | 
             
                # Public: Returns String base64 digest of source.
         | 
| 135 142 | 
             
                def base64digest
         | 
| @@ -138,7 +145,7 @@ module Sprockets | |
| 138 145 |  | 
| 139 146 | 
             
                # Public: A "named information" URL for subresource integrity.
         | 
| 140 147 | 
             
                def integrity
         | 
| 141 | 
            -
                  DigestUtils.integrity_uri( | 
| 148 | 
            +
                  DigestUtils.integrity_uri(digest)
         | 
| 142 149 | 
             
                end
         | 
| 143 150 |  | 
| 144 151 | 
             
                # Public: Add enumerator to allow `Asset` instances to be used as Rack
         | 
    
        data/lib/sprockets/base.rb
    CHANGED
    
    | @@ -19,12 +19,12 @@ module Sprockets | |
| 19 19 |  | 
| 20 20 | 
             
              class DoubleLinkError < Sprockets::Error
         | 
| 21 21 | 
             
                def initialize(parent_filename:, logical_path:, last_filename:, filename:)
         | 
| 22 | 
            -
                   | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
                   | 
| 22 | 
            +
                  super <<~MSG
         | 
| 23 | 
            +
                    Multiple files with the same output path cannot be linked (#{logical_path.inspect})
         | 
| 24 | 
            +
                    In #{parent_filename.inspect} these files were linked:
         | 
| 25 | 
            +
                      - #{last_filename}
         | 
| 26 | 
            +
                      - #{filename}
         | 
| 27 | 
            +
                  MSG
         | 
| 28 28 | 
             
                end
         | 
| 29 29 | 
             
              end
         | 
| 30 30 |  | 
| @@ -75,8 +75,8 @@ module Sprockets | |
| 75 75 | 
             
                end
         | 
| 76 76 |  | 
| 77 77 | 
             
                # Find asset by logical path or expanded path.
         | 
| 78 | 
            -
                def find_asset(*args)
         | 
| 79 | 
            -
                  uri, _ = resolve(*args)
         | 
| 78 | 
            +
                def find_asset(*args, **options)
         | 
| 79 | 
            +
                  uri, _ = resolve(*args, **options)
         | 
| 80 80 | 
             
                  if uri
         | 
| 81 81 | 
             
                    load(uri)
         | 
| 82 82 | 
             
                  end
         | 
| @@ -115,8 +115,8 @@ module Sprockets | |
| 115 115 | 
             
                #
         | 
| 116 116 | 
             
                #     environment['application.js']
         | 
| 117 117 | 
             
                #
         | 
| 118 | 
            -
                def [](*args)
         | 
| 119 | 
            -
                  find_asset(*args)
         | 
| 118 | 
            +
                def [](*args, **options)
         | 
| 119 | 
            +
                  find_asset(*args, **options)
         | 
| 120 120 | 
             
                end
         | 
| 121 121 |  | 
| 122 122 | 
             
                # Find asset by logical path or expanded path.
         | 
| @@ -137,8 +137,10 @@ module Sprockets | |
| 137 137 | 
             
                  #
         | 
| 138 138 | 
             
                  # Returns true
         | 
| 139 139 | 
             
                  def clear(options=nil)
         | 
| 140 | 
            -
                     | 
| 141 | 
            -
             | 
| 140 | 
            +
                    if File.exist?(@root)
         | 
| 141 | 
            +
                      root_dirs = Dir.entries(@root).reject { |f| (EXCLUDED_DIRS + GITKEEP_FILES).include?(f) }
         | 
| 142 | 
            +
                      FileUtils.rm_r(root_dirs.collect{ |f| File.join(@root, f) })
         | 
| 143 | 
            +
                    end
         | 
| 142 144 | 
             
                    true
         | 
| 143 145 | 
             
                  end
         | 
| 144 146 |  | 
| @@ -121,7 +121,7 @@ module Sprockets | |
| 121 121 |  | 
| 122 122 | 
             
                    header, directives = extract_directives(header)
         | 
| 123 123 |  | 
| 124 | 
            -
                    data =  | 
| 124 | 
            +
                    data = +""
         | 
| 125 125 | 
             
                    data.force_encoding(body.encoding)
         | 
| 126 126 | 
             
                    data << header unless header.empty?
         | 
| 127 127 | 
             
                    data << body
         | 
| @@ -139,7 +139,7 @@ module Sprockets | |
| 139 139 | 
             
                  #     [[1, "require", "foo"], [2, "require", "bar"]]
         | 
| 140 140 | 
             
                  #
         | 
| 141 141 | 
             
                  def extract_directives(header)
         | 
| 142 | 
            -
                    processed_header =  | 
| 142 | 
            +
                    processed_header = +""
         | 
| 143 143 | 
             
                    directives = []
         | 
| 144 144 |  | 
| 145 145 | 
             
                    header.lines.each_with_index do |line, index|
         | 
| @@ -18,7 +18,12 @@ class Sprockets::ERBProcessor | |
| 18 18 | 
             
              end
         | 
| 19 19 |  | 
| 20 20 | 
             
              def call(input)
         | 
| 21 | 
            -
                 | 
| 21 | 
            +
                match = ERB.version.match(/\Aerb\.rb \[(?<version>[^ ]+) /)
         | 
| 22 | 
            +
                if match && match[:version] >= "2.2.0" # Ruby 2.6+
         | 
| 23 | 
            +
                  engine = ::ERB.new(input[:data], trim_mode: '<>')
         | 
| 24 | 
            +
                else
         | 
| 25 | 
            +
                  engine = ::ERB.new(input[:data], nil, '<>')
         | 
| 26 | 
            +
                end
         | 
| 22 27 | 
             
                engine.filename = input[:filename]
         | 
| 23 28 |  | 
| 24 29 | 
             
                context = input[:environment].context_class.new(input)
         | 
    
        data/lib/sprockets/http_utils.rb
    CHANGED
    
    | @@ -86,14 +86,16 @@ module Sprockets | |
| 86 86 | 
             
                    raise TypeError, "unknown q_values type: #{q_values.class}"
         | 
| 87 87 | 
             
                  end
         | 
| 88 88 |  | 
| 89 | 
            +
                  i = 0
         | 
| 89 90 | 
             
                  q_values.each do |accepted, quality|
         | 
| 90 91 | 
             
                    if match = available.find { |option| matcher.call(option, accepted) }
         | 
| 91 | 
            -
                       | 
| 92 | 
            +
                      i += 1
         | 
| 93 | 
            +
                      matches << [-quality, i, match]
         | 
| 92 94 | 
             
                    end
         | 
| 93 95 | 
             
                  end
         | 
| 94 96 |  | 
| 95 | 
            -
                  matches. | 
| 96 | 
            -
                  matches.map! { | | 
| 97 | 
            +
                  matches.sort!
         | 
| 98 | 
            +
                  matches.map! { |_, _, match| match }
         | 
| 97 99 | 
             
                  matches
         | 
| 98 100 | 
             
                end
         | 
| 99 101 |  | 
    
        data/lib/sprockets/loader.rb
    CHANGED
    
    | @@ -64,6 +64,43 @@ module Sprockets | |
| 64 64 | 
             
                end
         | 
| 65 65 |  | 
| 66 66 | 
             
                private
         | 
| 67 | 
            +
                  def compress_key_from_hash(hash, key)
         | 
| 68 | 
            +
                    return unless hash.key?(key)
         | 
| 69 | 
            +
                    value = hash[key].dup
         | 
| 70 | 
            +
                    return if !value
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    if block_given?
         | 
| 73 | 
            +
                      value.map! do |x|
         | 
| 74 | 
            +
                        if yield x
         | 
| 75 | 
            +
                         compress_from_root(x)
         | 
| 76 | 
            +
                        else
         | 
| 77 | 
            +
                         x
         | 
| 78 | 
            +
                        end
         | 
| 79 | 
            +
                      end
         | 
| 80 | 
            +
                    else
         | 
| 81 | 
            +
                      value.map! { |x| compress_from_root(x) }
         | 
| 82 | 
            +
                    end
         | 
| 83 | 
            +
                    hash[key] = value
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
             | 
| 87 | 
            +
                  def expand_key_from_hash(hash, key)
         | 
| 88 | 
            +
                    return unless hash.key?(key)
         | 
| 89 | 
            +
                    value = hash[key].dup
         | 
| 90 | 
            +
                    return if !value
         | 
| 91 | 
            +
                    if block_given?
         | 
| 92 | 
            +
                      value.map! do |x|
         | 
| 93 | 
            +
                        if yield x
         | 
| 94 | 
            +
                          expand_from_root(x)
         | 
| 95 | 
            +
                        else
         | 
| 96 | 
            +
                          x
         | 
| 97 | 
            +
                        end
         | 
| 98 | 
            +
                      end
         | 
| 99 | 
            +
                    else
         | 
| 100 | 
            +
                      value.map! { |x| expand_from_root(x) }
         | 
| 101 | 
            +
                    end
         | 
| 102 | 
            +
                    hash[key] = value
         | 
| 103 | 
            +
                  end
         | 
| 67 104 |  | 
| 68 105 | 
             
                  # Internal: Load asset hash from cache
         | 
| 69 106 | 
             
                  #
         | 
| @@ -77,17 +114,17 @@ module Sprockets | |
| 77 114 | 
             
                      asset[:uri]       = expand_from_root(asset[:uri])
         | 
| 78 115 | 
             
                      asset[:load_path] = expand_from_root(asset[:load_path])
         | 
| 79 116 | 
             
                      asset[:filename]  = expand_from_root(asset[:filename])
         | 
| 80 | 
            -
                      asset[:metadata] | 
| 81 | 
            -
                      asset[:metadata] | 
| 82 | 
            -
                      asset[:metadata] | 
| 83 | 
            -
                      asset[:metadata] | 
| 84 | 
            -
                      asset[:metadata] | 
| 85 | 
            -
                      asset[:metadata] | 
| 86 | 
            -
                      asset[:metadata] | 
| 117 | 
            +
                      expand_key_from_hash(asset[:metadata], :included)
         | 
| 118 | 
            +
                      expand_key_from_hash(asset[:metadata], :links)
         | 
| 119 | 
            +
                      expand_key_from_hash(asset[:metadata], :stubbed)
         | 
| 120 | 
            +
                      expand_key_from_hash(asset[:metadata], :required)
         | 
| 121 | 
            +
                      expand_key_from_hash(asset[:metadata], :to_load)
         | 
| 122 | 
            +
                      expand_key_from_hash(asset[:metadata], :to_link)
         | 
| 123 | 
            +
                      expand_key_from_hash(asset[:metadata], :dependencies) { |uri| uri.start_with?("file-digest://") }
         | 
| 87 124 |  | 
| 88 125 | 
             
                      asset[:metadata].each_key do |k|
         | 
| 89 | 
            -
                        next unless k | 
| 90 | 
            -
                        asset[:metadata] | 
| 126 | 
            +
                        next unless k.match?(/_dependencies\z/) # rubocop:disable Performance/EndWith
         | 
| 127 | 
            +
                        expand_key_from_hash(asset[:metadata], k)
         | 
| 91 128 | 
             
                      end
         | 
| 92 129 | 
             
                    end
         | 
| 93 130 | 
             
                    asset
         | 
| @@ -158,14 +195,16 @@ module Sprockets | |
| 158 195 | 
             
                      source = result.delete(:data)
         | 
| 159 196 | 
             
                      metadata = result
         | 
| 160 197 | 
             
                      metadata[:charset] = source.encoding.name.downcase unless metadata.key?(:charset)
         | 
| 161 | 
            -
                      metadata[:digest]  = digest( | 
| 198 | 
            +
                      metadata[:digest]  = digest(source)
         | 
| 162 199 | 
             
                      metadata[:length]  = source.bytesize
         | 
| 200 | 
            +
                      metadata[:environment_version] = version
         | 
| 163 201 | 
             
                    else
         | 
| 164 202 | 
             
                      dependencies << build_file_digest_uri(unloaded.filename)
         | 
| 165 203 | 
             
                      metadata = {
         | 
| 166 204 | 
             
                        digest: file_digest(unloaded.filename),
         | 
| 167 205 | 
             
                        length: self.stat(unloaded.filename).size,
         | 
| 168 | 
            -
                        dependencies: dependencies
         | 
| 206 | 
            +
                        dependencies: dependencies,
         | 
| 207 | 
            +
                        environment_version: version,
         | 
| 169 208 | 
             
                      }
         | 
| 170 209 | 
             
                    end
         | 
| 171 210 |  | 
| @@ -205,48 +244,17 @@ module Sprockets | |
| 205 244 | 
             
                    if cached_asset[:metadata]
         | 
| 206 245 | 
             
                      # Deep dup to avoid modifying `asset`
         | 
| 207 246 | 
             
                      cached_asset[:metadata] = cached_asset[:metadata].dup
         | 
| 208 | 
            -
                       | 
| 209 | 
            -
             | 
| 210 | 
            -
             | 
| 211 | 
            -
                       | 
| 212 | 
            -
             | 
| 213 | 
            -
                       | 
| 214 | 
            -
             | 
| 215 | 
            -
                        cached_asset[:metadata][:links].map! { |uri| compress_from_root(uri) }
         | 
| 216 | 
            -
                      end
         | 
| 217 | 
            -
             | 
| 218 | 
            -
                      if cached_asset[:metadata][:stubbed] && !cached_asset[:metadata][:stubbed].empty?
         | 
| 219 | 
            -
                        cached_asset[:metadata][:stubbed] = cached_asset[:metadata][:stubbed].dup
         | 
| 220 | 
            -
                        cached_asset[:metadata][:stubbed].map! { |uri| compress_from_root(uri) }
         | 
| 221 | 
            -
                      end
         | 
| 222 | 
            -
             | 
| 223 | 
            -
                      if cached_asset[:metadata][:required] && !cached_asset[:metadata][:required].empty?
         | 
| 224 | 
            -
                        cached_asset[:metadata][:required] = cached_asset[:metadata][:required].dup
         | 
| 225 | 
            -
                        cached_asset[:metadata][:required].map! { |uri| compress_from_root(uri) }
         | 
| 226 | 
            -
                      end
         | 
| 227 | 
            -
             | 
| 228 | 
            -
                      if cached_asset[:metadata][:to_load] && !cached_asset[:metadata][:to_load].empty?
         | 
| 229 | 
            -
                        cached_asset[:metadata][:to_load] = cached_asset[:metadata][:to_load].dup
         | 
| 230 | 
            -
                        cached_asset[:metadata][:to_load].map! { |uri| compress_from_root(uri) }
         | 
| 231 | 
            -
                      end
         | 
| 232 | 
            -
             | 
| 233 | 
            -
                      if cached_asset[:metadata][:to_link] && !cached_asset[:metadata][:to_link].empty?
         | 
| 234 | 
            -
                        cached_asset[:metadata][:to_link] = cached_asset[:metadata][:to_link].dup
         | 
| 235 | 
            -
                        cached_asset[:metadata][:to_link].map! { |uri| compress_from_root(uri) }
         | 
| 236 | 
            -
                      end
         | 
| 237 | 
            -
             | 
| 238 | 
            -
                      if cached_asset[:metadata][:dependencies] && !cached_asset[:metadata][:dependencies].empty?
         | 
| 239 | 
            -
                        cached_asset[:metadata][:dependencies] = cached_asset[:metadata][:dependencies].dup
         | 
| 240 | 
            -
                        cached_asset[:metadata][:dependencies].map! do |uri|
         | 
| 241 | 
            -
                          uri.start_with?("file-digest://".freeze) ? compress_from_root(uri) : uri
         | 
| 242 | 
            -
                        end
         | 
| 243 | 
            -
                      end
         | 
| 247 | 
            +
                      compress_key_from_hash(cached_asset[:metadata], :included)
         | 
| 248 | 
            +
                      compress_key_from_hash(cached_asset[:metadata], :links)
         | 
| 249 | 
            +
                      compress_key_from_hash(cached_asset[:metadata], :stubbed)
         | 
| 250 | 
            +
                      compress_key_from_hash(cached_asset[:metadata], :required)
         | 
| 251 | 
            +
                      compress_key_from_hash(cached_asset[:metadata], :to_load)
         | 
| 252 | 
            +
                      compress_key_from_hash(cached_asset[:metadata], :to_link)
         | 
| 253 | 
            +
                      compress_key_from_hash(cached_asset[:metadata], :dependencies) { |uri| uri.start_with?("file-digest://") }
         | 
| 244 254 |  | 
| 245 | 
            -
                      # compress all _dependencies in metadata like `sass_dependencies`
         | 
| 246 255 | 
             
                      cached_asset[:metadata].each do |key, value|
         | 
| 247 | 
            -
                        next unless key | 
| 248 | 
            -
                        cached_asset[:metadata] | 
| 249 | 
            -
                        cached_asset[:metadata][key].map! {|uri| compress_from_root(uri) }
         | 
| 256 | 
            +
                        next unless key.match?(/_dependencies\z/) # rubocop:disable Performance/EndWith
         | 
| 257 | 
            +
                        compress_key_from_hash(cached_asset[:metadata], key)
         | 
| 250 258 | 
             
                      end
         | 
| 251 259 | 
             
                    end
         | 
| 252 260 |  | 
    
        data/lib/sprockets/manifest.rb
    CHANGED
    
    | @@ -53,7 +53,7 @@ module Sprockets | |
| 53 53 |  | 
| 54 54 | 
             
                  # If directory is given w/o filename, pick a random manifest location
         | 
| 55 55 | 
             
                  if @directory && @filename.nil?
         | 
| 56 | 
            -
                    @filename = find_directory_manifest(@directory)
         | 
| 56 | 
            +
                    @filename = find_directory_manifest(@directory, logger)
         | 
| 57 57 | 
             
                  end
         | 
| 58 58 |  | 
| 59 59 | 
             
                  unless @directory && @filename
         | 
| @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 | 
             
            require 'securerandom'
         | 
| 3 | 
            +
            require 'logger'
         | 
| 3 4 |  | 
| 4 5 | 
             
            module Sprockets
         | 
| 5 6 | 
             
              # Public: Manifest utilities.
         | 
| @@ -33,10 +34,14 @@ module Sprockets | |
| 33 34 | 
             
                #     # => "/app/public/assets/.sprockets-manifest-abc123.json"
         | 
| 34 35 | 
             
                #
         | 
| 35 36 | 
             
                # Returns String filename.
         | 
| 36 | 
            -
                def find_directory_manifest(dirname)
         | 
| 37 | 
            +
                def find_directory_manifest(dirname, logger = Logger.new($stderr))
         | 
| 37 38 | 
             
                  entries = File.directory?(dirname) ? Dir.entries(dirname) : []
         | 
| 38 | 
            -
                   | 
| 39 | 
            -
             | 
| 39 | 
            +
                  manifest_entries = entries.select { |e| e =~ MANIFEST_RE }
         | 
| 40 | 
            +
                  if manifest_entries.length > 1
         | 
| 41 | 
            +
                    manifest_entries.sort!
         | 
| 42 | 
            +
                    logger.warn("Found multiple manifests: #{manifest_entries}. Choosing the first alphabetically: #{manifest_entries.first}")
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                  entry = manifest_entries.first || generate_manifest_path
         | 
| 40 45 | 
             
                  File.join(dirname, entry)
         | 
| 41 46 | 
             
                end
         | 
| 42 47 | 
             
              end
         | 
    
        data/lib/sprockets/path_utils.rb
    CHANGED
    
    | @@ -98,7 +98,7 @@ module Sprockets | |
| 98 98 | 
             
                #
         | 
| 99 99 | 
             
                # Returns true if path is relative, otherwise false.
         | 
| 100 100 | 
             
                def relative_path?(path)
         | 
| 101 | 
            -
                  path | 
| 101 | 
            +
                  path.match?(/^\.\.?($|#{SEPARATOR_PATTERN})/) ? true : false
         | 
| 102 102 | 
             
                end
         | 
| 103 103 |  | 
| 104 104 | 
             
                # Public: Get relative path from `start` to `dest`.
         | 
| @@ -161,29 +161,9 @@ module Sprockets | |
| 161 161 | 
             
                    if !key.instance_of?(Symbol)
         | 
| 162 162 | 
             
                      raise TypeError, "processor metadata[#{key.inspect}] expected to be a Symbol"
         | 
| 163 163 | 
             
                    end
         | 
| 164 | 
            -
             | 
| 165 | 
            -
                    if !valid_processor_metadata_value?(value)
         | 
| 166 | 
            -
                      raise TypeError, "processor metadata[:#{key}] returned a complex type: #{value.inspect}\n" +
         | 
| 167 | 
            -
                        "Only #{VALID_METADATA_TYPES.to_a.join(", ")} maybe used."
         | 
| 168 | 
            -
                    end
         | 
| 169 164 | 
             
                  end
         | 
| 170 165 |  | 
| 171 166 | 
             
                  result
         | 
| 172 167 | 
             
                end
         | 
| 173 | 
            -
             | 
| 174 | 
            -
                # Internal: Validate object is in validate metadata whitelist.
         | 
| 175 | 
            -
                #
         | 
| 176 | 
            -
                # value - Any Object
         | 
| 177 | 
            -
                #
         | 
| 178 | 
            -
                # Returns true if class is in whitelist otherwise false.
         | 
| 179 | 
            -
                def valid_processor_metadata_value?(value)
         | 
| 180 | 
            -
                  if VALID_METADATA_VALUE_TYPES_HASH[value.class]
         | 
| 181 | 
            -
                    true
         | 
| 182 | 
            -
                  elsif VALID_METADATA_COMPOUND_TYPES_HASH[value.class]
         | 
| 183 | 
            -
                    value.all? { |v| valid_processor_metadata_value?(v) }
         | 
| 184 | 
            -
                  else
         | 
| 185 | 
            -
                    false
         | 
| 186 | 
            -
                  end
         | 
| 187 | 
            -
                end
         | 
| 188 168 | 
             
              end
         | 
| 189 169 | 
             
            end
         | 
    
        data/lib/sprockets/resolve.rb
    CHANGED
    
    | @@ -47,7 +47,7 @@ module Sprockets | |
| 47 47 | 
             
                  uri, deps = resolve(path, **kargs)
         | 
| 48 48 |  | 
| 49 49 | 
             
                  unless uri
         | 
| 50 | 
            -
                    message =  | 
| 50 | 
            +
                    message = +"couldn't find file '#{path}'"
         | 
| 51 51 |  | 
| 52 52 | 
             
                    if relative_path?(path) && kargs[:base_path]
         | 
| 53 53 | 
             
                      load_path, _ = paths_split(config[:paths], kargs[:base_path])
         | 
| @@ -1,10 +1,32 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 | 
             
            require 'sprockets/autoload'
         | 
| 3 | 
            -
            require 'sprockets/ | 
| 4 | 
            -
            require 'base64'
         | 
| 3 | 
            +
            require 'sprockets/source_map_utils'
         | 
| 5 4 |  | 
| 6 5 | 
             
            module Sprockets
         | 
| 7 | 
            -
               | 
| 6 | 
            +
              # Public: Sass CSS minifier.
         | 
| 7 | 
            +
              #
         | 
| 8 | 
            +
              # To accept the default options
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              #     environment.register_bundle_processor 'text/css',
         | 
| 11 | 
            +
              #       Sprockets::SasscCompressor
         | 
| 12 | 
            +
              #
         | 
| 13 | 
            +
              # Or to pass options to the Sass::Engine class.
         | 
| 14 | 
            +
              #
         | 
| 15 | 
            +
              #     environment.register_bundle_processor 'text/css',
         | 
| 16 | 
            +
              #       Sprockets::SasscCompressor.new({ ... })
         | 
| 17 | 
            +
              #
         | 
| 18 | 
            +
              class SasscCompressor
         | 
| 19 | 
            +
                # Public: Return singleton instance with default options.
         | 
| 20 | 
            +
                #
         | 
| 21 | 
            +
                # Returns SasscCompressor object.
         | 
| 22 | 
            +
                def self.instance
         | 
| 23 | 
            +
                  @instance ||= new
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def self.call(input)
         | 
| 27 | 
            +
                  instance.call(input)
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 8 30 | 
             
                def initialize(options = {})
         | 
| 9 31 | 
             
                  @options = {
         | 
| 10 32 | 
             
                    syntax: :scss,
         | 
| @@ -1,17 +1,49 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 | 
            -
            require ' | 
| 3 | 
            -
            require 'sprockets/ | 
| 4 | 
            -
            require ' | 
| 2 | 
            +
            require 'rack/utils'
         | 
| 3 | 
            +
            require 'sprockets/autoload'
         | 
| 4 | 
            +
            require 'sprockets/source_map_utils'
         | 
| 5 | 
            +
            require 'uri'
         | 
| 5 6 |  | 
| 6 7 | 
             
            module Sprockets
         | 
| 7 | 
            -
              class  | 
| 8 | 
            +
              # Processor engine class for the SASS/SCSS compiler. Depends on the `sassc` gem.
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              # For more infomation see:
         | 
| 11 | 
            +
              #
         | 
| 12 | 
            +
              #   https://github.com/sass/sassc-ruby
         | 
| 13 | 
            +
              #   https://github.com/sass/sassc-rails
         | 
| 14 | 
            +
              #
         | 
| 15 | 
            +
              class SasscProcessor
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                # Internal: Defines default sass syntax to use. Exposed so the ScsscProcessor
         | 
| 18 | 
            +
                # may override it.
         | 
| 19 | 
            +
                def self.syntax
         | 
| 20 | 
            +
                  :sass
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                # Public: Return singleton instance with default options.
         | 
| 24 | 
            +
                #
         | 
| 25 | 
            +
                # Returns SasscProcessor object.
         | 
| 26 | 
            +
                def self.instance
         | 
| 27 | 
            +
                  @instance ||= new
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def self.call(input)
         | 
| 31 | 
            +
                  instance.call(input)
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def self.cache_key
         | 
| 35 | 
            +
                  instance.cache_key
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                attr_reader :cache_key
         | 
| 39 | 
            +
             | 
| 8 40 | 
             
                def initialize(options = {}, &block)
         | 
| 9 41 | 
             
                  @cache_version = options[:cache_version]
         | 
| 10 42 | 
             
                  @cache_key = "#{self.class.name}:#{VERSION}:#{Autoload::SassC::VERSION}:#{@cache_version}".freeze
         | 
| 11 43 | 
             
                  @importer_class = options[:importer]
         | 
| 12 44 | 
             
                  @sass_config = options[:sass_config] || {}
         | 
| 13 45 | 
             
                  @functions = Module.new do
         | 
| 14 | 
            -
                    include  | 
| 46 | 
            +
                    include Functions
         | 
| 15 47 | 
             
                    include options[:functions] if options[:functions]
         | 
| 16 48 | 
             
                    class_eval(&block) if block_given?
         | 
| 17 49 | 
             
                  end
         | 
| @@ -43,6 +75,201 @@ module Sprockets | |
| 43 75 |  | 
| 44 76 | 
             
                private
         | 
| 45 77 |  | 
| 78 | 
            +
                def merge_options(options)
         | 
| 79 | 
            +
                  defaults = @sass_config.dup
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  if load_paths = defaults.delete(:load_paths)
         | 
| 82 | 
            +
                    options[:load_paths] += load_paths
         | 
| 83 | 
            +
                  end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  options.merge!(defaults)
         | 
| 86 | 
            +
                  options
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                # Public: Functions injected into Sass context during Sprockets evaluation.
         | 
| 90 | 
            +
                #
         | 
| 91 | 
            +
                # This module may be extended to add global functionality to all Sprockets
         | 
| 92 | 
            +
                # Sass environments. Though, scoping your functions to just your environment
         | 
| 93 | 
            +
                # is preferred.
         | 
| 94 | 
            +
                #
         | 
| 95 | 
            +
                # module Sprockets::SasscProcessor::Functions
         | 
| 96 | 
            +
                #   def asset_path(path, options = {})
         | 
| 97 | 
            +
                #   end
         | 
| 98 | 
            +
                # end
         | 
| 99 | 
            +
                #
         | 
| 100 | 
            +
                module Functions
         | 
| 101 | 
            +
                  # Public: Generate a url for asset path.
         | 
| 102 | 
            +
                  #
         | 
| 103 | 
            +
                  # Default implementation is deprecated. Currently defaults to
         | 
| 104 | 
            +
                  # Context#asset_path.
         | 
| 105 | 
            +
                  #
         | 
| 106 | 
            +
                  # Will raise NotImplementedError in the future. Users should provide their
         | 
| 107 | 
            +
                  # own base implementation.
         | 
| 108 | 
            +
                  #
         | 
| 109 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 110 | 
            +
                  def asset_path(path, options = {})
         | 
| 111 | 
            +
                    path = path.value
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                    path, _, query, fragment = URI.split(path)[5..8]
         | 
| 114 | 
            +
                    path     = sprockets_context.asset_path(path, options)
         | 
| 115 | 
            +
                    query    = "?#{query}" if query
         | 
| 116 | 
            +
                    fragment = "##{fragment}" if fragment
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                    Autoload::SassC::Script::Value::String.new("#{path}#{query}#{fragment}", :string)
         | 
| 119 | 
            +
                  end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                  # Public: Generate a asset url() link.
         | 
| 122 | 
            +
                  #
         | 
| 123 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 124 | 
            +
                  #
         | 
| 125 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 126 | 
            +
                  def asset_url(path, options = {})
         | 
| 127 | 
            +
                    Autoload::SassC::Script::Value::String.new("url(#{asset_path(path, options).value})")
         | 
| 128 | 
            +
                  end
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                  # Public: Generate url for image path.
         | 
| 131 | 
            +
                  #
         | 
| 132 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 133 | 
            +
                  #
         | 
| 134 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 135 | 
            +
                  def image_path(path)
         | 
| 136 | 
            +
                    asset_path(path, type: :image)
         | 
| 137 | 
            +
                  end
         | 
| 138 | 
            +
             | 
| 139 | 
            +
                  # Public: Generate a image url() link.
         | 
| 140 | 
            +
                  #
         | 
| 141 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 142 | 
            +
                  #
         | 
| 143 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 144 | 
            +
                  def image_url(path)
         | 
| 145 | 
            +
                    asset_url(path, type: :image)
         | 
| 146 | 
            +
                  end
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                  # Public: Generate url for video path.
         | 
| 149 | 
            +
                  #
         | 
| 150 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 151 | 
            +
                  #
         | 
| 152 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 153 | 
            +
                  def video_path(path)
         | 
| 154 | 
            +
                    asset_path(path, type: :video)
         | 
| 155 | 
            +
                  end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                  # Public: Generate a video url() link.
         | 
| 158 | 
            +
                  #
         | 
| 159 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 160 | 
            +
                  #
         | 
| 161 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 162 | 
            +
                  def video_url(path)
         | 
| 163 | 
            +
                    asset_url(path, type: :video)
         | 
| 164 | 
            +
                  end
         | 
| 165 | 
            +
             | 
| 166 | 
            +
                  # Public: Generate url for audio path.
         | 
| 167 | 
            +
                  #
         | 
| 168 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 169 | 
            +
                  #
         | 
| 170 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 171 | 
            +
                  def audio_path(path)
         | 
| 172 | 
            +
                    asset_path(path, type: :audio)
         | 
| 173 | 
            +
                  end
         | 
| 174 | 
            +
             | 
| 175 | 
            +
                  # Public: Generate a audio url() link.
         | 
| 176 | 
            +
                  #
         | 
| 177 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 178 | 
            +
                  #
         | 
| 179 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 180 | 
            +
                  def audio_url(path)
         | 
| 181 | 
            +
                    asset_url(path, type: :audio)
         | 
| 182 | 
            +
                  end
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                  # Public: Generate url for font path.
         | 
| 185 | 
            +
                  #
         | 
| 186 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 187 | 
            +
                  #
         | 
| 188 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 189 | 
            +
                  def font_path(path)
         | 
| 190 | 
            +
                    asset_path(path, type: :font)
         | 
| 191 | 
            +
                  end
         | 
| 192 | 
            +
             | 
| 193 | 
            +
                  # Public: Generate a font url() link.
         | 
| 194 | 
            +
                  #
         | 
| 195 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 196 | 
            +
                  #
         | 
| 197 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 198 | 
            +
                  def font_url(path)
         | 
| 199 | 
            +
                    asset_url(path, type: :font)
         | 
| 200 | 
            +
                  end
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                  # Public: Generate url for javascript path.
         | 
| 203 | 
            +
                  #
         | 
| 204 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 205 | 
            +
                  #
         | 
| 206 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 207 | 
            +
                  def javascript_path(path)
         | 
| 208 | 
            +
                    asset_path(path, type: :javascript)
         | 
| 209 | 
            +
                  end
         | 
| 210 | 
            +
             | 
| 211 | 
            +
                  # Public: Generate a javascript url() link.
         | 
| 212 | 
            +
                  #
         | 
| 213 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 214 | 
            +
                  #
         | 
| 215 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 216 | 
            +
                  def javascript_url(path)
         | 
| 217 | 
            +
                    asset_url(path, type: :javascript)
         | 
| 218 | 
            +
                  end
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                  # Public: Generate url for stylesheet path.
         | 
| 221 | 
            +
                  #
         | 
| 222 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 223 | 
            +
                  #
         | 
| 224 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 225 | 
            +
                  def stylesheet_path(path)
         | 
| 226 | 
            +
                    asset_path(path, type: :stylesheet)
         | 
| 227 | 
            +
                  end
         | 
| 228 | 
            +
             | 
| 229 | 
            +
                  # Public: Generate a stylesheet url() link.
         | 
| 230 | 
            +
                  #
         | 
| 231 | 
            +
                  # path - SassC::Script::Value::String URL path
         | 
| 232 | 
            +
                  #
         | 
| 233 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 234 | 
            +
                  def stylesheet_url(path)
         | 
| 235 | 
            +
                    asset_url(path, type: :stylesheet)
         | 
| 236 | 
            +
                  end
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                  # Public: Generate a data URI for asset path.
         | 
| 239 | 
            +
                  #
         | 
| 240 | 
            +
                  # path - SassC::Script::Value::String logical asset path
         | 
| 241 | 
            +
                  #
         | 
| 242 | 
            +
                  # Returns a SassC::Script::Value::String.
         | 
| 243 | 
            +
                  def asset_data_url(path)
         | 
| 244 | 
            +
                    url = sprockets_context.asset_data_uri(path.value)
         | 
| 245 | 
            +
                    Autoload::SassC::Script::Value::String.new("url(" + url + ")")
         | 
| 246 | 
            +
                  end
         | 
| 247 | 
            +
             | 
| 248 | 
            +
                  protected
         | 
| 249 | 
            +
                    # Public: The Environment.
         | 
| 250 | 
            +
                    #
         | 
| 251 | 
            +
                    # Returns Sprockets::Environment.
         | 
| 252 | 
            +
                    def sprockets_environment
         | 
| 253 | 
            +
                      options[:sprockets][:environment]
         | 
| 254 | 
            +
                    end
         | 
| 255 | 
            +
             | 
| 256 | 
            +
                    # Public: Mutatable set of dependencies.
         | 
| 257 | 
            +
                    #
         | 
| 258 | 
            +
                    # Returns a Set.
         | 
| 259 | 
            +
                    def sprockets_dependencies
         | 
| 260 | 
            +
                      options[:sprockets][:dependencies]
         | 
| 261 | 
            +
                    end
         | 
| 262 | 
            +
             | 
| 263 | 
            +
                    # Deprecated: Get the Context instance. Use APIs on
         | 
| 264 | 
            +
                    # sprockets_environment or sprockets_dependencies directly.
         | 
| 265 | 
            +
                    #
         | 
| 266 | 
            +
                    # Returns a Context instance.
         | 
| 267 | 
            +
                    def sprockets_context
         | 
| 268 | 
            +
                      options[:sprockets][:context]
         | 
| 269 | 
            +
                    end
         | 
| 270 | 
            +
             | 
| 271 | 
            +
                end
         | 
| 272 | 
            +
             | 
| 46 273 | 
             
                def engine_options(input, context)
         | 
| 47 274 | 
             
                  merge_options({
         | 
| 48 275 | 
             
                    filename: input[:filename],
         | 
    
        data/lib/sprockets/server.rb
    CHANGED
    
    | @@ -114,7 +114,7 @@ module Sprockets | |
| 114 114 | 
             
                    #
         | 
| 115 115 | 
             
                    #     http://example.org/assets/../../../etc/passwd
         | 
| 116 116 | 
             
                    #
         | 
| 117 | 
            -
                    path.include?("..") || absolute_path?(path)
         | 
| 117 | 
            +
                    path.include?("..") || absolute_path?(path) || path.include?("://")
         | 
| 118 118 | 
             
                  end
         | 
| 119 119 |  | 
| 120 120 | 
             
                  def head_request?(env)
         | 
| @@ -248,7 +248,7 @@ module Sprockets | |
| 248 248 | 
             
                    headers = {}
         | 
| 249 249 |  | 
| 250 250 | 
             
                    # Set caching headers
         | 
| 251 | 
            -
                    headers["Cache-Control"] =  | 
| 251 | 
            +
                    headers["Cache-Control"] = +"public"
         | 
| 252 252 | 
             
                    headers["ETag"]          = %("#{etag}")
         | 
| 253 253 |  | 
| 254 254 | 
             
                    # If the request url contains a fingerprint, set a long
         | 
| @@ -78,7 +78,7 @@ module Sprockets | |
| 78 78 | 
             
                  offset = 0
         | 
| 79 79 | 
             
                  if a["sections"].count != 0 && !a["sections"].last["map"]["mappings"].empty?
         | 
| 80 80 | 
             
                    last_line_count = a["sections"].last["map"].delete("x_sprockets_linecount")
         | 
| 81 | 
            -
                    offset += last_line_count
         | 
| 81 | 
            +
                    offset += last_line_count || 1
         | 
| 82 82 |  | 
| 83 83 | 
             
                    last_offset = a["sections"].last["offset"]["line"]
         | 
| 84 84 | 
             
                    offset += last_offset
         | 
| @@ -428,21 +428,23 @@ module Sprockets | |
| 428 428 | 
             
                # Returns an Array of Integers.
         | 
| 429 429 | 
             
                def vlq_decode(str)
         | 
| 430 430 | 
             
                  result = []
         | 
| 431 | 
            -
                   | 
| 432 | 
            -
                   | 
| 433 | 
            -
             | 
| 434 | 
            -
             | 
| 435 | 
            -
             | 
| 436 | 
            -
                     | 
| 437 | 
            -
             | 
| 438 | 
            -
             | 
| 439 | 
            -
             | 
| 440 | 
            -
                       | 
| 441 | 
            -
             | 
| 442 | 
            -
                      vlq   += digit << shift
         | 
| 431 | 
            +
                  shift = 0
         | 
| 432 | 
            +
                  value = 0
         | 
| 433 | 
            +
                  i = 0
         | 
| 434 | 
            +
             | 
| 435 | 
            +
                  while i < str.size do
         | 
| 436 | 
            +
                    digit = BASE64_VALUES[str[i]]
         | 
| 437 | 
            +
                    raise ArgumentError unless digit
         | 
| 438 | 
            +
                    continuation = (digit & VLQ_CONTINUATION_BIT) != 0
         | 
| 439 | 
            +
                    digit &= VLQ_BASE_MASK
         | 
| 440 | 
            +
                      value += digit << shift
         | 
| 441 | 
            +
                    if continuation
         | 
| 443 442 | 
             
                      shift += VLQ_BASE_SHIFT
         | 
| 443 | 
            +
                    else
         | 
| 444 | 
            +
                      result << ((value & 1) == 1 ? -(value >> 1) : value >> 1)
         | 
| 445 | 
            +
                      value = shift = 0
         | 
| 444 446 | 
             
                    end
         | 
| 445 | 
            -
                     | 
| 447 | 
            +
                    i += 1
         | 
| 446 448 | 
             
                  end
         | 
| 447 449 | 
             
                  result
         | 
| 448 450 | 
             
                end
         | 
    
        data/lib/sprockets/uri_utils.rb
    CHANGED
    
    | @@ -48,8 +48,10 @@ module Sprockets | |
| 48 48 | 
             
                  path = URI::Generic::DEFAULT_PARSER.unescape(path)
         | 
| 49 49 | 
             
                  path.force_encoding(Encoding::UTF_8)
         | 
| 50 50 |  | 
| 51 | 
            -
                  # Hack for parsing Windows " | 
| 52 | 
            -
                  path | 
| 51 | 
            +
                  # Hack for parsing Windows "/C:/Users/IEUser" paths
         | 
| 52 | 
            +
                  if File::ALT_SEPARATOR && path[2] == ':'
         | 
| 53 | 
            +
                    path = path[1..-1]
         | 
| 54 | 
            +
                  end
         | 
| 53 55 |  | 
| 54 56 | 
             
                  [scheme, host, path, query]
         | 
| 55 57 | 
             
                end
         | 
| @@ -58,7 +60,7 @@ module Sprockets | |
| 58 60 | 
             
                #
         | 
| 59 61 | 
             
                # Returns String.
         | 
| 60 62 | 
             
                def join_file_uri(scheme, host, path, query)
         | 
| 61 | 
            -
                  str =  | 
| 63 | 
            +
                  str = +"#{scheme}://"
         | 
| 62 64 | 
             
                  str << host if host
         | 
| 63 65 | 
             
                  path = "/#{path}" unless path.start_with?("/".freeze)
         | 
| 64 66 | 
             
                  str << URI::Generic::DEFAULT_PARSER.escape(path)
         | 
    
        data/lib/sprockets/version.rb
    CHANGED
    
    
    
        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.0.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Sam Stephenson
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2020-06-05 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rack
         | 
| @@ -171,6 +171,20 @@ dependencies: | |
| 171 171 | 
             
                - - "~>"
         | 
| 172 172 | 
             
                  - !ruby/object:Gem::Version
         | 
| 173 173 | 
             
                    version: '1.1'
         | 
| 174 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 175 | 
            +
              name: timecop
         | 
| 176 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 177 | 
            +
                requirements:
         | 
| 178 | 
            +
                - - "~>"
         | 
| 179 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 180 | 
            +
                    version: 0.9.1
         | 
| 181 | 
            +
              type: :development
         | 
| 182 | 
            +
              prerelease: false
         | 
| 183 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 184 | 
            +
                requirements:
         | 
| 185 | 
            +
                - - "~>"
         | 
| 186 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 187 | 
            +
                    version: 0.9.1
         | 
| 174 188 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 175 189 | 
             
              name: minitest
         | 
| 176 190 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -219,14 +233,14 @@ dependencies: | |
| 219 233 | 
             
                requirements:
         | 
| 220 234 | 
             
                - - "~>"
         | 
| 221 235 | 
             
                  - !ruby/object:Gem::Version
         | 
| 222 | 
            -
                    version: ' | 
| 236 | 
            +
                    version: '12.0'
         | 
| 223 237 | 
             
              type: :development
         | 
| 224 238 | 
             
              prerelease: false
         | 
| 225 239 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 226 240 | 
             
                requirements:
         | 
| 227 241 | 
             
                - - "~>"
         | 
| 228 242 | 
             
                  - !ruby/object:Gem::Version
         | 
| 229 | 
            -
                    version: ' | 
| 243 | 
            +
                    version: '12.0'
         | 
| 230 244 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 231 245 | 
             
              name: sass
         | 
| 232 246 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -245,20 +259,14 @@ dependencies: | |
| 245 259 | 
             
              name: sassc
         | 
| 246 260 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 247 261 | 
             
                requirements:
         | 
| 248 | 
            -
                - - " | 
| 249 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 250 | 
            -
                    version: 1.10.1
         | 
| 251 | 
            -
                - - "<"
         | 
| 262 | 
            +
                - - "~>"
         | 
| 252 263 | 
             
                  - !ruby/object:Gem::Version
         | 
| 253 264 | 
             
                    version: '2.0'
         | 
| 254 265 | 
             
              type: :development
         | 
| 255 266 | 
             
              prerelease: false
         | 
| 256 267 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 257 268 | 
             
                requirements:
         | 
| 258 | 
            -
                - - " | 
| 259 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 260 | 
            -
                    version: 1.10.1
         | 
| 261 | 
            -
                - - "<"
         | 
| 269 | 
            +
                - - "~>"
         | 
| 262 270 | 
             
                  - !ruby/object:Gem::Version
         | 
| 263 271 | 
             
                    version: '2.0'
         | 
| 264 272 | 
             
            - !ruby/object:Gem::Dependency
         | 
| @@ -303,6 +311,20 @@ dependencies: | |
| 303 311 | 
             
                - - "~>"
         | 
| 304 312 | 
             
                  - !ruby/object:Gem::Version
         | 
| 305 313 | 
             
                    version: 0.0.4
         | 
| 314 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 315 | 
            +
              name: rubocop-performance
         | 
| 316 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 317 | 
            +
                requirements:
         | 
| 318 | 
            +
                - - "~>"
         | 
| 319 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 320 | 
            +
                    version: '1.3'
         | 
| 321 | 
            +
              type: :development
         | 
| 322 | 
            +
              prerelease: false
         | 
| 323 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 324 | 
            +
                requirements:
         | 
| 325 | 
            +
                - - "~>"
         | 
| 326 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 327 | 
            +
                    version: '1.3'
         | 
| 306 328 | 
             
            description: Sprockets is a Rack-based asset packaging system that concatenates and
         | 
| 307 329 | 
             
              serves JavaScript, CoffeeScript, CSS, Sass, and SCSS.
         | 
| 308 330 | 
             
            email:
         | 
| @@ -408,15 +430,14 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 408 430 | 
             
              requirements:
         | 
| 409 431 | 
             
              - - ">="
         | 
| 410 432 | 
             
                - !ruby/object:Gem::Version
         | 
| 411 | 
            -
                  version: 2. | 
| 433 | 
            +
                  version: 2.5.0
         | 
| 412 434 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 413 435 | 
             
              requirements:
         | 
| 414 | 
            -
              - - " | 
| 436 | 
            +
              - - ">="
         | 
| 415 437 | 
             
                - !ruby/object:Gem::Version
         | 
| 416 | 
            -
                  version:  | 
| 438 | 
            +
                  version: '0'
         | 
| 417 439 | 
             
            requirements: []
         | 
| 418 | 
            -
             | 
| 419 | 
            -
            rubygems_version: 2.7.6
         | 
| 440 | 
            +
            rubygems_version: 3.1.2
         | 
| 420 441 | 
             
            signing_key: 
         | 
| 421 442 | 
             
            specification_version: 4
         | 
| 422 443 | 
             
            summary: Rack-based asset packaging system
         |