sprockets 2.6.0 → 4.2.2

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.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +118 -0
  3. data/{LICENSE → MIT-LICENSE} +2 -2
  4. data/README.md +541 -289
  5. data/bin/sprockets +20 -7
  6. data/lib/rake/sprocketstask.rb +34 -17
  7. data/lib/sprockets/add_source_map_comment_to_asset_processor.rb +60 -0
  8. data/lib/sprockets/asset.rb +158 -210
  9. data/lib/sprockets/autoload/babel.rb +8 -0
  10. data/lib/sprockets/autoload/closure.rb +8 -0
  11. data/lib/sprockets/autoload/coffee_script.rb +8 -0
  12. data/lib/sprockets/autoload/eco.rb +8 -0
  13. data/lib/sprockets/autoload/ejs.rb +8 -0
  14. data/lib/sprockets/autoload/jsminc.rb +8 -0
  15. data/lib/sprockets/autoload/sass.rb +8 -0
  16. data/lib/sprockets/autoload/sassc.rb +8 -0
  17. data/lib/sprockets/autoload/uglifier.rb +8 -0
  18. data/lib/sprockets/autoload/yui.rb +8 -0
  19. data/lib/sprockets/autoload/zopfli.rb +7 -0
  20. data/lib/sprockets/autoload.rb +16 -0
  21. data/lib/sprockets/babel_processor.rb +66 -0
  22. data/lib/sprockets/base.rb +89 -378
  23. data/lib/sprockets/bower.rb +61 -0
  24. data/lib/sprockets/bundle.rb +105 -0
  25. data/lib/sprockets/cache/file_store.rb +190 -14
  26. data/lib/sprockets/cache/memory_store.rb +84 -0
  27. data/lib/sprockets/cache/null_store.rb +54 -0
  28. data/lib/sprockets/cache.rb +271 -0
  29. data/lib/sprockets/cached_environment.rb +64 -0
  30. data/lib/sprockets/closure_compressor.rb +48 -0
  31. data/lib/sprockets/coffee_script_processor.rb +39 -0
  32. data/lib/sprockets/compressing.rb +134 -0
  33. data/lib/sprockets/configuration.rb +79 -0
  34. data/lib/sprockets/context.rb +166 -150
  35. data/lib/sprockets/dependencies.rb +74 -0
  36. data/lib/sprockets/digest_utils.rb +197 -0
  37. data/lib/sprockets/directive_processor.rb +241 -215
  38. data/lib/sprockets/eco_processor.rb +33 -0
  39. data/lib/sprockets/ejs_processor.rb +32 -0
  40. data/lib/sprockets/encoding_utils.rb +261 -0
  41. data/lib/sprockets/environment.rb +23 -64
  42. data/lib/sprockets/erb_processor.rb +43 -0
  43. data/lib/sprockets/errors.rb +5 -13
  44. data/lib/sprockets/exporters/base.rb +71 -0
  45. data/lib/sprockets/exporters/file_exporter.rb +24 -0
  46. data/lib/sprockets/exporters/zlib_exporter.rb +33 -0
  47. data/lib/sprockets/exporters/zopfli_exporter.rb +14 -0
  48. data/lib/sprockets/exporting.rb +73 -0
  49. data/lib/sprockets/file_reader.rb +16 -0
  50. data/lib/sprockets/http_utils.rb +135 -0
  51. data/lib/sprockets/jsminc_compressor.rb +32 -0
  52. data/lib/sprockets/jst_processor.rb +36 -19
  53. data/lib/sprockets/loader.rb +347 -0
  54. data/lib/sprockets/manifest.rb +228 -112
  55. data/lib/sprockets/manifest_utils.rb +48 -0
  56. data/lib/sprockets/mime.rb +78 -31
  57. data/lib/sprockets/npm.rb +52 -0
  58. data/lib/sprockets/path_dependency_utils.rb +77 -0
  59. data/lib/sprockets/path_digest_utils.rb +48 -0
  60. data/lib/sprockets/path_utils.rb +367 -0
  61. data/lib/sprockets/paths.rb +43 -19
  62. data/lib/sprockets/preprocessors/default_source_map.rb +49 -0
  63. data/lib/sprockets/processing.rb +146 -164
  64. data/lib/sprockets/processor_utils.rb +170 -0
  65. data/lib/sprockets/resolve.rb +295 -0
  66. data/lib/sprockets/sass_cache_store.rb +20 -15
  67. data/lib/sprockets/sass_compressor.rb +55 -10
  68. data/lib/sprockets/sass_functions.rb +3 -70
  69. data/lib/sprockets/sass_importer.rb +3 -29
  70. data/lib/sprockets/sass_processor.rb +313 -0
  71. data/lib/sprockets/sassc_compressor.rb +56 -0
  72. data/lib/sprockets/sassc_processor.rb +297 -0
  73. data/lib/sprockets/server.rb +159 -91
  74. data/lib/sprockets/source_map_processor.rb +66 -0
  75. data/lib/sprockets/source_map_utils.rb +483 -0
  76. data/lib/sprockets/transformers.rb +173 -0
  77. data/lib/sprockets/uglifier_compressor.rb +66 -0
  78. data/lib/sprockets/unloaded_asset.rb +139 -0
  79. data/lib/sprockets/uri_tar.rb +99 -0
  80. data/lib/sprockets/uri_utils.rb +194 -0
  81. data/lib/sprockets/utils/gzip.rb +99 -0
  82. data/lib/sprockets/utils.rb +193 -52
  83. data/lib/sprockets/version.rb +2 -1
  84. data/lib/sprockets/yui_compressor.rb +56 -0
  85. data/lib/sprockets.rb +217 -75
  86. metadata +272 -117
  87. data/lib/sprockets/asset_attributes.rb +0 -131
  88. data/lib/sprockets/bundled_asset.rb +0 -80
  89. data/lib/sprockets/caching.rb +0 -96
  90. data/lib/sprockets/charset_normalizer.rb +0 -41
  91. data/lib/sprockets/eco_template.rb +0 -38
  92. data/lib/sprockets/ejs_template.rb +0 -37
  93. data/lib/sprockets/engines.rb +0 -74
  94. data/lib/sprockets/index.rb +0 -99
  95. data/lib/sprockets/processed_asset.rb +0 -152
  96. data/lib/sprockets/processor.rb +0 -32
  97. data/lib/sprockets/safety_colons.rb +0 -28
  98. data/lib/sprockets/sass_template.rb +0 -60
  99. data/lib/sprockets/scss_template.rb +0 -13
  100. data/lib/sprockets/static_asset.rb +0 -58
