sprockets 4.0.0.beta8 → 4.0.0.beta9
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 +6 -1
- data/README.md +1 -1
- data/lib/sprockets.rb +5 -5
- data/lib/sprockets/base.rb +6 -6
- data/lib/sprockets/cache/file_store.rb +4 -2
- data/lib/sprockets/directive_processor.rb +2 -2
- data/lib/sprockets/erb_processor.rb +6 -1
- data/lib/sprockets/http_utils.rb +5 -3
- data/lib/sprockets/loader.rb +54 -49
- data/lib/sprockets/manifest.rb +1 -1
- data/lib/sprockets/manifest_utils.rb +7 -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 +1 -1
- data/lib/sprockets/uri_utils.rb +5 -3
- data/lib/sprockets/version.rb +1 -1
- metadata +36 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f01b64fd78772abf12d6c9f603059c9a398e56d2955d007b6b25b78d6d35e54
|
4
|
+
data.tar.gz: a4b3d110e6f084fd830d49b48e00147e53dce7e7c50f8957d670bd3d7e12d0dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c19695c9d705de579a62812a9c630decfef94f2599719fdd72d99c06815e6b86f522b84aef2eca2b9b7b592c65363c51f273353c50670ab8c3fadd7ae9108562
|
7
|
+
data.tar.gz: 3ec14baaff1b624ac3e2fe7877fa6520173260ac9cf387423a426839989bbe54af800003f80df0476553eeee2e1e4df3584acbe2105dfb15554610902fbc873e
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,12 @@ Get upgrade notes from Sprockets 3.x to 4.x at https://github.com/rails/sprocket
|
|
4
4
|
|
5
5
|
## Master
|
6
6
|
|
7
|
+
## 4.0.0.beta9
|
8
|
+
|
9
|
+
- Minimum Ruby version for Sprockets 4 is now 2.5+ which matches minimum ruby verision of Rails [#604]
|
10
|
+
- Fix threading bug introduced in Sprockets 4 [#603]
|
11
|
+
- Warn when two potential manifest files exist. [#560]
|
12
|
+
|
7
13
|
## 4.0.0.beta8
|
8
14
|
|
9
15
|
- Security release for [CVE-2018-3760](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-3760)
|
@@ -51,4 +57,3 @@ Get upgrade notes from Sprockets 3.x to 4.x at https://github.com/rails/sprocket
|
|
51
57
|
- Initial release of Sprockets 4
|
52
58
|
|
53
59
|
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.
|
54
|
-
|
data/README.md
CHANGED
@@ -390,7 +390,7 @@ Example:
|
|
390
390
|
You can specify a file extension so any extra files will be ignored:
|
391
391
|
|
392
392
|
```js
|
393
|
-
//= link_tree path/to/folder .js
|
393
|
+
//= link_tree ./path/to/folder .js
|
394
394
|
```
|
395
395
|
|
396
396
|
> Note: There is an intentional space between the path and the extension
|
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/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
|
|
@@ -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,16 @@ 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][:dependencies].map! { |uri| uri.start_with?("file-digest://") ? expand_from_root(uri) : uri } if asset[:metadata][:dependencies]
|
117
|
+
expand_key_from_hash(asset[:metadata], :included)
|
118
|
+
expand_key_from_hash(asset[:metadata], :stubbed)
|
119
|
+
expand_key_from_hash(asset[:metadata], :required)
|
120
|
+
expand_key_from_hash(asset[:metadata], :to_load)
|
121
|
+
expand_key_from_hash(asset[:metadata], :to_link)
|
122
|
+
expand_key_from_hash(asset[:metadata], :dependencies) { |uri| uri.start_with?("file-digest://") }
|
87
123
|
|
88
124
|
asset[:metadata].each_key do |k|
|
89
|
-
next unless k
|
90
|
-
asset[:metadata]
|
125
|
+
next unless k.match?(/_dependencies\z/) # rubocop:disable Performance/EndWith
|
126
|
+
expand_key_from_hash(asset[:metadata], k)
|
91
127
|
end
|
92
128
|
end
|
93
129
|
asset
|
@@ -205,48 +241,17 @@ module Sprockets
|
|
205
241
|
if cached_asset[:metadata]
|
206
242
|
# Deep dup to avoid modifying `asset`
|
207
243
|
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
|
244
|
+
compress_key_from_hash(cached_asset[:metadata], :included)
|
245
|
+
compress_key_from_hash(cached_asset[:metadata], :links)
|
246
|
+
compress_key_from_hash(cached_asset[:metadata], :stubbed)
|
247
|
+
compress_key_from_hash(cached_asset[:metadata], :required)
|
248
|
+
compress_key_from_hash(cached_asset[:metadata], :to_load)
|
249
|
+
compress_key_from_hash(cached_asset[:metadata], :to_link)
|
250
|
+
compress_key_from_hash(cached_asset[:metadata], :dependencies) { |uri| uri.start_with?("file-digest://") }
|
244
251
|
|
245
|
-
# compress all _dependencies in metadata like `sass_dependencies`
|
246
252
|
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) }
|
253
|
+
next unless key.match?(/_dependencies\z/) # rubocop:disable Performance/EndWith
|
254
|
+
compress_key_from_hash(cached_asset[:metadata], key)
|
250
255
|
end
|
251
256
|
end
|
252
257
|
|
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,13 @@ 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
|
+
logger.warn("Found multiple manifests: #{manifest_entries}. Choosing the first alphabetically: #{manifest_entries.first}")
|
42
|
+
end
|
43
|
+
entry = manifest_entries.first || generate_manifest_path
|
40
44
|
File.join(dirname, entry)
|
41
45
|
end
|
42
46
|
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
@@ -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
|
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.0.
|
4
|
+
version: 4.0.0.beta9
|
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: 2019-05-24 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
438
|
version: 1.3.1
|
417
439
|
requirements: []
|
418
|
-
|
419
|
-
rubygems_version: 2.7.6
|
440
|
+
rubygems_version: 3.0.3
|
420
441
|
signing_key:
|
421
442
|
specification_version: 4
|
422
443
|
summary: Rack-based asset packaging system
|