sprockets 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +68 -0
  3. data/README.md +397 -408
  4. data/bin/sprockets +12 -7
  5. data/lib/rake/sprocketstask.rb +3 -2
  6. data/lib/sprockets/add_source_map_comment_to_asset_processor.rb +60 -0
  7. data/lib/sprockets/asset.rb +19 -23
  8. data/lib/sprockets/autoload/babel.rb +8 -0
  9. data/lib/sprockets/autoload/closure.rb +1 -0
  10. data/lib/sprockets/autoload/coffee_script.rb +1 -0
  11. data/lib/sprockets/autoload/eco.rb +1 -0
  12. data/lib/sprockets/autoload/ejs.rb +1 -0
  13. data/lib/sprockets/autoload/jsminc.rb +8 -0
  14. data/lib/sprockets/autoload/sass.rb +1 -0
  15. data/lib/sprockets/autoload/sassc.rb +8 -0
  16. data/lib/sprockets/autoload/uglifier.rb +1 -0
  17. data/lib/sprockets/autoload/yui.rb +1 -0
  18. data/lib/sprockets/autoload/zopfli.rb +7 -0
  19. data/lib/sprockets/autoload.rb +5 -0
  20. data/lib/sprockets/babel_processor.rb +66 -0
  21. data/lib/sprockets/base.rb +59 -11
  22. data/lib/sprockets/bower.rb +5 -2
  23. data/lib/sprockets/bundle.rb +44 -4
  24. data/lib/sprockets/cache/file_store.rb +32 -7
  25. data/lib/sprockets/cache/memory_store.rb +9 -0
  26. data/lib/sprockets/cache/null_store.rb +8 -0
  27. data/lib/sprockets/cache.rb +42 -5
  28. data/lib/sprockets/cached_environment.rb +14 -19
  29. data/lib/sprockets/closure_compressor.rb +6 -11
  30. data/lib/sprockets/coffee_script_processor.rb +19 -5
  31. data/lib/sprockets/compressing.rb +62 -2
  32. data/lib/sprockets/configuration.rb +3 -7
  33. data/lib/sprockets/context.rb +98 -23
  34. data/lib/sprockets/dependencies.rb +9 -8
  35. data/lib/sprockets/digest_utils.rb +104 -60
  36. data/lib/sprockets/directive_processor.rb +45 -35
  37. data/lib/sprockets/eco_processor.rb +3 -2
  38. data/lib/sprockets/ejs_processor.rb +3 -2
  39. data/lib/sprockets/encoding_utils.rb +8 -4
  40. data/lib/sprockets/environment.rb +9 -4
  41. data/lib/sprockets/erb_processor.rb +28 -21
  42. data/lib/sprockets/errors.rb +1 -1
  43. data/lib/sprockets/exporters/base.rb +72 -0
  44. data/lib/sprockets/exporters/file_exporter.rb +24 -0
  45. data/lib/sprockets/exporters/zlib_exporter.rb +33 -0
  46. data/lib/sprockets/exporters/zopfli_exporter.rb +14 -0
  47. data/lib/sprockets/exporting.rb +73 -0
  48. data/lib/sprockets/file_reader.rb +1 -0
  49. data/lib/sprockets/http_utils.rb +26 -6
  50. data/lib/sprockets/jsminc_compressor.rb +32 -0
  51. data/lib/sprockets/jst_processor.rb +11 -10
  52. data/lib/sprockets/loader.rb +236 -69
  53. data/lib/sprockets/manifest.rb +97 -44
  54. data/lib/sprockets/manifest_utils.rb +9 -6
  55. data/lib/sprockets/mime.rb +8 -42
  56. data/lib/sprockets/npm.rb +52 -0
  57. data/lib/sprockets/path_dependency_utils.rb +3 -11
  58. data/lib/sprockets/path_digest_utils.rb +2 -1
  59. data/lib/sprockets/path_utils.rb +106 -21
  60. data/lib/sprockets/paths.rb +1 -0
  61. data/lib/sprockets/preprocessors/default_source_map.rb +49 -0
  62. data/lib/sprockets/processing.rb +31 -51
  63. data/lib/sprockets/processor_utils.rb +81 -15
  64. data/lib/sprockets/resolve.rb +182 -95
  65. data/lib/sprockets/sass_cache_store.rb +1 -0
  66. data/lib/sprockets/sass_compressor.rb +21 -17
  67. data/lib/sprockets/sass_functions.rb +1 -0
  68. data/lib/sprockets/sass_importer.rb +1 -0
  69. data/lib/sprockets/sass_processor.rb +45 -17
  70. data/lib/sprockets/sassc_compressor.rb +56 -0
  71. data/lib/sprockets/sassc_processor.rb +297 -0
  72. data/lib/sprockets/server.rb +57 -34
  73. data/lib/sprockets/source_map_processor.rb +66 -0
  74. data/lib/sprockets/source_map_utils.rb +483 -0
  75. data/lib/sprockets/transformers.rb +63 -35
  76. data/lib/sprockets/uglifier_compressor.rb +23 -20
  77. data/lib/sprockets/unloaded_asset.rb +139 -0
  78. data/lib/sprockets/uri_tar.rb +99 -0
  79. data/lib/sprockets/uri_utils.rb +15 -14
  80. data/lib/sprockets/utils/gzip.rb +99 -0
  81. data/lib/sprockets/utils.rb +43 -59
  82. data/lib/sprockets/version.rb +2 -1
  83. data/lib/sprockets/yui_compressor.rb +5 -14
  84. data/lib/sprockets.rb +103 -33
  85. metadata +151 -22
  86. data/LICENSE +0 -21
  87. data/lib/sprockets/coffee_script_template.rb +0 -6
  88. data/lib/sprockets/eco_template.rb +0 -6
  89. data/lib/sprockets/ejs_template.rb +0 -6
  90. data/lib/sprockets/engines.rb +0 -81
  91. data/lib/sprockets/erb_template.rb +0 -6
  92. data/lib/sprockets/legacy.rb +0 -314
  93. data/lib/sprockets/legacy_proc_processor.rb +0 -35
  94. data/lib/sprockets/legacy_tilt_processor.rb +0 -29
  95. data/lib/sprockets/sass_template.rb +0 -7