@@ -1,69 +1,210 @@
1
+ # frozen_string_literal: true
2
+ require 'set'
3
+
1
4
  module Sprockets
2
- # `Utils`, we didn't know where else to put it!
5
+ # Internal: Utils, we didn't know where else to put it! Functions may
6
+ # eventually be shuffled into more specific drawers.
3
7
  module Utils
4
- # If theres encoding support (aka Ruby 1.9)
5
- if "".respond_to?(:valid_encoding?)
6
- # Define UTF-8 BOM pattern matcher.
7
- # Avoid using a Regexp literal because it inheirts the files
8
- # encoding and we want to avoid syntax errors in other interpreters.
9
- UTF8_BOM_PATTERN = Regexp.new("\\A\uFEFF".encode('utf-8'))
10
-
11
- def self.read_unicode(pathname, external_encoding = Encoding.default_external)
12
- pathname.open("r:#{external_encoding}") do |f|
13
- f.read.tap do |data|
14
- # Eager validate the file's encoding. In most cases we
15
- # expect it to be UTF-8 unless `default_external` is set to
16
- # something else. An error is usually raised if the file is
17
- # saved as UTF-16 when we expected UTF-8.
18
- if !data.valid_encoding?
19
- raise EncodingError, "#{pathname} has a invalid " +
20
- "#{data.encoding} byte sequence"
21
-
22
- # If the file is UTF-8 and theres a BOM, strip it for safe concatenation.
23
- elsif data.encoding.name == "UTF-8" && data =~ UTF8_BOM_PATTERN
24
- data.sub!(UTF8_BOM_PATTERN, "")
25
- end
26
- end
8
+ extend self
9
+
10
+ # Internal: Check if object can safely be .dup'd.
11
+ #
12
+ # Similar to ActiveSupport #duplicable? check.
13
+ #
14
+ # obj - Any Object
15
+ #
16
+ # Returns false if .dup would raise a TypeError, otherwise true.
17
+ def duplicable?(obj)
18
+ case obj
19
+ when NilClass, FalseClass, TrueClass, Symbol, Numeric
20
+ false
21
+ else
22
+ true
23
+ end
24
+ end
25
+
26
+ # Internal: Duplicate and store key/value on new frozen hash.
27
+ #
28
+ # Separated for recursive calls, always use hash_reassoc(hash, *keys).
29
+ #
30
+ # hash - Hash
31
+ # key - Object key
32
+ #
33
+ # Returns Hash.
34
+ def hash_reassoc1(hash, key)
35
+ hash = hash.dup if hash.frozen?
36
+ old_value = hash[key]
37
+ old_value = old_value.dup if duplicable?(old_value)
38
+ new_value = yield old_value
39
+ new_value.freeze if duplicable?(new_value)
40
+ hash.store(key, new_value)
41
+ hash.freeze
42
+ end
43
+
44
+ # Internal: Duplicate and store key/value on new frozen hash.
45
+ #
46
+ # Similar to Hash#store for nested frozen hashes.
47
+ #
48
+ # hash - Hash
49
+ # key_a - Object key. Use multiple keys for nested hashes.
50
+ # key_b - Object key. Use multiple keys for nested hashes.
51
+ # block - Receives current value at key.
52
+ #
53
+ # Examples
54
+ #
55
+ # config = {paths: ["/bin", "/sbin"]}.freeze
56
+ # new_config = hash_reassoc(config, :paths) do |paths|
57
+ # paths << "/usr/local/bin"
58
+ # end
59
+ #
60
+ # Returns duplicated frozen Hash.
61
+ def hash_reassoc(hash, key_a, key_b = nil, &block)
62
+ if key_b
63
+ hash_reassoc1(hash, key_a) do |value|
64
+ hash_reassoc(value, key_b, &block)
27
65
  end
