sprockets 2.2.3 → 2.12.5
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 +5 -5
- data/README.md +135 -4
- data/bin/sprockets +8 -0
- data/lib/rake/sprocketstask.rb +24 -13
- data/lib/sprockets.rb +52 -8
- data/lib/sprockets/asset.rb +17 -8
- data/lib/sprockets/asset_attributes.rb +15 -4
- data/lib/sprockets/base.rb +155 -15
- data/lib/sprockets/bundled_asset.rb +5 -6
- data/lib/sprockets/caching.rb +39 -39
- data/lib/sprockets/closure_compressor.rb +22 -0
- data/lib/sprockets/compressing.rb +73 -0
- data/lib/sprockets/context.rb +57 -3
- data/lib/sprockets/directive_processor.rb +3 -1
- data/lib/sprockets/engines.rb +4 -4
- data/lib/sprockets/environment.rb +12 -15
- data/lib/sprockets/errors.rb +1 -0
- data/lib/sprockets/index.rb +1 -0
- data/lib/sprockets/jst_processor.rb +2 -6
- data/lib/sprockets/manifest.rb +77 -19
- data/lib/sprockets/mime.rb +5 -4
- data/lib/sprockets/{trail.rb → paths.rb} +5 -37
- data/lib/sprockets/processed_asset.rb +1 -1
- data/lib/sprockets/processing.rb +3 -77
- data/lib/sprockets/processor.rb +1 -1
- data/lib/sprockets/sass_cache_store.rb +29 -0
- data/lib/sprockets/sass_compressor.rb +27 -0
- data/lib/sprockets/sass_functions.rb +70 -0
- data/lib/sprockets/sass_importer.rb +30 -0
- data/lib/sprockets/sass_template.rb +66 -0
- data/lib/sprockets/scss_template.rb +13 -0
- data/lib/sprockets/server.rb +1 -1
- data/lib/sprockets/static_asset.rb +4 -1
- data/lib/sprockets/uglifier_compressor.rb +29 -0
- data/lib/sprockets/version.rb +1 -1
- data/lib/sprockets/yui_compressor.rb +27 -0
- metadata +88 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 80bdc30a8aea68bb04398d467eea5a5e4cfe9b7dcef6ee41e2902debcec63342
|
4
|
+
data.tar.gz: 55a0f0b58e3e55c08ccfb30476017b814894b7ec98cf3bd22eecbc8bdcbe5c39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3ee63f44b0391509f3e80b1c6b403abf52168a66910da726221b7b45c6c51187f86a7896df45e8b6c7bed68d5218ad7915fa79602e3cf7a23c32622d23ab8a5
|
7
|
+
data.tar.gz: da30a4f95ef0691cec504b73b1d832cec2577aa0b2905050e74ad9a89322c6568e3ec250a760ac3a6f2080f738e8ed1580e3ae7ff2a53e8623820d98fea00b2d
|
data/README.md
CHANGED
@@ -159,9 +159,9 @@ variables, mixins, operations and functions.
|
|
159
159
|
|
160
160
|
If the `less` gem is available to your application, you can use LESS
|
161
161
|
to write CSS assets in Sprockets. Note that the LESS compiler is
|
162
|
-
written in JavaScript
|
163
|
-
|
164
|
-
|
162
|
+
written in JavaScript and the `less` gem (on MRI) uses `therubyracer`
|
163
|
+
which embeds the V8 JavaScript runtime in Ruby, while on JRuby you're
|
164
|
+
going to need `therubyrhino` gem installed.
|
165
165
|
|
166
166
|
To write CSS assets with LESS, use the extension `.css.less`.
|
167
167
|
|
@@ -336,6 +336,18 @@ source file before any subsequent `require` or `include` directives.
|
|
336
336
|
including it in the bundle. This is useful when you need to expire an
|
337
337
|
asset's cache in response to a change in another file.
|
338
338
|
|
339
|
+
### The `depend_on_asset` Directive ###
|
340
|
+
|
341
|
+
`depend_on_asset` *path* works like `depend_on`, but operates
|
342
|
+
recursively reading the the file and following the directives found.
|
343
|
+
|
344
|
+
### The `stub` Directive ###
|
345
|
+
|
346
|
+
`stub` *path* allows dependency to be excluded from the asset bundle.
|
347
|
+
The *path* must be a valid asset and may or may not already be part
|
348
|
+
of the bundle. Once stubbed, it is blacklisted and can't be brought
|
349
|
+
back by any other `require`.
|
350
|
+
|
339
351
|
# Development #
|
340
352
|
|
341
353
|
## Contributing ##
|
@@ -354,7 +366,126 @@ submit a pull request.
|
|
354
366
|
|
355
367
|
## Version History ##
|
356
368
|
|
357
|
-
**2.
|
369
|
+
**2.12.3** (October 28, 2014)
|
370
|
+
|
371
|
+
* Security: Fix directory traversal bug in development mode server.
|
372
|
+
|
373
|
+
**2.12.2** (September 5, 2014)
|
374
|
+
|
375
|
+
* Ensure internal asset lookups calls are still restricted to load paths within
|
376
|
+
asset compiles. Though, you should not depend on internal asset resolves to be
|
377
|
+
completely restricted for security reasons. Assets themselves should be
|
378
|
+
considered full scripting environments with filesystem access.
|
379
|
+
|
380
|
+
**2.12.1** (April 17, 2014)
|
381
|
+
|
382
|
+
* Fix making manifest target directory when its different than the output directory.
|
383
|
+
|
384
|
+
**2.12.0** (March 13, 2014)
|
385
|
+
|
386
|
+
* Avoid context reference in SassImporter hack so its Marshallable. Fixes
|
387
|
+
issues with Sass 3.3.x.
|
388
|
+
|
389
|
+
**2.11.0** (February 19, 2014)
|
390
|
+
|
391
|
+
* Support for `.bower.json`
|
392
|
+
|
393
|
+
**2.10.0** (May 24, 2013)
|
394
|
+
|
395
|
+
* Support for `bower.json`
|
396
|
+
|
397
|
+
**2.9.3** (April 20, 2013)
|
398
|
+
|
399
|
+
* Fixed sass caching bug
|
400
|
+
|
401
|
+
**2.9.2** (April 8, 2013)
|
402
|
+
|
403
|
+
* Improve file freshness check performance
|
404
|
+
* Directive processor encoding fixes
|
405
|
+
|
406
|
+
**2.9.1** (April 6, 2013)
|
407
|
+
|
408
|
+
* Support for Uglifier 2.x
|
409
|
+
|
410
|
+
**2.9.0** (February 25, 2013)
|
411
|
+
|
412
|
+
* Write out gzipped variants of bundled assets.
|
413
|
+
|
414
|
+
**2.8.2** (December 10, 2012)
|
415
|
+
|
416
|
+
* Fixed top level Sass constant references
|
417
|
+
* Fixed manifest logger when environment is disabled
|
418
|
+
|
419
|
+
**2.8.1** (October 31, 2012)
|
420
|
+
|
421
|
+
* Fixed Sass importer bug
|
422
|
+
|
423
|
+
**2.8.0** (October 16, 2012)
|
424
|
+
|
425
|
+
* Allow manifest location to be seperated from output directory
|
426
|
+
* Pass logical path and absolute path to each_logical_path iterator
|
427
|
+
|
428
|
+
**2.7.0** (October 10, 2012)
|
429
|
+
|
430
|
+
* Added --css-compressor and --js-compressor command line flags
|
431
|
+
* Added css/js compressor shorthand
|
432
|
+
* Change default manifest.json filename to be a randomized manifest-16HEXBYTES.json
|
433
|
+
* Allow nil environment to be passed to manifest
|
434
|
+
* Allow manifest instance to be set on rake task
|
435
|
+
|
436
|
+
**2.6.0** (September 19, 2012)
|
437
|
+
|
438
|
+
* Added bower component.json require support
|
439
|
+
|
440
|
+
**2.5.0** (September 4, 2012)
|
441
|
+
|
442
|
+
* Fixed Ruby 2.0 RegExp warning
|
443
|
+
* Provide stubbed implementation of context *_path helpers
|
444
|
+
* Add SassCompressor
|
445
|
+
|
446
|
+
**2.4.5** (July 10, 2012)
|
447
|
+
|
448
|
+
* Tweaked some logger levels
|
449
|
+
|
450
|
+
**2.4.4** (July 2, 2012)
|
451
|
+
|
452
|
+
* Canonicalize logical path extensions
|
453
|
+
* Check absolute paths passed to depend_on
|
454
|
+
|
455
|
+
**2.4.3** (May 16, 2012)
|
456
|
+
|
457
|
+
* Exposed :sprockets in sass options
|
458
|
+
* Include dependency paths in asset mtime
|
459
|
+
|
460
|
+
**2.4.2** (May 7, 2012)
|
461
|
+
|
462
|
+
* Fixed MultiJson feature detect
|
463
|
+
|
464
|
+
**2.4.1** (April 26, 2012)
|
465
|
+
|
466
|
+
* Fixed MultiJson API change
|
467
|
+
* Fixed gzip mtime
|
468
|
+
|
469
|
+
**2.4.0** (March 27, 2012)
|
470
|
+
|
471
|
+
* Added global path registry
|
472
|
+
* Added global processor registry
|
473
|
+
|
474
|
+
**2.3.2** (March 26, 2012)
|
475
|
+
|
476
|
+
* Fix Context#logical_path with dots
|
477
|
+
|
478
|
+
**2.3.1** (February 11, 2012)
|
479
|
+
|
480
|
+
* Added bytesize to manifest
|
481
|
+
* Added Asset#bytesize alias
|
482
|
+
* Security: Check path for forbidden access after unescaping
|
483
|
+
|
484
|
+
**2.3.0** (January 16, 2012)
|
485
|
+
|
486
|
+
* Added special Sass importer that automatically tracks any `@import`ed files.
|
487
|
+
|
488
|
+
**2.2.0** (January 10, 2012)
|
358
489
|
|
359
490
|
* Added `sprockets` command line utility.
|
360
491
|
* Added rake/sprocketstask.
|
data/bin/sprockets
CHANGED
@@ -40,6 +40,14 @@ OptionParser.new do |opts|
|
|
40
40
|
manifest = Sprockets::Manifest.new(environment, directory)
|
41
41
|
end
|
42
42
|
|
43
|
+
opts.on("--css-compressor=COMPRESSOR", "Use CSS compressor") do |compressor|
|
44
|
+
environment.css_compressor = compressor.to_sym
|
45
|
+
end
|
46
|
+
|
47
|
+
opts.on("--js-compressor=COMPRESSOR", "Use JavaScript compressor") do |compressor|
|
48
|
+
environment.js_compressor = compressor.to_sym
|
49
|
+
end
|
50
|
+
|
43
51
|
opts.on("--noenv", "Disables .sprocketsrc file") do
|
44
52
|
end
|
45
53
|
|
data/lib/rake/sprocketstask.rb
CHANGED
@@ -37,6 +37,24 @@ module Rake
|
|
37
37
|
end
|
38
38
|
attr_writer :environment
|
39
39
|
|
40
|
+
# Returns cached indexed environment
|
41
|
+
def index
|
42
|
+
@index ||= environment.index if environment
|
43
|
+
end
|
44
|
+
|
45
|
+
# `Manifest` instance used for already compiled assets.
|
46
|
+
#
|
47
|
+
# Will be created by default if an environment and output
|
48
|
+
# directory are given
|
49
|
+
def manifest
|
50
|
+
if !@manifest.is_a?(Sprockets::Manifest) && @manifest.respond_to?(:call)
|
51
|
+
@manifest = @manifest.call
|
52
|
+
else
|
53
|
+
@manifest
|
54
|
+
end
|
55
|
+
end
|
56
|
+
attr_writer :manifest
|
57
|
+
|
40
58
|
# Directory to write compiled assets too. As well as the manifest file.
|
41
59
|
#
|
42
60
|
# t.output = "./public/assets"
|
@@ -79,6 +97,7 @@ module Rake
|
|
79
97
|
def initialize(name = :assets)
|
80
98
|
@name = name
|
81
99
|
@environment = lambda { Sprockets::Environment.new(Dir.pwd) }
|
100
|
+
@manifest = lambda { Sprockets::Manifest.new(index, output) }
|
82
101
|
@logger = Logger.new($stderr)
|
83
102
|
@logger.level = Logger::INFO
|
84
103
|
@keep = 2
|
@@ -117,24 +136,16 @@ module Rake
|
|
117
136
|
end
|
118
137
|
|
119
138
|
private
|
120
|
-
# Returns cached indexed environment
|
121
|
-
def index
|
122
|
-
@index ||= environment.index
|
123
|
-
end
|
124
|
-
|
125
|
-
# Returns manifest for tasks
|
126
|
-
def manifest
|
127
|
-
@manifest ||= Sprockets::Manifest.new(index, output)
|
128
|
-
end
|
129
|
-
|
130
139
|
# Sub out environment logger with our rake task logger that
|
131
140
|
# writes to stderr.
|
132
141
|
def with_logger
|
133
|
-
|
134
|
-
|
142
|
+
if env = manifest.environment
|
143
|
+
old_logger = env.logger
|
144
|
+
env.logger = @logger
|
145
|
+
end
|
135
146
|
yield
|
136
147
|
ensure
|
137
|
-
|
148
|
+
env.logger = old_logger if env
|
138
149
|
end
|
139
150
|
end
|
140
151
|
end
|
data/lib/sprockets.rb
CHANGED
@@ -3,7 +3,6 @@ require 'sprockets/version'
|
|
3
3
|
module Sprockets
|
4
4
|
# Environment
|
5
5
|
autoload :Base, "sprockets/base"
|
6
|
-
autoload :Engines, "sprockets/engines"
|
7
6
|
autoload :Environment, "sprockets/environment"
|
8
7
|
autoload :Index, "sprockets/index"
|
9
8
|
autoload :Manifest, "sprockets/manifest"
|
@@ -15,14 +14,16 @@ module Sprockets
|
|
15
14
|
autoload :StaticAsset, "sprockets/static_asset"
|
16
15
|
|
17
16
|
# Processing
|
18
|
-
autoload :CharsetNormalizer, "sprockets/charset_normalizer"
|
19
17
|
autoload :Context, "sprockets/context"
|
20
|
-
autoload :DirectiveProcessor, "sprockets/directive_processor"
|
21
18
|
autoload :EcoTemplate, "sprockets/eco_template"
|
22
19
|
autoload :EjsTemplate, "sprockets/ejs_template"
|
23
20
|
autoload :JstProcessor, "sprockets/jst_processor"
|
24
21
|
autoload :Processor, "sprockets/processor"
|
25
|
-
autoload :
|
22
|
+
autoload :SassCacheStore, "sprockets/sass_cache_store"
|
23
|
+
autoload :SassFunctions, "sprockets/sass_functions"
|
24
|
+
autoload :SassImporter, "sprockets/sass_importer"
|
25
|
+
autoload :SassTemplate, "sprockets/sass_template"
|
26
|
+
autoload :ScssTemplate, "sprockets/scss_template"
|
26
27
|
|
27
28
|
# Internal utilities
|
28
29
|
autoload :ArgumentError, "sprockets/errors"
|
@@ -39,8 +40,51 @@ module Sprockets
|
|
39
40
|
end
|
40
41
|
|
41
42
|
# Extend Sprockets module to provide global registry
|
42
|
-
|
43
|
-
|
43
|
+
require 'hike'
|
44
|
+
require 'sprockets/engines'
|
45
|
+
require 'sprockets/mime'
|
46
|
+
require 'sprockets/processing'
|
47
|
+
require 'sprockets/compressing'
|
48
|
+
require 'sprockets/paths'
|
49
|
+
extend Engines, Mime, Processing, Compressing, Paths
|
50
|
+
|
51
|
+
@trail = Hike::Trail.new(File.expand_path('..', __FILE__))
|
52
|
+
@mime_types = {}
|
53
|
+
@engines = {}
|
54
|
+
@preprocessors = Hash.new { |h, k| h[k] = [] }
|
55
|
+
@postprocessors = Hash.new { |h, k| h[k] = [] }
|
56
|
+
@bundle_processors = Hash.new { |h, k| h[k] = [] }
|
57
|
+
@compressors = Hash.new { |h, k| h[k] = {} }
|
58
|
+
|
59
|
+
register_mime_type 'text/css', '.css'
|
60
|
+
register_mime_type 'application/javascript', '.js'
|
61
|
+
|
62
|
+
require 'sprockets/directive_processor'
|
63
|
+
register_preprocessor 'text/css', DirectiveProcessor
|
64
|
+
register_preprocessor 'application/javascript', DirectiveProcessor
|
65
|
+
|
66
|
+
require 'sprockets/safety_colons'
|
67
|
+
register_postprocessor 'application/javascript', SafetyColons
|
68
|
+
|
69
|
+
require 'sprockets/charset_normalizer'
|
70
|
+
register_bundle_processor 'text/css', CharsetNormalizer
|
71
|
+
|
72
|
+
require 'sprockets/sass_compressor'
|
73
|
+
register_compressor 'text/css', :sass, SassCompressor
|
74
|
+
register_compressor 'text/css', :scss, SassCompressor
|
75
|
+
|
76
|
+
require 'sprockets/yui_compressor'
|
77
|
+
register_compressor 'text/css', :yui, YUICompressor
|
78
|
+
|
79
|
+
require 'sprockets/closure_compressor'
|
80
|
+
register_compressor 'application/javascript', :closure, ClosureCompressor
|
81
|
+
|
82
|
+
require 'sprockets/uglifier_compressor'
|
83
|
+
register_compressor 'application/javascript', :uglifier, UglifierCompressor
|
84
|
+
register_compressor 'application/javascript', :uglify, UglifierCompressor
|
85
|
+
|
86
|
+
require 'sprockets/yui_compressor'
|
87
|
+
register_compressor 'application/javascript', :yui, YUICompressor
|
44
88
|
|
45
89
|
# Cherry pick the default Tilt engines that make sense for
|
46
90
|
# Sprockets. We don't need ones that only generate html like HAML.
|
@@ -55,8 +99,8 @@ module Sprockets
|
|
55
99
|
|
56
100
|
# CSS engines
|
57
101
|
register_engine '.less', Tilt::LessTemplate
|
58
|
-
register_engine '.sass',
|
59
|
-
register_engine '.scss',
|
102
|
+
register_engine '.sass', SassTemplate
|
103
|
+
register_engine '.scss', ScssTemplate
|
60
104
|
|
61
105
|
# Other
|
62
106
|
register_engine '.erb', Tilt::ERBTemplate
|
data/lib/sprockets/asset.rb
CHANGED
@@ -30,13 +30,17 @@ module Sprockets
|
|
30
30
|
|
31
31
|
attr_reader :logical_path, :pathname
|
32
32
|
attr_reader :content_type, :mtime, :length, :digest
|
33
|
+
alias_method :bytesize, :length
|
33
34
|
|
34
35
|
def initialize(environment, logical_path, pathname)
|
36
|
+
raise ArgumentError, "Asset logical path has no extension: #{logical_path}" if File.extname(logical_path) == ""
|
37
|
+
|
35
38
|
@root = environment.root
|
36
39
|
@logical_path = logical_path.to_s
|
37
40
|
@pathname = Pathname.new(pathname)
|
38
41
|
@content_type = environment.content_type_of(pathname)
|
39
|
-
|
42
|
+
# drop precision to 1 second, same pattern followed elsewhere
|
43
|
+
@mtime = Time.at(environment.stat(pathname).mtime.to_i)
|
40
44
|
@length = environment.stat(pathname).size
|
41
45
|
@digest = environment.file_digest(pathname).hexdigest
|
42
46
|
end
|
@@ -55,8 +59,7 @@ module Sprockets
|
|
55
59
|
end
|
56
60
|
|
57
61
|
if mtime = coder['mtime']
|
58
|
-
|
59
|
-
@mtime = Time.parse(mtime)
|
62
|
+
@mtime = Time.at(mtime)
|
60
63
|
end
|
61
64
|
|
62
65
|
if length = coder['length']
|
@@ -71,7 +74,7 @@ module Sprockets
|
|
71
74
|
coder['logical_path'] = logical_path
|
72
75
|
coder['pathname'] = relativize_root_path(pathname).to_s
|
73
76
|
coder['content_type'] = content_type
|
74
|
-
coder['mtime'] = mtime.
|
77
|
+
coder['mtime'] = mtime.to_i
|
75
78
|
coder['length'] = length
|
76
79
|
coder['digest'] = digest
|
77
80
|
end
|
@@ -136,7 +139,9 @@ module Sprockets
|
|
136
139
|
# Save asset to disk.
|
137
140
|
def write_to(filename, options = {})
|
138
141
|
# Gzip contents if filename has '.gz'
|
139
|
-
options
|
142
|
+
unless options.key?(:compress)
|
143
|
+
options[:compress] = File.extname(filename) == '.gz' && File.extname(logical_path) != '.gz'
|
144
|
+
end
|
140
145
|
|
141
146
|
FileUtils.mkdir_p File.dirname(filename)
|
142
147
|
|
@@ -144,12 +149,12 @@ module Sprockets
|
|
144
149
|
if options[:compress]
|
145
150
|
# Run contents through `Zlib`
|
146
151
|
gz = Zlib::GzipWriter.new(f, Zlib::BEST_COMPRESSION)
|
152
|
+
gz.mtime = mtime.to_i
|
147
153
|
gz.write to_s
|
148
154
|
gz.close
|
149
155
|
else
|
150
156
|
# Write out as is
|
151
157
|
f.write to_s
|
152
|
-
f.close
|
153
158
|
end
|
154
159
|
end
|
155
160
|
|
@@ -233,7 +238,7 @@ module Sprockets
|
|
233
238
|
return false
|
234
239
|
end
|
235
240
|
|
236
|
-
# Compare dependency
|
241
|
+
# Compare dependency mtime to the actual mtime. If the
|
237
242
|
# dependency mtime is newer than the actual mtime, the file
|
238
243
|
# hasn't changed since we created this `Asset` instance.
|
239
244
|
#
|
@@ -241,7 +246,11 @@ module Sprockets
|
|
241
246
|
# stale. Many deployment environments may recopy or recheckout
|
242
247
|
# assets on each deploy. In this case the mtime would be the
|
243
248
|
# time of deploy rather than modified time.
|
244
|
-
|
249
|
+
#
|
250
|
+
# Note: to_i is used in eql? and write_to we assume fidelity of 1 second
|
251
|
+
# if people save files more frequently than 1 second sprockets may
|
252
|
+
# not pick it up, by design
|
253
|
+
if mtime.to_i >= stat.mtime.to_i
|
245
254
|
return true
|
246
255
|
end
|
247
256
|
|
@@ -17,10 +17,21 @@ module Sprockets
|
|
17
17
|
def search_paths
|
18
18
|
paths = [pathname.to_s]
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
extension = format_extension
|
21
|
+
path_without_extension = extension ?
|
22
|
+
pathname.sub(extension, '') :
|
23
|
+
pathname
|
24
|
+
|
25
|
+
# optimization: bower.json can only be nested one level deep
|
26
|
+
if !path_without_extension.to_s.index('/')
|
27
|
+
paths << path_without_extension.join(".bower.json").to_s
|
28
|
+
paths << path_without_extension.join("bower.json").to_s
|
29
|
+
# DEPRECATED bower configuration file
|
30
|
+
paths << path_without_extension.join("component.json").to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
if pathname.basename(extension.to_s).to_s != 'index'
|
34
|
+
paths << path_without_extension.join("index#{extension}").to_s
|
24
35
|
end
|
25
36
|
|
26
37
|
paths
|