@@ -1,314 +0,0 @@
1
- require 'pathname'
2
- require 'sprockets/asset'
3
- require 'sprockets/base'
4
- require 'sprockets/cached_environment'
5
- require 'sprockets/context'
6
- require 'sprockets/manifest'
7
- require 'sprockets/resolve'
8
-
9
- module Sprockets
10
- autoload :CoffeeScriptTemplate, 'sprockets/coffee_script_template'
11
- autoload :EcoTemplate, 'sprockets/eco_template'
12
- autoload :EjsTemplate, 'sprockets/ejs_template'
13
- autoload :ERBTemplate, 'sprockets/erb_template'
14
- autoload :SassTemplate, 'sprockets/sass_template'
15
- autoload :ScssTemplate, 'sprockets/sass_template'
16
-
17
- # Deprecated
18
- Index = CachedEnvironment
19
-
20
- class Base
21
- include Resolve
22
-
23
- # Deprecated: Change default return type of resolve() to return 2.x
24
- # compatible plain filename String. 4.x will always return an Asset URI
25
- # and a set of file system dependencies that had to be read to compute the
26
- # result.
27
- #
28
- # 2.x
29
- #
30
- # resolve("foo.js")
31
- # # => "/path/to/app/javascripts/foo.js"
32
- #
33
- # 3.x
34
- #
35
- # resolve("foo.js")
36
- # # => "/path/to/app/javascripts/foo.js"
37
- #
38
- # resolve("foo.js", compat: true)
39
- # # => "/path/to/app/javascripts/foo.js"
40
- #
41
- # resolve("foo.js", compat: false)
42
- # # => [
43
- # # "file:///path/to/app/javascripts/foo.js?type=application/javascript"
44
- # # #<Set: {"file-digest:/path/to/app/javascripts/foo.js"}>
45
- # # ]
46
- #
47
- # 4.x
48
- #
49
- # resolve("foo.js")
50
- # # => [
51
- # # "file:///path/to/app/javascripts/foo.js?type=application/javascript"
52
- # # #<Set: {"file-digest:/path/to/app/javascripts/foo.js"}>
53
- # # ]
54
- #
55
- def resolve_with_compat(path, options = {})
56
- options = options.dup
57
- if options.delete(:compat) { true }
58
- uri, _ = resolve_without_compat(path, options)
59
- if uri
60
- path, _ = parse_asset_uri(uri)
61
- path
62
- else
63
- nil
64
- end
65
- else
66
- resolve_without_compat(path, options)
67
- end
68
- end
69
- alias_method :resolve_without_compat, :resolve
70
- alias_method :resolve, :resolve_with_compat
71
-
72
- # Deprecated: Iterate over all logical paths with a matcher.
73
- #
74
- # Remove from 4.x.
75
- #
76
- # args - List of matcher objects.
77
- #
78
- # Returns Enumerator if no block is given.
79
- def each_logical_path(*args, &block)
80
- return to_enum(__method__, *args) unless block_given?
81
-
82
- filters = args.flatten.map { |arg| Manifest.compile_match_filter(arg) }
83
- logical_paths.each do |a, b|
84
- if filters.any? { |f| f.call(a, b) }
85
- if block.arity == 2
86
- yield a, b
87
- else
88
- yield a
89
- end
90
- end
91
- end
92
-
93
- nil
94
- end
95
-
96
- # Deprecated: Enumerate over all logical paths in the environment.
97
- #
98
- # Returns an Enumerator of [logical_path, filename].
99
- def logical_paths
100
- return to_enum(__method__) unless block_given?
101
-
102
- seen = Set.new
103
-
104
- paths.each do |load_path|
105
- stat_tree(load_path).each do |filename, stat|
106
- next unless stat.file?
107
-
108
- path = split_subpath(load_path, filename)
109
- path, mime_type, _, _ = parse_path_extnames(path)
110
- path = normalize_logical_path(path)
111
- path += mime_types[mime_type][:extensions].first if mime_type
112
-
113
- if !seen.include?(path)
114
- yield path, filename
115
- seen << path
116
- end
117
- end
118
- end
119
-
120
- nil
121
- end
122
-
123
- def cache_get(key)
124
- cache.get(key)
125
- end
126
-
127
- def cache_set(key, value)
128
- cache.set(key, value)
129
- end
130
-
131
- private
132
- # Deprecated: Seriously.
133
- def matches_filter(filters, logical_path, filename)
134
- return true if filters.empty?
135
-
136
- filters.any? do |filter|
137
- if filter.is_a?(Regexp)
138
- filter.match(logical_path)
139
- elsif filter.respond_to?(:call)
140
- if filter.arity == 1
141
- filter.call(logical_path)
142
- else
143
- filter.call(logical_path, filename.to_s)
144
- end
145
- else
146
- File.fnmatch(filter.to_s, logical_path)
147
- end
148
- end
149
- end
150
-
151
- # URI.unescape is deprecated on 1.9. We need to use URI::Parser
152
- # if its available.
153
- if defined? URI::DEFAULT_PARSER
154
- def unescape(str)
155
- str = URI::DEFAULT_PARSER.unescape(str)
156
- str.force_encoding(Encoding.default_internal) if Encoding.default_internal
157
- str
158
- end
159
- else
160
- def unescape(str)
161
- URI.unescape(str)
162
- end
163
- end
164
- end
165
-
166
- class Asset
167
- # Deprecated: Use #filename instead.
168
- #
169
- # Returns Pathname.
170
- def pathname
171
- @pathname ||= Pathname.new(filename)
172
- end
173
-
174
- # Deprecated: Expand asset into an `Array` of parts.
175
- #
176
- # Appending all of an assets body parts together should give you
177
- # the asset's contents as a whole.
178
- #
179
- # This allows you to link to individual files for debugging
180
- # purposes.
181
- #
182
- # Use Asset#included instead. Keeping a full copy of the bundle's processed
183
- # assets in memory (and in cache) is expensive and redundant. The common use
184
- # case is to relink to the assets anyway.
185
- #
186
- # Returns Array of Assets.
187
- def to_a
188
- if metadata[:included]
189
- metadata[:included].map { |uri| @environment.load(uri) }
190
- else
191
- [self]
192
- end
193
- end
194
-
195
- # Deprecated: Get all required Assets.
196
- #
197
- # See Asset#to_a
198
- #
199
- # Returns Array of Assets.
200
- def dependencies
201
- to_a.reject { |a| a.filename.eql?(self.filename) }
202
- end
203
-
204
- # Deprecated: Returns Time of the last time the source was modified.
205
- #
206
- # Time resolution is normalized to the nearest second.
207
- #
208
- # Returns Time.
209
- def mtime
210
- Time.at(@mtime)
211
- end
212
- end
213
-
214
- class Context
215
- # Deprecated: Change default return type of resolve() to return 2.x
216
- # compatible plain filename String. 4.x will always return an Asset URI.
217
- #
218
- # 2.x
219
- #
220
- # resolve("foo.js")
221
- # # => "/path/to/app/javascripts/foo.js"
222
- #
223
- # 3.x
224
- #
225
- # resolve("foo.js")
226
- # # => "/path/to/app/javascripts/foo.js"
227
- #
228
- # resolve("foo.js", compat: true)
229
- # # => "/path/to/app/javascripts/foo.js"
230
- #
231
- # resolve("foo.js", compat: false)
232
- # # => "file:///path/to/app/javascripts/foo.js?type=application/javascript"
233
- #
234
- # 4.x
235
- #
236
- # resolve("foo.js")
237
- # # => "file:///path/to/app/javascripts/foo.js?type=application/javascript"
238
- #
239
- def resolve_with_compat(path, options = {})
240
- options = options.dup
241
-
242
- # Support old :content_type option, prefer :accept going forward
243
- if type = options.delete(:content_type)
244
- type = self.content_type if type == :self
245
- options[:accept] ||= type
246
- end
247
-
248
- if options.delete(:compat) { true }
249
- uri = resolve_without_compat(path, options)
250
- path, _ = environment.parse_asset_uri(uri)
251
- path
252
- else
253
- resolve_without_compat(path, options)
254
- end
255
- end
256
- alias_method :resolve_without_compat, :resolve
257
- alias_method :resolve, :resolve_with_compat
258
- end
259
-
260
- class Manifest
261
- # Deprecated: Compile logical path matching filter into a proc that can be
262
- # passed to logical_paths.select(&proc).
263
- #
264
- # compile_match_filter(proc { |logical_path|
265
- # File.extname(logical_path) == '.js'
266
- # })
267
- #
268
- # compile_match_filter(/application.js/)
269
- #
270
- # compile_match_filter("foo/*.js")
271
- #
272
- # Returns a Proc or raise a TypeError.
273
- def self.compile_match_filter(filter)
274
- # If the filter is already a proc, great nothing to do.
275
- if filter.respond_to?(:call)
276
- filter
277
- # If the filter is a regexp, wrap it in a proc that tests it against the
278
- # logical path.
279
- elsif filter.is_a?(Regexp)
280
- proc { |logical_path| filter.match(logical_path) }
281
- elsif filter.is_a?(String)
282
- # If its an absolute path, detect the matching full filename
283
- if PathUtils.absolute_path?(filter)
284
- proc { |logical_path, filename| filename == filter.to_s }
285
- else
286
- # Otherwise do an fnmatch against the logical path.
287
- proc { |logical_path| File.fnmatch(filter.to_s, logical_path) }
288
- end
289
- else
290
- raise TypeError, "unknown filter type: #{filter.inspect}"
291
- end
292
- end
293
-
294
- def self.simple_logical_path?(str)
295
- str.is_a?(String) &&
296
- !PathUtils.absolute_path?(str) &&
297
- str !~ /\*|\*\*|\?|\[|\]|\{|\}/
298
- end
299
-
300
- # Deprecated: Filter logical paths in environment. Useful for selecting what
301
- # files you want to compile.
302
- #
303
- # Returns an Enumerator.
304
- def filter_logical_paths(*args)
305
- filters = args.flatten.map { |arg| self.class.compile_match_filter(arg) }
306
- environment.cached.logical_paths.select do |a, b|
307
- filters.any? { |f| f.call(a, b) }
308
- end
309
- end
310
-
311
- # Deprecated alias.
312
- alias_method :find_logical_paths, :filter_logical_paths
313
- end
314
- end
@@ -1,35 +0,0 @@
1
- require 'delegate'
2
-
3
- module Sprockets
4
- # Deprecated: Wraps legacy process Procs with new processor call signature.
5
- #
6
- # Will be removed in Sprockets 4.x.
7
- #
8
- # LegacyProcProcessor.new(:compress,
9
- # proc { |context, data| data.gsub(...) })
10
- #
11
- class LegacyProcProcessor < Delegator
12
- def initialize(name, proc)
13
- @name = name
14
- @proc = proc
15
- end
16
-
17
- def __getobj__
18
- @proc
19
- end
20
-
21
- def name
22
- "Sprockets::LegacyProcProcessor (#{@name})"
23
- end
24
-
25
- def to_s
26
- name
27
- end
28
-
29
- def call(input)
30
- context = input[:environment].context_class.new(input)
31
- data = @proc.call(context, input[:data])
32
- context.metadata.merge(data: data)
33
- end
34
- end
35
- end
@@ -1,29 +0,0 @@
1
- require 'delegate'
2
-
3
- module Sprockets
4
- # Deprecated: Wraps legacy engine and process Tilt templates with new
5
- # processor call signature.
6
- #
7
- # Will be removed in Sprockets 4.x.
8
- #
9
- # LegacyTiltProcessor.new(Tilt::CoffeeScriptProcessor)
10
- #
11
- class LegacyTiltProcessor < Delegator
12
- def initialize(klass)
13
- @klass = klass
14
- end
15
-
16
- def __getobj__
17
- @klass
18
- end
19
-
20
- def call(input)
21
- filename = input[:filename]
22
- data = input[:data]
23
- context = input[:environment].context_class.new(input)
24
-
25
- data = @klass.new(filename) { data }.render(context)
26
- context.metadata.merge(data: data)
27
- end
28
- end
29
- end
@@ -1,7 +0,0 @@
1
- require 'sprockets/sass_processor'
2
-
3
- module Sprockets
4
- # Deprecated
5
- SassTemplate = SassProcessor
6
- ScssTemplate = ScssProcessor
7
- end