66
+ else
67
+ hash_reassoc1(hash, key_a, &block)
68
+ end
69
+ end
70
+
71
+ WHITESPACE_ORDINALS = {0x0A => "\n", 0x20 => " ", 0x09 => "\t"}
72
+ private_constant :WHITESPACE_ORDINALS
73
+
74
+ # Internal: Check if string has a trailing semicolon.
75
+ #
76
+ # str - String
77
+ #
78
+ # Returns true or false.
79
+ def string_end_with_semicolon?(str)
80
+ i = str.size - 1
81
+ while i >= 0
82
+ c = str[i].ord
83
+ i -= 1
84
+
85
+ next if WHITESPACE_ORDINALS[c]
86
+
87
+ return c === 0x3B
28
88
  end
29
89
 
30
- else
31
- # Define UTF-8 and UTF-16 BOM pattern matchers.
32
- # Avoid using a Regexp literal to prevent syntax errors in other interpreters.
33
- UTF8_BOM_PATTERN = Regexp.new("\\A\\xEF\\xBB\\xBF")
34
- UTF16_BOM_PATTERN = Regexp.new("\\A(\\xFE\\xFF|\\xFF\\xFE)")
35
-
36
- def self.read_unicode(pathname)
37
- pathname.read.tap do |data|
38
- # If the file is UTF-8 and theres a BOM, strip it for safe concatenation.
39
- if data =~ UTF8_BOM_PATTERN
40
- data.sub!(UTF8_BOM_PATTERN, "")
41
-
42
- # If we find a UTF-16 BOM, theres nothing we can do on
43
- # 1.8. Only UTF-8 is supported.
44
- elsif data =~ UTF16_BOM_PATTERN
45
- raise EncodingError, "#{pathname} has a UTF-16 BOM. " +
46
- "Resave the file as UTF-8 or upgrade to Ruby 1.9."
90
+ true
91
+ end
92
+
93
+ # Internal: Accumulate asset source to buffer and append a trailing
94
+ # semicolon if necessary.
95
+ #
96
+ # buf - String buffer to append to
97
+ # source - String source to append
98
+ #
99
+ # Returns buf String.
100
+ def concat_javascript_sources(buf, source)
101
+ return buf if source.bytesize <= 0
102
+
103
+ buf << source
104
+ # If the source contains non-ASCII characters, indexing on it becomes O(N).
105
+ # This will lead to O(N^2) performance in string_end_with_semicolon?, so we should use 32 bit encoding to make sure indexing stays O(1)
106
+ source = source.encode(Encoding::UTF_32LE) unless source.ascii_only?
107
+ return buf if string_end_with_semicolon?(source)
108
+
109
+ # If the last character in the string was whitespace,
110
+ # such as a newline, then we want to put the semicolon
111
+ # before the whitespace. Otherwise append a semicolon.
112
+ if whitespace = WHITESPACE_ORDINALS[source[-1].ord]
113
+ buf[-1] = ";#{whitespace}"
114
+ else
115
+ buf << ";"
116
+ end
117
+
118
+ buf
119
+ end
120
+
121
+ MODULE_INCLUDE_MUTEX = Mutex.new
122
+ private_constant :MODULE_INCLUDE_MUTEX
123
+
124
+ # Internal: Inject into target module for the duration of the block.
125
+ #
126
+ # mod - Module
127
+ #
128
+ # Returns result of block.
129
+ def module_include(base, mod)
130
+ MODULE_INCLUDE_MUTEX.synchronize do
131
+ old_methods = {}
132
+
133
+ mod.instance_methods.each do |sym|
134
+ old_methods[sym] = base.instance_method(sym) if base.method_defined?(sym)
135
+ end
136
+
137
+ mod.instance_methods.each do |sym|
138
+ method = mod.instance_method(sym)
139
+ if base.method_defined?(sym)
140
+ base.send(:alias_method, sym, sym)
47
141
  end
