lib/sprockets/rails/sourcemapping_url_processor.rb in sprockets-rails-3.4.0 vs lib/sprockets/rails/sourcemapping_url_processor.rb in sprockets-rails-3.4.1
- old
+ new
@@ -2,21 +2,53 @@
module Rails
# Rewrites source mapping urls with the digested paths and protect against semicolon appending with a dummy comment line
class SourcemappingUrlProcessor
REGEX = /\/\/# sourceMappingURL=(.*\.map)/
- def self.call(input)
- env = input[:environment]
- context = env.context_class.new(input)
- data = input[:data].gsub(REGEX) do |_match|
- ensure_file_is_present = context.resolve($1)
- "//# sourceMappingURL=#{context.asset_path($1)}\n//!\n"
- rescue Sprockets::FileNotFound
- env.logger.warn "Removed sourceMappingURL comment for missing asset '#{$1}' from #{input[:filename]}"
- nil
+ class << self
+ def call(input)
+ env = input[:environment]
+ context = env.context_class.new(input)
+ data = input[:data].gsub(REGEX) do |_match|
+ sourcemap_logical_path = combine_sourcemap_logical_path(sourcefile: input[:name], sourcemap: $1)
+
+ begin
+ resolved_sourcemap_comment(sourcemap_logical_path, context: context)
+ rescue Sprockets::FileNotFound
+ removed_sourcemap_comment(sourcemap_logical_path, filename: input[:filename], env: env)
+ end
+ end
+
+ { data: data }
end
- { data: data }
+ private
+ def combine_sourcemap_logical_path(sourcefile:, sourcemap:)
+ if (parts = sourcefile.split("/")).many?
+ parts[0..-2].append(sourcemap).join("/")
+ else
+ sourcemap
+ end
+ end
+
+ def resolved_sourcemap_comment(sourcemap_logical_path, context:)
+ "//# sourceMappingURL=#{sourcemap_asset_path(sourcemap_logical_path, context: context)}\n//!\n"
+ end
+
+ def sourcemap_asset_path(sourcemap_logical_path, context:)
+ # FIXME: Work-around for bug where if the sourcemap is nested two levels deep, it'll resolve as the source file
+ # that's being mapped, rather than the map itself. So context.resolve("a/b/c.js.map") will return "c.js?"
+ if context.resolve(sourcemap_logical_path) =~ /\.map/
+ context.asset_path(sourcemap_logical_path)
+ else
+ raise Sprockets::FileNotFound, "Failed to resolve source map asset due to nesting depth"
+ end
+ end
+
+ def removed_sourcemap_comment(sourcemap_logical_path, filename:, env:)
+ env.logger.warn "Removed sourceMappingURL comment for missing asset '#{sourcemap_logical_path}' from #{filename}"
+ nil
+ end
end
end
end
end