Skip to content

Commit

Permalink
Add VERBOSE to importmap:verify, fix verify error
Browse files Browse the repository at this point in the history
  • Loading branch information
martinemde committed Oct 9, 2024
1 parent ec335fb commit a7aa813
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 17 deletions.
39 changes: 23 additions & 16 deletions lib/tasks/helpers/importmap_helper.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# frozen_string_literal: true

require "importmap/packager"
require "diff/lcs"

module ImportmapHelper
VerifyError = Class.new(StandardError)
Expand All @@ -9,45 +10,51 @@ class Packager < Importmap::Packager
self.endpoint = URI("https://api.jspm.io/generate")

# Copied from https://github.com/rails/importmap-rails/pull/237
def verify(package, url)
def verify(package, url, verbose: false)
ensure_vendor_directory_exists

return unless vendored_package_path(package).file?
verify_vendored_package(package, url)
verify_vendored_package(package, url, verbose:)
end

def verify_vendored_package(package, url)
def verify_vendored_package(package, url, verbose: false)
vendored_body = vendored_package_path(package).read.strip
remote_body = load_package_file(package, url).strip
remote_body = load_package_file(url).strip

return true if vendored_body == remote_body

raise ImportmapHelper::VerifyError, "Vendored #{package}#{extract_package_version_from(url)} does not match remote #{url}"
verbose_error = "\n\nDiff:\n#{verbose_diff(vendored_body, remote_body)}" if verbose
raise ImportmapHelper::VerifyError, "Vendored #{package}#{extract_package_version_from(url)} does not match remote #{url}#{verbose_error}"
end

def load_package_file(package, url)
def load_package_file(url)
response = Net::HTTP.get_response(URI(url))

if response.code == "200"
format_vendored_package(package, url, response.body)
remove_sourcemap_comment_from(response.body).force_encoding("UTF-8")
else
handle_failure_response(response)
end
end

def format_vendored_package(package, url, source)
formatted = +""
if Gem::Version.new(Importmap::VERSION) > Gem::Version.new("2.0.1")
formatted.concat "// #{package}#{extract_package_version_from(url)} downloaded from #{url}\n\n"
end
formatted.concat remove_sourcemap_comment_from(source).force_encoding("UTF-8")
formatted
end

def save_vendored_package(package, _url, source)
File.write(vendored_package_path(package), source)
end

def verbose_diff(vendored_body, remote_body)
diff = Diff::LCS.sdiff(vendored_body.split("\n"), remote_body.split("\n"))
diff.map do |diff|
case diff.action
when "!"
"- #{diff.old_element}"
when "+"
"+ #{diff.new_element}"
when "="
" #{diff.old_element}"
end
end.join("\n")
end

public :vendored_package_path
end
end
2 changes: 1 addition & 1 deletion lib/tasks/importmap.rake
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ namespace :importmap do
if (imports = packager.import(*packages, env: "production", from: "jspm.io"))
imports.each do |package, url|
puts %(Verifying "#{package}" download from #{url})
packager.verify(package, url)
packager.verify(package, url, verbose: ENV["VERBOSE"])
path = packager.vendored_package_path(package)
puts %(Verified "#{package}" at #{path})
all_files.delete path
Expand Down

0 comments on commit a7aa813

Please sign in to comment.