142
+ base.send(:define_method, sym, method)
143
+ end
144
+
145
+ yield
146
+ ensure
147
+ mod.instance_methods.each do |sym|
148
+ base.send(:undef_method, sym) if base.method_defined?(sym)
149
+ end
150
+ old_methods.each do |sym, method|
151
+ base.send(:define_method, sym, method)
48
152
  end
49
153
  end
50
154
  end
51
155
 
52
- # Prepends a leading "." to an extension if its missing.
156
+ # Internal: Post-order Depth-First search algorithm.
53
157
  #
54
- # normalize_extension("js")
55
- # # => ".js"
158
+ # Used for resolving asset dependencies.
56
159
  #
57
- # normalize_extension(".css")
58
- # # => ".css"
160
+ # initial - Initial Array of nodes to traverse.
161
+ # block -
162
+ # node - Current node to get children of
59
163
  #
60
- def self.normalize_extension(extension)
61
- extension = extension.to_s
62
- if extension[/^\./]
63
- extension
64
- else
65
- ".#{extension}"
164
+ # Returns a Set of nodes.
165
+ def dfs(initial)
166
+ nodes, seen = Set.new, Set.new
167
+ stack = Array(initial).reverse
168
+
169
+ while node = stack.pop
170
+ if seen.include?(node)
171
+ nodes.add(node)
172
+ else
173
+ seen.add(node)
174
+ stack.push(node)
175
+ stack.concat(Array(yield node).reverse)
176
+ end
66
177
  end
178
+
179
+ nodes
180
+ end
181
+
182
+ # Internal: Post-order Depth-First search algorithm that gathers all paths
183
+ # along the way.
184
+ #
185
+ # TODO: Rename function.
186
+ #
187
+ # path - Initial Array node path
188
+ # block -
189
+ # node - Current node to get children of
190
+ #
191
+ # Returns an Array of node Arrays.
192
+ def dfs_paths(path)
193
+ paths = []
194
+ stack = [path]
195
+ seen = Set.new
196
+
197
+ while path = stack.pop
198
+ seen.add(path.last)
199
+ paths << path
200
+
201
+ children = yield path.last
202
+ children.reverse_each do |node|
203
+ stack.push(path + [node]) unless seen.include?(node)
204
+ end
205
+ end
206
+
207
+ paths
67
208
  end
68
209
  end
