sprockets 4.0.0.beta2 → 4.0.0.beta3
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 +5 -0
- data/README.md +25 -13
- data/lib/rake/sprocketstask.rb +1 -0
- data/lib/sprockets.rb +4 -2
- data/lib/sprockets/asset.rb +1 -0
- data/lib/sprockets/autoload.rb +1 -0
- data/lib/sprockets/autoload/babel.rb +1 -0
- data/lib/sprockets/autoload/closure.rb +1 -0
- data/lib/sprockets/autoload/coffee_script.rb +1 -0
- data/lib/sprockets/autoload/eco.rb +1 -0
- data/lib/sprockets/autoload/ejs.rb +1 -0
- data/lib/sprockets/autoload/jsminc.rb +1 -0
- data/lib/sprockets/autoload/sass.rb +1 -0
- data/lib/sprockets/autoload/sassc.rb +1 -0
- data/lib/sprockets/autoload/uglifier.rb +1 -0
- data/lib/sprockets/autoload/yui.rb +1 -0
- data/lib/sprockets/babel_processor.rb +3 -1
- data/lib/sprockets/base.rb +3 -2
- data/lib/sprockets/bower.rb +1 -0
- data/lib/sprockets/bundle.rb +1 -0
- data/lib/sprockets/cache.rb +4 -1
- data/lib/sprockets/cache/file_store.rb +1 -0
- data/lib/sprockets/cache/memory_store.rb +1 -0
- data/lib/sprockets/cache/null_store.rb +1 -0
- data/lib/sprockets/cached_environment.rb +4 -3
- data/lib/sprockets/closure_compressor.rb +3 -1
- data/lib/sprockets/coffee_script_processor.rb +2 -1
- data/lib/sprockets/compressing.rb +19 -0
- data/lib/sprockets/configuration.rb +1 -0
- data/lib/sprockets/context.rb +3 -2
- data/lib/sprockets/dependencies.rb +1 -0
- data/lib/sprockets/digest_utils.rb +64 -41
- data/lib/sprockets/directive_processor.rb +15 -10
- data/lib/sprockets/eco_processor.rb +1 -0
- data/lib/sprockets/ejs_processor.rb +1 -0
- data/lib/sprockets/encoding_utils.rb +1 -0
- data/lib/sprockets/environment.rb +3 -2
- data/lib/sprockets/erb_processor.rb +1 -0
- data/lib/sprockets/errors.rb +1 -0
- data/lib/sprockets/file_reader.rb +1 -0
- data/lib/sprockets/http_utils.rb +1 -0
- data/lib/sprockets/jsminc_compressor.rb +1 -0
- data/lib/sprockets/jst_processor.rb +1 -0
- data/lib/sprockets/loader.rb +2 -1
- data/lib/sprockets/manifest.rb +1 -0
- data/lib/sprockets/manifest_utils.rb +1 -0
- data/lib/sprockets/mime.rb +1 -0
- data/lib/sprockets/path_dependency_utils.rb +1 -0
- data/lib/sprockets/path_digest_utils.rb +1 -0
- data/lib/sprockets/path_utils.rb +18 -13
- data/lib/sprockets/paths.rb +1 -0
- data/lib/sprockets/preprocessors/default_source_map.rb +1 -0
- data/lib/sprockets/processing.rb +1 -0
- data/lib/sprockets/processor_utils.rb +15 -3
- data/lib/sprockets/resolve.rb +2 -1
- data/lib/sprockets/sass_cache_store.rb +1 -0
- data/lib/sprockets/sass_compressor.rb +1 -0
- data/lib/sprockets/sass_functions.rb +1 -0
- data/lib/sprockets/sass_importer.rb +1 -0
- data/lib/sprockets/sass_processor.rb +15 -3
- data/lib/sprockets/sassc_compressor.rb +4 -1
- data/lib/sprockets/sassc_processor.rb +5 -0
- data/lib/sprockets/server.rb +2 -1
- data/lib/sprockets/source_map_comment_processor.rb +1 -0
- data/lib/sprockets/source_map_processor.rb +9 -2
- data/lib/sprockets/source_map_utils.rb +1 -0
- data/lib/sprockets/transformers.rb +1 -0
- data/lib/sprockets/uglifier_compressor.rb +9 -12
- data/lib/sprockets/unloaded_asset.rb +1 -0
- data/lib/sprockets/uri_tar.rb +3 -4
- data/lib/sprockets/uri_utils.rb +2 -1
- data/lib/sprockets/utils.rb +25 -11
- data/lib/sprockets/utils/gzip.rb +1 -0
- data/lib/sprockets/version.rb +2 -1
- data/lib/sprockets/yui_compressor.rb +1 -0
- metadata +2 -2
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'digest/md5'
|
2
3
|
require 'digest/sha1'
|
3
4
|
require 'digest/sha2'
|
@@ -34,6 +35,50 @@ module Sprockets
|
|
34
35
|
DIGEST_SIZES[bytes.bytesize]
|
35
36
|
end
|
36
37
|
|
38
|
+
ADD_VALUE_TO_DIGEST = {
|
39
|
+
String => ->(val, digest) { digest << val },
|
40
|
+
FalseClass => ->(val, digest) { digest << 'FalseClass'.freeze },
|
41
|
+
TrueClass => ->(val, digest) { digest << 'TrueClass'.freeze },
|
42
|
+
NilClass => ->(val, digest) { digest << 'NilClass'.freeze },
|
43
|
+
|
44
|
+
Symbol => ->(val, digest) {
|
45
|
+
digest << 'Symbol'.freeze
|
46
|
+
digest << val.to_s
|
47
|
+
},
|
48
|
+
Fixnum => ->(val, digest) {
|
49
|
+
digest << 'Fixnum'.freeze
|
50
|
+
digest << val.to_s
|
51
|
+
},
|
52
|
+
Bignum => ->(val, digest) {
|
53
|
+
digest << 'Bignum'.freeze
|
54
|
+
digest << val.to_s
|
55
|
+
},
|
56
|
+
Array => ->(val, digest) {
|
57
|
+
digest << 'Array'.freeze
|
58
|
+
val.each do |element|
|
59
|
+
ADD_VALUE_TO_DIGEST[element.class].call(element, digest)
|
60
|
+
end
|
61
|
+
},
|
62
|
+
Hash => ->(val, digest) {
|
63
|
+
digest << 'Hash'.freeze
|
64
|
+
val.sort.each do |array|
|
65
|
+
ADD_VALUE_TO_DIGEST[Array].call(array, digest)
|
66
|
+
end
|
67
|
+
},
|
68
|
+
Set => ->(val, digest) {
|
69
|
+
digest << 'Set'.freeze
|
70
|
+
ADD_VALUE_TO_DIGEST[Array].call(val, digest)
|
71
|
+
},
|
72
|
+
Encoding => ->(val, digest) {
|
73
|
+
digest << 'Encoding'.freeze
|
74
|
+
digest << val.name
|
75
|
+
},
|
76
|
+
}
|
77
|
+
ADD_VALUE_TO_DIGEST.default_proc = ->(_, val) {
|
78
|
+
raise TypeError, "couldn't digest #{ val }"
|
79
|
+
}
|
80
|
+
private_constant :ADD_VALUE_TO_DIGEST
|
81
|
+
|
37
82
|
# Internal: Generate a hexdigest for a nested JSON serializable object.
|
38
83
|
#
|
39
84
|
# This is used for generating cache keys, so its pretty important its
|
@@ -43,48 +88,18 @@ module Sprockets
|
|
43
88
|
#
|
44
89
|
# Returns a String digest of the object.
|
45
90
|
def digest(obj)
|
46
|
-
digest
|
47
|
-
|
48
|
-
|
49
|
-
while queue.length > 0
|
50
|
-
obj = queue.shift
|
51
|
-
klass = obj.class
|
52
|
-
|
53
|
-
if klass == String
|
54
|
-
digest << obj
|
55
|
-
elsif klass == Symbol
|
56
|
-
digest << 'Symbol'
|
57
|
-
digest << obj.to_s
|
58
|
-
elsif klass == Fixnum
|
59
|
-
digest << 'Fixnum'
|
60
|
-
digest << obj.to_s
|
61
|
-
elsif klass == Bignum
|
62
|
-
digest << 'Bignum'
|
63
|
-
digest << obj.to_s
|
64
|
-
elsif klass == TrueClass
|
65
|
-
digest << 'TrueClass'
|
66
|
-
elsif klass == FalseClass
|
67
|
-
digest << 'FalseClass'
|
68
|
-
elsif klass == NilClass
|
69
|
-
digest << 'NilClass'.freeze
|
70
|
-
elsif klass == Array
|
71
|
-
digest << 'Array'
|
72
|
-
queue.concat(obj)
|
73
|
-
elsif klass == Hash
|
74
|
-
digest << 'Hash'
|
75
|
-
queue.concat(obj.sort)
|
76
|
-
elsif klass == Set
|
77
|
-
digest << 'Set'
|
78
|
-
queue.concat(obj.to_a)
|
79
|
-
elsif klass == Encoding
|
80
|
-
digest << 'Encoding'
|
81
|
-
digest << obj.name
|
82
|
-
else
|
83
|
-
raise TypeError, "couldn't digest #{klass}"
|
84
|
-
end
|
85
|
-
end
|
91
|
+
build_digest(obj).digest
|
92
|
+
end
|
86
93
|
|
87
|
-
|
94
|
+
# Internal: Generate a hexdigest for a nested JSON serializable object.
|
95
|
+
#
|
96
|
+
# The same as `pack_hexdigest(digest(obj))`.
|
97
|
+
#
|
98
|
+
# obj - A JSON serializable object.
|
99
|
+
#
|
100
|
+
# Returns a String digest of the object.
|
101
|
+
def hexdigest(obj)
|
102
|
+
build_digest(obj).hexdigest!
|
88
103
|
end
|
89
104
|
|
90
105
|
# Internal: Pack a binary digest to a hex encoded string.
|
@@ -164,5 +179,13 @@ module Sprockets
|
|
164
179
|
def hexdigest_integrity_uri(hexdigest)
|
165
180
|
integrity_uri(unpack_hexdigest(hexdigest))
|
166
181
|
end
|
182
|
+
|
183
|
+
private
|
184
|
+
def build_digest(obj)
|
185
|
+
digest = digest_class.new
|
186
|
+
|
187
|
+
ADD_VALUE_TO_DIGEST[obj.class].call(obj, digest)
|
188
|
+
digest
|
189
|
+
end
|
167
190
|
end
|
168
191
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'set'
|
2
3
|
require 'shellwords'
|
3
4
|
|
@@ -48,7 +49,7 @@ module Sprockets
|
|
48
49
|
/x
|
49
50
|
|
50
51
|
def self.instance
|
51
|
-
# Default to C
|
52
|
+
# Default to C comment styles
|
52
53
|
@instance ||= new(comments: ["//", ["/*", "*/"]])
|
53
54
|
end
|
54
55
|
|
@@ -112,9 +113,9 @@ module Sprockets
|
|
112
113
|
|
113
114
|
header, directives = extract_directives(header)
|
114
115
|
|
115
|
-
data = ""
|
116
|
+
data = String.new("")
|
116
117
|
data.force_encoding(body.encoding)
|
117
|
-
data << header
|
118
|
+
data << header unless header.empty?
|
118
119
|
data << body
|
119
120
|
# Ensure body ends in a new line
|
120
121
|
data << "\n" if data.length > 0 && data[-1] != "\n"
|
@@ -130,7 +131,7 @@ module Sprockets
|
|
130
131
|
# [[1, "require", "foo"], [2, "require", "bar"]]
|
131
132
|
#
|
132
133
|
def extract_directives(header)
|
133
|
-
processed_header = ""
|
134
|
+
processed_header = String.new("")
|
134
135
|
directives = []
|
135
136
|
|
136
137
|
header.lines.each_with_index do |line, index|
|
@@ -145,7 +146,11 @@ module Sprockets
|
|
145
146
|
processed_header << line
|
146
147
|
end
|
147
148
|
|
148
|
-
|
149
|
+
processed_header.chomp!
|
150
|
+
# Ensure header ends in a new line like before it was processed
|
151
|
+
processed_header << "\n" if processed_header.length > 0 && header[-1] == "\n"
|
152
|
+
|
153
|
+
return processed_header, directives
|
149
154
|
end
|
150
155
|
|
151
156
|
# Gathers comment directives in the source and processes them.
|
@@ -183,7 +188,7 @@ module Sprockets
|
|
183
188
|
|
184
189
|
# The `require` directive functions similar to Ruby's own `require`.
|
185
190
|
# It provides a way to declare a dependency on a file in your path
|
186
|
-
# and ensures
|
191
|
+
# and ensures it's only loaded once before the source file.
|
187
192
|
#
|
188
193
|
# `require` works with files in the environment path:
|
189
194
|
#
|
@@ -261,8 +266,8 @@ module Sprockets
|
|
261
266
|
# it.
|
262
267
|
#
|
263
268
|
# This is used for caching purposes. Any changes that would
|
264
|
-
#
|
265
|
-
# source file.
|
269
|
+
# invalidate the asset dependency will invalidate the cache of
|
270
|
+
# the source file.
|
266
271
|
#
|
267
272
|
# Unlike `depend_on`, the path must be a requirable asset.
|
268
273
|
#
|
@@ -303,7 +308,7 @@ module Sprockets
|
|
303
308
|
# //= link_directory "./fonts"
|
304
309
|
#
|
305
310
|
# Use caution when linking against JS or CSS assets. Include an explicit
|
306
|
-
# extension or content type in these cases
|
311
|
+
# extension or content type in these cases.
|
307
312
|
#
|
308
313
|
# //= link_directory "./scripts" .js
|
309
314
|
#
|
@@ -319,7 +324,7 @@ module Sprockets
|
|
319
324
|
# //= link_tree "./images"
|
320
325
|
#
|
321
326
|
# Use caution when linking against JS or CSS assets. Include an explicit
|
322
|
-
# extension or content type in these cases
|
327
|
+
# extension or content type in these cases.
|
323
328
|
#
|
324
329
|
# //= link_tree "./styles" .css
|
325
330
|
#
|
@@ -1,10 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'sprockets/base'
|
2
3
|
require 'sprockets/cache/memory_store'
|
3
4
|
require 'sprockets/cached_environment'
|
4
5
|
|
5
6
|
module Sprockets
|
6
7
|
class Environment < Base
|
7
|
-
# `Environment` should initialized with your application's root
|
8
|
+
# `Environment` should be initialized with your application's root
|
8
9
|
# directory. This should be the same as your Rails or Rack root.
|
9
10
|
#
|
10
11
|
# env = Environment.new(Rails.root)
|
@@ -18,7 +19,7 @@ module Sprockets
|
|
18
19
|
|
19
20
|
# Returns a cached version of the environment.
|
20
21
|
#
|
21
|
-
# All its file system calls are cached which makes `cached` much
|
22
|
+
# All of its file system calls are cached which makes `cached` much
|
22
23
|
# faster. This behavior is ideal in production since the file
|
23
24
|
# system only changes between deploys.
|
24
25
|
def cached
|
data/lib/sprockets/errors.rb
CHANGED
data/lib/sprockets/http_utils.rb
CHANGED
data/lib/sprockets/loader.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'sprockets/asset'
|
2
3
|
require 'sprockets/digest_utils'
|
3
4
|
require 'sprockets/errors'
|
@@ -185,7 +186,7 @@ module Sprockets
|
|
185
186
|
dependencies_digest: DigestUtils.digest(resolve_dependencies(metadata[:dependencies]))
|
186
187
|
}
|
187
188
|
|
188
|
-
asset[:id] =
|
189
|
+
asset[:id] = hexdigest(asset)
|
189
190
|
asset[:uri] = build_asset_uri(unloaded.filename, unloaded.params.merge(id: asset[:id]))
|
190
191
|
|
191
192
|
store_asset(asset, unloaded)
|
data/lib/sprockets/manifest.rb
CHANGED
data/lib/sprockets/mime.rb
CHANGED
data/lib/sprockets/path_utils.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
3
2
|
module Sprockets
|
4
3
|
# Internal: File and path related utilities. Mixed into Environment.
|
5
4
|
#
|
@@ -57,7 +56,9 @@ module Sprockets
|
|
57
56
|
if File.directory?(path)
|
58
57
|
entries = Dir.entries(path, encoding: Encoding.default_internal)
|
59
58
|
entries.reject! { |entry|
|
60
|
-
entry
|
59
|
+
entry.start_with?(".".freeze) ||
|
60
|
+
(entry.start_with?("#".freeze) && entry.end_with?("#".freeze)) ||
|
61
|
+
entry.end_with?("~".freeze)
|
61
62
|
}
|
62
63
|
entries.sort!
|
63
64
|
entries
|
@@ -149,16 +150,19 @@ module Sprockets
|
|
149
150
|
#
|
150
151
|
# Returns [String extname, Object value] or nil nothing matched.
|
151
152
|
def match_path_extname(path, extensions)
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
153
|
+
basename = File.basename(path)
|
154
|
+
|
155
|
+
i = basename.index('.'.freeze)
|
156
|
+
while i && i < basename.length - 1
|
157
|
+
extname = basename[i..-1]
|
158
|
+
if value = extensions[extname]
|
159
|
+
return extname, value
|
159
160
|
end
|
161
|
+
|
162
|
+
i = basename.index('.'.freeze, i+1)
|
160
163
|
end
|
161
|
-
|
164
|
+
|
165
|
+
nil
|
162
166
|
end
|
163
167
|
|
164
168
|
# Internal: Match paths in a directory against available extensions.
|
@@ -177,6 +181,7 @@ module Sprockets
|
|
177
181
|
def find_matching_path_for_extensions(path, basename, extensions)
|
178
182
|
matches = []
|
179
183
|
entries(path).each do |entry|
|
184
|
+
next unless File.basename(entry).start_with?(basename)
|
180
185
|
extname, value = match_path_extname(entry, extensions)
|
181
186
|
if basename == entry.chomp(extname)
|
182
187
|
filename = File.join(path, entry)
|
@@ -304,9 +309,9 @@ module Sprockets
|
|
304
309
|
yield f
|
305
310
|
end
|
306
311
|
|
307
|
-
|
312
|
+
File.rename(tmpname, filename)
|
308
313
|
ensure
|
309
|
-
|
314
|
+
File.delete(tmpname) if File.exist?(tmpname)
|
310
315
|
end
|
311
316
|
end
|
312
317
|
end
|
data/lib/sprockets/paths.rb
CHANGED
data/lib/sprockets/processing.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'set'
|
2
3
|
|
3
4
|
module Sprockets
|
4
5
|
# Functional utilities for dealing with Processor functions.
|
5
6
|
#
|
6
|
-
# A Processor is a general function that
|
7
|
+
# A Processor is a general function that may modify or transform an asset as
|
7
8
|
# part of the pipeline. CoffeeScript to JavaScript conversion, Minification
|
8
9
|
# or Concatenation are all implemented as seperate Processor steps.
|
9
10
|
#
|
@@ -129,6 +130,17 @@ module Sprockets
|
|
129
130
|
Set
|
130
131
|
]).freeze
|
131
132
|
|
133
|
+
# Internal: Hash of all "simple" value types allowed to be returned in
|
134
|
+
# processor metadata.
|
135
|
+
VALID_METADATA_VALUE_TYPES_HASH = VALID_METADATA_VALUE_TYPES.each_with_object({}) do |type, hash|
|
136
|
+
hash[type] = true
|
137
|
+
end.freeze
|
138
|
+
|
139
|
+
# Internal: Hash of all nested compound metadata types that can nest values.
|
140
|
+
VALID_METADATA_COMPOUND_TYPES_HASH = VALID_METADATA_COMPOUND_TYPES.each_with_object({}) do |type, hash|
|
141
|
+
hash[type] = true
|
142
|
+
end.freeze
|
143
|
+
|
132
144
|
# Internal: Set of all allowed metadata types.
|
133
145
|
VALID_METADATA_TYPES = (VALID_METADATA_VALUE_TYPES + VALID_METADATA_COMPOUND_TYPES).freeze
|
134
146
|
|
@@ -167,9 +179,9 @@ module Sprockets
|
|
167
179
|
#
|
168
180
|
# Returns true if class is in whitelist otherwise false.
|
169
181
|
def valid_processor_metadata_value?(value)
|
170
|
-
if
|
182
|
+
if VALID_METADATA_VALUE_TYPES_HASH[value.class]
|
171
183
|
true
|
172
|
-
elsif
|
184
|
+
elsif VALID_METADATA_COMPOUND_TYPES_HASH[value.class]
|
173
185
|
value.all? { |v| valid_processor_metadata_value?(v) }
|
174
186
|
else
|
175
187
|
false
|