class Importmap::Packager

Constants

Error
HTTPError
ServiceError

Attributes

endpoint[RW]

Public Class Methods

new(importmap_path = "config/importmap.rb") click to toggle source
# File lib/importmap/packager.rb, line 13
def initialize(importmap_path = "config/importmap.rb")
  @importmap_path = importmap_path
end

Public Instance Methods

import(*packages, env: "production", from: "jspm") click to toggle source
# File lib/importmap/packager.rb, line 17
def import(*packages, env: "production", from: "jspm")
  response = post_json({
    "install"      => Array(packages), 
    "flattenScope" => true,
    "env"          => [ "browser", "module", env ],
    "provider"     => from.to_s,
  })

  case response.code
  when "200"        then extract_parsed_imports(response)
  when "404", "401" then nil
  else                   handle_failure_response(response)
  end
end
packaged?(package) click to toggle source
# File lib/importmap/packager.rb, line 36
def packaged?(package)
  importmap.match(/^pin "#{package}".*$/)
end
pin_for(package, url) click to toggle source
# File lib/importmap/packager.rb, line 32
def pin_for(package, url)
  %(pin "#{package}", to: "#{url}")
end

Private Instance Methods

extract_parsed_imports(response) click to toggle source
# File lib/importmap/packager.rb, line 41
def extract_parsed_imports(response)
  JSON.parse(response.body).dig("map", "imports")
end
handle_failure_response(response) click to toggle source
# File lib/importmap/packager.rb, line 45
def handle_failure_response(response)
  if error_message = parse_service_error(response)
    raise ServiceError, error_message
  else
    raise HTTPError, "Unexpected response code (#{response.code})"
  end
end
importmap() click to toggle source
# File lib/importmap/packager.rb, line 65
def importmap
  @importmap ||= File.read(@importmap_path)
end
parse_service_error(response) click to toggle source
# File lib/importmap/packager.rb, line 53
def parse_service_error(response)
  JSON.parse(response.body.to_s)["error"]
rescue JSON::ParserError
  nil
end
post_json(body) click to toggle source
# File lib/importmap/packager.rb, line 59
def post_json(body)
  Net::HTTP.post(self.class.endpoint, body.to_json, { "Content-Type" => "application/json" })
rescue => error
  raise HTTPError, "Unexpected transport error (#{error.class}: #{error.message})"
end