69
210
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Sprockets
2
- VERSION = "2.6.0"
3
+ VERSION = "4.2.2"
3
4
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+ require 'sprockets/autoload'
3
+ require 'sprockets/digest_utils'
4
+
5
+ module Sprockets
6
+ # Public: YUI compressor.
7
+ #
8
+ # To accept the default options
9
+ #
10
+ # environment.register_bundle_processor 'application/javascript',
11
+ # Sprockets::YUICompressor
12
+ #
13
+ # Or to pass options to the YUI::JavaScriptCompressor class.
14
+ #
15
+ # environment.register_bundle_processor 'application/javascript',
16
+ # Sprockets::YUICompressor.new(munge: true)
17
+ #
18
+ class YUICompressor
19
+ VERSION = '1'
20
+
21
+ # Public: Return singleton instance with default options.
22
+ #
23
+ # Returns YUICompressor object.
24
+ def self.instance
25
+ @instance ||= new
26
+ end
27
+
28
+ def self.call(input)
29
+ instance.call(input)
30
+ end
31
+
32
+ def self.cache_key
33
+ instance.cache_key
34
+ end
35
+
36
+ attr_reader :cache_key
37
+
38
+ def initialize(options = {})
39
+ @options = options
40
+ @cache_key = "#{self.class.name}:#{Autoload::YUI::Compressor::VERSION}:#{VERSION}:#{DigestUtils.digest(options)}".freeze
41
+ end
42
+
43
+ def call(input)
44
+ data = input[:data]
45
+
46
+ case input[:content_type]
47
+ when 'application/javascript'
48
+ Autoload::YUI::JavaScriptCompressor.new(@options).compress(data)
49
+ when 'text/css'
50
+ Autoload::YUI::CssCompressor.new(@options).compress(data)
51
+ else
52
+ data
53
+ end
54
+ end
55
+ end
56
+ end
data/lib/sprockets.rb CHANGED
@@ -1,90 +1,232 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
1
4
  require 'sprockets/version'
5
+ require 'sprockets/cache'
6
+ require 'sprockets/environment'
7
+ require 'sprockets/errors'
8
+ require 'sprockets/manifest'
2
9
 
3
10
  module Sprockets
4
- # Environment
5
- autoload :Base, "sprockets/base"
6
- autoload :Environment, "sprockets/environment"
7
- autoload :Index, "sprockets/index"
8
- autoload :Manifest, "sprockets/manifest"
9
-
10
- # Assets
11
- autoload :Asset, "sprockets/asset"
12
- autoload :BundledAsset, "sprockets/bundled_asset"
13
- autoload :ProcessedAsset, "sprockets/processed_asset"
14
- autoload :StaticAsset, "sprockets/static_asset"
15
-
16
- # Processing
17
- autoload :Context, "sprockets/context"
18
- autoload :EcoTemplate, "sprockets/eco_template"
19
- autoload :EjsTemplate, "sprockets/ejs_template"
20
- autoload :JstProcessor, "sprockets/jst_processor"
21
- autoload :Processor, "sprockets/processor"
22
- autoload :SassCacheStore, "sprockets/sass_cache_store"
23
- autoload :SassCompressor, "sprockets/sass_compressor"
24
- autoload :SassFunctions, "sprockets/sass_functions"
25
- autoload :SassImporter, "sprockets/sass_importer"
26
- autoload :SassTemplate, "sprockets/sass_template"
27
- autoload :ScssTemplate, "sprockets/scss_template"
28
-
29
- # Internal utilities
30
- autoload :ArgumentError, "sprockets/errors"
31
- autoload :AssetAttributes, "sprockets/asset_attributes"
32
- autoload :CircularDependencyError, "sprockets/errors"
33
- autoload :ContentTypeMismatch, "sprockets/errors"
34
- autoload :EngineError, "sprockets/errors"
35
- autoload :Error, "sprockets/errors"
36
- autoload :FileNotFound, "sprockets/errors"
37
- autoload :Utils, "sprockets/utils"
38
-
39
- module Cache
40
- autoload :FileStore, "sprockets/cache/file_store"
41
- end
11
+ require 'sprockets/processor_utils'
12
+ extend ProcessorUtils
42
13
 
43
14
  # Extend Sprockets module to provide global registry
