sprockets 3.0.0.beta.6 → 3.0.0.beta.7
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/README.md +171 -100
- data/lib/rake/sprocketstask.rb +2 -2
- data/lib/sprockets.rb +69 -63
- data/lib/sprockets/asset.rb +2 -61
- data/lib/sprockets/autoload_processor.rb +48 -0
- data/lib/sprockets/base.rb +4 -6
- data/lib/sprockets/bower.rb +8 -5
- data/lib/sprockets/bundle.rb +9 -13
- data/lib/sprockets/cache.rb +19 -14
- data/lib/sprockets/cache/file_store.rb +2 -1
- data/lib/sprockets/cached_environment.rb +15 -68
- data/lib/sprockets/closure_compressor.rb +17 -4
- data/lib/sprockets/coffee_script_processor.rb +26 -0
- data/lib/sprockets/coffee_script_template.rb +3 -20
- data/lib/sprockets/compressing.rb +10 -4
- data/lib/sprockets/configuration.rb +21 -37
- data/lib/sprockets/context.rb +37 -67
- data/lib/sprockets/dependencies.rb +73 -0
- data/lib/sprockets/digest_utils.rb +8 -2
- data/lib/sprockets/directive_processor.rb +122 -165
- data/lib/sprockets/eco_processor.rb +32 -0
- data/lib/sprockets/eco_template.rb +3 -26
- data/lib/sprockets/ejs_processor.rb +31 -0
- data/lib/sprockets/ejs_template.rb +3 -25
- data/lib/sprockets/encoding_utils.rb +9 -21
- data/lib/sprockets/engines.rb +25 -27
- data/lib/sprockets/environment.rb +9 -1
- data/lib/sprockets/erb_processor.rb +30 -0
- data/lib/sprockets/erb_template.rb +3 -20
- data/lib/sprockets/file_reader.rb +15 -0
- data/lib/sprockets/http_utils.rb +2 -0
- data/lib/sprockets/jst_processor.rb +9 -2
- data/lib/sprockets/legacy.rb +212 -3
- data/lib/sprockets/legacy_tilt_processor.rb +1 -1
- data/lib/sprockets/loader.rb +95 -89
- data/lib/sprockets/manifest.rb +23 -59
- data/lib/sprockets/mime.rb +28 -41
- data/lib/sprockets/path_dependency_utils.rb +76 -0
- data/lib/sprockets/path_utils.rb +21 -1
- data/lib/sprockets/paths.rb +23 -8
- data/lib/sprockets/processing.rb +102 -91
- data/lib/sprockets/processor_utils.rb +97 -0
- data/lib/sprockets/resolve.rb +110 -97
- data/lib/sprockets/sass_cache_store.rb +2 -2
- data/lib/sprockets/sass_compressor.rb +17 -4
- data/lib/sprockets/sass_functions.rb +2 -2
- data/lib/sprockets/sass_importer.rb +2 -2
- data/lib/sprockets/sass_processor.rb +305 -0
- data/lib/sprockets/sass_template.rb +4 -286
- data/lib/sprockets/server.rb +1 -13
- data/lib/sprockets/transformers.rb +62 -25
- data/lib/sprockets/uglifier_compressor.rb +17 -4
- data/lib/sprockets/uri_utils.rb +190 -0
- data/lib/sprockets/utils.rb +87 -6
- data/lib/sprockets/version.rb +1 -1
- data/lib/sprockets/yui_compressor.rb +17 -4
- metadata +14 -5
- data/lib/sprockets/asset_uri.rb +0 -80
- data/lib/sprockets/lazy_processor.rb +0 -15
@@ -16,10 +16,23 @@ module Sprockets
|
|
16
16
|
class UglifierCompressor
|
17
17
|
VERSION = '1'
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
# Public: Return singleton instance with default options.
|
20
|
+
#
|
21
|
+
# Returns UglifierCompressor object.
|
22
|
+
def self.instance
|
23
|
+
@instance ||= new
|
21
24
|
end
|
22
25
|
|
26
|
+
def self.call(input)
|
27
|
+
instance.call(input)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.cache_key
|
31
|
+
instance.cache_key
|
32
|
+
end
|
33
|
+
|
34
|
+
attr_reader :cache_key
|
35
|
+
|
23
36
|
def initialize(options = {})
|
24
37
|
# Feature detect Uglifier 2.0 option support
|
25
38
|
if Uglifier::DEFAULTS[:copyright]
|
@@ -33,11 +46,11 @@ module Sprockets
|
|
33
46
|
@uglifier = ::Uglifier.new(options)
|
34
47
|
|
35
48
|
@cache_key = [
|
36
|
-
|
49
|
+
self.class.name,
|
37
50
|
::Uglifier::VERSION,
|
38
51
|
VERSION,
|
39
52
|
options
|
40
|
-
]
|
53
|
+
].freeze
|
41
54
|
end
|
42
55
|
|
43
56
|
def call(input)
|
@@ -0,0 +1,190 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module Sprockets
|
4
|
+
# Internal: Asset URI related parsing utilities. Mixed into Environment.
|
5
|
+
#
|
6
|
+
# An Asset URI identifies the compiled Asset result. It shares the file:
|
7
|
+
# scheme and requires an absolute path.
|
8
|
+
#
|
9
|
+
# Other query parameters
|
10
|
+
#
|
11
|
+
# type - String output content type. Otherwise assumed from file extension.
|
12
|
+
# This maybe different than the extension if the asset is transformed
|
13
|
+
# from one content type to another. For an example .coffee -> .js.
|
14
|
+
#
|
15
|
+
# id - Unique fingerprint of the entire asset and all its metadata. Assets
|
16
|
+
# will only have the same id if they serialize to an identical value.
|
17
|
+
#
|
18
|
+
# skip_bundle - Boolean if bundle processors should be skipped.
|
19
|
+
#
|
20
|
+
# encoding - A content encoding such as "gzip" or "deflate". NOT a charset
|
21
|
+
# like "utf-8".
|
22
|
+
#
|
23
|
+
module URIUtils
|
24
|
+
extend self
|
25
|
+
|
26
|
+
# Internal: Parse URI into component parts.
|
27
|
+
#
|
28
|
+
# uri - String uri
|
29
|
+
#
|
30
|
+
# Returns Array of components.
|
31
|
+
def split_uri(uri)
|
32
|
+
URI.split(uri)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Internal: Join URI component parts into String.
|
36
|
+
#
|
37
|
+
# Returns String.
|
38
|
+
def join_uri(scheme, userinfo, host, port, registry, path, opaque, query, fragment)
|
39
|
+
URI::Generic.new(scheme, userinfo, host, port, registry, path, opaque, query, fragment).to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
# Internal: Parse file: URI into component parts.
|
43
|
+
#
|
44
|
+
# uri - String uri
|
45
|
+
#
|
46
|
+
# Returns [scheme, host, path, query].
|
47
|
+
def split_file_uri(uri)
|
48
|
+
scheme, _, host, _, _, path, _, query, _ = URI.split(uri)
|
49
|
+
|
50
|
+
path = URI::Generic::DEFAULT_PARSER.unescape(path)
|
51
|
+
path.force_encoding(Encoding::UTF_8)
|
52
|
+
|
53
|
+
# Hack for parsing Windows "file:///C:/Users/IEUser" paths
|
54
|
+
path = path.gsub(/^\/([a-zA-Z]:)/, '\1')
|
55
|
+
|
56
|
+
[scheme, host, path, query]
|
57
|
+
end
|
58
|
+
|
59
|
+
# Internal: Join file: URI component parts into String.
|
60
|
+
#
|
61
|
+
# Returns String.
|
62
|
+
def join_file_uri(scheme, host, path, query)
|
63
|
+
str = "#{scheme}://"
|
64
|
+
str << host if host
|
65
|
+
path = "/#{path}" unless path.start_with?("/")
|
66
|
+
str << URI::Generic::DEFAULT_PARSER.escape(path)
|
67
|
+
str << "?#{query}" if query
|
68
|
+
str
|
69
|
+
end
|
70
|
+
|
71
|
+
# Internal: Check if String is a valid Asset URI.
|
72
|
+
#
|
73
|
+
# str - Possible String asset URI.
|
74
|
+
#
|
75
|
+
# Returns true or false.
|
76
|
+
def valid_asset_uri?(str)
|
77
|
+
# Quick prefix check before attempting a full parse
|
78
|
+
str.start_with?("file://") && parse_asset_uri(str) ? true : false
|
79
|
+
rescue URI::InvalidURIError
|
80
|
+
false
|
81
|
+
end
|
82
|
+
|
83
|
+
# Internal: Parse Asset URI.
|
84
|
+
#
|
85
|
+
# Examples
|
86
|
+
#
|
87
|
+
# parse("file:///tmp/js/application.coffee?type=application/javascript")
|
88
|
+
# # => "/tmp/js/application.coffee", {type: "application/javascript"}
|
89
|
+
#
|
90
|
+
# uri - String asset URI
|
91
|
+
#
|
92
|
+
# Returns String path and Hash of symbolized parameters.
|
93
|
+
def parse_asset_uri(uri)
|
94
|
+
scheme, _, path, query = split_file_uri(uri)
|
95
|
+
|
96
|
+
unless scheme == 'file'
|
97
|
+
raise URI::InvalidURIError, "expected file:// scheme: #{uri}"
|
98
|
+
end
|
99
|
+
|
100
|
+
return path, parse_uri_query_params(query)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Internal: Build Asset URI.
|
104
|
+
#
|
105
|
+
# Examples
|
106
|
+
#
|
107
|
+
# build("/tmp/js/application.coffee", type: "application/javascript")
|
108
|
+
# # => "file:///tmp/js/application.coffee?type=application/javascript"
|
109
|
+
#
|
110
|
+
# path - String file path
|
111
|
+
# params - Hash of optional parameters
|
112
|
+
#
|
113
|
+
# Returns String URI.
|
114
|
+
def build_asset_uri(path, params = {})
|
115
|
+
join_file_uri("file", nil, path, encode_uri_query_params(params))
|
116
|
+
end
|
117
|
+
|
118
|
+
# Internal: Parse file-digest dependency URI.
|
119
|
+
#
|
120
|
+
# Examples
|
121
|
+
#
|
122
|
+
# parse("file-digest:/tmp/js/application.js")
|
123
|
+
# # => "/tmp/js/application.js"
|
124
|
+
#
|
125
|
+
# uri - String file-digest URI
|
126
|
+
#
|
127
|
+
# Returns String path.
|
128
|
+
def parse_file_digest_uri(uri)
|
129
|
+
scheme, _, path, _ = split_file_uri(uri)
|
130
|
+
|
131
|
+
unless scheme == 'file-digest'
|
132
|
+
raise URI::InvalidURIError, "expected file-digest scheme: #{uri}"
|
133
|
+
end
|
134
|
+
|
135
|
+
path
|
136
|
+
end
|
137
|
+
|
138
|
+
# Internal: Build file-digest dependency URI.
|
139
|
+
#
|
140
|
+
# Examples
|
141
|
+
#
|
142
|
+
# build("/tmp/js/application.js")
|
143
|
+
# # => "file-digest:/tmp/js/application.js"
|
144
|
+
#
|
145
|
+
# path - String file path
|
146
|
+
#
|
147
|
+
# Returns String URI.
|
148
|
+
def build_file_digest_uri(path)
|
149
|
+
join_file_uri("file-digest", nil, path, nil)
|
150
|
+
end
|
151
|
+
|
152
|
+
# Internal: Serialize hash of params into query string.
|
153
|
+
#
|
154
|
+
# params - Hash of params to serialize
|
155
|
+
#
|
156
|
+
# Returns String query or nil if empty.
|
157
|
+
def encode_uri_query_params(params)
|
158
|
+
query = []
|
159
|
+
|
160
|
+
params.each do |key, value|
|
161
|
+
case value
|
162
|
+
when Integer
|
163
|
+
query << "#{key}=#{value}"
|
164
|
+
when String
|
165
|
+
query << "#{key}=#{URI::Generic::DEFAULT_PARSER.escape(value)}"
|
166
|
+
when TrueClass
|
167
|
+
query << "#{key}"
|
168
|
+
when FalseClass, NilClass
|
169
|
+
else
|
170
|
+
raise TypeError, "unexpected type: #{value.class}"
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
"#{query.join('&')}" if query.any?
|
175
|
+
end
|
176
|
+
|
177
|
+
# Internal: Parse query string into hash of params
|
178
|
+
#
|
179
|
+
# query - String query string
|
180
|
+
#
|
181
|
+
# Return Hash of params.
|
182
|
+
def parse_uri_query_params(query)
|
183
|
+
query.to_s.split('&').reduce({}) do |h, p|
|
184
|
+
k, v = p.split('=', 2)
|
185
|
+
v = URI::Generic::DEFAULT_PARSER.unescape(v) if v
|
186
|
+
h.merge(k.to_sym => v || true)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
data/lib/sprockets/utils.rb
CHANGED
@@ -1,10 +1,71 @@
|
|
1
1
|
require 'set'
|
2
2
|
|
3
3
|
module Sprockets
|
4
|
-
#
|
4
|
+
# Internal: Utils, we didn't know where else to put it! Functions may
|
5
|
+
# eventually be shuffled into more specific drawers.
|
5
6
|
module Utils
|
6
7
|
extend self
|
7
8
|
|
9
|
+
# Internal: Check if object can safely be .dup'd.
|
10
|
+
#
|
11
|
+
# Similar to ActiveSupport #duplicable? check.
|
12
|
+
#
|
13
|
+
# obj - Any Object
|
14
|
+
#
|
15
|
+
# Returns false if .dup would raise a TypeError, otherwise true.
|
16
|
+
def duplicable?(obj)
|
17
|
+
case obj
|
18
|
+
when NilClass, FalseClass, TrueClass, Symbol, Numeric
|
19
|
+
false
|
20
|
+
else
|
21
|
+
true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Internal: Duplicate and store key/value on new frozen hash.
|
26
|
+
#
|
27
|
+
# Seperated for recursive calls, always use hash_reassoc(hash, *keys).
|
28
|
+
#
|
29
|
+
# hash - Hash
|
30
|
+
# key - Object key
|
31
|
+
#
|
32
|
+
# Returns Hash.
|
33
|
+
def hash_reassoc1(hash, key)
|
34
|
+
hash = hash.dup if hash.frozen?
|
35
|
+
old_value = hash[key]
|
36
|
+
old_value = old_value.dup if duplicable?(old_value)
|
37
|
+
new_value = yield old_value
|
38
|
+
new_value.freeze if duplicable?(new_value)
|
39
|
+
hash.store(key, new_value)
|
40
|
+
hash.freeze
|
41
|
+
end
|
42
|
+
|
43
|
+
# Internal: Duplicate and store key/value on new frozen hash.
|
44
|
+
#
|
45
|
+
# Similar to Hash#store for nested frozen hashes.
|
46
|
+
#
|
47
|
+
# hash - Hash
|
48
|
+
# key - Object keys. Use multiple keys for nested hashes.
|
49
|
+
# block - Receives current value at key.
|
50
|
+
#
|
51
|
+
# Examples
|
52
|
+
#
|
53
|
+
# config = {paths: ["/bin", "/sbin"]}.freeze
|
54
|
+
# new_config = hash_reassoc(config, :paths) do |paths|
|
55
|
+
# paths << "/usr/local/bin"
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# Returns duplicated frozen Hash.
|
59
|
+
def hash_reassoc(hash, *keys, &block)
|
60
|
+
if keys.size == 1
|
61
|
+
hash_reassoc1(hash, keys[0], &block)
|
62
|
+
else
|
63
|
+
hash_reassoc1(hash, keys[0]) do |value|
|
64
|
+
hash_reassoc(value, *keys[1..-1], &block)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
8
69
|
# Internal: Check if string has a trailing semicolon.
|
9
70
|
#
|
10
71
|
# str - String
|
@@ -126,12 +187,32 @@ module Sprockets
|
|
126
187
|
nodes
|
127
188
|
end
|
128
189
|
|
129
|
-
|
130
|
-
|
131
|
-
|
190
|
+
# Internal: Post-order Depth-First search algorithm that gathers all paths
|
191
|
+
# along the way.
|
192
|
+
#
|
193
|
+
# TODO: Rename function.
|
194
|
+
#
|
195
|
+
# path - Initial Array node path
|
196
|
+
# block -
|
197
|
+
# node - Current node to get children of
|
198
|
+
#
|
199
|
+
# Returns an Array of node Arrays.
|
200
|
+
def dfs_paths(path)
|
201
|
+
paths = []
|
202
|
+
stack, seen = [path], Set.new
|
203
|
+
|
204
|
+
while path = stack.pop
|
205
|
+
if !seen.include?(path.last)
|
206
|
+
seen.add(path.last)
|
207
|
+
paths << path if path.size > 1
|
208
|
+
|
209
|
+
Array(yield path.last).reverse_each do |node|
|
210
|
+
stack.push(path + [node])
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
132
214
|
|
133
|
-
|
134
|
-
((Time.now.to_f - start_time) * 1000).to_i
|
215
|
+
paths
|
135
216
|
end
|
136
217
|
end
|
137
218
|
end
|
data/lib/sprockets/version.rb
CHANGED
@@ -16,18 +16,31 @@ module Sprockets
|
|
16
16
|
class YUICompressor
|
17
17
|
VERSION = '1'
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
# Public: Return singleton instance with default options.
|
20
|
+
#
|
21
|
+
# Returns YUICompressor object.
|
22
|
+
def self.instance
|
23
|
+
@instance ||= new
|
21
24
|
end
|
22
25
|
|
26
|
+
def self.call(input)
|
27
|
+
instance.call(input)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.cache_key
|
31
|
+
instance.cache_key
|
32
|
+
end
|
33
|
+
|
34
|
+
attr_reader :cache_key
|
35
|
+
|
23
36
|
def initialize(options = {})
|
24
37
|
@options = options
|
25
38
|
@cache_key = [
|
26
|
-
|
39
|
+
self.class.name,
|
27
40
|
::YUI::Compressor::VERSION,
|
28
41
|
VERSION,
|
29
42
|
options
|
30
|
-
]
|
43
|
+
].freeze
|
31
44
|
end
|
32
45
|
|
33
46
|
def call(input)
|
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: 3.0.0.beta.
|
4
|
+
version: 3.0.0.beta.7
|
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: 2015-02-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -223,7 +223,7 @@ files:
|
|
223
223
|
- lib/rake/sprocketstask.rb
|
224
224
|
- lib/sprockets.rb
|
225
225
|
- lib/sprockets/asset.rb
|
226
|
-
- lib/sprockets/
|
226
|
+
- lib/sprockets/autoload_processor.rb
|
227
227
|
- lib/sprockets/base.rb
|
228
228
|
- lib/sprockets/bower.rb
|
229
229
|
- lib/sprockets/bundle.rb
|
@@ -233,41 +233,50 @@ files:
|
|
233
233
|
- lib/sprockets/cache/null_store.rb
|
234
234
|
- lib/sprockets/cached_environment.rb
|
235
235
|
- lib/sprockets/closure_compressor.rb
|
236
|
+
- lib/sprockets/coffee_script_processor.rb
|
236
237
|
- lib/sprockets/coffee_script_template.rb
|
237
238
|
- lib/sprockets/compressing.rb
|
238
239
|
- lib/sprockets/configuration.rb
|
239
240
|
- lib/sprockets/context.rb
|
241
|
+
- lib/sprockets/dependencies.rb
|
240
242
|
- lib/sprockets/digest_utils.rb
|
241
243
|
- lib/sprockets/directive_processor.rb
|
244
|
+
- lib/sprockets/eco_processor.rb
|
242
245
|
- lib/sprockets/eco_template.rb
|
246
|
+
- lib/sprockets/ejs_processor.rb
|
243
247
|
- lib/sprockets/ejs_template.rb
|
244
248
|
- lib/sprockets/encoding_utils.rb
|
245
249
|
- lib/sprockets/engines.rb
|
246
250
|
- lib/sprockets/environment.rb
|
251
|
+
- lib/sprockets/erb_processor.rb
|
247
252
|
- lib/sprockets/erb_template.rb
|
248
253
|
- lib/sprockets/errors.rb
|
254
|
+
- lib/sprockets/file_reader.rb
|
249
255
|
- lib/sprockets/http_utils.rb
|
250
256
|
- lib/sprockets/jst_processor.rb
|
251
|
-
- lib/sprockets/lazy_processor.rb
|
252
257
|
- lib/sprockets/legacy.rb
|
253
258
|
- lib/sprockets/legacy_proc_processor.rb
|
254
259
|
- lib/sprockets/legacy_tilt_processor.rb
|
255
260
|
- lib/sprockets/loader.rb
|
256
261
|
- lib/sprockets/manifest.rb
|
257
262
|
- lib/sprockets/mime.rb
|
263
|
+
- lib/sprockets/path_dependency_utils.rb
|
258
264
|
- lib/sprockets/path_digest_utils.rb
|
259
265
|
- lib/sprockets/path_utils.rb
|
260
266
|
- lib/sprockets/paths.rb
|
261
267
|
- lib/sprockets/processing.rb
|
268
|
+
- lib/sprockets/processor_utils.rb
|
262
269
|
- lib/sprockets/resolve.rb
|
263
270
|
- lib/sprockets/sass_cache_store.rb
|
264
271
|
- lib/sprockets/sass_compressor.rb
|
265
272
|
- lib/sprockets/sass_functions.rb
|
266
273
|
- lib/sprockets/sass_importer.rb
|
274
|
+
- lib/sprockets/sass_processor.rb
|
267
275
|
- lib/sprockets/sass_template.rb
|
268
276
|
- lib/sprockets/server.rb
|
269
277
|
- lib/sprockets/transformers.rb
|
270
278
|
- lib/sprockets/uglifier_compressor.rb
|
279
|
+
- lib/sprockets/uri_utils.rb
|
271
280
|
- lib/sprockets/utils.rb
|
272
281
|
- lib/sprockets/version.rb
|
273
282
|
- lib/sprockets/yui_compressor.rb
|
@@ -291,7 +300,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
291
300
|
version: 1.3.1
|
292
301
|
requirements: []
|
293
302
|
rubyforge_project: sprockets
|
294
|
-
rubygems_version: 2.
|
303
|
+
rubygems_version: 2.4.5
|
295
304
|
signing_key:
|
296
305
|
specification_version: 4
|
297
306
|
summary: Rack-based asset packaging system
|