sprockets 3.7.4 → 4.0.0.beta1
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/CHANGELOG.md +2 -303
- data/README.md +21 -35
- data/bin/sprockets +11 -8
- data/lib/rake/sprocketstask.rb +2 -2
- data/lib/sprockets/asset.rb +8 -21
- data/lib/sprockets/autoload/babel.rb +7 -0
- data/lib/sprockets/autoload/jsminc.rb +7 -0
- data/lib/sprockets/autoload/sassc.rb +7 -0
- data/lib/sprockets/autoload.rb +3 -0
- data/lib/sprockets/babel_processor.rb +58 -0
- data/lib/sprockets/base.rb +8 -8
- data/lib/sprockets/bower.rb +4 -2
- data/lib/sprockets/bundle.rb +1 -1
- data/lib/sprockets/cache.rb +2 -4
- data/lib/sprockets/closure_compressor.rb +1 -2
- data/lib/sprockets/coffee_script_processor.rb +9 -3
- data/lib/sprockets/compressing.rb +2 -2
- data/lib/sprockets/configuration.rb +1 -7
- data/lib/sprockets/context.rb +10 -18
- data/lib/sprockets/digest_utils.rb +40 -52
- data/lib/sprockets/directive_processor.rb +10 -15
- data/lib/sprockets/erb_processor.rb +1 -13
- data/lib/sprockets/http_utils.rb +19 -4
- data/lib/sprockets/jsminc_compressor.rb +31 -0
- data/lib/sprockets/jst_processor.rb +10 -10
- data/lib/sprockets/loader.rb +34 -28
- data/lib/sprockets/manifest.rb +3 -35
- data/lib/sprockets/manifest_utils.rb +0 -2
- data/lib/sprockets/mime.rb +7 -62
- data/lib/sprockets/path_dependency_utils.rb +2 -11
- data/lib/sprockets/path_digest_utils.rb +1 -1
- data/lib/sprockets/path_utils.rb +43 -18
- data/lib/sprockets/preprocessors/default_source_map.rb +24 -0
- data/lib/sprockets/processing.rb +30 -61
- data/lib/sprockets/processor_utils.rb +27 -28
- data/lib/sprockets/resolve.rb +172 -92
- data/lib/sprockets/sass_cache_store.rb +1 -6
- data/lib/sprockets/sass_compressor.rb +14 -1
- data/lib/sprockets/sass_processor.rb +18 -8
- data/lib/sprockets/sassc_compressor.rb +30 -0
- data/lib/sprockets/sassc_processor.rb +68 -0
- data/lib/sprockets/server.rb +11 -22
- data/lib/sprockets/source_map_comment_processor.rb +29 -0
- data/lib/sprockets/source_map_processor.rb +40 -0
- data/lib/sprockets/source_map_utils.rb +345 -0
- data/lib/sprockets/transformers.rb +62 -35
- data/lib/sprockets/uglifier_compressor.rb +12 -5
- data/lib/sprockets/unloaded_asset.rb +12 -11
- data/lib/sprockets/uri_tar.rb +4 -2
- data/lib/sprockets/uri_utils.rb +9 -14
- data/lib/sprockets/utils.rb +30 -79
- data/lib/sprockets/version.rb +1 -1
- data/lib/sprockets.rb +80 -35
- metadata +70 -41
- data/LICENSE +0 -21
- data/lib/sprockets/coffee_script_template.rb +0 -17
- data/lib/sprockets/deprecation.rb +0 -90
- data/lib/sprockets/eco_template.rb +0 -17
- data/lib/sprockets/ejs_template.rb +0 -17
- data/lib/sprockets/engines.rb +0 -92
- data/lib/sprockets/erb_template.rb +0 -11
- data/lib/sprockets/legacy.rb +0 -322
- data/lib/sprockets/legacy_proc_processor.rb +0 -35
- data/lib/sprockets/legacy_tilt_processor.rb +0 -29
- data/lib/sprockets/sass_template.rb +0 -19
data/lib/sprockets/loader.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'sprockets/asset'
|
2
2
|
require 'sprockets/digest_utils'
|
3
|
-
require 'sprockets/engines'
|
4
3
|
require 'sprockets/errors'
|
5
4
|
require 'sprockets/file_reader'
|
6
5
|
require 'sprockets/mime'
|
@@ -18,7 +17,7 @@ module Sprockets
|
|
18
17
|
# object.
|
19
18
|
module Loader
|
20
19
|
include DigestUtils, PathUtils, ProcessorUtils, URIUtils
|
21
|
-
include
|
20
|
+
include Mime, Processing, Resolve, Transformers
|
22
21
|
|
23
22
|
|
24
23
|
# Public: Load Asset by Asset URI.
|
@@ -27,7 +26,6 @@ module Sprockets
|
|
27
26
|
# and full path such as:
|
28
27
|
# "file:///Path/app/assets/js/app.js?type=application/javascript"
|
29
28
|
#
|
30
|
-
#
|
31
29
|
# Returns Asset.
|
32
30
|
def load(uri)
|
33
31
|
unloaded = UnloadedAsset.new(uri, self)
|
@@ -46,7 +44,7 @@ module Sprockets
|
|
46
44
|
# The presence of `paths` indicates dependencies were stored.
|
47
45
|
# We can check to see if the dependencies have not changed by "resolving" them and
|
48
46
|
# generating a digest key from the resolved entries. If this digest key has not
|
49
|
-
# changed the asset will be pulled from cache.
|
47
|
+
# changed, the asset will be pulled from cache.
|
50
48
|
#
|
51
49
|
# If this `paths` is present but the cache returns nothing then `fetch_asset_from_dependency_cache`
|
52
50
|
# will confusingly be called again with `paths` set to nil where the asset will be
|
@@ -61,7 +59,7 @@ module Sprockets
|
|
61
59
|
end
|
62
60
|
end
|
63
61
|
end
|
64
|
-
Asset.new(
|
62
|
+
Asset.new(asset)
|
65
63
|
end
|
66
64
|
|
67
65
|
private
|
@@ -103,13 +101,23 @@ module Sprockets
|
|
103
101
|
raise FileNotFound, "could not find file: #{unloaded.filename}"
|
104
102
|
end
|
105
103
|
|
106
|
-
|
104
|
+
path_to_split =
|
105
|
+
if index_alias = unloaded.params[:index_alias]
|
106
|
+
expand_from_root index_alias
|
107
|
+
else
|
108
|
+
unloaded.filename
|
109
|
+
end
|
110
|
+
|
111
|
+
load_path, logical_path = paths_split(config[:paths], path_to_split)
|
107
112
|
|
108
113
|
unless load_path
|
109
|
-
|
114
|
+
target = path_to_split
|
115
|
+
target += " (index alias of #{unloaded.filename})" if unloaded.params[:index_alias]
|
116
|
+
raise FileOutsidePaths, "#{target} is no longer under a load path: #{self.paths.join(', ')}"
|
110
117
|
end
|
111
118
|
|
112
|
-
|
119
|
+
extname, file_type = match_path_extname(logical_path, mime_exts)
|
120
|
+
logical_path = logical_path.chomp(extname)
|
113
121
|
name = logical_path
|
114
122
|
|
115
123
|
if pipeline = unloaded.params[:pipeline]
|
@@ -124,22 +132,31 @@ module Sprockets
|
|
124
132
|
raise ConversionError, "could not convert #{file_type.inspect} to #{type.inspect}"
|
125
133
|
end
|
126
134
|
|
127
|
-
processors = processors_for(type, file_type,
|
135
|
+
processors = processors_for(type, file_type, pipeline)
|
128
136
|
|
129
|
-
processors_dep_uri = build_processors_uri(type, file_type,
|
137
|
+
processors_dep_uri = build_processors_uri(type, file_type, pipeline)
|
130
138
|
dependencies = config[:dependencies] + [processors_dep_uri]
|
131
139
|
|
132
140
|
# Read into memory and process if theres a processor pipeline
|
133
141
|
if processors.any?
|
142
|
+
source_uri, _ = resolve!(unloaded.filename, pipeline: :source)
|
143
|
+
source_asset = load(source_uri)
|
144
|
+
|
145
|
+
source_path = source_asset.digest_path
|
146
|
+
|
134
147
|
result = call_processors(processors, {
|
135
148
|
environment: self,
|
136
149
|
cache: self.cache,
|
137
150
|
uri: unloaded.uri,
|
138
151
|
filename: unloaded.filename,
|
139
152
|
load_path: load_path,
|
153
|
+
source_path: source_path,
|
140
154
|
name: name,
|
141
155
|
content_type: type,
|
142
|
-
metadata: {
|
156
|
+
metadata: {
|
157
|
+
dependencies: dependencies,
|
158
|
+
map: []
|
159
|
+
}
|
143
160
|
})
|
144
161
|
validate_processor_result!(result)
|
145
162
|
source = result.delete(:data)
|
@@ -171,17 +188,6 @@ module Sprockets
|
|
171
188
|
asset[:id] = pack_hexdigest(digest(asset))
|
172
189
|
asset[:uri] = build_asset_uri(unloaded.filename, unloaded.params.merge(id: asset[:id]))
|
173
190
|
|
174
|
-
# Deprecated: Avoid tracking Asset mtime
|
175
|
-
asset[:mtime] = metadata[:dependencies].map { |u|
|
176
|
-
if u.start_with?("file-digest:")
|
177
|
-
s = self.stat(parse_file_digest_uri(u))
|
178
|
-
s ? s.mtime.to_i : nil
|
179
|
-
else
|
180
|
-
nil
|
181
|
-
end
|
182
|
-
}.compact.max
|
183
|
-
asset[:mtime] ||= self.stat(unloaded.filename).mtime.to_i
|
184
|
-
|
185
191
|
store_asset(asset, unloaded)
|
186
192
|
asset
|
187
193
|
end
|
@@ -255,11 +261,11 @@ module Sprockets
|
|
255
261
|
# "processors:type=text/css&file_type=text/css&pipeline=self",
|
256
262
|
# "file-digest:///Full/path/app/assets/stylesheets"]
|
257
263
|
#
|
258
|
-
# Returns back array of things that the given uri
|
264
|
+
# Returns back array of things that the given uri depends on
|
259
265
|
# For example the environment version, if you're using a different version of sprockets
|
260
266
|
# then the dependencies should be different, this is used only for generating cache key
|
261
267
|
# for example the "environment-version" may be resolved to "environment-1.0-3.2.0" for
|
262
|
-
#
|
268
|
+
# version "3.2.0" of sprockets.
|
263
269
|
#
|
264
270
|
# Any paths that are returned are converted to relative paths
|
265
271
|
#
|
@@ -276,9 +282,9 @@ module Sprockets
|
|
276
282
|
#
|
277
283
|
# This method attempts to retrieve the last `limit` number of histories of an asset
|
278
284
|
# from the cache a "history" which is an array of unresolved "dependencies" that the asset needs
|
279
|
-
# to compile. In this case
|
280
|
-
# may rely on jquery.js (so jquery.js is a
|
281
|
-
# compilation, such as the VERSION of
|
285
|
+
# to compile. In this case a dependency can refer to either an asset e.g. index.js
|
286
|
+
# may rely on jquery.js (so jquery.js is a dependency), or other factors that may affect
|
287
|
+
# compilation, such as the VERSION of Sprockets (i.e. the environment) and what "processors"
|
282
288
|
# are used.
|
283
289
|
#
|
284
290
|
# For example a history array may look something like this
|
@@ -289,7 +295,7 @@ module Sprockets
|
|
289
295
|
# "file-digest:///Full/path/app/assets/stylesheets"]]
|
290
296
|
#
|
291
297
|
# Where the first entry is a Set of dependencies for last generated version of that asset.
|
292
|
-
# Multiple versions are stored since
|
298
|
+
# Multiple versions are stored since Sprockets keeps the last `limit` number of assets
|
293
299
|
# generated present in the system.
|
294
300
|
#
|
295
301
|
# If a "history" of dependencies is present in the cache, each version of "history" will be
|
data/lib/sprockets/manifest.rb
CHANGED
@@ -52,14 +52,8 @@ module Sprockets
|
|
52
52
|
@directory ||= File.dirname(@filename) if @filename
|
53
53
|
|
54
54
|
# If directory is given w/o filename, pick a random manifest location
|
55
|
-
@rename_filename = nil
|
56
55
|
if @directory && @filename.nil?
|
57
56
|
@filename = find_directory_manifest(@directory)
|
58
|
-
|
59
|
-
# If legacy manifest name autodetected, mark to rename on save
|
60
|
-
if File.basename(@filename).start_with?("manifest")
|
61
|
-
@rename_filename = File.join(@directory, generate_manifest_path)
|
62
|
-
end
|
63
57
|
end
|
64
58
|
|
65
59
|
unless @directory && @filename
|
@@ -125,27 +119,13 @@ module Sprockets
|
|
125
119
|
|
126
120
|
return to_enum(__method__, *args) unless block_given?
|
127
121
|
|
128
|
-
paths, filters = args.flatten.partition { |arg| self.class.simple_logical_path?(arg) }
|
129
|
-
filters = filters.map { |arg| self.class.compile_match_filter(arg) }
|
130
|
-
|
131
122
|
environment = self.environment.cached
|
132
|
-
|
133
|
-
paths.each do |path|
|
123
|
+
args.flatten.each do |path|
|
134
124
|
environment.find_all_linked_assets(path) do |asset|
|
135
125
|
yield asset
|
136
126
|
end
|
137
127
|
end
|
138
128
|
|
139
|
-
if filters.any?
|
140
|
-
environment.logical_paths do |logical_path, filename|
|
141
|
-
if filters.any? { |f| f.call(logical_path, filename) }
|
142
|
-
environment.find_all_linked_assets(filename) do |asset|
|
143
|
-
yield asset
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
129
|
nil
|
150
130
|
end
|
151
131
|
|
@@ -161,8 +141,7 @@ module Sprockets
|
|
161
141
|
end
|
162
142
|
else
|
163
143
|
args.each do |path|
|
164
|
-
|
165
|
-
yield File.binread(File.join(dir, asset)) if asset
|
144
|
+
yield File.binread(File.join(dir, assets[path]))
|
166
145
|
end
|
167
146
|
end
|
168
147
|
end
|
@@ -186,7 +165,7 @@ module Sprockets
|
|
186
165
|
find(*args) do |asset|
|
187
166
|
files[asset.digest_path] = {
|
188
167
|
'logical_path' => asset.logical_path,
|
189
|
-
'mtime' =>
|
168
|
+
'mtime' => Time.now.iso8601,
|
190
169
|
'size' => asset.bytesize,
|
191
170
|
'digest' => asset.hexdigest,
|
192
171
|
|
@@ -197,10 +176,6 @@ module Sprockets
|
|
197
176
|
}
|
198
177
|
assets[asset.logical_path] = asset.digest_path
|
199
178
|
|
200
|
-
if alias_logical_path = self.class.compute_alias_logical_path(asset.logical_path)
|
201
|
-
assets[alias_logical_path] = asset.digest_path
|
202
|
-
end
|
203
|
-
|
204
179
|
target = File.join(dir, asset.digest_path)
|
205
180
|
|
206
181
|
if File.exist?(target)
|
@@ -300,13 +275,6 @@ module Sprockets
|
|
300
275
|
|
301
276
|
# Persist manfiest back to FS
|
302
277
|
def save
|
303
|
-
if @rename_filename
|
304
|
-
logger.info "Renaming #{@filename} to #{@rename_filename}"
|
305
|
-
FileUtils.mv(@filename, @rename_filename)
|
306
|
-
@filename = @rename_filename
|
307
|
-
@rename_filename = nil
|
308
|
-
end
|
309
|
-
|
310
278
|
data = json_encode(@data)
|
311
279
|
FileUtils.mkdir_p File.dirname(@filename)
|
312
280
|
PathUtils.atomic_write(@filename) do |f|
|
@@ -36,8 +36,6 @@ module Sprockets
|
|
36
36
|
def find_directory_manifest(dirname)
|
37
37
|
entries = File.directory?(dirname) ? Dir.entries(dirname) : []
|
38
38
|
entry = entries.find { |e| e =~ MANIFEST_RE } ||
|
39
|
-
# Deprecated: Will be removed in 4.x
|
40
|
-
entries.find { |e| e =~ LEGACY_MANIFEST_RE } ||
|
41
39
|
generate_manifest_path
|
42
40
|
File.join(dirname, entry)
|
43
41
|
end
|
data/lib/sprockets/mime.rb
CHANGED
@@ -36,29 +36,18 @@ module Sprockets
|
|
36
36
|
|
37
37
|
# Public: Register a new mime type.
|
38
38
|
#
|
39
|
-
# mime_type
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
# See EncodingUtils.
|
39
|
+
# mime_type - String MIME Type
|
40
|
+
# extensions - Array of String extnames
|
41
|
+
# charset - Proc/Method that detects the charset of a file.
|
42
|
+
# See EncodingUtils.
|
44
43
|
#
|
45
44
|
# Returns nothing.
|
46
|
-
def register_mime_type(mime_type,
|
47
|
-
|
48
|
-
if options.is_a?(String)
|
49
|
-
options = { extensions: [options] }
|
50
|
-
end
|
51
|
-
|
52
|
-
extnames = Array(options[:extensions]).map { |extname|
|
53
|
-
Sprockets::Utils.normalize_extension(extname)
|
54
|
-
}
|
45
|
+
def register_mime_type(mime_type, extensions: [], charset: nil)
|
46
|
+
extnames = Array(extensions)
|
55
47
|
|
56
|
-
charset = options[:charset]
|
57
48
|
charset ||= :default if mime_type.start_with?('text/')
|
58
49
|
charset = EncodingUtils::CHARSET_DETECT[charset] if charset.is_a?(Symbol)
|
59
50
|
|
60
|
-
self.computed_config = {}
|
61
|
-
|
62
51
|
self.config = hash_reassoc(config, :mime_exts) do |mime_exts|
|
63
52
|
extnames.each do |extname|
|
64
53
|
mime_exts[extname] = mime_type
|
@@ -97,54 +86,10 @@ module Sprockets
|
|
97
86
|
data = File.binread(filename)
|
98
87
|
|
99
88
|
if detect = mime_type_charset_detecter(content_type)
|
100
|
-
detect.call(data).encode(Encoding::UTF_8, :
|
89
|
+
detect.call(data).encode(Encoding::UTF_8, universal_newline: true)
|
101
90
|
else
|
102
91
|
data
|
103
92
|
end
|
104
93
|
end
|
105
|
-
|
106
|
-
private
|
107
|
-
def extname_map
|
108
|
-
self.computed_config[:_extnames] ||= compute_extname_map
|
109
|
-
end
|
110
|
-
|
111
|
-
def compute_extname_map
|
112
|
-
graph = {}
|
113
|
-
|
114
|
-
engine_extname_permutation = []
|
115
|
-
|
116
|
-
4.times do |n|
|
117
|
-
config[:engines].keys.permutation(n).each do |engine_extnames|
|
118
|
-
engine_extname_permutation << engine_extnames
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
mime_exts_grouped_by_mime_type = {}
|
123
|
-
config[:mime_exts].each do |format_extname,format_type|
|
124
|
-
mime_exts_grouped_by_mime_type[format_type] ||= []
|
125
|
-
mime_exts_grouped_by_mime_type[format_type] << format_extname
|
126
|
-
end
|
127
|
-
|
128
|
-
([nil] + pipelines.keys.map(&:to_s)).each do |pipeline|
|
129
|
-
pipeline_extname = pipeline ? ".#{pipeline}" : ''.freeze
|
130
|
-
engine_extname_permutation.each do |engine_extnames|
|
131
|
-
mime_exts_grouped_by_mime_type.each do |format_type, format_extnames|
|
132
|
-
type = format_type
|
133
|
-
value = [type, engine_extnames, pipeline]
|
134
|
-
format_extnames.each do |format_extname|
|
135
|
-
key = "#{pipeline_extname}#{format_extname}#{engine_extnames.join}"
|
136
|
-
graph[key] = value
|
137
|
-
end
|
138
|
-
if format_type == config[:engine_mime_types][engine_extnames.first]
|
139
|
-
key = "#{pipeline_extname}#{engine_extnames.join}"
|
140
|
-
graph[key] = value
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
graph[pipeline_extname] = [nil, [], pipeline]
|
145
|
-
end
|
146
|
-
|
147
|
-
graph
|
148
|
-
end
|
149
94
|
end
|
150
95
|
end
|
@@ -41,7 +41,7 @@ module Sprockets
|
|
41
41
|
#
|
42
42
|
# Returns an Array of entry names and a Set of dependency URIs.
|
43
43
|
def entries_with_dependencies(path)
|
44
|
-
return entries(path),
|
44
|
+
return entries(path), Set.new([build_file_digest_uri(path)])
|
45
45
|
end
|
46
46
|
|
47
47
|
# Internal: List directory filenames and associated Stats under a
|
@@ -53,16 +53,7 @@ module Sprockets
|
|
53
53
|
#
|
54
54
|
# Returns an Array of filenames and a Set of dependency URIs.
|
55
55
|
def stat_directory_with_dependencies(dir)
|
56
|
-
return stat_directory(dir).to_a,
|
57
|
-
end
|
58
|
-
|
59
|
-
# Internal: Returns a set of dependencies for a particular path.
|
60
|
-
#
|
61
|
-
# path - String directory path
|
62
|
-
#
|
63
|
-
# Returns a Set of dependency URIs.
|
64
|
-
def file_digest_dependency_set(path)
|
65
|
-
Set.new([build_file_digest_uri(path)])
|
56
|
+
return stat_directory(dir).to_a, Set.new([build_file_digest_uri(dir)])
|
66
57
|
end
|
67
58
|
|
68
59
|
# Internal: List directory filenames and associated Stats under an entire
|
@@ -15,7 +15,7 @@ module Sprockets
|
|
15
15
|
def stat_digest(path, stat)
|
16
16
|
if stat.directory?
|
17
17
|
# If its a directive, digest the list of filenames
|
18
|
-
digest_class.digest(self.entries(path).join(','))
|
18
|
+
digest_class.digest(self.entries(path).join(','.freeze))
|
19
19
|
elsif stat.file?
|
20
20
|
# If its a file, digest the contents
|
21
21
|
digest_class.file(path.to_s).digest
|
data/lib/sprockets/path_utils.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
1
3
|
module Sprockets
|
2
4
|
# Internal: File and path related utilities. Mixed into Environment.
|
3
5
|
#
|
@@ -53,13 +55,12 @@ module Sprockets
|
|
53
55
|
# Returns an empty `Array` if the directory does not exist.
|
54
56
|
def entries(path)
|
55
57
|
if File.directory?(path)
|
56
|
-
entries = Dir.entries(path, :
|
58
|
+
entries = Dir.entries(path, encoding: Encoding.default_internal)
|
57
59
|
entries.reject! { |entry|
|
58
|
-
entry
|
59
|
-
(entry.start_with?("#".freeze) && entry.end_with?("#".freeze)) ||
|
60
|
-
entry.end_with?("~".freeze)
|
60
|
+
entry =~ /^\.|~$|^\#.*\#$/
|
61
61
|
}
|
62
62
|
entries.sort!
|
63
|
+
entries
|
63
64
|
else
|
64
65
|
[]
|
65
66
|
end
|
@@ -109,7 +110,7 @@ module Sprockets
|
|
109
110
|
# subpath is outside of path.
|
110
111
|
def split_subpath(path, subpath)
|
111
112
|
return "" if path == subpath
|
112
|
-
path = File.join(path, '')
|
113
|
+
path = File.join(path, ''.freeze)
|
113
114
|
if subpath.start_with?(path)
|
114
115
|
subpath[path.length..-1]
|
115
116
|
else
|
@@ -148,19 +149,43 @@ module Sprockets
|
|
148
149
|
#
|
149
150
|
# Returns [String extname, Object value] or nil nothing matched.
|
150
151
|
def match_path_extname(path, extensions)
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
152
|
+
match, key = nil, ""
|
153
|
+
path_extnames(path).reverse_each do |extname|
|
154
|
+
key.prepend(extname)
|
155
|
+
if value = extensions[key]
|
156
|
+
match = [key.dup, value]
|
157
|
+
elsif match
|
158
|
+
break
|
158
159
|
end
|
159
|
-
|
160
|
-
i = basename.index('.'.freeze, i+1)
|
161
160
|
end
|
161
|
+
match
|
162
|
+
end
|
162
163
|
|
163
|
-
|
164
|
+
# Internal: Match paths in a directory against available extensions.
|
165
|
+
#
|
166
|
+
# path - String directory
|
167
|
+
# basename - String basename of target file
|
168
|
+
# extensions - Hash of String extnames to values
|
169
|
+
#
|
170
|
+
# Examples
|
171
|
+
#
|
172
|
+
# exts = { ".js" => "application/javascript" }
|
173
|
+
# find_matching_path_for_extensions("app/assets", "application", exts)
|
174
|
+
# # => ["app/assets/application.js", "application/javascript"]
|
175
|
+
#
|
176
|
+
# Returns an Array of [String path, Object value] matches.
|
177
|
+
def find_matching_path_for_extensions(path, basename, extensions)
|
178
|
+
matches = []
|
179
|
+
entries(path).each do |entry|
|
180
|
+
extname, value = match_path_extname(entry, extensions)
|
181
|
+
if basename == entry.chomp(extname)
|
182
|
+
filename = File.join(path, entry)
|
183
|
+
if file?(filename)
|
184
|
+
matches << [filename, value]
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
matches
|
164
189
|
end
|
165
190
|
|
166
191
|
# Internal: Returns all parents for path
|
@@ -272,16 +297,16 @@ module Sprockets
|
|
272
297
|
Thread.current.object_id,
|
273
298
|
Process.pid,
|
274
299
|
rand(1000000)
|
275
|
-
].join('.')
|
300
|
+
].join('.'.freeze)
|
276
301
|
tmpname = File.join(dirname, basename)
|
277
302
|
|
278
303
|
File.open(tmpname, 'wb+') do |f|
|
279
304
|
yield f
|
280
305
|
end
|
281
306
|
|
282
|
-
|
307
|
+
FileUtils.mv(tmpname, filename)
|
283
308
|
ensure
|
284
|
-
|
309
|
+
FileUtils.rm(tmpname) if File.exist?(tmpname)
|
285
310
|
end
|
286
311
|
end
|
287
312
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Sprockets
|
2
|
+
module Preprocessors
|
3
|
+
# Private: Adds a default map to assets when one is not present
|
4
|
+
#
|
5
|
+
# If the input file already has a source map, it effectively returns the original
|
6
|
+
# result. Otherwise it maps 1 for 1 lines original to generated. This is needed
|
7
|
+
# Because other generators run after might depend on having a valid source map
|
8
|
+
# available.
|
9
|
+
class DefaultSourceMap
|
10
|
+
def call(input)
|
11
|
+
result = { data: input[:data] }
|
12
|
+
map = input[:metadata][:map]
|
13
|
+
if map.nil? || map.empty?
|
14
|
+
result[:map] ||= []
|
15
|
+
input[:data].each_line.with_index do |_, index|
|
16
|
+
line = index + 1
|
17
|
+
result[:map] << { source: input[:source_path], generated: [line , 0], original: [line, 0] }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
return result
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|