44
- require 'hike'
45
- require 'sprockets/engines'
46
- require 'sprockets/mime'
47
- require 'sprockets/processing'
48
- require 'sprockets/paths'
49
- extend Engines, Mime, Processing, 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
-
58
- register_mime_type 'text/css', '.css'
59
- register_mime_type 'application/javascript', '.js'
15
+ require 'sprockets/configuration'
16
+ require 'sprockets/context'
17
+ require 'digest/sha2'
18
+ extend Configuration
19
+
20
+ self.config = {
21
+ bundle_processors: Hash.new { |h, k| [].freeze }.freeze,
22
+ bundle_reducers: Hash.new { |h, k| {}.freeze }.freeze,
23
+ compressors: Hash.new { |h, k| {}.freeze }.freeze,
24
+ dependencies: Set.new.freeze,
25
+ dependency_resolvers: {}.freeze,
26
+ digest_class: Digest::SHA256,
27
+ mime_exts: {}.freeze,
28
+ mime_types: {}.freeze,
29
+ paths: [].freeze,
30
+ pipelines: {}.freeze,
31
+ pipeline_exts: {}.freeze,
32
+ postprocessors: Hash.new { |h, k| [].freeze }.freeze,
33
+ preprocessors: Hash.new { |h, k| [].freeze }.freeze,
34
+ registered_transformers: [].freeze,
35
+ root: __dir__.dup.freeze,
36
+ transformers: Hash.new { |h, k| {}.freeze }.freeze,
37
+ exporters: Hash.new { |h, k| Set.new.freeze }.freeze,
38
+ version: "",
39
+ gzip_enabled: true,
40
+ export_concurrent: true
41
+ }.freeze
42
+
43
+ @context_class = Context
44
+
45
+ require 'logger'
46
+ @logger = Logger.new($stderr)
47
+ @logger.level = Logger::FATAL
48
+
49
+ # Common asset text types
50
+ register_mime_type 'application/javascript', extensions: ['.js'], charset: :unicode
51
+ register_mime_type 'application/json', extensions: ['.json'], charset: :unicode
52
+ register_mime_type 'application/ruby', extensions: ['.rb']
53
+ register_mime_type 'application/xml', extensions: ['.xml']
54
+ register_mime_type 'application/manifest+json', extensions: ['.webmanifest']
55
+ register_mime_type 'text/css', extensions: ['.css'], charset: :css
56
+ register_mime_type 'text/html', extensions: ['.html', '.htm'], charset: :html
57
+ register_mime_type 'text/plain', extensions: ['.txt', '.text']
58
+ register_mime_type 'text/yaml', extensions: ['.yml', '.yaml'], charset: :unicode
59
+
60
+ # Common image types
61
+ register_mime_type 'image/x-icon', extensions: ['.ico']
62
+ register_mime_type 'image/bmp', extensions: ['.bmp']
63
+ register_mime_type 'image/gif', extensions: ['.gif']
64
+ register_mime_type 'image/webp', extensions: ['.webp']
65
+ register_mime_type 'image/png', extensions: ['.png']
66
+ register_mime_type 'image/jpeg', extensions: ['.jpg', '.jpeg']
67
+ register_mime_type 'image/tiff', extensions: ['.tiff', '.tif']
68
+ register_mime_type 'image/svg+xml', extensions: ['.svg']
69
+
70
+ # Common audio/video types
71
+ register_mime_type 'video/webm', extensions: ['.webm']
72
+ register_mime_type 'audio/basic', extensions: ['.snd', '.au']
73
+ register_mime_type 'audio/aiff', extensions: ['.aiff']
74
+ register_mime_type 'audio/mpeg', extensions: ['.mp3', '.mp2', '.m2a', '.m3a']
75
+ register_mime_type 'application/ogg', extensions: ['.ogx']
76
+ register_mime_type 'audio/ogg', extensions: ['.ogg', '.oga']
77
+ register_mime_type 'audio/midi', extensions: ['.midi', '.mid']
78
+ register_mime_type 'video/avi', extensions: ['.avi']
79
+ register_mime_type 'audio/wave', extensions: ['.wav', '.wave']
80
+ register_mime_type 'video/mp4', extensions: ['.mp4', '.m4v']
81
+ register_mime_type 'audio/aac', extensions: ['.aac']
82
+ register_mime_type 'audio/mp4', extensions: ['.m4a']
83
+ register_mime_type 'audio/flac', extensions: ['.flac']
84
+
85
+ # Common font types
86
+ register_mime_type 'application/vnd.ms-fontobject', extensions: ['.eot']
87
+ register_mime_type 'application/x-font-opentype', extensions: ['.otf']
88
+ register_mime_type 'application/x-font-ttf', extensions: ['.ttf']
89
+ register_mime_type 'application/font-woff', extensions: ['.woff']
90
+ register_mime_type 'application/font-woff2', extensions: ['.woff2']
91
+
92
+ require 'sprockets/source_map_processor'
93
+ register_mime_type 'application/js-sourcemap+json', extensions: ['.js.map'], charset: :unicode
94
+ register_mime_type 'application/css-sourcemap+json', extensions: ['.css.map'], charset: :unicode
95
+ register_transformer 'application/javascript', 'application/js-sourcemap+json', SourceMapProcessor
96
+ register_transformer 'text/css', 'application/css-sourcemap+json', SourceMapProcessor
97
+
98
+ register_pipeline :source do |env|
99
+ []
100
+ end
60
101
 
61
- require 'sprockets/directive_processor'
62
- register_preprocessor 'text/css', DirectiveProcessor
63
- register_preprocessor 'application/javascript', DirectiveProcessor
102
+ register_pipeline :self do |env, type, file_type|
103
+ env.self_processors_for(type, file_type)
104
+ end
64
105
 
65
- require 'sprockets/safety_colons'
66
- register_postprocessor 'application/javascript', SafetyColons
106
+ register_pipeline :default do |env, type, file_type|
107
+ env.default_processors_for(type, file_type)
108
+ end
67
109
 
68
- require 'sprockets/charset_normalizer'
69
- register_bundle_processor 'text/css', CharsetNormalizer
110
+ require 'sprockets/add_source_map_comment_to_asset_processor'
111
+ register_pipeline :debug do
112
+ [AddSourceMapCommentToAssetProcessor]
113
+ end
70
114
 
71
- # Cherry pick the default Tilt engines that make sense for
72
- # Sprockets. We don't need ones that only generate html like HAML.
115
+ require 'sprockets/directive_processor'
116
+ register_preprocessor 'text/css', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
117
+ register_preprocessor 'application/javascript', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
118
+
119
+ require 'sprockets/bundle'
120
+ register_bundle_processor 'application/javascript', Bundle
121
+ register_bundle_processor 'text/css', Bundle
122
+
123
+ register_bundle_metadata_reducer '*/*', :data, proc { +"" }, :concat
124
+ register_bundle_metadata_reducer 'application/javascript', :data, proc { +"" }, Utils.method(:concat_javascript_sources)
125
+ register_bundle_metadata_reducer '*/*', :links, :+
126
+ register_bundle_metadata_reducer '*/*', :sources, proc { [] }, :+
127
+
128
+ require 'sprockets/closure_compressor'
129
+ require 'sprockets/sass_compressor'
130
+ require 'sprockets/sassc_compressor'
131
+ require 'sprockets/jsminc_compressor'
132
+ require 'sprockets/uglifier_compressor'
133
+ require 'sprockets/yui_compressor'
134
+ register_compressor 'text/css', :sass, SassCompressor
135
+ register_compressor 'text/css', :sassc, SasscCompressor
136
+ register_compressor 'text/css', :scss, SassCompressor
137
+ register_compressor 'text/css', :scssc, SasscCompressor
138
+ register_compressor 'text/css', :yui, YUICompressor
139
+ register_compressor 'application/javascript', :closure, ClosureCompressor
140
+ register_compressor 'application/javascript', :jsmin, JSMincCompressor
141
+ register_compressor 'application/javascript', :jsminc, JSMincCompressor
142
+ register_compressor 'application/javascript', :uglifier, UglifierCompressor
143
+ register_compressor 'application/javascript', :uglify, UglifierCompressor
144
+ register_compressor 'application/javascript', :yui, YUICompressor
145
+
146
+ # Babel, TheFuture™ is now
147
+ require 'sprockets/babel_processor'
148
+ register_mime_type 'application/ecmascript-6', extensions: ['.es6'], charset: :unicode
149
+ register_transformer 'application/ecmascript-6', 'application/javascript', BabelProcessor
150
+ register_preprocessor 'application/ecmascript-6', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
73
151
 
74
152
  # Mmm, CoffeeScript
75
- register_engine '.coffee', Tilt::CoffeeScriptTemplate
153
+ require 'sprockets/coffee_script_processor'
154
+ register_mime_type 'text/coffeescript', extensions: ['.coffee', '.js.coffee']
155
+ register_transformer 'text/coffeescript', 'application/javascript', CoffeeScriptProcessor
156
+ register_preprocessor 'text/coffeescript', DirectiveProcessor.new(comments: ["#", ["###", "###"]])
157
+
158
+ # JST processors
159
+ require 'sprockets/eco_processor'
160
+ require 'sprockets/ejs_processor'
161
+ require 'sprockets/jst_processor'
162
+ register_mime_type 'text/eco', extensions: ['.eco', '.jst.eco']
163
+ register_mime_type 'text/ejs', extensions: ['.ejs', '.jst.ejs']
164
+ register_transformer 'text/eco', 'application/javascript+function', EcoProcessor
165
+ register_transformer 'text/ejs', 'application/javascript+function', EjsProcessor
166
+ register_transformer 'application/javascript+function', 'application/javascript', JstProcessor
167
+
168
+ # CSS processors
169
+ require 'sprockets/sassc_processor'
170
+ register_mime_type 'text/sass', extensions: ['.sass', '.css.sass']
171
+ register_mime_type 'text/scss', extensions: ['.scss', '.css.scss']
172
+ register_transformer 'text/sass', 'text/css', SasscProcessor
173
+ register_transformer 'text/scss', 'text/css', ScsscProcessor
174
+ register_preprocessor 'text/sass', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
175
+ register_preprocessor 'text/scss', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
176
+ register_bundle_metadata_reducer 'text/css', :sass_dependencies, Set.new, :+
177
+
178
+ # ERB
179
+ require 'sprockets/erb_processor'
180
+ register_transformer_suffix(%w(
181
+ application/ecmascript-6
182
+ application/javascript
183
+ application/json
184
+ application/manifest+json
185
+ application/xml
186
+ text/coffeescript
187
+ text/css
188
+ text/html
189
+ text/plain
190
+ text/sass
191
+ text/scss
192
+ text/yaml
193
+ text/eco
194
+ text/ejs
195
+ ), 'application/\2+ruby', '.erb', ERBProcessor)
196
+
197
+ register_mime_type 'application/html+ruby', extensions: ['.html.erb', '.erb', '.rhtml'], charset: :html
198
+ register_mime_type 'application/xml+ruby', extensions: ['.xml.erb', '.rxml']
199
+
200
+ require 'sprockets/exporters/file_exporter'
201
+ require 'sprockets/exporters/zlib_exporter'
202
+ require 'sprockets/exporters/zopfli_exporter'
203
+ register_exporter '*/*', Exporters::FileExporter
204
+ register_exporter '*/*', Exporters::ZlibExporter
205
+
206
+ register_dependency_resolver 'environment-version' do |env|
207
+ env.version
208
+ end
209
+ register_dependency_resolver 'environment-paths' do |env|
210
+ env.paths.map {|path| env.compress_from_root(path) }
211
+ end
212
+ register_dependency_resolver 'file-digest' do |env, str|
213
+ env.file_digest(env.parse_file_digest_uri(str))
214
+ end
215
+ register_dependency_resolver 'processors' do |env, str|
216
+ env.resolve_processors_cache_key_uri(str)
217
+ end
218
+ register_dependency_resolver 'env' do |env, str|
219
+ _, var = str.split(':', 2)
220
+ ENV[var]
221
+ end
76
222
 
77
- # JST engines
78
- register_engine '.jst', JstProcessor
79
- register_engine '.eco', EcoTemplate
80
- register_engine '.ejs', EjsTemplate
223
+ depend_on 'environment-version'
224
+ depend_on 'environment-paths'
81
225
 
82
- # CSS engines
83
- register_engine '.less', Tilt::LessTemplate
84
- register_engine '.sass', SassTemplate
85
- register_engine '.scss', ScssTemplate
226
+ require 'sprockets/preprocessors/default_source_map'
227
+ register_preprocessor 'text/css', Preprocessors::DefaultSourceMap.new
228
+ register_preprocessor 'application/javascript', Preprocessors::DefaultSourceMap.new
86
229
 
87
- # Other
88
- register_engine '.erb', Tilt::ERBTemplate
89
- register_engine '.str', Tilt::StringTemplate
230
+ register_bundle_metadata_reducer 'text/css', :map, proc { |input| { "version" => 3, "file" => PathUtils.split_subpath(input[:load_path], input[:filename]), "sections" => [] } }, SourceMapUtils.method(:concat_source_maps)
231
+ register_bundle_metadata_reducer 'application/javascript', :map, proc { |input| { "version" => 3, "file" => PathUtils.split_subpath(input[:load_path], input[:filename]), "sections" => [] } }, SourceMapUtils.method(:concat_source_maps)
90
232
  end